diff --git a/.env.template b/.env.template index 8bf5b484b..cb62dc522 100644 --- a/.env.template +++ b/.env.template @@ -2,6 +2,7 @@ # when unset: 1 (true) - dont unset this, just for development DEBUG=0 SQL_DEBUG=0 +DEBUG_TOOLBAR=0 # HTTP port to bind to # TANDOOR_PORT=8080 @@ -97,7 +98,7 @@ GUNICORN_MEDIA=0 # ACCOUNT_EMAIL_SUBJECT_PREFIX= # allow authentication via reverse proxy (e.g. authelia), leave off if you dont know what you are doing -# see docs for more information https://vabene1111.github.io/recipes/features/authentication/ +# see docs for more information https://docs.tandoor.dev/features/authentication/ # when unset: 0 (false) REVERSE_PROXY_AUTH=0 @@ -126,7 +127,7 @@ REVERSE_PROXY_AUTH=0 # ENABLE_METRICS=0 # allows you to setup OAuth providers -# see docs for more information https://vabene1111.github.io/recipes/features/authentication/ +# see docs for more information https://docs.tandoor.dev/features/authentication/ # SOCIAL_PROVIDERS = allauth.socialaccount.providers.github, allauth.socialaccount.providers.nextcloud, # Should a newly created user from a social provider get assigned to the default space and given permission by default ? @@ -157,6 +158,7 @@ REVERSE_PROXY_AUTH=0 #AUTH_LDAP_BIND_PASSWORD= #AUTH_LDAP_USER_SEARCH_BASE_DN= #AUTH_LDAP_TLS_CACERTFILE= +#AUTH_LDAP_START_TLS= # Enables exporting PDF (see export docs) # Disabled by default, uncomment to enable diff --git a/.github/dependabot.yml b/.github/dependabot.yml index ac81a7663..5ef2310a3 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -14,3 +14,8 @@ updates: directory: "/vue/" schedule: interval: "monthly" + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "monthly" diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml new file mode 100644 index 000000000..070e27fc4 --- /dev/null +++ b/.github/workflows/build-docker.yml @@ -0,0 +1,142 @@ +name: Build Docker Container + +on: push + +jobs: + build-container: + name: Build ${{ matrix.name }} Container + runs-on: ubuntu-latest + if: github.repository_owner == 'TandoorRecipes' + continue-on-error: ${{ matrix.continue-on-error }} + permissions: + contents: read + packages: write + strategy: + matrix: + include: + # Standard build config + - name: Standard + dockerfile: Dockerfile + platforms: linux/amd64,linux/arm64 + suffix: "" + continue-on-error: false + # Raspi build config + - name: Raspi + dockerfile: Dockerfile-raspi + platforms: linux/arm/v7 + suffix: "-raspi" + continue-on-error: true + steps: + - uses: actions/checkout@v3 + + - name: Get version number + id: get_version + run: | + if [[ "$GITHUB_REF" = refs/tags/* ]]; then + echo "VERSION=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_OUTPUT + elif [[ "$GITHUB_REF" = refs/heads/beta ]]; then + echo VERSION=beta >> $GITHUB_OUTPUT + else + echo VERSION=develop >> $GITHUB_OUTPUT + fi + + # Update Version number + - name: Update version file + uses: DamianReeves/write-file-action@v1.2 + with: + path: recipes/version.py + contents: | + VERSION_NUMBER = '${{ steps.get_version.outputs.VERSION }}' + BUILD_REF = '${{ github.sha }}' + write-mode: overwrite + + # Build Vue frontend + - uses: actions/setup-node@v3 + with: + node-version: '14' + cache: yarn + cache-dependency-path: vue/yarn.lock + - name: Install dependencies + working-directory: ./vue + run: yarn install --frozen-lockfile + - name: Build dependencies + working-directory: ./vue + run: yarn build + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + - name: Set up Buildx + uses: docker/setup-buildx-action@v2 + - name: Login to Docker Hub + uses: docker/login-action@v2 + if: github.secret_source == 'Actions' + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + - name: Login to GitHub Container Registry + uses: docker/login-action@v2 + if: github.secret_source == 'Actions' + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ github.token }} + - name: Docker meta + id: meta + uses: docker/metadata-action@v4 + with: + images: | + vabene1111/recipes + ghcr.io/TandoorRecipes/recipes + flavor: | + latest=false + suffix=${{ matrix.suffix }} + tags: | + type=raw,value=latest,enable=${{ startsWith(github.ref, 'refs/tags/') }} + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=semver,pattern={{major}} + type=ref,event=branch + - name: Build and Push + uses: docker/build-push-action@v4 + with: + context: . + file: ${{ matrix.dockerfile }} + pull: true + push: ${{ github.secret_source == 'Actions' }} + platforms: ${{ matrix.platforms }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + + notify-stable: + name: Notify Stable + runs-on: ubuntu-latest + needs: build-container + if: startsWith(github.ref, 'refs/tags/') + steps: + - name: Set tag name + run: | + # Strip "refs/tags/" prefix + echo "VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV + # Send stable discord notification + - name: Discord notification + env: + DISCORD_WEBHOOK: ${{ secrets.DISCORD_RELEASE_WEBHOOK }} + uses: Ilshidur/action-discord@0.3.2 + with: + args: '🚀 Version {{ VERSION }} of tandoor has been released 🥳 Check it out https://github.com/vabene1111/recipes/releases/tag/{{ VERSION }}' + + notify-beta: + name: Notify Beta + runs-on: ubuntu-latest + needs: build-container + if: github.ref == 'refs/heads/beta' + steps: + # Send beta discord notification + - name: Discord notification + env: + DISCORD_WEBHOOK: ${{ secrets.DISCORD_BETA_WEBHOOK }} + uses: Ilshidur/action-discord@0.3.2 + with: + args: '🚀 The BETA Image has been updated! 🥳' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2fdabaf2f..8492e717d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,6 +1,6 @@ name: Continuous Integration -on: [push] +on: [push, pull_request] jobs: build: @@ -12,7 +12,7 @@ jobs: python-version: ['3.10'] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v3 - name: Set up Python 3.10 uses: actions/setup-python@v4 with: diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index e25328d5a..4166aae31 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: # We must fetch at least the immediate parents so that if this is # a pull request then we can checkout the head. @@ -25,7 +25,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v1 + uses: github/codeql-action/init@v2 # Override language selection by uncommenting this and choosing your languages with: languages: python, javascript @@ -47,6 +47,6 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + uses: github/codeql-action/analyze@v2 with: languages: javascript, python diff --git a/.github/workflows/docker-publish-beta-raspi.yml b/.github/workflows/docker-publish-beta-raspi.yml deleted file mode 100644 index d3e382f53..000000000 --- a/.github/workflows/docker-publish-beta-raspi.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: publish beta raspi image docker -on: - push: - branches: - - 'beta' -jobs: - build: - if: github.repository_owner == 'TandoorRecipes' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@master - # Update Version number - - name: Update version file - uses: DamianReeves/write-file-action@v1.0 - with: - path: recipes/version.py - contents: | - VERSION_NUMBER = 'beta' - BUILD_REF = '${{ github.sha }}' - write-mode: overwrite - # Build Vue frontend - - uses: actions/setup-node@v2 - with: - node-version: '14' - - name: Install dependencies - working-directory: ./vue - run: yarn install - - name: Build dependencies - working-directory: ./vue - run: yarn build - # Build container - - name: Build and publish image - uses: ilteoood/docker_buildx@master - with: - publish: true - imageName: vabene1111/recipes - tag: beta-raspi - dockerFile: Dockerfile-raspi - platform: linux/arm/v7 - dockerUser: ${{ secrets.DOCKER_USERNAME }} - dockerPassword: ${{ secrets.DOCKER_PASSWORD }} - # Send discord notification - - name: Discord notification - env: - DISCORD_WEBHOOK: ${{ secrets.DISCORD_BETA_WEBHOOK }} - uses: Ilshidur/action-discord@0.3.2 - with: - args: '🚀 The BETA Image has been updated! 🥳' \ No newline at end of file diff --git a/.github/workflows/docker-publish-beta.yml b/.github/workflows/docker-publish-beta.yml deleted file mode 100644 index 715507f61..000000000 --- a/.github/workflows/docker-publish-beta.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: publish beta image docker -on: - push: - branches: - - 'beta' -jobs: - build: - if: github.repository_owner == 'TandoorRecipes' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@master - # Update Version number - - name: Update version file - uses: DamianReeves/write-file-action@v1.0 - with: - path: recipes/version.py - contents: | - VERSION_NUMBER = 'beta' - BUILD_REF = '${{ github.sha }}' - write-mode: overwrite - # Build Vue frontend - - uses: actions/setup-node@v2 - with: - node-version: '14' - - name: Install dependencies - working-directory: ./vue - run: yarn install - - name: Build dependencies - working-directory: ./vue - run: yarn build - # Build container - - name: Build and publish image - uses: ilteoood/docker_buildx@master - with: - publish: true - imageName: vabene1111/recipes - tag: beta - platform: linux/amd64,linux/arm64 - dockerUser: ${{ secrets.DOCKER_USERNAME }} - dockerPassword: ${{ secrets.DOCKER_PASSWORD }} - # Send discord notification - - name: Discord notification - env: - DISCORD_WEBHOOK: ${{ secrets.DISCORD_BETA_WEBHOOK }} - uses: Ilshidur/action-discord@0.3.2 - with: - args: '🚀 The BETA Image has been updated! 🥳' \ No newline at end of file diff --git a/.github/workflows/docker-publish-dev.yml b/.github/workflows/docker-publish-dev.yml deleted file mode 100644 index 59db59de0..000000000 --- a/.github/workflows/docker-publish-dev.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: publish dev image docker -on: - push: - branches: - - '*' - - '*/*' - - '!master' -jobs: - build: - if: github.repository_owner == 'TandoorRecipes' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@master - # Update Version number - - name: Update version file - uses: DamianReeves/write-file-action@v1.0 - with: - path: recipes/version.py - contents: | - VERSION_NUMBER = 'develop' - BUILD_REF = '${{ github.sha }}' - write-mode: overwrite - # Build Vue frontend - - uses: actions/setup-node@v2 - with: - node-version: '14' - - name: Clear Cache - working-directory: ./vue - run: yarn cache clean --all - - name: Install dependencies - working-directory: ./vue - run: yarn install - - name: Build dependencies - working-directory: ./vue - run: yarn build - # Build container - - name: Publish to Registry - uses: elgohr/Publish-Docker-Github-Action@2.13 - with: - name: vabene1111/recipes - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} diff --git a/.github/workflows/docker-publish-latest-raspi.yml b/.github/workflows/docker-publish-latest-raspi.yml deleted file mode 100644 index 8907e2c9c..000000000 --- a/.github/workflows/docker-publish-latest-raspi.yml +++ /dev/null @@ -1,45 +0,0 @@ -name: publish latest raspi image docker -on: - push: - tags: - - '*' - -jobs: - build: - if: github.repository_owner == 'TandoorRecipes' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@master - - name: Get version number - id: get_version - run: echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\//}-raspi - # Update Version number - - name: Update version file - uses: DamianReeves/write-file-action@v1.0 - with: - path: recipes/version.py - contents: | - VERSION_NUMBER = '${{ steps.get_version.outputs.VERSION }}-raspi' - BUILD_REF = '${{ github.sha }}' - write-mode: overwrite - # Build Vue frontend - - uses: actions/setup-node@v2 - with: - node-version: '14' - - name: Install dependencies - working-directory: ./vue - run: yarn install - - name: Build dependencies - working-directory: ./vue - run: yarn build - # Build container - - name: Build and publish image - uses: ilteoood/docker_buildx@master - with: - publish: true - imageName: vabene1111/recipes - dockerFile: Dockerfile-raspi - platform: linux/arm/v7 - tag: latest-raspi - dockerUser: ${{ secrets.DOCKER_USERNAME }} - dockerPassword: ${{ secrets.DOCKER_PASSWORD }} diff --git a/.github/workflows/docker-publish-latest.yml b/.github/workflows/docker-publish-latest.yml deleted file mode 100644 index e48bb3072..000000000 --- a/.github/workflows/docker-publish-latest.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: publish latest image docker -on: - push: - tags: - - '*' - -jobs: - build: - if: github.repository_owner == 'TandoorRecipes' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@master - - name: Get version number - id: get_version - run: echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\//} - # Update Version number - - name: Update version file - uses: DamianReeves/write-file-action@v1.0 - with: - path: recipes/version.py - contents: | - VERSION_NUMBER = '${{ steps.get_version.outputs.VERSION }}' - BUILD_REF = '${{ github.sha }}' - write-mode: overwrite - # Build Vue frontend - - uses: actions/setup-node@v2 - with: - node-version: '14' - - name: Install dependencies - working-directory: ./vue - run: yarn install - - name: Build dependencies - working-directory: ./vue - run: yarn build - # Build container - - name: Build and publish image - uses: ilteoood/docker_buildx@master - with: - publish: true - imageName: vabene1111/recipes - platform: linux/amd64,linux/arm64 - tag: latest - dockerUser: ${{ secrets.DOCKER_USERNAME }} - dockerPassword: ${{ secrets.DOCKER_PASSWORD }} diff --git a/.github/workflows/docker-publish-release-raspi.yml b/.github/workflows/docker-publish-release-raspi.yml deleted file mode 100644 index 76da44a1e..000000000 --- a/.github/workflows/docker-publish-release-raspi.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: publish tagged raspi release docker - -on: - release: - types: [published] - -jobs: - build: - if: github.repository_owner == 'TandoorRecipes' - runs-on: ubuntu-latest - name: Build image job - steps: - - name: Checkout master - uses: actions/checkout@master - - name: Get version number - id: get_version - run: echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\//} - # Update Version number - - name: Update version file - uses: DamianReeves/write-file-action@v1.0 - with: - path: recipes/version.py - contents: | - VERSION_NUMBER = '${{ steps.get_version.outputs.VERSION }}' - BUILD_REF = '${{ github.sha }}' - write-mode: overwrite - # Build Vue frontend - - uses: actions/setup-node@v2 - with: - node-version: '14' - - name: Install dependencies - working-directory: ./vue - run: yarn install - - name: Build dependencies - working-directory: ./vue - run: yarn build - # Build container - - name: Build and publish image - uses: ilteoood/docker_buildx@master - with: - publish: true - imageName: vabene1111/recipes - dockerFile: Dockerfile-raspi - platform: linux/arm/v7 - tag: ${{ steps.get_version.outputs.VERSION }}-raspi - dockerUser: ${{ secrets.DOCKER_USERNAME }} - dockerPassword: ${{ secrets.DOCKER_PASSWORD }} diff --git a/.github/workflows/docker-publish-release.yml b/.github/workflows/docker-publish-release.yml deleted file mode 100644 index 1b79b34de..000000000 --- a/.github/workflows/docker-publish-release.yml +++ /dev/null @@ -1,53 +0,0 @@ -name: publish tagged release docker - -on: - release: - types: [published] - -jobs: - build: - if: github.repository_owner == 'TandoorRecipes' - runs-on: ubuntu-latest - name: Build image job - steps: - - name: Checkout master - uses: actions/checkout@master - - name: Get version number - id: get_version - run: echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\//} - # Update Version number - - name: Update version file - uses: DamianReeves/write-file-action@v1.0 - with: - path: recipes/version.py - contents: | - VERSION_NUMBER = '${{ steps.get_version.outputs.VERSION }}' - BUILD_REF = '${{ github.sha }}' - write-mode: overwrite - # Build Vue frontend - - uses: actions/setup-node@v2 - with: - node-version: '14' - - name: Install dependencies - working-directory: ./vue - run: yarn install - - name: Build dependencies - working-directory: ./vue - run: yarn build - # Build container - - name: Build and publish image - uses: ilteoood/docker_buildx@master - with: - publish: true - imageName: vabene1111/recipes - platform: linux/amd64,linux/arm64 - tag: ${{ steps.get_version.outputs.VERSION }} - dockerUser: ${{ secrets.DOCKER_USERNAME }} - dockerPassword: ${{ secrets.DOCKER_PASSWORD }} - # Send discord notification - - name: Discord notification - env: - DISCORD_WEBHOOK: ${{ secrets.DISCORD_RELEASE_WEBHOOK }} - uses: Ilshidur/action-discord@0.3.2 - with: - args: '🚀 Version {{ EVENT_PAYLOAD.release.tag_name }} of tandoor has been released 🥳 Check it out https://github.com/vabene1111/recipes/releases/tag/{{ EVENT_PAYLOAD.release.tag_name }}' diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 7e7723c90..7a35555bb 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -9,8 +9,8 @@ jobs: if: github.repository_owner == 'TandoorRecipes' runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions/setup-python@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 with: python-version: 3.x - run: pip install mkdocs-material mkdocs-include-markdown-plugin diff --git a/.gitignore b/.gitignore index b0d71b268..ad9c1fc7f 100644 --- a/.gitignore +++ b/.gitignore @@ -78,6 +78,7 @@ postgresql/ /docker-compose.override.yml vue/node_modules +plugins .vscode/ vetur.config.js cookbook/static/vue diff --git a/.idea/dictionaries/vaben.xml b/.idea/dictionaries/vaben.xml new file mode 100644 index 000000000..3568ee84f --- /dev/null +++ b/.idea/dictionaries/vaben.xml @@ -0,0 +1,8 @@ + + + + pinia + selfhosted + + + \ No newline at end of file diff --git a/.idea/recipes.iml b/.idea/recipes.iml index 1b96c9d80..8a0e59c8e 100644 --- a/.idea/recipes.iml +++ b/.idea/recipes.iml @@ -18,7 +18,7 @@ - + diff --git a/cookbook/admin.py b/cookbook/admin.py index 4e3670562..aba876dfb 100644 --- a/cookbook/admin.py +++ b/cookbook/admin.py @@ -32,11 +32,11 @@ admin.site.unregister(Group) @admin.action(description='Delete all data from a space') def delete_space_action(modeladmin, request, queryset): for space in queryset: - space.save() + space.safe_delete() class SpaceAdmin(admin.ModelAdmin): - list_display = ('name', 'created_by', 'max_recipes', 'max_users', 'max_file_storage_mb', 'allow_sharing', 'use_plural') + list_display = ('name', 'created_by', 'max_recipes', 'max_users', 'max_file_storage_mb', 'allow_sharing') search_fields = ('name', 'created_by__username') list_filter = ('max_recipes', 'max_users', 'max_file_storage_mb', 'allow_sharing') date_hierarchy = 'created_at' diff --git a/cookbook/forms.py b/cookbook/forms.py index 626f2d12b..1c1a90c0e 100644 --- a/cookbook/forms.py +++ b/cookbook/forms.py @@ -154,6 +154,7 @@ class ImportExportBase(forms.Form): COOKBOOKAPP = 'COOKBOOKAPP' COPYMETHAT = 'COPYMETHAT' COOKMATE = 'COOKMATE' + REZEPTSUITEDE = 'REZEPTSUITEDE' PDF = 'PDF' type = forms.ChoiceField(choices=( @@ -162,7 +163,7 @@ class ImportExportBase(forms.Form): (PEPPERPLATE, 'Pepperplate'), (RECETTETEK, 'RecetteTek'), (RECIPESAGE, 'Recipe Sage'), (DOMESTICA, 'Domestica'), (MEALMASTER, 'MealMaster'), (REZKONV, 'RezKonv'), (OPENEATS, 'Openeats'), (RECIPEKEEPER, 'Recipe Keeper'), (PLANTOEAT, 'Plantoeat'), (COOKBOOKAPP, 'CookBookApp'), (COPYMETHAT, 'CopyMeThat'), (PDF, 'PDF'), (MELARECIPES, 'Melarecipes'), - (COOKMATE, 'Cookmate') + (COOKMATE, 'Cookmate'), (REZEPTSUITEDE, 'Recipesuite.de') )) diff --git a/cookbook/helper/ingredient_parser.py b/cookbook/helper/ingredient_parser.py index 45f4e5534..8ecf299b9 100644 --- a/cookbook/helper/ingredient_parser.py +++ b/cookbook/helper/ingredient_parser.py @@ -28,7 +28,7 @@ class IngredientParser: self.food_aliases = c caches['default'].touch(FOOD_CACHE_KEY, 30) else: - for a in Automation.objects.filter(space=self.request.space, disabled=False, type=Automation.FOOD_ALIAS).only('param_1', 'param_2').all(): + for a in Automation.objects.filter(space=self.request.space, disabled=False, type=Automation.FOOD_ALIAS).only('param_1', 'param_2').order_by('order').all(): self.food_aliases[a.param_1] = a.param_2 caches['default'].set(FOOD_CACHE_KEY, self.food_aliases, 30) @@ -37,7 +37,7 @@ class IngredientParser: self.unit_aliases = c caches['default'].touch(UNIT_CACHE_KEY, 30) else: - for a in Automation.objects.filter(space=self.request.space, disabled=False, type=Automation.UNIT_ALIAS).only('param_1', 'param_2').all(): + for a in Automation.objects.filter(space=self.request.space, disabled=False, type=Automation.UNIT_ALIAS).only('param_1', 'param_2').order_by('order').all(): self.unit_aliases[a.param_1] = a.param_2 caches['default'].set(UNIT_CACHE_KEY, self.unit_aliases, 30) else: @@ -59,7 +59,7 @@ class IngredientParser: except KeyError: return food else: - if automation := Automation.objects.filter(space=self.request.space, type=Automation.FOOD_ALIAS, param_1=food, disabled=False).first(): + if automation := Automation.objects.filter(space=self.request.space, type=Automation.FOOD_ALIAS, param_1=food, disabled=False).order_by('order').first(): return automation.param_2 return food @@ -78,7 +78,7 @@ class IngredientParser: except KeyError: return unit else: - if automation := Automation.objects.filter(space=self.request.space, type=Automation.UNIT_ALIAS, param_1=unit, disabled=False).first(): + if automation := Automation.objects.filter(space=self.request.space, type=Automation.UNIT_ALIAS, param_1=unit, disabled=False).order_by('order').first(): return automation.param_2 return unit @@ -126,6 +126,8 @@ class IngredientParser: amount = 0 unit = None note = '' + if x.strip() == '': + return amount, unit, note did_check_frac = False end = 0 @@ -235,6 +237,10 @@ class IngredientParser: # leading spaces before commas result in extra tokens, clean them out ingredient = ingredient.replace(' ,', ',') + # handle "(from) - (to)" amounts by using the minimum amount and adding the range to the description + # "10.5 - 200 g XYZ" => "100 g XYZ (10.5 - 200)" + ingredient = re.sub("^(\d+|\d+[\\.,]\d+) - (\d+|\d+[\\.,]\d+) (.*)", "\\1 \\3 (\\1 - \\2)", ingredient) + # if amount and unit are connected add space in between if re.match('([0-9])+([A-z])+\s', ingredient): ingredient = re.sub(r'(?<=([a-z])|\d)(?=(?(1)\d|[a-z]))', ' ', ingredient) diff --git a/cookbook/helper/permission_helper.py b/cookbook/helper/permission_helper.py index 2e6df0bb4..6afb2e923 100644 --- a/cookbook/helper/permission_helper.py +++ b/cookbook/helper/permission_helper.py @@ -123,7 +123,7 @@ def share_link_valid(recipe, share): return c if link := ShareLink.objects.filter(recipe=recipe, uuid=share, abuse_blocked=False).first(): - if 0 < settings.SHARING_LIMIT < link.request_count: + if 0 < settings.SHARING_LIMIT < link.request_count and not link.space.no_sharing_limit: return False link.request_count += 1 link.save() diff --git a/cookbook/helper/recipe_search.py b/cookbook/helper/recipe_search.py index a618efb1f..93dbe2de4 100644 --- a/cookbook/helper/recipe_search.py +++ b/cookbook/helper/recipe_search.py @@ -3,9 +3,9 @@ from collections import Counter from datetime import date, timedelta from django.contrib.postgres.search import SearchQuery, SearchRank, SearchVector, TrigramSimilarity -from django.core.cache import cache -from django.core.cache import caches -from django.db.models import (Avg, Case, Count, Exists, F, Func, Max, OuterRef, Q, Subquery, Value, When, FilteredRelation) +from django.core.cache import cache, caches +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 _ @@ -20,7 +20,8 @@ from recipes import settings # TODO create extensive tests to make sure ORs ANDs and various filters, sorting, etc work as expected # TODO consider creating a simpleListRecipe API that only includes minimum of recipe info and minimal filtering class RecipeSearch(): - _postgres = settings.DATABASES['default']['ENGINE'] in ['django.db.backends.postgresql_psycopg2', 'django.db.backends.postgresql'] + _postgres = settings.DATABASES['default']['ENGINE'] in [ + 'django.db.backends.postgresql_psycopg2', 'django.db.backends.postgresql'] def __init__(self, request, **params): self._request = request @@ -45,7 +46,8 @@ class RecipeSearch(): cache.set(CACHE_KEY, self._search_prefs, timeout=10) else: self._search_prefs = SearchPreference() - self._string = self._params.get('query').strip() if self._params.get('query', None) else None + self._string = self._params.get('query').strip( + ) if self._params.get('query', None) else None self._rating = self._params.get('rating', None) self._keywords = { 'or': self._params.get('keywords_or', None) or self._params.get('keywords', None), @@ -74,7 +76,8 @@ class RecipeSearch(): self._random = str2bool(self._params.get('random', False)) self._new = str2bool(self._params.get('new', False)) self._num_recent = int(self._params.get('num_recent', 0)) - self._include_children = str2bool(self._params.get('include_children', None)) + self._include_children = str2bool( + self._params.get('include_children', None)) self._timescooked = self._params.get('timescooked', None) self._cookedon = self._params.get('cookedon', None) self._createdon = self._params.get('createdon', None) @@ -95,18 +98,24 @@ class RecipeSearch(): self._search_type = self._search_prefs.search or 'plain' if self._string: if self._postgres: - self._unaccent_include = self._search_prefs.unaccent.values_list('field', flat=True) + self._unaccent_include = self._search_prefs.unaccent.values_list( + 'field', flat=True) else: self._unaccent_include = [] - self._icontains_include = [x + '__unaccent' if x in self._unaccent_include else x for x in self._search_prefs.icontains.values_list('field', flat=True)] - self._istartswith_include = [x + '__unaccent' if x in self._unaccent_include else x for x in self._search_prefs.istartswith.values_list('field', flat=True)] + self._icontains_include = [ + x + '__unaccent' if x in self._unaccent_include else x for x in self._search_prefs.icontains.values_list('field', flat=True)] + self._istartswith_include = [ + x + '__unaccent' if x in self._unaccent_include else x for x in self._search_prefs.istartswith.values_list('field', flat=True)] self._trigram_include = None self._fulltext_include = None self._trigram = False if self._postgres and self._string: - self._language = DICTIONARY.get(translation.get_language(), 'simple') - self._trigram_include = [x + '__unaccent' if x in self._unaccent_include else x for x in self._search_prefs.trigram.values_list('field', flat=True)] - self._fulltext_include = self._search_prefs.fulltext.values_list('field', flat=True) or None + self._language = DICTIONARY.get( + translation.get_language(), 'simple') + self._trigram_include = [ + x + '__unaccent' if x in self._unaccent_include else x for x in self._search_prefs.trigram.values_list('field', flat=True)] + self._fulltext_include = self._search_prefs.fulltext.values_list( + 'field', flat=True) or None if self._search_type not in ['websearch', 'raw'] and self._trigram_include: self._trigram = True @@ -182,8 +191,10 @@ class RecipeSearch(): # otherwise sort by the remaining order_by attributes or favorite by default else: order += default_order - order[:] = [Lower('name').asc() if x == 'name' else x for x in order] - order[:] = [Lower('name').desc() if x == '-name' else x for x in order] + order[:] = [Lower('name').asc() if x == + 'name' else x for x in order] + order[:] = [Lower('name').desc() if x == + '-name' else x for x in order] self.orderby = order def string_filters(self, string=None): @@ -200,21 +211,28 @@ class RecipeSearch(): for f in self._filters: query_filter |= f - self._queryset = self._queryset.filter(query_filter).distinct() # this creates duplicate records which can screw up other aggregates, see makenow for workaround + # this creates duplicate records which can screw up other aggregates, see makenow for workaround + self._queryset = self._queryset.filter(query_filter).distinct() if self._fulltext_include: if self._fuzzy_match is None: - self._queryset = self._queryset.annotate(score=Coalesce(Max(self.search_rank), 0.0)) + self._queryset = self._queryset.annotate( + score=Coalesce(Max(self.search_rank), 0.0)) else: - self._queryset = self._queryset.annotate(rank=Coalesce(Max(self.search_rank), 0.0)) + self._queryset = self._queryset.annotate( + rank=Coalesce(Max(self.search_rank), 0.0)) if self._fuzzy_match is not None: - simularity = self._fuzzy_match.filter(pk=OuterRef('pk')).values('simularity') + simularity = self._fuzzy_match.filter( + pk=OuterRef('pk')).values('simularity') if not self._fulltext_include: - self._queryset = self._queryset.annotate(score=Coalesce(Subquery(simularity), 0.0)) + self._queryset = self._queryset.annotate( + score=Coalesce(Subquery(simularity), 0.0)) else: - self._queryset = self._queryset.annotate(simularity=Coalesce(Subquery(simularity), 0.0)) + self._queryset = self._queryset.annotate( + simularity=Coalesce(Subquery(simularity), 0.0)) if self._sort_includes('score') and self._fulltext_include and self._fuzzy_match is not None: - self._queryset = self._queryset.annotate(score=F('rank') + F('simularity')) + self._queryset = self._queryset.annotate( + score=F('rank') + F('simularity')) else: query_filter = Q() for f in [x + '__unaccent__iexact' if x in self._unaccent_include else x + '__iexact' for x in SearchFields.objects.all().values_list('field', flat=True)]: @@ -223,7 +241,8 @@ class RecipeSearch(): def _cooked_on_filter(self, cooked_date=None): if self._sort_includes('lastcooked') or cooked_date: - lessthan = self._sort_includes('-lastcooked') or '-' in (cooked_date or [])[:1] + lessthan = self._sort_includes( + '-lastcooked') or '-' in (cooked_date or [])[:1] if lessthan: default = timezone.now() - timedelta(days=100000) else: @@ -233,32 +252,41 @@ class RecipeSearch(): if cooked_date is None: return - cooked_date = date(*[int(x) for x in cooked_date.split('-') if x != '']) + cooked_date = date(*[int(x) + for x in cooked_date.split('-') if x != '']) if lessthan: - self._queryset = self._queryset.filter(lastcooked__date__lte=cooked_date).exclude(lastcooked=default) + self._queryset = self._queryset.filter( + lastcooked__date__lte=cooked_date).exclude(lastcooked=default) else: - self._queryset = self._queryset.filter(lastcooked__date__gte=cooked_date).exclude(lastcooked=default) + self._queryset = self._queryset.filter( + lastcooked__date__gte=cooked_date).exclude(lastcooked=default) def _created_on_filter(self, created_date=None): if created_date is None: return lessthan = '-' in created_date[:1] - created_date = date(*[int(x) for x in created_date.split('-') if x != '']) + created_date = date(*[int(x) + for x in created_date.split('-') if x != '']) if lessthan: - self._queryset = self._queryset.filter(created_at__date__lte=created_date) + self._queryset = self._queryset.filter( + created_at__date__lte=created_date) else: - self._queryset = self._queryset.filter(created_at__date__gte=created_date) + self._queryset = self._queryset.filter( + created_at__date__gte=created_date) def _updated_on_filter(self, updated_date=None): if updated_date is None: return lessthan = '-' in updated_date[:1] - updated_date = date(*[int(x) for x in updated_date.split('-') if x != '']) + updated_date = date(*[int(x) + for x in updated_date.split('-') if x != '']) if lessthan: - self._queryset = self._queryset.filter(updated_at__date__lte=updated_date) + self._queryset = self._queryset.filter( + updated_at__date__lte=updated_date) else: - self._queryset = self._queryset.filter(updated_at__date__gte=updated_date) + self._queryset = self._queryset.filter( + updated_at__date__gte=updated_date) def _viewed_on_filter(self, viewed_date=None): if self._sort_includes('lastviewed') or viewed_date: @@ -268,12 +296,15 @@ class RecipeSearch(): if viewed_date is None: return lessthan = '-' in viewed_date[:1] - viewed_date = date(*[int(x) for x in viewed_date.split('-') if x != '']) + viewed_date = date(*[int(x) + for x in viewed_date.split('-') if x != '']) if lessthan: - self._queryset = self._queryset.filter(lastviewed__date__lte=viewed_date).exclude(lastviewed=longTimeAgo) + self._queryset = self._queryset.filter( + lastviewed__date__lte=viewed_date).exclude(lastviewed=longTimeAgo) else: - self._queryset = self._queryset.filter(lastviewed__date__gte=viewed_date).exclude(lastviewed=longTimeAgo) + self._queryset = self._queryset.filter( + lastviewed__date__gte=viewed_date).exclude(lastviewed=longTimeAgo) def _new_recipes(self, new_days=7): # TODO make new days a user-setting @@ -293,27 +324,32 @@ class RecipeSearch(): num_recent_recipes = ViewLog.objects.filter(created_by=self._request.user, space=self._request.space).values( 'recipe').annotate(recent=Max('created_at')).order_by('-recent')[:num_recent] - self._queryset = self._queryset.annotate(recent=Coalesce(Max(Case(When(pk__in=num_recent_recipes.values('recipe'), then='viewlog__pk'))), Value(0))) + self._queryset = self._queryset.annotate(recent=Coalesce(Max(Case(When( + pk__in=num_recent_recipes.values('recipe'), then='viewlog__pk'))), Value(0))) def _favorite_recipes(self, times_cooked=None): if self._sort_includes('favorite') or times_cooked: - less_than = '-' in (times_cooked or []) or not self._sort_includes('-favorite') + less_than = '-' in (times_cooked or [] + ) and not self._sort_includes('-favorite') if less_than: default = 1000 else: default = 0 favorite_recipes = CookLog.objects.filter(created_by=self._request.user, space=self._request.space, recipe=OuterRef('pk') ).values('recipe').annotate(count=Count('pk', distinct=True)).values('count') - self._queryset = self._queryset.annotate(favorite=Coalesce(Subquery(favorite_recipes), default)) + self._queryset = self._queryset.annotate( + favorite=Coalesce(Subquery(favorite_recipes), default)) if times_cooked is None: return if times_cooked == '0': self._queryset = self._queryset.filter(favorite=0) elif less_than: - self._queryset = self._queryset.filter(favorite__lte=int(times_cooked[1:])).exclude(favorite=0) + self._queryset = self._queryset.filter(favorite__lte=int( + times_cooked.replace('-', ''))).exclude(favorite=0) else: - self._queryset = self._queryset.filter(favorite__gte=int(times_cooked)) + self._queryset = self._queryset.filter( + favorite__gte=int(times_cooked)) def keyword_filters(self, **kwargs): if all([kwargs[x] is None for x in kwargs]): @@ -346,7 +382,8 @@ class RecipeSearch(): else: self._queryset = self._queryset.filter(f_and) if 'not' in kw_filter: - self._queryset = self._queryset.exclude(id__in=recipes.values('id')) + self._queryset = self._queryset.exclude( + id__in=recipes.values('id')) def food_filters(self, **kwargs): if all([kwargs[x] is None for x in kwargs]): @@ -360,7 +397,8 @@ class RecipeSearch(): foods = Food.objects.filter(pk__in=kwargs[fd_filter]) if 'or' in fd_filter: if self._include_children: - f_or = Q(steps__ingredients__food__in=Food.include_descendants(foods)) + f_or = Q( + steps__ingredients__food__in=Food.include_descendants(foods)) else: f_or = Q(steps__ingredients__food__in=foods) @@ -372,7 +410,8 @@ class RecipeSearch(): recipes = Recipe.objects.all() for food in foods: if self._include_children: - f_and = Q(steps__ingredients__food__in=food.get_descendants_and_self()) + f_and = Q( + steps__ingredients__food__in=food.get_descendants_and_self()) else: f_and = Q(steps__ingredients__food=food) if 'not' in fd_filter: @@ -380,7 +419,8 @@ class RecipeSearch(): else: self._queryset = self._queryset.filter(f_and) if 'not' in fd_filter: - self._queryset = self._queryset.exclude(id__in=recipes.values('id')) + self._queryset = self._queryset.exclude( + id__in=recipes.values('id')) def unit_filters(self, units=None, operator=True): if operator != True: @@ -389,7 +429,8 @@ class RecipeSearch(): return if not isinstance(units, list): units = [units] - self._queryset = self._queryset.filter(steps__ingredients__unit__in=units) + self._queryset = self._queryset.filter( + steps__ingredients__unit__in=units) def rating_filter(self, rating=None): if rating or self._sort_includes('rating'): @@ -399,14 +440,16 @@ class RecipeSearch(): else: default = 0 # TODO make ratings a settings user-only vs all-users - self._queryset = self._queryset.annotate(rating=Round(Avg(Case(When(cooklog__created_by=self._request.user, then='cooklog__rating'), default=default)))) + self._queryset = self._queryset.annotate(rating=Round(Avg(Case(When( + cooklog__created_by=self._request.user, then='cooklog__rating'), default=default)))) if rating is None: return if rating == '0': self._queryset = self._queryset.filter(rating=0) elif lessthan: - self._queryset = self._queryset.filter(rating__lte=int(rating[1:])).exclude(rating=0) + self._queryset = self._queryset.filter( + rating__lte=int(rating[1:])).exclude(rating=0) else: self._queryset = self._queryset.filter(rating__gte=int(rating)) @@ -434,11 +477,14 @@ class RecipeSearch(): recipes = Recipe.objects.all() for book in kwargs[bk_filter]: if 'not' in bk_filter: - recipes = recipes.filter(recipebookentry__book__id=book) + recipes = recipes.filter( + recipebookentry__book__id=book) else: - self._queryset = self._queryset.filter(recipebookentry__book__id=book) + self._queryset = self._queryset.filter( + recipebookentry__book__id=book) if 'not' in bk_filter: - self._queryset = self._queryset.exclude(id__in=recipes.values('id')) + self._queryset = self._queryset.exclude( + id__in=recipes.values('id')) def step_filters(self, steps=None, operator=True): if operator != True: @@ -446,7 +492,7 @@ class RecipeSearch(): if not steps: return if not isinstance(steps, list): - steps = [unistepsts] + steps = [steps] self._queryset = self._queryset.filter(steps__id__in=steps) def build_fulltext_filters(self, string=None): @@ -457,20 +503,25 @@ class RecipeSearch(): rank = [] if 'name' in self._fulltext_include: vectors.append('name_search_vector') - rank.append(SearchRank('name_search_vector', self.search_query, cover_density=True)) + rank.append(SearchRank('name_search_vector', + self.search_query, cover_density=True)) if 'description' in self._fulltext_include: vectors.append('desc_search_vector') - rank.append(SearchRank('desc_search_vector', self.search_query, cover_density=True)) + rank.append(SearchRank('desc_search_vector', + self.search_query, cover_density=True)) if 'steps__instruction' in self._fulltext_include: vectors.append('steps__search_vector') - rank.append(SearchRank('steps__search_vector', self.search_query, cover_density=True)) + rank.append(SearchRank('steps__search_vector', + self.search_query, cover_density=True)) if 'keywords__name' in self._fulltext_include: # explicitly settings unaccent on keywords and foods so that they behave the same as search_vector fields vectors.append('keywords__name__unaccent') - rank.append(SearchRank('keywords__name__unaccent', self.search_query, cover_density=True)) + rank.append(SearchRank('keywords__name__unaccent', + self.search_query, cover_density=True)) if 'steps__ingredients__food__name' in self._fulltext_include: vectors.append('steps__ingredients__food__name__unaccent') - rank.append(SearchRank('steps__ingredients__food__name', self.search_query, cover_density=True)) + rank.append(SearchRank('steps__ingredients__food__name', + self.search_query, cover_density=True)) for r in rank: if self.search_rank is None: @@ -478,7 +529,8 @@ class RecipeSearch(): else: self.search_rank += r # modifying queryset will annotation creates duplicate results - self._filters.append(Q(id__in=Recipe.objects.annotate(vector=SearchVector(*vectors)).filter(Q(vector=self.search_query)))) + self._filters.append(Q(id__in=Recipe.objects.annotate( + vector=SearchVector(*vectors)).filter(Q(vector=self.search_query)))) def build_text_filters(self, string=None): if not string: @@ -510,23 +562,30 @@ class RecipeSearch(): def _makenow_filter(self, missing=None): if missing is None or (type(missing) == bool and missing == False): return - shopping_users = [*self._request.user.get_shopping_share(), self._request.user] + shopping_users = [ + *self._request.user.get_shopping_share(), self._request.user] onhand_filter = ( - Q(steps__ingredients__food__onhand_users__in=shopping_users) # food onhand - | Q(steps__ingredients__food__substitute__onhand_users__in=shopping_users) # or substitute food onhand - | Q(steps__ingredients__food__in=self.__children_substitute_filter(shopping_users)) - | Q(steps__ingredients__food__in=self.__sibling_substitute_filter(shopping_users)) + Q(steps__ingredients__food__onhand_users__in=shopping_users) # food onhand + # or substitute food onhand + | Q(steps__ingredients__food__substitute__onhand_users__in=shopping_users) + | Q(steps__ingredients__food__in=self.__children_substitute_filter(shopping_users)) + | Q(steps__ingredients__food__in=self.__sibling_substitute_filter(shopping_users)) ) makenow_recipes = Recipe.objects.annotate( - count_food=Count('steps__ingredients__food__pk', filter=Q(steps__ingredients__food__isnull=False), distinct=True), - count_onhand=Count('steps__ingredients__food__pk', filter=onhand_filter, distinct=True), + count_food=Count('steps__ingredients__food__pk', filter=Q( + steps__ingredients__food__isnull=False), distinct=True), + count_onhand=Count('steps__ingredients__food__pk', + filter=onhand_filter, distinct=True), count_ignore_shopping=Count('steps__ingredients__food__pk', filter=Q(steps__ingredients__food__ignore_shopping=True, steps__ingredients__food__recipe__isnull=True), distinct=True), - has_child_sub=Case(When(steps__ingredients__food__in=self.__children_substitute_filter(shopping_users), then=Value(1)), default=Value(0)), - has_sibling_sub=Case(When(steps__ingredients__food__in=self.__sibling_substitute_filter(shopping_users), then=Value(1)), default=Value(0)) + has_child_sub=Case(When(steps__ingredients__food__in=self.__children_substitute_filter( + shopping_users), then=Value(1)), default=Value(0)), + has_sibling_sub=Case(When(steps__ingredients__food__in=self.__sibling_substitute_filter( + shopping_users), then=Value(1)), default=Value(0)) ).annotate(missingfood=F('count_food') - F('count_onhand') - F('count_ignore_shopping')).filter(missingfood=missing) - self._queryset = self._queryset.distinct().filter(id__in=makenow_recipes.values('id')) + self._queryset = self._queryset.distinct().filter( + id__in=makenow_recipes.values('id')) @staticmethod def __children_substitute_filter(shopping_users=None): @@ -547,7 +606,8 @@ class RecipeSearch(): @staticmethod def __sibling_substitute_filter(shopping_users=None): sibling_onhand_subquery = Food.objects.filter( - path__startswith=Substr(OuterRef('path'), 1, Food.steplen * (OuterRef('depth') - 1)), + path__startswith=Substr( + OuterRef('path'), 1, Food.steplen * (OuterRef('depth') - 1)), depth=OuterRef('depth'), onhand_users__in=shopping_users ) @@ -586,7 +646,8 @@ class RecipeFacet(): self.Recent = self._cache.get('Recent', None) if self._queryset is not None: - self._recipe_list = list(self._queryset.values_list('id', flat=True)) + self._recipe_list = list( + self._queryset.values_list('id', flat=True)) self._search_params = { 'keyword_list': self._request.query_params.getlist('keywords', []), 'food_list': self._request.query_params.getlist('foods', []), @@ -618,7 +679,8 @@ class RecipeFacet(): 'Books': self.Books } - caches['default'].set(self._SEARCH_CACHE_KEY, self._cache, self._cache_timeout) + caches['default'].set(self._SEARCH_CACHE_KEY, + self._cache, self._cache_timeout) def get_facets(self, from_cache=False): if from_cache: @@ -655,13 +717,16 @@ class RecipeFacet(): def get_keywords(self): if self.Keywords is None: if self._search_params['search_keywords_or']: - keywords = Keyword.objects.filter(space=self._request.space).distinct() + keywords = Keyword.objects.filter( + space=self._request.space).distinct() else: - keywords = Keyword.objects.filter(Q(recipe__in=self._recipe_list) | Q(depth=1)).filter(space=self._request.space).distinct() + keywords = Keyword.objects.filter(Q(recipe__in=self._recipe_list) | Q( + depth=1)).filter(space=self._request.space).distinct() # set keywords to root objects only keywords = self._keyword_queryset(keywords) - self.Keywords = [{**x, 'children': None} if x['numchild'] > 0 else x for x in list(keywords)] + self.Keywords = [{**x, 'children': None} + if x['numchild'] > 0 else x for x in list(keywords)] self.set_cache('Keywords', self.Keywords) return self.Keywords @@ -669,28 +734,28 @@ class RecipeFacet(): if self.Foods is None: # # if using an OR search, will annotate all keywords, otherwise, just those that appear in results if self._search_params['search_foods_or']: - foods = Food.objects.filter(space=self._request.space).distinct() + foods = Food.objects.filter( + space=self._request.space).distinct() else: - foods = Food.objects.filter(Q(ingredient__step__recipe__in=self._recipe_list) | Q(depth=1)).filter(space=self._request.space).distinct() + foods = Food.objects.filter(Q(ingredient__step__recipe__in=self._recipe_list) | Q( + depth=1)).filter(space=self._request.space).distinct() # set keywords to root objects only foods = self._food_queryset(foods) - self.Foods = [{**x, 'children': None} if x['numchild'] > 0 else x for x in list(foods)] + self.Foods = [{**x, 'children': None} + if x['numchild'] > 0 else x for x in list(foods)] self.set_cache('Foods', self.Foods) return self.Foods - def get_books(self): - if self.Books is None: - self.Books = [] - return self.Books - def get_ratings(self): if self.Ratings is None: if not self._request.space.demo and self._request.space.show_facet_count: if self._queryset is None: - self._queryset = Recipe.objects.filter(id__in=self._recipe_list) - rating_qs = self._queryset.annotate(rating=Round(Avg(Case(When(cooklog__created_by=self._request.user, then='cooklog__rating'), default=Value(0))))) + self._queryset = Recipe.objects.filter( + id__in=self._recipe_list) + rating_qs = self._queryset.annotate(rating=Round(Avg(Case(When( + cooklog__created_by=self._request.user, then='cooklog__rating'), default=Value(0))))) self.Ratings = dict(Counter(r.rating for r in rating_qs)) else: self.Rating = {} @@ -715,10 +780,13 @@ class RecipeFacet(): foods = self._food_queryset(food.get_children(), food) deep_search = self.Foods for node in nodes: - index = next((i for i, x in enumerate(deep_search) if x["id"] == node.id), None) + index = next((i for i, x in enumerate( + deep_search) if x["id"] == node.id), None) deep_search = deep_search[index]['children'] - index = next((i for i, x in enumerate(deep_search) if x["id"] == food.id), None) - deep_search[index]['children'] = [{**x, 'children': None} if x['numchild'] > 0 else x for x in list(foods)] + index = next((i for i, x in enumerate( + deep_search) if x["id"] == food.id), None) + deep_search[index]['children'] = [ + {**x, 'children': None} if x['numchild'] > 0 else x for x in list(foods)] self.set_cache('Foods', self.Foods) return self.get_facets() @@ -731,10 +799,13 @@ class RecipeFacet(): keywords = self._keyword_queryset(keyword.get_children(), keyword) deep_search = self.Keywords for node in nodes: - index = next((i for i, x in enumerate(deep_search) if x["id"] == node.id), None) + index = next((i for i, x in enumerate( + deep_search) if x["id"] == node.id), None) deep_search = deep_search[index]['children'] - index = next((i for i, x in enumerate(deep_search) if x["id"] == keyword.id), None) - deep_search[index]['children'] = [{**x, 'children': None} if x['numchild'] > 0 else x for x in list(keywords)] + index = next((i for i, x in enumerate(deep_search) + if x["id"] == keyword.id), None) + deep_search[index]['children'] = [ + {**x, 'children': None} if x['numchild'] > 0 else x for x in list(keywords)] self.set_cache('Keywords', self.Keywords) return self.get_facets() diff --git a/cookbook/helper/recipe_url_import.py b/cookbook/helper/recipe_url_import.py index 2ed85b082..f9398294f 100644 --- a/cookbook/helper/recipe_url_import.py +++ b/cookbook/helper/recipe_url_import.py @@ -1,8 +1,8 @@ -import random +# import random import re from html import unescape -from unicodedata import decomposition +from django.core.cache import caches from django.utils.dateparse import parse_duration from django.utils.translation import gettext as _ from isodate import parse_duration as iso_parse_duration @@ -10,9 +10,12 @@ from isodate.isoerror import ISO8601Error 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 import recipe_url_import as helper from cookbook.helper.ingredient_parser import IngredientParser -from cookbook.models import Keyword +from cookbook.models import Automation, Keyword + +# from unicodedata import decomposition + # from recipe_scrapers._utils import get_minutes ## temporary until/unless upstream incorporates get_minutes() PR @@ -121,7 +124,13 @@ def get_from_scraper(scrape, request): try: keywords.append(source_url.replace('http://', '').replace('https://', '').split('/')[0]) except Exception: - pass + recipe_json['source_url'] = '' + + try: + if scrape.author(): + keywords.append(scrape.author()) + except Exception: + pass try: recipe_json['keywords'] = parse_keywords(list(set(map(str.casefold, keywords))), request.space) @@ -139,42 +148,58 @@ def get_from_scraper(scrape, request): if len(recipe_json['steps']) == 0: recipe_json['steps'].append({'instruction': '', 'ingredients': [], }) - if len(parse_description(description)) > 256: # split at 256 as long descriptions dont look good on recipe cards - recipe_json['steps'][0]['instruction'] = f'*{parse_description(description)}* \n\n' + recipe_json['steps'][0]['instruction'] + parsed_description = parse_description(description) + # TODO notify user about limit if reached + # limits exist to limit the attack surface for dos style attacks + automations = Automation.objects.filter(type=Automation.DESCRIPTION_REPLACE, space=request.space, disabled=False).only('param_1', 'param_2', 'param_3').all().order_by('order')[:512] + for a in automations: + if re.match(a.param_1, (recipe_json['source_url'])[:512]): + parsed_description = re.sub(a.param_2, a.param_3, parsed_description, count=1) + + if len(parsed_description) > 256: # split at 256 as long descriptions don't look good on recipe cards + recipe_json['steps'][0]['instruction'] = f'*{parsed_description}* \n\n' + recipe_json['steps'][0]['instruction'] else: - recipe_json['description'] = parse_description(description)[:512] + recipe_json['description'] = parsed_description[:512] try: for x in scrape.ingredients(): - try: - amount, unit, ingredient, note = ingredient_parser.parse(x) - ingredient = { - 'amount': amount, - 'food': { - 'name': ingredient, - }, - 'unit': None, - 'note': note, - 'original_text': x - } - if unit: - ingredient['unit'] = {'name': unit, } - recipe_json['steps'][0]['ingredients'].append(ingredient) - except Exception: - recipe_json['steps'][0]['ingredients'].append( - { - 'amount': 0, - 'unit': None, + if x.strip() != '': + try: + amount, unit, ingredient, note = ingredient_parser.parse(x) + ingredient = { + 'amount': amount, 'food': { - 'name': x, + 'name': ingredient, }, - 'note': '', + 'unit': None, + 'note': note, 'original_text': x } - ) + if unit: + ingredient['unit'] = {'name': unit, } + recipe_json['steps'][0]['ingredients'].append(ingredient) + except Exception: + recipe_json['steps'][0]['ingredients'].append( + { + 'amount': 0, + 'unit': None, + 'food': { + 'name': x, + }, + 'note': '', + 'original_text': x + } + ) except Exception: pass + if recipe_json['source_url']: + automations = Automation.objects.filter(type=Automation.INSTRUCTION_REPLACE, space=request.space, disabled=False).only('param_1', 'param_2', 'param_3').order_by('order').all()[:512] + for a in automations: + if re.match(a.param_1, (recipe_json['source_url'])[:512]): + for s in recipe_json['steps']: + s['instruction'] = re.sub(a.param_2, a.param_3, s['instruction']) + return recipe_json @@ -224,10 +249,27 @@ def parse_description(description): def clean_instruction_string(instruction): - normalized_string = normalize_string(instruction) + # handle HTML tags that can be converted to markup + normalized_string = instruction \ + .replace("", "**") \ + .replace("", "**") \ + .replace("", "**") \ + .replace("", "**") + normalized_string = normalize_string(normalized_string) normalized_string = normalized_string.replace('\n', ' \n') normalized_string = normalized_string.replace(' \n \n', '\n\n') - return normalized_string + + # handle unsupported, special UTF8 character in Thermomix-specific instructions, + # that happen in nearly every recipe on Cookidoo, Zaubertopf Club, Rezeptwelt + # and in Thermomix-specific recipes on many other sites + return normalized_string \ + .replace("", _('reverse rotation')) \ + .replace("", _('careful rotation')) \ + .replace("", _('knead')) \ + .replace("Andicken ", _('thicken')) \ + .replace("Erwärmen ", _('warm up')) \ + .replace("Fermentieren ", _('ferment')) \ + .replace("Sous-vide ", _("sous-vide")) def parse_instructions(instructions): @@ -299,6 +341,11 @@ def parse_servings_text(servings): servings = re.sub("\d+", '', servings).strip() except Exception: servings = '' + if type(servings) == list: + try: + servings = parse_servings_text(servings[1]) + except Exception: + pass return str(servings)[:32] @@ -322,10 +369,28 @@ def parse_time(recipe_time): def parse_keywords(keyword_json, space): keywords = [] + keyword_aliases = {} + # retrieve keyword automation cache if it exists, otherwise build from database + KEYWORD_CACHE_KEY = f'automation_keyword_alias_{space.pk}' + if c := caches['default'].get(KEYWORD_CACHE_KEY, None): + self.food_aliases = c + caches['default'].touch(KEYWORD_CACHE_KEY, 30) + else: + for a in Automation.objects.filter(space=space, disabled=False, type=Automation.KEYWORD_ALIAS).only('param_1', 'param_2').order_by('order').all(): + keyword_aliases[a.param_1] = a.param_2 + caches['default'].set(KEYWORD_CACHE_KEY, keyword_aliases, 30) + # keywords as list for kw in keyword_json: kw = normalize_string(kw) + # if alias exists use that instead + if len(kw) != 0: + if keyword_aliases: + try: + kw = keyword_aliases[kw] + except KeyError: + pass if k := Keyword.objects.filter(name=kw, space=space).first(): keywords.append({'label': str(k), 'name': k.name, 'id': k.id}) else: @@ -396,3 +461,18 @@ def get_images_from_soup(soup, url): if 'http' in u: images.append(u) return images + + +def clean_dict(input_dict, key): + if type(input_dict) == dict: + for x in list(input_dict): + if x == key: + del input_dict[x] + elif type(input_dict[x]) == dict: + input_dict[x] = clean_dict(input_dict[x], key) + elif type(input_dict[x]) == list: + temp_list = [] + for e in input_dict[x]: + temp_list.append(clean_dict(e, key)) + + return input_dict diff --git a/cookbook/helper/shopping_helper.py b/cookbook/helper/shopping_helper.py index 1783ca421..c4a8b0796 100644 --- a/cookbook/helper/shopping_helper.py +++ b/cookbook/helper/shopping_helper.py @@ -47,6 +47,8 @@ class RecipeShoppingEditor(): self.mealplan = self._kwargs.get('mealplan', None) if type(self.mealplan) in [int, float]: self.mealplan = MealPlan.objects.filter(id=self.mealplan, space=self.space) + if type(self.mealplan) == dict: + self.mealplan = MealPlan.objects.filter(id=self.mealplan['id'], space=self.space).first() self.id = self._kwargs.get('id', None) self._shopping_list_recipe = self.get_shopping_list_recipe(self.id, self.created_by, self.space) @@ -107,7 +109,10 @@ class RecipeShoppingEditor(): self.servings = float(servings) if mealplan := kwargs.get('mealplan', None): - self.mealplan = mealplan + if type(mealplan) == dict: + self.mealplan = MealPlan.objects.filter(id=mealplan['id'], space=self.space).first() + else: + self.mealplan = mealplan self.recipe = mealplan.recipe elif recipe := kwargs.get('recipe', None): self.recipe = recipe @@ -310,4 +315,4 @@ class RecipeShoppingEditor(): # ) # # return all shopping list items -# return list_recipe +# return list_recipe \ No newline at end of file diff --git a/cookbook/integration/integration.py b/cookbook/integration/integration.py index b54e7e560..dbe3d6678 100644 --- a/cookbook/integration/integration.py +++ b/cookbook/integration/integration.py @@ -1,16 +1,12 @@ -import time +import traceback import datetime -import json import traceback import uuid -from io import BytesIO, StringIO +from io import BytesIO from zipfile import BadZipFile, ZipFile -import lxml -from django.core.cache import cache -import datetime - from bs4 import Tag +from django.core.cache import cache from django.core.exceptions import ObjectDoesNotExist from django.core.files import File from django.db import IntegrityError @@ -20,8 +16,7 @@ from django.utils.translation import gettext as _ from django_scopes import scope from lxml import etree -from cookbook.forms import ImportExportBase -from cookbook.helper.image_processing import get_filetype, handle_image +from cookbook.helper.image_processing import handle_image from cookbook.models import Keyword, Recipe from recipes.settings import DEBUG from recipes.settings import EXPORT_FILE_CACHE_DURATION @@ -182,7 +177,7 @@ class Integration: traceback.print_exc() self.handle_exception(e, log=il, message=f'-------------------- \nERROR \n{e}\n--------------------\n') import_zip.close() - elif '.json' in f['name'] or '.txt' in f['name'] or '.mmf' in f['name'] or '.rk' in f['name'] or '.melarecipe' in f['name']: + elif '.json' in f['name'] or '.xml' in f['name'] or '.txt' in f['name'] or '.mmf' in f['name'] or '.rk' in f['name'] or '.melarecipe' in f['name']: data_list = self.split_recipe_file(f['file']) il.total_recipes += len(data_list) for d in data_list: diff --git a/cookbook/integration/mealie.py b/cookbook/integration/mealie.py index 803cc6382..ccd16ce93 100644 --- a/cookbook/integration/mealie.py +++ b/cookbook/integration/mealie.py @@ -5,6 +5,7 @@ from zipfile import ZipFile from cookbook.helper.image_processing import get_filetype from cookbook.helper.ingredient_parser import IngredientParser +from cookbook.helper.recipe_url_import import parse_servings, parse_servings_text, parse_time from cookbook.integration.integration import Integration from cookbook.models import Ingredient, Recipe, Step @@ -23,41 +24,60 @@ class Mealie(Integration): name=recipe_json['name'].strip(), description=description, created_by=self.request.user, internal=True, space=self.request.space) - # TODO parse times (given in PT2H3M ) - # @vabene check recipe_url_import.iso_duration_to_minutes I think it does what you are looking for - - ingredients_added = False for s in recipe_json['recipe_instructions']: - step = Step.objects.create( - instruction=s['text'], space=self.request.space, - ) - if not ingredients_added: - ingredients_added = True - - if len(recipe_json['description'].strip()) > 500: - step.instruction = recipe_json['description'].strip() + '\n\n' + step.instruction - - ingredient_parser = IngredientParser(self.request, True) - for ingredient in recipe_json['recipe_ingredient']: - try: - if ingredient['food']: - f = ingredient_parser.get_food(ingredient['food']) - u = ingredient_parser.get_unit(ingredient['unit']) - amount = ingredient['quantity'] - note = ingredient['note'] - original_text = None - else: - amount, unit, food, note = ingredient_parser.parse(ingredient['note']) - f = ingredient_parser.get_food(food) - u = ingredient_parser.get_unit(unit) - original_text = ingredient['note'] - step.ingredients.add(Ingredient.objects.create( - food=f, unit=u, amount=amount, note=note, original_text=original_text, space=self.request.space, - )) - except Exception: - pass + step = Step.objects.create(instruction=s['text'], space=self.request.space, ) recipe.steps.add(step) + step = recipe.steps.first() + if not step: # if there is no step in the exported data + step = Step.objects.create(instruction='', space=self.request.space, ) + recipe.steps.add(step) + + if len(recipe_json['description'].strip()) > 500: + step.instruction = recipe_json['description'].strip() + '\n\n' + step.instruction + + ingredient_parser = IngredientParser(self.request, True) + for ingredient in recipe_json['recipe_ingredient']: + try: + if ingredient['food']: + f = ingredient_parser.get_food(ingredient['food']) + u = ingredient_parser.get_unit(ingredient['unit']) + amount = ingredient['quantity'] + note = ingredient['note'] + original_text = None + else: + amount, unit, food, note = ingredient_parser.parse(ingredient['note']) + f = ingredient_parser.get_food(food) + u = ingredient_parser.get_unit(unit) + original_text = ingredient['note'] + step.ingredients.add(Ingredient.objects.create( + food=f, unit=u, amount=amount, note=note, original_text=original_text, space=self.request.space, + )) + except Exception: + pass + + if 'notes' in recipe_json and len(recipe_json['notes']) > 0: + notes_text = "#### Notes \n\n" + for n in recipe_json['notes']: + notes_text += f'{n["text"]} \n' + + step = Step.objects.create( + instruction=notes_text, space=self.request.space, + ) + recipe.steps.add(step) + + if 'recipe_yield' in recipe_json: + recipe.servings = parse_servings(recipe_json['recipe_yield']) + recipe.servings_text = parse_servings_text(recipe_json['recipe_yield']) + + if 'total_time' in recipe_json and recipe_json['total_time'] is not None: + recipe.working_time = parse_time(recipe_json['total_time']) + + if 'org_url' in recipe_json: + recipe.source_url = recipe_json['org_url'] + + recipe.save() + for f in self.files: if '.zip' in f['name']: import_zip = ZipFile(f['file']) diff --git a/cookbook/integration/openeats.py b/cookbook/integration/openeats.py index a8485f050..9188ca8de 100644 --- a/cookbook/integration/openeats.py +++ b/cookbook/integration/openeats.py @@ -2,24 +2,54 @@ import json from cookbook.helper.ingredient_parser import IngredientParser from cookbook.integration.integration import Integration -from cookbook.models import Ingredient, Recipe, Step - +from cookbook.models import Ingredient, Recipe, Step, Keyword, Comment, CookLog +from django.utils.translation import gettext as _ class OpenEats(Integration): def get_recipe_from_file(self, file): - recipe = Recipe.objects.create(name=file['name'].strip(), created_by=self.request.user, internal=True, + + description = file['info'] + description_max_length = Recipe._meta.get_field('description').max_length + if len(description) > description_max_length: + description = description[0:description_max_length] + + recipe = Recipe.objects.create(name=file['name'].strip(), description=description, created_by=self.request.user, internal=True, servings=file['servings'], space=self.request.space, waiting_time=file['cook_time'], working_time=file['prep_time']) instructions = '' - if file["info"] != '': - instructions += file["info"] if file["directions"] != '': instructions += file["directions"] if file["source"] != '': - instructions += file["source"] + instructions += '\n' + _('Recipe source:') + f'[{file["source"]}]({file["source"]})' + + cuisine_keyword, created = Keyword.objects.get_or_create(name="Cuisine", space=self.request.space) + if file["cuisine"] != '': + keyword, created = Keyword.objects.get_or_create(name=file["cuisine"].strip(), space=self.request.space) + if created: + keyword.move(cuisine_keyword, pos="last-child") + recipe.keywords.add(keyword) + + course_keyword, created = Keyword.objects.get_or_create(name="Course", space=self.request.space) + if file["course"] != '': + keyword, created = Keyword.objects.get_or_create(name=file["course"].strip(), space=self.request.space) + if created: + keyword.move(course_keyword, pos="last-child") + recipe.keywords.add(keyword) + + for tag in file["tags"]: + keyword, created = Keyword.objects.get_or_create(name=tag.strip(), space=self.request.space) + recipe.keywords.add(keyword) + + for comment in file['comments']: + Comment.objects.create(recipe=recipe, text=comment['text'], created_by=self.request.user) + CookLog.objects.create(recipe=recipe, rating=comment['rating'], created_by=self.request.user, space=self.request.space) + + if file["photo"] != '': + recipe.image = f'recipes/openeats-import/{file["photo"]}' + recipe.save() step = Step.objects.create(instruction=instructions, space=self.request.space,) @@ -38,6 +68,9 @@ class OpenEats(Integration): recipe_json = json.loads(file.read()) recipe_dict = {} ingredient_group_dict = {} + cuisine_group_dict = {} + course_group_dict = {} + tag_group_dict = {} for o in recipe_json: if o['model'] == 'recipe.recipe': @@ -50,11 +83,27 @@ class OpenEats(Integration): 'cook_time': o['fields']['cook_time'], 'servings': o['fields']['servings'], 'ingredients': [], + 'photo': o['fields']['photo'], + 'cuisine': o['fields']['cuisine'], + 'course': o['fields']['course'], + 'tags': o['fields']['tags'], + 'comments': [], } if o['model'] == 'ingredient.ingredientgroup': ingredient_group_dict[o['pk']] = o['fields']['recipe'] + if o['model'] == 'recipe_groups.cuisine': + cuisine_group_dict[o['pk']] = o['fields']['title'] + if o['model'] == 'recipe_groups.course': + course_group_dict[o['pk']] = o['fields']['title'] + if o['model'] == 'recipe_groups.tag': + tag_group_dict[o['pk']] = o['fields']['title'] for o in recipe_json: + if o['model'] == 'rating.rating': + recipe_dict[o['fields']['recipe']]["comments"].append({ + "text": o['fields']['comment'], + "rating": o['fields']['rating'] + }) if o['model'] == 'ingredient.ingredient': ingredient = { 'food': o['fields']['title'], @@ -63,6 +112,15 @@ class OpenEats(Integration): } recipe_dict[ingredient_group_dict[o['fields']['ingredient_group']]]['ingredients'].append(ingredient) + for k, r in recipe_dict.items(): + if r["cuisine"] in cuisine_group_dict: + r["cuisine"] = cuisine_group_dict[r["cuisine"]] + if r["course"] in course_group_dict: + r["course"] = course_group_dict[r["course"]] + for index in range(len(r["tags"])): + if r["tags"][index] in tag_group_dict: + r["tags"][index] = tag_group_dict[r["tags"][index]] + return list(recipe_dict.values()) def get_file_from_recipe(self, recipe): diff --git a/cookbook/integration/paprika.py b/cookbook/integration/paprika.py index 010783e3a..3d78b9eb0 100644 --- a/cookbook/integration/paprika.py +++ b/cookbook/integration/paprika.py @@ -5,6 +5,9 @@ import re from gettext import gettext as _ from io import BytesIO +import requests +import validators + from cookbook.helper.ingredient_parser import IngredientParser from cookbook.helper.recipe_url_import import parse_servings, parse_servings_text from cookbook.integration.integration import Integration @@ -81,7 +84,14 @@ class Paprika(Integration): recipe.steps.add(step) - if recipe_json.get("photo_data", None): - self.import_recipe_image(recipe, BytesIO(base64.b64decode(recipe_json['photo_data'])), filetype='.jpeg') + try: + if recipe_json.get("image_url", None): + url = recipe_json.get("image_url", None) + if validators.url(url, public=True): + response = requests.get(url) + self.import_recipe_image(recipe, BytesIO(response.content)) + except: + if recipe_json.get("photo_data", None): + self.import_recipe_image(recipe, BytesIO(base64.b64decode(recipe_json['photo_data'])), filetype='.jpeg') return recipe diff --git a/cookbook/integration/rezeptsuitede.py b/cookbook/integration/rezeptsuitede.py new file mode 100644 index 000000000..75682e1f6 --- /dev/null +++ b/cookbook/integration/rezeptsuitede.py @@ -0,0 +1,72 @@ +import base64 +from io import BytesIO +from xml import etree + +from lxml import etree + +from cookbook.helper.ingredient_parser import IngredientParser +from cookbook.helper.recipe_url_import import parse_time, parse_servings, parse_servings_text +from cookbook.integration.integration import Integration +from cookbook.models import Ingredient, Recipe, Step, Keyword + + +class Rezeptsuitede(Integration): + + def split_recipe_file(self, file): + return etree.parse(file).getroot().getchildren() + + def get_recipe_from_file(self, file): + recipe_xml = file + + recipe = Recipe.objects.create( + name=recipe_xml.find('head').attrib['title'].strip(), + created_by=self.request.user, internal=True, space=self.request.space) + + if recipe_xml.find('head').attrib['servingtype']: + recipe.servings = parse_servings(recipe_xml.find('head').attrib['servingtype'].strip()) + recipe.servings_text = parse_servings_text(recipe_xml.find('head').attrib['servingtype'].strip()) + + if recipe_xml.find('remark') is not None: # description is a list of
  • 's with text + if recipe_xml.find('remark').find('line') is not None: + recipe.description = recipe_xml.find('remark').find('line').text[:512] + + for prep in recipe_xml.findall('preparation'): + try: + if prep.find('step').text: + step = Step.objects.create( + instruction=prep.find('step').text.strip(), space=self.request.space, + ) + recipe.steps.add(step) + except Exception: + pass + + ingredient_parser = IngredientParser(self.request, True) + + if recipe_xml.find('part').find('ingredient') is not None: + ingredient_step = recipe.steps.first() + if ingredient_step is None: + ingredient_step = Step.objects.create(space=self.request.space, instruction='') + + for ingredient in recipe_xml.find('part').findall('ingredient'): + f = ingredient_parser.get_food(ingredient.attrib['item']) + u = ingredient_parser.get_unit(ingredient.attrib['unit']) + amount, unit, note = ingredient_parser.parse_amount(ingredient.attrib['qty']) + ingredient_step.ingredients.add(Ingredient.objects.create(food=f, unit=u, amount=amount, space=self.request.space, )) + + try: + k, created = Keyword.objects.get_or_create(name=recipe_xml.find('head').find('cat').text.strip(), space=self.request.space) + recipe.keywords.add(k) + except Exception as e: + pass + + recipe.save() + + try: + self.import_recipe_image(recipe, BytesIO(base64.b64decode(recipe_xml.find('head').find('picbin').text)), filetype='.jpeg') + except: + pass + + return recipe + + def get_file_from_recipe(self, recipe): + raise NotImplementedError('Method not implemented in storage integration') diff --git a/cookbook/locale/ar/LC_MESSAGES/django.mo b/cookbook/locale/ar/LC_MESSAGES/django.mo index 0da836d50..fb42d5abc 100644 Binary files a/cookbook/locale/ar/LC_MESSAGES/django.mo and b/cookbook/locale/ar/LC_MESSAGES/django.mo differ diff --git a/cookbook/locale/bg/LC_MESSAGES/django.mo b/cookbook/locale/bg/LC_MESSAGES/django.mo index 2b36ba377..eeb679446 100644 Binary files a/cookbook/locale/bg/LC_MESSAGES/django.mo and b/cookbook/locale/bg/LC_MESSAGES/django.mo differ diff --git a/cookbook/locale/bg/LC_MESSAGES/django.po b/cookbook/locale/bg/LC_MESSAGES/django.po index 8d8bf04f9..37e359a09 100644 --- a/cookbook/locale/bg/LC_MESSAGES/django.po +++ b/cookbook/locale/bg/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ 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" -"Last-Translator: zeon \n" +"PO-Revision-Date: 2023-04-12 11:55+0000\n" +"Last-Translator: noxonad \n" "Language-Team: Bulgarian \n" "Language: bg\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.10.1\n" +"X-Generator: Weblate 4.15\n" #: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 #: .\cookbook\templates\space.html:49 .\cookbook\templates\stats.html:28 @@ -1433,7 +1433,7 @@ msgstr "" #: .\cookbook\templates\index.html:29 msgid "Search recipe ..." -msgstr "Търсете рецепта..." +msgstr "Търсете рецепта ..." #: .\cookbook\templates\index.html:44 msgid "New Recipe" @@ -1818,7 +1818,7 @@ msgid "" msgstr "" " \n" " Пълнотекстови търсения се опитват да нормализират предоставените " -"думи, за да съответстват на често срещани варианти. Например: 'вили, " +"думи, за да съответстват на често срещани варианти. Например: 'вили, " "'вилица', 'вилици' всички ще се нормализират до 'вилиц'.\n" " Има няколко налични метода, описани по-долу, които ще " "контролират как поведението при търсене трябва да реагира, когато се търсят " diff --git a/cookbook/locale/ca/LC_MESSAGES/django.mo b/cookbook/locale/ca/LC_MESSAGES/django.mo index 6f583e9c2..5e08d9fdf 100644 Binary files a/cookbook/locale/ca/LC_MESSAGES/django.mo and b/cookbook/locale/ca/LC_MESSAGES/django.mo differ diff --git a/cookbook/locale/ca/LC_MESSAGES/django.po b/cookbook/locale/ca/LC_MESSAGES/django.po index a209f5817..4e59fe016 100644 --- a/cookbook/locale/ca/LC_MESSAGES/django.po +++ b/cookbook/locale/ca/LC_MESSAGES/django.po @@ -12,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 19:20+0200\n" -"PO-Revision-Date: 2022-05-22 11:20+0000\n" -"Last-Translator: Ramon Aixa Juan \n" +"POT-Creation-Date: 2023-04-26 07:46+0200\n" +"PO-Revision-Date: 2023-04-12 11:55+0000\n" +"Last-Translator: noxonad \n" "Language-Team: Catalan \n" "Language: ca\n" @@ -22,71 +22,57 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.10.1\n" +"X-Generator: Weblate 4.15\n" -#: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 -#: .\cookbook\templates\stats.html:28 -msgid "Ingredients" -msgstr "Ingredients" - -#: .\cookbook\forms.py:53 +#: .\cookbook\forms.py:52 msgid "Default unit" msgstr "Unitat per defecte" -#: .\cookbook\forms.py:54 +#: .\cookbook\forms.py:53 msgid "Use fractions" msgstr "Utilitza fraccions" -#: .\cookbook\forms.py:55 +#: .\cookbook\forms.py:54 msgid "Use KJ" msgstr "Usa KJ" -#: .\cookbook\forms.py:56 +#: .\cookbook\forms.py:55 msgid "Theme" msgstr "Tema" -#: .\cookbook\forms.py:57 +#: .\cookbook\forms.py:56 msgid "Navbar color" msgstr "Color barra" -#: .\cookbook\forms.py:58 +#: .\cookbook\forms.py:57 msgid "Sticky navbar" msgstr "Barra Sticky" -#: .\cookbook\forms.py:59 +#: .\cookbook\forms.py:58 msgid "Default page" msgstr "Pàgina per defecte" -#: .\cookbook\forms.py:60 -msgid "Show recent recipes" -msgstr "Mostra Receptes Recents" - -#: .\cookbook\forms.py:61 -msgid "Search style" -msgstr "Estil de Cerca" - -#: .\cookbook\forms.py:62 +#: .\cookbook\forms.py:59 msgid "Plan sharing" msgstr "Comparteix pla" -#: .\cookbook\forms.py:63 +#: .\cookbook\forms.py:60 msgid "Ingredient decimal places" msgstr "Decimals Ingredients" -#: .\cookbook\forms.py:64 +#: .\cookbook\forms.py:61 msgid "Shopping list auto sync period" msgstr "Auto-sincronització Llista compra" -#: .\cookbook\forms.py:65 .\cookbook\templates\recipe_view.html:21 -#: .\cookbook\templates\stats.html:47 +#: .\cookbook\forms.py:62 .\cookbook\templates\recipe_view.html:36 msgid "Comments" msgstr "Comentaris" -#: .\cookbook\forms.py:66 +#: .\cookbook\forms.py:63 msgid "Left-handed mode" msgstr "Mode per a esquerrans" -#: .\cookbook\forms.py:70 +#: .\cookbook\forms.py:67 msgid "" "Color of the top navigation bar. Not all colors work with all themes, just " "try them out!" @@ -94,13 +80,13 @@ msgstr "" "Color de la barra de navegació superior. No tots els colors funcionen amb " "tots els temes, cal provar-los!" -#: .\cookbook\forms.py:72 +#: .\cookbook\forms.py:69 msgid "Default Unit to be used when inserting a new ingredient into a recipe." msgstr "" "Unitat per defecte que s'utilitzarà quan s'insereixi un ingredient nou en " "una recepta." -#: .\cookbook\forms.py:74 +#: .\cookbook\forms.py:71 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" @@ -108,33 +94,29 @@ msgstr "" "Permet l'ús de fraccions de quantitats d'ingredients (p.ex.: converteix els " "decimals a fraccions automàticament)" -#: .\cookbook\forms.py:76 +#: .\cookbook\forms.py:73 msgid "Display nutritional energy amounts in joules instead of calories" msgstr "Mostra quantitats nutricionals d'energia en joules" -#: .\cookbook\forms.py:77 +#: .\cookbook\forms.py:74 msgid "Users with whom newly created meal plans should be shared by default." msgstr "" "Els usuaris que han creat elements d'un pla de menjars s'haurien de " "compartir per defecte." -#: .\cookbook\forms.py:78 +#: .\cookbook\forms.py:75 msgid "Users with whom to share shopping lists." msgstr "Usuaris amb qui compartir llistes de la compra." -#: .\cookbook\forms.py:80 -msgid "Show recently viewed recipes on search page." -msgstr "Mostra les receptes vistes recentment a la pàgina de cerca." - -#: .\cookbook\forms.py:81 +#: .\cookbook\forms.py:76 msgid "Number of decimals to round ingredients." msgstr "Nombre de decimals dels ingredients." -#: .\cookbook\forms.py:82 +#: .\cookbook\forms.py:77 msgid "If you want to be able to create and see comments underneath recipes." msgstr "Si vols poder crear i veure comentaris a sota de les receptes." -#: .\cookbook\forms.py:84 .\cookbook\forms.py:496 +#: .\cookbook\forms.py:79 .\cookbook\forms.py:492 msgid "" "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. " @@ -147,25 +129,25 @@ msgstr "" "diverses persones, però pot fer servir una mica de dades mòbils. Si és " "inferior al límit d’instància, es restablirà quan es desa." -#: .\cookbook\forms.py:87 +#: .\cookbook\forms.py:82 msgid "Makes the navbar stick to the top of the page." msgstr "Barra de navegació s'enganxi a la part superior de la pàgina." -#: .\cookbook\forms.py:88 .\cookbook\forms.py:499 +#: .\cookbook\forms.py:83 .\cookbook\forms.py:495 msgid "Automatically add meal plan ingredients to shopping list." msgstr "" "Afegeix automàticament els ingredients del pla d'àpats a la llista de la " "compra." -#: .\cookbook\forms.py:89 +#: .\cookbook\forms.py:84 msgid "Exclude ingredients that are on hand." msgstr "Exclou els ingredients que hi ha a mà." -#: .\cookbook\forms.py:90 +#: .\cookbook\forms.py:85 msgid "Will optimize the UI for use with your left hand." msgstr "S'optimitzarà la UI pel seu ús amb la mà esquerra." -#: .\cookbook\forms.py:107 +#: .\cookbook\forms.py:102 msgid "" "Both fields are optional. If none are given the username will be displayed " "instead" @@ -173,36 +155,35 @@ msgstr "" "Tots dos camps són opcionals. Si no se'n dóna cap, es mostrarà el nom " "d'usuari" -#: .\cookbook\forms.py:128 .\cookbook\forms.py:301 +#: .\cookbook\forms.py:123 .\cookbook\forms.py:297 msgid "Name" msgstr "Nom" -#: .\cookbook\forms.py:129 .\cookbook\forms.py:302 -#: .\cookbook\templates\stats.html:24 .\cookbook\views\lists.py:88 +#: .\cookbook\forms.py:124 .\cookbook\forms.py:298 .\cookbook\views\lists.py:88 msgid "Keywords" msgstr "Paraules clau" -#: .\cookbook\forms.py:130 +#: .\cookbook\forms.py:125 msgid "Preparation time in minutes" msgstr "Temps de preparació en minuts" -#: .\cookbook\forms.py:131 +#: .\cookbook\forms.py:126 msgid "Waiting time (cooking/baking) in minutes" msgstr "Temps d'espera (cocció/fornejat) en minuts" -#: .\cookbook\forms.py:132 .\cookbook\forms.py:270 .\cookbook\forms.py:303 +#: .\cookbook\forms.py:127 .\cookbook\forms.py:266 .\cookbook\forms.py:299 msgid "Path" msgstr "Ruta" -#: .\cookbook\forms.py:133 +#: .\cookbook\forms.py:128 msgid "Storage UID" msgstr "UID Emmagatzematge" -#: .\cookbook\forms.py:165 +#: .\cookbook\forms.py:161 msgid "Default" msgstr "Per defecte" -#: .\cookbook\forms.py:177 +#: .\cookbook\forms.py:173 msgid "" "To prevent duplicates recipes with the same name as existing ones are " "ignored. Check this box to import everything." @@ -210,21 +191,21 @@ msgstr "" "Per evitar duplicats, s'ignoren les receptes amb el mateix nom que les " "existents. Marqueu aquesta casella per importar-ho tot." -#: .\cookbook\forms.py:200 +#: .\cookbook\forms.py:196 msgid "Add your comment: " msgstr "Afegir el teu comentari: " -#: .\cookbook\forms.py:215 +#: .\cookbook\forms.py:211 msgid "Leave empty for dropbox and enter app password for nextcloud." msgstr "" "Deixeu-lo buit per a Dropbox i introduïu la contrasenya de l'aplicació per a " "nextcloud." -#: .\cookbook\forms.py:222 +#: .\cookbook\forms.py:218 msgid "Leave empty for nextcloud and enter api token for dropbox." msgstr "Deixeu-lo buit per a nextcloud i introduïu el token API per a Dropbox." -#: .\cookbook\forms.py:231 +#: .\cookbook\forms.py:227 msgid "" "Leave empty for dropbox and enter only base url for nextcloud (/remote." "php/webdav/ is added automatically)" @@ -232,33 +213,33 @@ msgstr "" "Deixeu-lo buit per a Dropbox i introduïu només l'URL base per a Nextcloud " "(/remote.php/webdav/ s'afegeix automàticament)" -#: .\cookbook\forms.py:269 .\cookbook\views\edit.py:157 +#: .\cookbook\forms.py:265 .\cookbook\views\edit.py:157 msgid "Storage" msgstr "Emmagatzematge" -#: .\cookbook\forms.py:271 +#: .\cookbook\forms.py:267 msgid "Active" msgstr "Actiu" -#: .\cookbook\forms.py:277 +#: .\cookbook\forms.py:273 msgid "Search String" msgstr "Cerca Cadena" -#: .\cookbook\forms.py:304 +#: .\cookbook\forms.py:300 msgid "File ID" msgstr "ID d'Arxiu" -#: .\cookbook\forms.py:326 +#: .\cookbook\forms.py:322 msgid "You must provide at least a recipe or a title." msgstr "Has de proporcionar com a mínim una recepta o un títol." -#: .\cookbook\forms.py:339 +#: .\cookbook\forms.py:335 msgid "You can list default users to share recipes with in the settings." msgstr "" "Podeu llistar els usuaris predeterminats amb els quals voleu compartir " "receptes a la configuració." -#: .\cookbook\forms.py:340 +#: .\cookbook\forms.py:336 msgid "" "You can use markdown to format this field. See the docs here" @@ -266,15 +247,15 @@ msgstr "" "Podeu utilitzar el marcador per donar format a aquest camp. Consulteu els documents aquí " -#: .\cookbook\forms.py:366 +#: .\cookbook\forms.py:362 msgid "Maximum number of users for this space reached." msgstr "Nombre màxim d'usuaris assolit per a aquest espai." -#: .\cookbook\forms.py:372 +#: .\cookbook\forms.py:368 msgid "Email address already taken!" msgstr "Adreça de correu electrònic existent!" -#: .\cookbook\forms.py:380 +#: .\cookbook\forms.py:376 msgid "" "An email address is not required but if present the invite link will be sent " "to the user." @@ -282,15 +263,15 @@ msgstr "" "No cal una adreça de correu electrònic, però si està present, s'enviarà " "l'enllaç d'invitació a l'usuari." -#: .\cookbook\forms.py:395 +#: .\cookbook\forms.py:391 msgid "Name already taken." msgstr "Nom agafat." -#: .\cookbook\forms.py:406 +#: .\cookbook\forms.py:402 msgid "Accept Terms and Privacy" msgstr "Accepteu les condicions i la privadesa" -#: .\cookbook\forms.py:438 +#: .\cookbook\forms.py:434 msgid "" "Determines how fuzzy a search is if it uses trigram similarity matching (e." "g. low values mean more typos are ignored)." @@ -299,7 +280,7 @@ msgstr "" "de trigrama (p. ex., els valors baixos signifiquen que s'ignoren més errors " "ortogràfics)." -#: .\cookbook\forms.py:448 +#: .\cookbook\forms.py:444 msgid "" "Select type method of search. Click here for " "full description of choices." @@ -307,7 +288,7 @@ msgstr "" "Seleccioneu el tipus de mètode de cerca. Feu clic aquí per obtenir una descripció completa de les opcions." -#: .\cookbook\forms.py:449 +#: .\cookbook\forms.py:445 msgid "" "Use fuzzy matching on units, keywords and ingredients when editing and " "importing recipes." @@ -315,7 +296,7 @@ msgstr "" "Utilitzeu la concordança difusa en unitats, paraules clau i ingredients quan " "editeu i importeu receptes." -#: .\cookbook\forms.py:451 +#: .\cookbook\forms.py:447 msgid "" "Fields to search ignoring accents. Selecting this option can improve or " "degrade search quality depending on language" @@ -323,7 +304,7 @@ msgstr "" "Camps per cercar ignorant els accents. La selecció d'aquesta opció pot " "millorar o degradar la qualitat de la cerca en funció de l'idioma" -#: .\cookbook\forms.py:453 +#: .\cookbook\forms.py:449 msgid "" "Fields to search for partial matches. (e.g. searching for 'Pie' will return " "'pie' and 'piece' and 'soapie')" @@ -331,7 +312,7 @@ msgstr "" "Camps per cercar coincidències parcials. (p. ex., en cercar \"Pastís\" " "tornarà \"pastís\" i \"peça\" i \"sabó\")" -#: .\cookbook\forms.py:455 +#: .\cookbook\forms.py:451 msgid "" "Fields to search for beginning of word matches. (e.g. searching for 'sa' " "will return 'salad' and 'sandwich')" @@ -339,7 +320,7 @@ msgstr "" "Camps per cercar l'inici de les coincidències de paraula. (p. ex., en cercar " "\"sa\" es tornarà \"amanida\" i \"entrepà\")" -#: .\cookbook\forms.py:457 +#: .\cookbook\forms.py:453 msgid "" "Fields to 'fuzzy' search. (e.g. searching for 'recpie' will find 'recipe'.) " "Note: this option will conflict with 'web' and 'raw' methods of search." @@ -348,7 +329,7 @@ msgstr "" "trobareu \"recepta\".) Nota: aquesta opció entrarà en conflicte amb els " "mètodes de cerca \"web\" i \"cru\"." -#: .\cookbook\forms.py:459 +#: .\cookbook\forms.py:455 msgid "" "Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " "only function with fulltext fields." @@ -356,35 +337,35 @@ msgstr "" "Camps per a la cerca de text complet. Nota: els mètodes de cerca \"web\", " "\"frase\" i \"en brut\" només funcionen amb camps de text complet." -#: .\cookbook\forms.py:463 +#: .\cookbook\forms.py:459 msgid "Search Method" msgstr "Mètode de cerca" -#: .\cookbook\forms.py:464 +#: .\cookbook\forms.py:460 msgid "Fuzzy Lookups" msgstr "Cerques difuses" -#: .\cookbook\forms.py:465 +#: .\cookbook\forms.py:461 msgid "Ignore Accent" msgstr "Ignora Accents" -#: .\cookbook\forms.py:466 +#: .\cookbook\forms.py:462 msgid "Partial Match" msgstr "Cerca Parcial" -#: .\cookbook\forms.py:467 +#: .\cookbook\forms.py:463 msgid "Starts With" msgstr "Comença amb" -#: .\cookbook\forms.py:468 +#: .\cookbook\forms.py:464 msgid "Fuzzy Search" msgstr "Cerca Difusa" -#: .\cookbook\forms.py:469 +#: .\cookbook\forms.py:465 msgid "Full Text" msgstr "Text Sencer" -#: .\cookbook\forms.py:494 +#: .\cookbook\forms.py:490 msgid "" "Users will see all items you add to your shopping list. They must add you " "to see items on their list." @@ -392,7 +373,7 @@ msgstr "" "Els usuaris veuran tots els articles que afegiu a la vostra llista de la " "compra. Us han d'afegir per veure els elements de la seva llista." -#: .\cookbook\forms.py:500 +#: .\cookbook\forms.py:496 msgid "" "When adding a meal plan to the shopping list (manually or automatically), " "include all related recipes." @@ -400,7 +381,7 @@ msgstr "" "Quan afegiu un pla d'àpats a la llista de la compra (de manera manual o " "automàtica), inclou totes les receptes relacionades." -#: .\cookbook\forms.py:501 +#: .\cookbook\forms.py:497 msgid "" "When adding a meal plan to the shopping list (manually or automatically), " "exclude ingredients that are on hand." @@ -408,93 +389,97 @@ msgstr "" "Quan afegiu un pla d'àpats a la llista de la compra (manual o " "automàticament), excloeu els ingredients que teniu a mà." -#: .\cookbook\forms.py:502 +#: .\cookbook\forms.py:498 msgid "Default number of hours to delay a shopping list entry." msgstr "" "Nombre d'hores per defecte per retardar l'entrada d'una llista de la compra." -#: .\cookbook\forms.py:503 +#: .\cookbook\forms.py:499 msgid "Filter shopping list to only include supermarket categories." msgstr "" "Filtreu la llista de compres per incloure només categories de supermercats." -#: .\cookbook\forms.py:504 +#: .\cookbook\forms.py:500 msgid "Days of recent shopping list entries to display." msgstr "Dies de les entrades recents de la llista de la compra per mostrar." -#: .\cookbook\forms.py:505 +#: .\cookbook\forms.py:501 msgid "Mark food 'On Hand' when checked off shopping list." msgstr "Marca el menjar com a \"A mà\" quan marqueu la llista de la compra." -#: .\cookbook\forms.py:506 +#: .\cookbook\forms.py:502 msgid "Delimiter to use for CSV exports." msgstr "Delimitador per a les exportacions CSV." -#: .\cookbook\forms.py:507 +#: .\cookbook\forms.py:503 msgid "Prefix to add when copying list to the clipboard." msgstr "Prefix per afegir en copiar la llista al porta-retalls." -#: .\cookbook\forms.py:511 +#: .\cookbook\forms.py:507 msgid "Share Shopping List" msgstr "Compartir Llista de la Compra" -#: .\cookbook\forms.py:512 +#: .\cookbook\forms.py:508 msgid "Autosync" msgstr "Autosync" -#: .\cookbook\forms.py:513 +#: .\cookbook\forms.py:509 msgid "Auto Add Meal Plan" msgstr "Afegeix automàticament un pla d'àpats" -#: .\cookbook\forms.py:514 +#: .\cookbook\forms.py:510 msgid "Exclude On Hand" msgstr "Exclou a mà" -#: .\cookbook\forms.py:515 +#: .\cookbook\forms.py:511 msgid "Include Related" msgstr "Incloure Relacionats" -#: .\cookbook\forms.py:516 +#: .\cookbook\forms.py:512 msgid "Default Delay Hours" msgstr "Hores de retard per defecte" -#: .\cookbook\forms.py:517 +#: .\cookbook\forms.py:513 msgid "Filter to Supermarket" msgstr "Filtrar a supermercat" -#: .\cookbook\forms.py:518 +#: .\cookbook\forms.py:514 msgid "Recent Days" msgstr "Dies recents" -#: .\cookbook\forms.py:519 +#: .\cookbook\forms.py:515 msgid "CSV Delimiter" msgstr "Delimitador CSV" -#: .\cookbook\forms.py:520 +#: .\cookbook\forms.py:516 msgid "List Prefix" msgstr "Prefix de Llista" -#: .\cookbook\forms.py:521 +#: .\cookbook\forms.py:517 msgid "Auto On Hand" msgstr "Auto a mà" -#: .\cookbook\forms.py:531 +#: .\cookbook\forms.py:527 msgid "Reset Food Inheritance" msgstr "Restablir Herència Alimentària" -#: .\cookbook\forms.py:532 +#: .\cookbook\forms.py:528 msgid "Reset all food to inherit the fields configured." msgstr "Restableix tots els aliments per heretar els camps configurats." -#: .\cookbook\forms.py:544 +#: .\cookbook\forms.py:540 msgid "Fields on food that should be inherited by default." msgstr "Camps dels aliments que s'han d'heretar per defecte." -#: .\cookbook\forms.py:545 +#: .\cookbook\forms.py:541 msgid "Show recipe counts on search filters" msgstr "Mostra el recompte de receptes als filtres de cerca" -#: .\cookbook\helper\AllAuthCustomAdapter.py:36 +#: .\cookbook\forms.py:542 +msgid "Use the plural form for units and food inside this space." +msgstr "" + +#: .\cookbook\helper\AllAuthCustomAdapter.py:39 msgid "" "In order to prevent spam, the requested email was not send. Please wait a " "few minutes and try again." @@ -502,64 +487,93 @@ msgstr "" "Per evitar spam, no s'ha enviat el correu electrònic sol·licitat. Espereu " "uns minuts i torneu-ho a provar." -#: .\cookbook\helper\permission_helper.py:149 -#: .\cookbook\helper\permission_helper.py:172 .\cookbook\views\views.py:152 +#: .\cookbook\helper\permission_helper.py:164 +#: .\cookbook\helper\permission_helper.py:187 .\cookbook\views\views.py:117 msgid "You are not logged in and therefore cannot view this page!" msgstr "No heu iniciat la sessió, no podeu veure aquesta pàgina." -#: .\cookbook\helper\permission_helper.py:153 -#: .\cookbook\helper\permission_helper.py:159 -#: .\cookbook\helper\permission_helper.py:184 -#: .\cookbook\helper\permission_helper.py:254 -#: .\cookbook\helper\permission_helper.py:268 -#: .\cookbook\helper\permission_helper.py:279 -#: .\cookbook\helper\permission_helper.py:290 .\cookbook\views\data.py:33 -#: .\cookbook\views\views.py:163 .\cookbook\views\views.py:170 -#: .\cookbook\views\views.py:249 +#: .\cookbook\helper\permission_helper.py:168 +#: .\cookbook\helper\permission_helper.py:174 +#: .\cookbook\helper\permission_helper.py:199 +#: .\cookbook\helper\permission_helper.py:269 +#: .\cookbook\helper\permission_helper.py:283 +#: .\cookbook\helper\permission_helper.py:294 +#: .\cookbook\helper\permission_helper.py:305 +#: .\cookbook\helper\permission_helper.py:321 +#: .\cookbook\helper\permission_helper.py:342 .\cookbook\views\data.py:36 +#: .\cookbook\views\views.py:128 .\cookbook\views\views.py:135 msgid "You do not have the required permissions to view this page!" msgstr "No teniu els permisos necessaris per veure aquesta pàgina!" -#: .\cookbook\helper\permission_helper.py:177 -#: .\cookbook\helper\permission_helper.py:200 -#: .\cookbook\helper\permission_helper.py:222 +#: .\cookbook\helper\permission_helper.py:192 +#: .\cookbook\helper\permission_helper.py:215 #: .\cookbook\helper\permission_helper.py:237 +#: .\cookbook\helper\permission_helper.py:252 msgid "You cannot interact with this object as it is not owned by you!" msgstr "" "No pots interaccionar amb aquest objecte ja que no és de la teva propietat!" -#: .\cookbook\helper\permission_helper.py:321 +#: .\cookbook\helper\permission_helper.py:403 msgid "You have reached the maximum number of recipes for your space." msgstr "Has arribat al nombre màxim de receptes per al vostre espai." -#: .\cookbook\helper\permission_helper.py:333 +#: .\cookbook\helper\permission_helper.py:415 msgid "You have more users than allowed in your space." msgstr "Tens més usuaris dels permesos al teu espai." -#: .\cookbook\helper\recipe_search.py:565 +#: .\cookbook\helper\recipe_search.py:630 msgid "One of queryset or hash_key must be provided" msgstr "S'ha de proporcionar una de queryset o hash_key" -#: .\cookbook\helper\shopping_helper.py:152 +#: .\cookbook\helper\recipe_url_import.py:266 +#, fuzzy +#| msgid "Use fractions" +msgid "reverse rotation" +msgstr "Utilitza fraccions" + +#: .\cookbook\helper\recipe_url_import.py:267 +msgid "careful rotation" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:268 +msgid "knead" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:269 +msgid "thicken" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:270 +msgid "warm up" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:271 +msgid "ferment" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:272 +msgid "sous-vide" +msgstr "" + +#: .\cookbook\helper\shopping_helper.py:157 msgid "You must supply a servings size" msgstr "Heu de proporcionar una mida de porcions" -#: .\cookbook\helper\template_helper.py:64 -#: .\cookbook\helper\template_helper.py:66 +#: .\cookbook\helper\template_helper.py:79 +#: .\cookbook\helper\template_helper.py:81 msgid "Could not parse template code." msgstr "No s'ha pogut analitzar el codi de la plantilla." -#: .\cookbook\integration\copymethat.py:41 +#: .\cookbook\integration\copymethat.py:44 #: .\cookbook\integration\melarecipes.py:37 msgid "Favorite" msgstr "" -#: .\cookbook\integration\copymethat.py:70 -#: .\cookbook\integration\recettetek.py:54 -#: .\cookbook\integration\recipekeeper.py:63 -msgid "Imported from" -msgstr "Importat des de" +#: .\cookbook\integration\copymethat.py:50 +msgid "I made this" +msgstr "" -#: .\cookbook\integration\integration.py:223 +#: .\cookbook\integration\integration.py:218 msgid "" "Importer expected a .zip file. Did you choose the correct importer type for " "your data ?" @@ -567,7 +581,7 @@ msgstr "" "S'esperava un fitxer .zip. Heu escollit el tipus d'importador correcte per a " "les vostres dades?" -#: .\cookbook\integration\integration.py:226 +#: .\cookbook\integration\integration.py:221 msgid "" "An unexpected error occurred during the import. Please make sure you have " "uploaded a valid file." @@ -575,27 +589,38 @@ msgstr "" "S'ha produït un error inesperat durant la importació. Assegureu-vos que heu " "penjat un fitxer vàlid." -#: .\cookbook\integration\integration.py:231 +#: .\cookbook\integration\integration.py:226 msgid "The following recipes were ignored because they already existed:" msgstr "Les receptes següents s'han ignorat perquè ja existien:" -#: .\cookbook\integration\integration.py:235 +#: .\cookbook\integration\integration.py:230 #, python-format msgid "Imported %s recipes." msgstr "%s Receptes Importades." -#: .\cookbook\integration\paprika.py:46 +#: .\cookbook\integration\openeats.py:26 +#, fuzzy +#| msgid "Recipe Home" +msgid "Recipe source:" +msgstr "Receptari" + +#: .\cookbook\integration\paprika.py:49 msgid "Notes" msgstr "Notes" -#: .\cookbook\integration\paprika.py:49 +#: .\cookbook\integration\paprika.py:52 msgid "Nutritional Information" msgstr "Informació Nutricional" -#: .\cookbook\integration\paprika.py:53 +#: .\cookbook\integration\paprika.py:56 msgid "Source" msgstr "Font" +#: .\cookbook\integration\recettetek.py:54 +#: .\cookbook\integration\recipekeeper.py:70 +msgid "Imported from" +msgstr "Importat des de" + #: .\cookbook\integration\saffron.py:23 msgid "Servings" msgstr "Racions" @@ -608,9 +633,7 @@ msgstr "Temps d'espera" msgid "Preparation Time" msgstr "Temps de preparació" -#: .\cookbook\integration\saffron.py:29 -#: .\cookbook\templates\forms\ingredients.html:7 -#: .\cookbook\templates\index.html:7 +#: .\cookbook\integration\saffron.py:29 .\cookbook\templates\index.html:7 msgid "Cookbook" msgstr "Receptari" @@ -652,7 +675,7 @@ msgstr "Sopar" msgid "Other" msgstr "Un altre" -#: .\cookbook\models.py:251 +#: .\cookbook\models.py:261 msgid "" "Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " "upload." @@ -660,136 +683,134 @@ msgstr "" "Emmagatzematge màxim de fitxers per espai en MB. 0 per il·limitat, -1 per " "desactivar la càrrega de fitxers." -#: .\cookbook\models.py:353 .\cookbook\templates\search.html:7 +#: .\cookbook\models.py:365 .\cookbook\templates\search.html:7 +#: .\cookbook\templates\settings.html:18 #: .\cookbook\templates\space_manage.html:7 msgid "Search" msgstr "Cerca" -#: .\cookbook\models.py:354 .\cookbook\templates\base.html:107 +#: .\cookbook\models.py:366 .\cookbook\templates\base.html:110 #: .\cookbook\templates\meal_plan.html:7 .\cookbook\views\delete.py:178 #: .\cookbook\views\edit.py:211 .\cookbook\views\new.py:179 msgid "Meal-Plan" msgstr "Plans de Menjar" -#: .\cookbook\models.py:355 .\cookbook\templates\base.html:115 +#: .\cookbook\models.py:367 .\cookbook\templates\base.html:118 msgid "Books" msgstr "Receptes" -#: .\cookbook\models.py:363 -msgid "Small" -msgstr "Petit" - -#: .\cookbook\models.py:363 -msgid "Large" -msgstr "Gran" - -#: .\cookbook\models.py:363 .\cookbook\templates\generic\new_template.html:6 -#: .\cookbook\templates\generic\new_template.html:14 -msgid "New" -msgstr "Nova" - -#: .\cookbook\models.py:584 +#: .\cookbook\models.py:580 msgid " is part of a recipe step and cannot be deleted" msgstr " forma part d'un pas de recepta i no es pot suprimir" -#: .\cookbook\models.py:1162 .\cookbook\templates\search_info.html:28 +#: .\cookbook\models.py:1181 .\cookbook\templates\search_info.html:28 msgid "Simple" msgstr "Simple" -#: .\cookbook\models.py:1163 .\cookbook\templates\search_info.html:33 +#: .\cookbook\models.py:1182 .\cookbook\templates\search_info.html:33 msgid "Phrase" msgstr "Frase" -#: .\cookbook\models.py:1164 .\cookbook\templates\search_info.html:38 +#: .\cookbook\models.py:1183 .\cookbook\templates\search_info.html:38 msgid "Web" msgstr "Web" -#: .\cookbook\models.py:1165 .\cookbook\templates\search_info.html:47 +#: .\cookbook\models.py:1184 .\cookbook\templates\search_info.html:47 msgid "Raw" msgstr "Cru" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 msgid "Food Alias" msgstr "Alies Menjar" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 msgid "Unit Alias" msgstr "Àlies Unitat" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 msgid "Keyword Alias" msgstr "Àlies Paraula clau" -#: .\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 +#: .\cookbook\models.py:1232 +#, fuzzy +#| msgid "Description" +msgid "Description Replace" +msgstr "Descripció" + +#: .\cookbook\models.py:1232 +#, fuzzy +#| msgid "Instructions" +msgid "Instruction Replace" +msgstr "Instruccions" + +#: .\cookbook\models.py:1258 .\cookbook\views\delete.py:36 +#: .\cookbook\views\edit.py:251 .\cookbook\views\new.py:48 msgid "Recipe" msgstr "Recepta" -#: .\cookbook\models.py:1228 +#: .\cookbook\models.py:1259 #, fuzzy #| msgid "Foods" msgid "Food" msgstr "Menjars" -#: .\cookbook\models.py:1229 .\cookbook\templates\base.html:138 +#: .\cookbook\models.py:1260 .\cookbook\templates\base.html:141 msgid "Keyword" msgstr "Paraula Clau" -#: .\cookbook\serializer.py:207 -msgid "Cannot modify Space owner permission." -msgstr "" - -#: .\cookbook\serializer.py:290 +#: .\cookbook\serializer.py:198 msgid "File uploads are not enabled for this Space." msgstr "Càrregues de fitxers no habilitades en aquest espai." -#: .\cookbook\serializer.py:301 +#: .\cookbook\serializer.py:209 msgid "You have reached your file upload limit." msgstr "Límit de càrrega de fitxers Assolit." -#: .\cookbook\serializer.py:1081 +#: .\cookbook\serializer.py:291 +msgid "Cannot modify Space owner permission." +msgstr "" + +#: .\cookbook\serializer.py:1093 msgid "Hello" msgstr "Hola" -#: .\cookbook\serializer.py:1081 +#: .\cookbook\serializer.py:1093 msgid "You have been invited by " msgstr "Convidat per " -#: .\cookbook\serializer.py:1082 +#: .\cookbook\serializer.py:1094 msgid " to join their Tandoor Recipes space " msgstr " per unir-se al seu espai de Receptes " -#: .\cookbook\serializer.py:1083 +#: .\cookbook\serializer.py:1095 msgid "Click the following link to activate your account: " msgstr "Click per activar el teu compte: " -#: .\cookbook\serializer.py:1084 +#: .\cookbook\serializer.py:1096 msgid "" "If the link does not work use the following code to manually join the space: " msgstr "" "Si l'enllaç no funciona, utilitzeu el codi següent per unir-vos a l'espai: " -#: .\cookbook\serializer.py:1085 +#: .\cookbook\serializer.py:1097 msgid "The invitation is valid until " msgstr "Invitació vàlida fins " -#: .\cookbook\serializer.py:1086 +#: .\cookbook\serializer.py:1098 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " msgstr "" "Tandoor Recipes és un gestor de receptes de codi obert. Comprova a GitHub " -#: .\cookbook\serializer.py:1089 +#: .\cookbook\serializer.py:1101 msgid "Tandoor Recipes Invite" msgstr "Invitació de receptes Tandoor" -#: .\cookbook\serializer.py:1209 +#: .\cookbook\serializer.py:1242 msgid "Existing shopping list to update" msgstr "Llista de la compra existent a actualitzar" -#: .\cookbook\serializer.py:1211 +#: .\cookbook\serializer.py:1244 msgid "" "List of ingredient IDs from the recipe to add, if not provided all " "ingredients will be added." @@ -797,38 +818,31 @@ msgstr "" "Llista d'ingredients IDs de la recepta per afegir, si no es proporciona, " "s'afegiran tots els ingredients." -#: .\cookbook\serializer.py:1213 +#: .\cookbook\serializer.py:1246 msgid "" "Providing a list_recipe ID and servings of 0 will delete that shopping list." msgstr "" "Proporcionant un list_recipe ID i porcions de 0, se suprimirà aquesta llista " "de la compra." -#: .\cookbook\serializer.py:1222 +#: .\cookbook\serializer.py:1255 msgid "Amount of food to add to the shopping list" msgstr "Quantitat de menjar per afegir a la llista de la compra" -#: .\cookbook\serializer.py:1224 +#: .\cookbook\serializer.py:1257 msgid "ID of unit to use for the shopping list" msgstr "ID de la unitat a utilitzar per a la llista de la compra" -#: .\cookbook\serializer.py:1226 +#: .\cookbook\serializer.py:1259 msgid "When set to true will delete all food from active shopping lists." msgstr "" "Quan s'estableix a true, se suprimirà tots els aliments de les llistes de " "compra actives." -#: .\cookbook\tables.py:36 .\cookbook\templates\generic\edit_template.html:6 -#: .\cookbook\templates\generic\edit_template.html:14 -#: .\cookbook\templates\recipes_table.html:82 -msgid "Edit" -msgstr "Edita" - -#: .\cookbook\tables.py:116 .\cookbook\tables.py:131 +#: .\cookbook\tables.py:61 .\cookbook\tables.py:75 #: .\cookbook\templates\generic\delete_template.html:7 #: .\cookbook\templates\generic\delete_template.html:15 #: .\cookbook\templates\generic\edit_template.html:28 -#: .\cookbook\templates\recipes_table.html:90 msgid "Delete" msgstr "Esborra" @@ -856,9 +870,10 @@ msgstr "Adreces Email" #: .\cookbook\templates\account\email.html:12 #: .\cookbook\templates\account\password_change.html:11 #: .\cookbook\templates\account\password_set.html:11 -#: .\cookbook\templates\base.html:293 .\cookbook\templates\settings.html:6 +#: .\cookbook\templates\base.html:296 .\cookbook\templates\settings.html:6 #: .\cookbook\templates\settings.html:17 #: .\cookbook\templates\socialaccount\connections.html:10 +#: .\cookbook\templates\user_settings.html:8 msgid "Settings" msgstr "Opcions" @@ -955,8 +970,8 @@ msgstr "" " emet una nova sol·licitud de " "confirmació d'email." -#: .\cookbook\templates\account\login.html:8 -#: .\cookbook\templates\base.html:340 .\cookbook\templates\openid\login.html:8 +#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:343 +#: .\cookbook\templates\openid\login.html:8 msgid "Login" msgstr "Iniciar Sessió" @@ -976,21 +991,20 @@ msgstr "Inicia Sessió" msgid "Sign Up" msgstr "Donar Alta" +#: .\cookbook\templates\account\login.html:38 +msgid "Lost your password?" +msgstr "Clau Oblidada?" + #: .\cookbook\templates\account\login.html:39 -#: .\cookbook\templates\account\login.html:41 #: .\cookbook\templates\account\password_reset.html:29 msgid "Reset My Password" msgstr "Restablir Clau" -#: .\cookbook\templates\account\login.html:40 -msgid "Lost your password?" -msgstr "Clau Oblidada?" - -#: .\cookbook\templates\account\login.html:52 +#: .\cookbook\templates\account\login.html:50 msgid "Social Login" msgstr "Accés Social" -#: .\cookbook\templates\account\login.html:53 +#: .\cookbook\templates\account\login.html:51 msgid "You can use any of the following providers to sign in." msgstr "Pots utilitzar els proveïdors següents per iniciar sessió." @@ -1016,7 +1030,6 @@ msgstr "Canvia clau" #: .\cookbook\templates\account\password_change.html:12 #: .\cookbook\templates\account\password_set.html:12 -#: .\cookbook\templates\settings.html:76 msgid "Password" msgstr "Clau" @@ -1123,56 +1136,53 @@ 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:330 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:333 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "Documentació API" -#: .\cookbook\templates\base.html:103 .\cookbook\templates\index.html:87 -#: .\cookbook\templates\stats.html:22 +#: .\cookbook\templates\base.html:106 .\cookbook\templates\index.html:87 msgid "Recipes" msgstr "Receptes" -#: .\cookbook\templates\base.html:111 +#: .\cookbook\templates\base.html:114 msgid "Shopping" msgstr "Compres" -#: .\cookbook\templates\base.html:150 .\cookbook\views\lists.py:105 +#: .\cookbook\templates\base.html:153 .\cookbook\views\lists.py:105 msgid "Foods" msgstr "Menjars" -#: .\cookbook\templates\base.html:162 -#: .\cookbook\templates\forms\ingredients.html:24 -#: .\cookbook\templates\stats.html:26 .\cookbook\views\lists.py:122 +#: .\cookbook\templates\base.html:165 .\cookbook\views\lists.py:122 msgid "Units" msgstr "Unitats" -#: .\cookbook\templates\base.html:176 .\cookbook\templates\supermarket.html:7 +#: .\cookbook\templates\base.html:179 .\cookbook\templates\supermarket.html:7 msgid "Supermarket" msgstr "Supermercat" -#: .\cookbook\templates\base.html:188 +#: .\cookbook\templates\base.html:191 msgid "Supermarket Category" msgstr "Categoria de Supermercat" -#: .\cookbook\templates\base.html:200 .\cookbook\views\lists.py:171 +#: .\cookbook\templates\base.html:203 .\cookbook\views\lists.py:171 msgid "Automations" msgstr "Automatitzacions" -#: .\cookbook\templates\base.html:214 .\cookbook\views\lists.py:207 +#: .\cookbook\templates\base.html:217 .\cookbook\views\lists.py:207 msgid "Files" msgstr "Arxius" -#: .\cookbook\templates\base.html:226 +#: .\cookbook\templates\base.html:229 msgid "Batch Edit" msgstr "Edició per lots" -#: .\cookbook\templates\base.html:238 .\cookbook\templates\history.html:6 +#: .\cookbook\templates\base.html:241 .\cookbook\templates\history.html:6 #: .\cookbook\templates\history.html:14 msgid "History" msgstr "Historial" -#: .\cookbook\templates\base.html:252 +#: .\cookbook\templates\base.html:255 #: .\cookbook\templates\ingredient_editor.html:7 #: .\cookbook\templates\ingredient_editor.html:13 #, fuzzy @@ -1180,76 +1190,74 @@ msgstr "Historial" msgid "Ingredient Editor" msgstr "Ingredients" -#: .\cookbook\templates\base.html:264 +#: .\cookbook\templates\base.html:267 #: .\cookbook\templates\export_response.html:7 #: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 msgid "Export" msgstr "Exporta" -#: .\cookbook\templates\base.html:280 .\cookbook\templates\index.html:47 +#: .\cookbook\templates\base.html:283 .\cookbook\templates\index.html:47 msgid "Import Recipe" msgstr "Importa recepta" -#: .\cookbook\templates\base.html:282 +#: .\cookbook\templates\base.html:285 msgid "Create" msgstr "Crea" -#: .\cookbook\templates\base.html:295 +#: .\cookbook\templates\base.html:298 #: .\cookbook\templates\generic\list_template.html:14 -#: .\cookbook\templates\stats.html:43 msgid "External Recipes" msgstr "Receptes Externes" -#: .\cookbook\templates\base.html:298 -#: .\cookbook\templates\space_manage.html:15 +#: .\cookbook\templates\base.html:301 .\cookbook\templates\space_manage.html:15 msgid "Space Settings" msgstr "Opcions d'espai" -#: .\cookbook\templates\base.html:303 .\cookbook\templates\system.html:13 +#: .\cookbook\templates\base.html:306 .\cookbook\templates\system.html:13 msgid "System" msgstr "Sistema" -#: .\cookbook\templates\base.html:305 +#: .\cookbook\templates\base.html:308 msgid "Admin" msgstr "Admin" -#: .\cookbook\templates\base.html:309 +#: .\cookbook\templates\base.html:312 #: .\cookbook\templates\space_overview.html:25 #, fuzzy #| msgid "No Space" msgid "Your Spaces" msgstr "Sense Espai" -#: .\cookbook\templates\base.html:320 +#: .\cookbook\templates\base.html:323 #: .\cookbook\templates\space_overview.html:6 msgid "Overview" msgstr "" -#: .\cookbook\templates\base.html:324 +#: .\cookbook\templates\base.html:327 msgid "Markdown Guide" msgstr "Guia Markdown" -#: .\cookbook\templates\base.html:326 +#: .\cookbook\templates\base.html:329 msgid "GitHub" msgstr "GitHub" -#: .\cookbook\templates\base.html:328 +#: .\cookbook\templates\base.html:331 msgid "Translate Tandoor" msgstr "Tradueix Tandoor" -#: .\cookbook\templates\base.html:332 +#: .\cookbook\templates\base.html:335 msgid "API Browser" msgstr "Navegador API" -#: .\cookbook\templates\base.html:335 +#: .\cookbook\templates\base.html:338 msgid "Log out" msgstr "Tanca sessió" -#: .\cookbook\templates\base.html:357 +#: .\cookbook\templates\base.html:360 msgid "You are using the free version of Tandor" msgstr "" -#: .\cookbook\templates\base.html:358 +#: .\cookbook\templates\base.html:361 msgid "Upgrade Now" msgstr "" @@ -1291,11 +1299,7 @@ msgstr "El camí ha de tenir el format següent" #: .\cookbook\templates\forms\edit_import_recipe.html:14 #: .\cookbook\templates\generic\edit_template.html:23 #: .\cookbook\templates\generic\new_template.html:23 -#: .\cookbook\templates\settings.html:70 -#: .\cookbook\templates\settings.html:112 -#: .\cookbook\templates\settings.html:130 -#: .\cookbook\templates\settings.html:202 -#: .\cookbook\templates\settings.html:213 +#: .\cookbook\templates\settings.html:57 msgid "Save" msgstr "Desa" @@ -1345,41 +1349,6 @@ msgstr "Importa nova Recepta" msgid "Edit Recipe" msgstr "Edita Recepta" -#: .\cookbook\templates\forms\ingredients.html:15 -msgid "Edit Ingredients" -msgstr "Edita Ingredients" - -#: .\cookbook\templates\forms\ingredients.html:16 -msgid "" -"\n" -" The following form can be used if, accidentally, two (or more) units " -"or ingredients where created that should be\n" -" the same.\n" -" It merges two units or ingredients and updates all recipes using " -"them.\n" -" " -msgstr "" -"\n" -" Es pot utilitzar el següent formulari si, de manera accidental dues " -"(o més) unitats o ingredients es van crear haurien\n" -" de ser el mateix.\n" -" Combina dues unitats o ingredients i actualitza totes les receptes " -"amb ells\n" -" " - -#: .\cookbook\templates\forms\ingredients.html:26 -msgid "Are you sure that you want to merge these two units?" -msgstr "Estàs segur que vols combinar aquestes dues unitats?" - -#: .\cookbook\templates\forms\ingredients.html:31 -#: .\cookbook\templates\forms\ingredients.html:40 -msgid "Merge" -msgstr "Combina" - -#: .\cookbook\templates\forms\ingredients.html:36 -msgid "Are you sure that you want to merge these two ingredients?" -msgstr "Estàs segur que vols combinar aquests dos ingredients?" - #: .\cookbook\templates\generic\delete_template.html:21 #, python-format msgid "Are you sure you want to delete the %(title)s: %(object)s " @@ -1401,6 +1370,11 @@ msgstr "Cascada" msgid "Cancel" msgstr "Cancel·la" +#: .\cookbook\templates\generic\edit_template.html:6 +#: .\cookbook\templates\generic\edit_template.html:14 +msgid "Edit" +msgstr "Edita" + #: .\cookbook\templates\generic\edit_template.html:32 msgid "View" msgstr "Veure" @@ -1422,13 +1396,16 @@ msgstr "Filtre" msgid "Import all" msgstr "Importa tot" +#: .\cookbook\templates\generic\new_template.html:6 +#: .\cookbook\templates\generic\new_template.html:14 +msgid "New" +msgstr "Nova" + #: .\cookbook\templates\generic\table_template.html:76 -#: .\cookbook\templates\recipes_table.html:121 msgid "previous" msgstr "anterior" #: .\cookbook\templates\generic\table_template.html:98 -#: .\cookbook\templates\recipes_table.html:143 msgid "next" msgstr "següent" @@ -1440,24 +1417,11 @@ msgstr "Veure Registre" msgid "Cook Log" msgstr "Registre de Receptes" -#: .\cookbook\templates\import.html:6 -msgid "Import Recipes" -msgstr "Importar Receptes" - -#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 #: .\cookbook\templates\import_response.html:7 .\cookbook\views\delete.py:86 #: .\cookbook\views\edit.py:191 msgid "Import" msgstr "Importar" -#: .\cookbook\templates\include\recipe_open_modal.html:18 -msgid "Close" -msgstr "Tanca" - -#: .\cookbook\templates\include\recipe_open_modal.html:32 -msgid "Open Recipe" -msgstr "Obrir Recepta" - #: .\cookbook\templates\include\storage_backend_warning.html:4 msgid "Security Warning" msgstr "Advertència de Seguretat" @@ -1486,7 +1450,7 @@ msgstr "" #: .\cookbook\templates\index.html:29 msgid "Search recipe ..." -msgstr "Cerca Recepta..." +msgstr "Cerca Recepta ..." #: .\cookbook\templates\index.html:44 msgid "New Recipe" @@ -1663,31 +1627,6 @@ msgstr "Capçalera" msgid "Cell" msgstr "Cel·la" -#: .\cookbook\templates\meal_plan_entry.html:6 -msgid "Meal Plan View" -msgstr "Vista Pla de menjars" - -#: .\cookbook\templates\meal_plan_entry.html:18 -msgid "Created by" -msgstr "Creat per" - -#: .\cookbook\templates\meal_plan_entry.html:20 -msgid "Shared with" -msgstr "Compartit per" - -#: .\cookbook\templates\meal_plan_entry.html:48 -#: .\cookbook\templates\recipes_table.html:64 -msgid "Last cooked" -msgstr "Darrera cocció" - -#: .\cookbook\templates\meal_plan_entry.html:50 -msgid "Never cooked before." -msgstr "No cuinat abans." - -#: .\cookbook\templates\meal_plan_entry.html:76 -msgid "Other meals on this day" -msgstr "Altres menjars en aquest dia" - #: .\cookbook\templates\no_groups_info.html:5 #: .\cookbook\templates\no_groups_info.html:12 msgid "No Permissions" @@ -1735,43 +1674,26 @@ msgstr "" msgid "Back" msgstr "" -#: .\cookbook\templates\recipe_view.html:26 +#: .\cookbook\templates\profile.html:7 +msgid "Profile" +msgstr "" + +#: .\cookbook\templates\recipe_view.html:41 msgid "by" msgstr "per" -#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:144 +#: .\cookbook\templates\recipe_view.html:59 .\cookbook\views\delete.py:144 #: .\cookbook\views\edit.py:171 msgid "Comment" msgstr "Comentari" -#: .\cookbook\templates\recipes_table.html:19 -#: .\cookbook\templates\recipes_table.html:23 -msgid "Recipe Image" -msgstr "Imatge de la Recepta" - -#: .\cookbook\templates\recipes_table.html:51 -msgid "Preparation time ca." -msgstr "Temps de Preparació ca." - -#: .\cookbook\templates\recipes_table.html:57 -msgid "Waiting time ca." -msgstr "Temps d'Espera ca." - -#: .\cookbook\templates\recipes_table.html:60 -msgid "External" -msgstr "Extern" - -#: .\cookbook\templates\recipes_table.html:86 -msgid "Log Cooking" -msgstr "Registre de Cuines" - #: .\cookbook\templates\rest_framework\api.html:5 msgid "Recipe Home" msgstr "Receptari" #: .\cookbook\templates\search_info.html:5 #: .\cookbook\templates\search_info.html:9 -#: .\cookbook\templates\settings.html:172 +#: .\cookbook\templates\settings.html:24 msgid "Search Settings" msgstr "Cerca Opcions" @@ -1926,76 +1848,7 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\settings.html:28 -msgid "Account" -msgstr "Compte" - -#: .\cookbook\templates\settings.html:35 -msgid "Preferences" -msgstr "Preferències" - -#: .\cookbook\templates\settings.html:42 -msgid "API-Settings" -msgstr "Opcions API" - -#: .\cookbook\templates\settings.html:49 -msgid "Search-Settings" -msgstr "Cerca-Opcions" - -#: .\cookbook\templates\settings.html:56 -msgid "Shopping-Settings" -msgstr "Compres-Opcions" - -#: .\cookbook\templates\settings.html:65 -msgid "Name Settings" -msgstr "Noms Opcions" - -#: .\cookbook\templates\settings.html:73 -msgid "Account Settings" -msgstr "Opcions de Compte" - -#: .\cookbook\templates\settings.html:75 -msgid "Emails" -msgstr "Emails" - -#: .\cookbook\templates\settings.html:78 -#: .\cookbook\templates\socialaccount\connections.html:11 -msgid "Social" -msgstr "Social" - -#: .\cookbook\templates\settings.html:91 -msgid "Language" -msgstr "Idioma" - -#: .\cookbook\templates\settings.html:121 -msgid "Style" -msgstr "Estil" - -#: .\cookbook\templates\settings.html:142 -msgid "API Token" -msgstr "Token API" - -#: .\cookbook\templates\settings.html:143 -msgid "" -"You can use both basic authentication and token based authentication to " -"access the REST API." -msgstr "" -"Podeu utilitzar tant l’autenticació bàsica com l’autenticació basada en " -"token per accedir a l’API REST." - -#: .\cookbook\templates\settings.html:160 -msgid "" -"Use the token as an Authorization header prefixed by the word token as shown " -"in the following examples:" -msgstr "" -"Utilitzeu el testimoni com a capçalera d'autorització prefixada per la " -"paraula símbol tal com es mostra als exemples següents:" - -#: .\cookbook\templates\settings.html:162 -msgid "or" -msgstr "o" - -#: .\cookbook\templates\settings.html:173 +#: .\cookbook\templates\settings.html:25 msgid "" "There are many options to configure the search depending on your personal " "preferences." @@ -2003,7 +1856,7 @@ msgstr "" "Hi ha moltes opcions per configurar la cerca en funció de les vostres " "preferències personals." -#: .\cookbook\templates\settings.html:174 +#: .\cookbook\templates\settings.html:26 msgid "" "Usually you do not need to configure any of them and can just stick " "with either the default or one of the following presets." @@ -2011,7 +1864,7 @@ msgstr "" "Normalment no cal configurar cap d'ells i només podeu quedar-vos amb " "el valor predeterminat o amb un dels següents valors predefinits." -#: .\cookbook\templates\settings.html:175 +#: .\cookbook\templates\settings.html:27 msgid "" "If you do want to configure the search you can read about the different " "options here." @@ -2019,11 +1872,11 @@ msgstr "" "Si vols configurar la cerca, pots llegir les diferents opcions aquí." -#: .\cookbook\templates\settings.html:180 +#: .\cookbook\templates\settings.html:32 msgid "Fuzzy" msgstr "Difusa" -#: .\cookbook\templates\settings.html:181 +#: .\cookbook\templates\settings.html:33 msgid "" "Find what you need even if your search or the recipe contains typos. Might " "return more results than needed to make sure you find what you are looking " @@ -2032,20 +1885,19 @@ msgstr "" "Trobeu el que necessiteu encara que la cerca o la recepta contingui errors " "d'ortografia. Pot ser que tornin més resultats dels necessaris." -#: .\cookbook\templates\settings.html:182 +#: .\cookbook\templates\settings.html:34 msgid "This is the default behavior" msgstr "Comportament per Defecte" -#: .\cookbook\templates\settings.html:183 -#: .\cookbook\templates\settings.html:191 +#: .\cookbook\templates\settings.html:37 .\cookbook\templates\settings.html:46 msgid "Apply" msgstr "Aplicar" -#: .\cookbook\templates\settings.html:188 +#: .\cookbook\templates\settings.html:42 msgid "Precise" msgstr "Precisar" -#: .\cookbook\templates\settings.html:189 +#: .\cookbook\templates\settings.html:43 msgid "" "Allows fine control over search results but might not return results if too " "many spelling mistakes are made." @@ -2053,14 +1905,10 @@ msgstr "" "Permet un control minuciós sobre els resultats de la cerca, però és possible " "que no es tornin si hi han errors ortogràfics." -#: .\cookbook\templates\settings.html:190 +#: .\cookbook\templates\settings.html:44 msgid "Perfect for large Databases" msgstr "Perfecte per BBDD Grans" -#: .\cookbook\templates\settings.html:207 -msgid "Shopping Settings" -msgstr "Opcions de Compra" - #: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5 msgid "Cookbook Setup" msgstr "Opcions del Cookbook" @@ -2099,6 +1947,10 @@ msgstr "Error a l'intentar moure " msgid "Account Connections" msgstr "Connexions de Compte" +#: .\cookbook\templates\socialaccount\connections.html:11 +msgid "Social" +msgstr "Social" + #: .\cookbook\templates\socialaccount\connections.html:18 msgid "" "You can sign in to your account using any of the following third party\n" @@ -2195,26 +2047,26 @@ msgid "" "You can either be invited into an existing space or create your own one." msgstr "Pots ser convidat a un espai existent o crear el teu propi." -#: .\cookbook\templates\space_overview.html:45 +#: .\cookbook\templates\space_overview.html:53 msgid "Owner" msgstr "" -#: .\cookbook\templates\space_overview.html:49 +#: .\cookbook\templates\space_overview.html:57 #, fuzzy #| msgid "Create Space" msgid "Leave Space" msgstr "Crear Espai" -#: .\cookbook\templates\space_overview.html:70 -#: .\cookbook\templates\space_overview.html:80 +#: .\cookbook\templates\space_overview.html:78 +#: .\cookbook\templates\space_overview.html:88 msgid "Join Space" msgstr "uneix-te a l'espai" -#: .\cookbook\templates\space_overview.html:73 +#: .\cookbook\templates\space_overview.html:81 msgid "Join an existing space." msgstr "Unir-se a espai existent." -#: .\cookbook\templates\space_overview.html:75 +#: .\cookbook\templates\space_overview.html:83 msgid "" "To join an existing space either enter your invite token or click on the " "invite link the space owner send you." @@ -2222,47 +2074,19 @@ msgstr "" "Per unir-vos a un espai existent, introduïu el vostre token d'invitació o " "feu clic a l'enllaç d'invitació." -#: .\cookbook\templates\space_overview.html:88 -#: .\cookbook\templates\space_overview.html:97 +#: .\cookbook\templates\space_overview.html:96 +#: .\cookbook\templates\space_overview.html:105 msgid "Create Space" msgstr "Crear Espai" -#: .\cookbook\templates\space_overview.html:91 +#: .\cookbook\templates\space_overview.html:99 msgid "Create your own recipe space." msgstr "Crear el propi espai de recepta." -#: .\cookbook\templates\space_overview.html:93 +#: .\cookbook\templates\space_overview.html:101 msgid "Start your own recipe space and invite other users to it." msgstr "Inicieu el vostre propi espai de receptes i convideu altres usuaris." -#: .\cookbook\templates\stats.html:4 -msgid "Stats" -msgstr "Estadístiques" - -#: .\cookbook\templates\stats.html:10 -msgid "Statistics" -msgstr "Estadístiques" - -#: .\cookbook\templates\stats.html:19 -msgid "Number of objects" -msgstr "Nombre d'objectes" - -#: .\cookbook\templates\stats.html:30 -msgid "Recipe Imports" -msgstr "Importacions de receptes" - -#: .\cookbook\templates\stats.html:38 -msgid "Objects stats" -msgstr "Estadístiques d'objectes" - -#: .\cookbook\templates\stats.html:41 -msgid "Recipes without Keywords" -msgstr "Receptes sense paraules clau" - -#: .\cookbook\templates\stats.html:45 -msgid "Internal Recipes" -msgstr "Receptes Internes" - #: .\cookbook\templates\system.html:20 msgid "System Information" msgstr "Informació de Sistema" @@ -2389,72 +2213,81 @@ msgstr "" msgid "URL Import" msgstr "Importació d’URL" -#: .\cookbook\views\api.py:105 .\cookbook\views\api.py:197 +#: .\cookbook\views\api.py:110 .\cookbook\views\api.py:202 msgid "Parameter updated_at incorrectly formatted" msgstr "El paràmetre updated_at té un format incorrecte" -#: .\cookbook\views\api.py:217 .\cookbook\views\api.py:320 +#: .\cookbook\views\api.py:222 .\cookbook\views\api.py:325 +#, python-brace-format msgid "No {self.basename} with id {pk} exists" msgstr "No {self.basename} amb id {pk} existeix" -#: .\cookbook\views\api.py:221 +#: .\cookbook\views\api.py:226 msgid "Cannot merge with the same object!" msgstr "No es pot fusionar amb el mateix objecte!" -#: .\cookbook\views\api.py:228 +#: .\cookbook\views\api.py:233 +#, python-brace-format msgid "No {self.basename} with id {target} exists" msgstr "No {self.basename} amb id {target} existeix" -#: .\cookbook\views\api.py:233 +#: .\cookbook\views\api.py:238 msgid "Cannot merge with child object!" msgstr "No es pot combinar amb l'objecte fill!" -#: .\cookbook\views\api.py:266 +#: .\cookbook\views\api.py:271 +#, python-brace-format msgid "{source.name} was merged successfully with {target.name}" msgstr "{source.name} s'ha fusionat amb {target.name}" -#: .\cookbook\views\api.py:271 +#: .\cookbook\views\api.py:276 +#, python-brace-format 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:329 +#: .\cookbook\views\api.py:334 +#, python-brace-format msgid "{child.name} was moved successfully to the root." msgstr "{child.name} s'ha mogut correctament a l'arrel." -#: .\cookbook\views\api.py:332 .\cookbook\views\api.py:350 +#: .\cookbook\views\api.py:337 .\cookbook\views\api.py:355 msgid "An error occurred attempting to move " msgstr "Error a l'intentar moure " -#: .\cookbook\views\api.py:335 +#: .\cookbook\views\api.py:340 msgid "Cannot move an object to itself!" msgstr "No es pot moure un objecte cap a si mateix!" -#: .\cookbook\views\api.py:341 +#: .\cookbook\views\api.py:346 +#, python-brace-format msgid "No {self.basename} with id {parent} exists" msgstr "No existeix {self.basename} amb identificador {parent}" -#: .\cookbook\views\api.py:347 +#: .\cookbook\views\api.py:352 +#, python-brace-format 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:542 +#: .\cookbook\views\api.py:553 +#, python-brace-format msgid "{obj.name} was removed from the shopping list." msgstr "{obj.name} eliminat de la llista de la compra." -#: .\cookbook\views\api.py:547 .\cookbook\views\api.py:879 -#: .\cookbook\views\api.py:892 +#: .\cookbook\views\api.py:558 .\cookbook\views\api.py:888 +#: .\cookbook\views\api.py:901 +#, python-brace-format msgid "{obj.name} was added to the shopping list." msgstr "Afegit {obj.name} a la llista de la compra." -#: .\cookbook\views\api.py:674 +#: .\cookbook\views\api.py:685 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:676 +#: .\cookbook\views\api.py:687 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:720 +#: .\cookbook\views\api.py:731 msgid "" "Query string matched (fuzzy) against recipe name. In the future also " "fulltext search." @@ -2462,7 +2295,7 @@ msgstr "" "Cadena de consulta coincideix (difusa) amb el nom de la recepta. En el futur " "també cerca text complet." -#: .\cookbook\views\api.py:722 +#: .\cookbook\views\api.py:733 #, fuzzy #| msgid "ID of keyword a recipe should have. For multiple repeat parameter." msgid "" @@ -2472,177 +2305,181 @@ msgstr "" "ID de la paraula clau que hauria de tenir una recepta. Per a múltiples " "repeteix paràmetre." -#: .\cookbook\views\api.py:725 +#: .\cookbook\views\api.py:736 msgid "" "Keyword IDs, repeat for multiple. Return recipes with any of the keywords" msgstr "" -#: .\cookbook\views\api.py:728 +#: .\cookbook\views\api.py:739 msgid "" "Keyword IDs, repeat for multiple. Return recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:742 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords." msgstr "" -#: .\cookbook\views\api.py:734 +#: .\cookbook\views\api.py:745 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:736 +#: .\cookbook\views\api.py:747 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:739 +#: .\cookbook\views\api.py:750 msgid "Food IDs, repeat for multiple. Return recipes with any of the foods" msgstr "" -#: .\cookbook\views\api.py:741 +#: .\cookbook\views\api.py:752 msgid "Food IDs, repeat for multiple. Return recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:743 +#: .\cookbook\views\api.py:754 msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods." msgstr "" -#: .\cookbook\views\api.py:745 +#: .\cookbook\views\api.py:756 msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:746 +#: .\cookbook\views\api.py:757 msgid "ID of unit a recipe should have." msgstr "ID d'unitat que hauria de tenir una recepta." -#: .\cookbook\views\api.py:748 +#: .\cookbook\views\api.py:759 msgid "" "Rating a recipe should have or greater. [0 - 5] Negative value filters " "rating less than." msgstr "" -#: .\cookbook\views\api.py:749 +#: .\cookbook\views\api.py:760 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:751 +#: .\cookbook\views\api.py:762 msgid "Book IDs, repeat for multiple. Return recipes with any of the books" msgstr "" -#: .\cookbook\views\api.py:753 +#: .\cookbook\views\api.py:764 msgid "Book IDs, repeat for multiple. Return recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:755 +#: .\cookbook\views\api.py:766 msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books." msgstr "" -#: .\cookbook\views\api.py:757 +#: .\cookbook\views\api.py:768 msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:759 +#: .\cookbook\views\api.py:770 msgid "If only internal recipes should be returned. [true/false]" msgstr "" -#: .\cookbook\views\api.py:761 +#: .\cookbook\views\api.py:772 msgid "Returns the results in randomized order. [true/false]" msgstr "" -#: .\cookbook\views\api.py:763 +#: .\cookbook\views\api.py:774 msgid "Returns new results first in search results. [true/false]" msgstr "" -#: .\cookbook\views\api.py:765 +#: .\cookbook\views\api.py:776 msgid "" "Filter recipes cooked X times or more. Negative values returns cooked less " "than X times" msgstr "" -#: .\cookbook\views\api.py:767 +#: .\cookbook\views\api.py:778 msgid "" "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:769 +#: .\cookbook\views\api.py:780 msgid "" "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:771 +#: .\cookbook\views\api.py:782 msgid "" "Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:773 +#: .\cookbook\views\api.py:784 msgid "" "Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:775 +#: .\cookbook\views\api.py:786 msgid "Filter recipes that can be made with OnHand food. [true/false]" msgstr "" -#: .\cookbook\views\api.py:937 +#: .\cookbook\views\api.py:946 msgid "" "Returns the shopping list entry with a primary key of id. Multiple values " "allowed." msgstr "" -#: .\cookbook\views\api.py:942 +#: .\cookbook\views\api.py:951 msgid "" -"Filter shopping list entries on checked. [true, false, both, recent]" -"
    - recent includes unchecked items and recently completed items." +"Filter shopping list entries on checked. [true, false, both, recent]
    - recent includes unchecked items and recently completed items." msgstr "" -#: .\cookbook\views\api.py:945 +#: .\cookbook\views\api.py:954 msgid "Returns the shopping list entries sorted by supermarket category order." msgstr "" -#: .\cookbook\views\api.py:1140 +#: .\cookbook\views\api.py:1166 msgid "Nothing to do." msgstr "Res a fer." -#: .\cookbook\views\api.py:1160 +#: .\cookbook\views\api.py:1198 msgid "Invalid Url" msgstr "" -#: .\cookbook\views\api.py:1167 +#: .\cookbook\views\api.py:1205 msgid "Connection Refused." msgstr "Connexió Refusada." -#: .\cookbook\views\api.py:1172 +#: .\cookbook\views\api.py:1210 msgid "Bad URL Schema." msgstr "" -#: .\cookbook\views\api.py:1195 +#: .\cookbook\views\api.py:1233 msgid "No usable data could be found." msgstr "No s'han trobat dades utilitzables." -#: .\cookbook\views\api.py:1303 .\cookbook\views\data.py:28 +#: .\cookbook\views\api.py:1326 .\cookbook\views\import_export.py:117 +msgid "Importing is not implemented for this provider" +msgstr "Importació no implementada en aquest proveïdor" + +#: .\cookbook\views\api.py:1372 .\cookbook\views\data.py:31 #: .\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:1325 +#: .\cookbook\views\api.py:1394 msgid "Sync successful!" msgstr "Sincronització correcte" -#: .\cookbook\views\api.py:1330 +#: .\cookbook\views\api.py:1399 msgid "Error synchronizing with Storage" msgstr "Error de sincronització amb emmagatzematge" -#: .\cookbook\views\data.py:97 +#: .\cookbook\views\data.py:100 #, python-format msgid "Batch edit done. %(count)d recipe was updated." msgid_plural "Batch edit done. %(count)d Recipes where updated." @@ -2704,11 +2541,7 @@ msgstr "Canvis desats!" msgid "Error saving changes!" msgstr "Error al desar canvis!" -#: .\cookbook\views\import_export.py:111 .\cookbook\views\import_export.py:150 -msgid "Importing is not implemented for this provider" -msgstr "Importació no implementada en aquest proveïdor" - -#: .\cookbook\views\import_export.py:137 +#: .\cookbook\views\import_export.py:104 msgid "" "The PDF Exporter is not enabled on this instance as it is still in an " "experimental state." @@ -2758,7 +2591,12 @@ msgstr "Nova Recepta importada!" msgid "There was an error importing this recipe!" msgstr "S'ha produït un error en importar la recepta!" -#: .\cookbook\views\views.py:124 +#: .\cookbook\views\views.py:73 .\cookbook\views\views.py:191 +#: .\cookbook\views\views.py:213 .\cookbook\views\views.py:399 +msgid "This feature is not available in the demo version!" +msgstr "Funció no està disponible a la versió de demostració!" + +#: .\cookbook\views\views.py:89 msgid "" "You have successfully created your own recipe space. Start by adding some " "recipes or invite other people to join you." @@ -2766,23 +2604,19 @@ msgstr "" "Espai de Receptes creat correctament. Comenceu afegint algunes receptes o " "convida altres persones a unir-se." -#: .\cookbook\views\views.py:178 +#: .\cookbook\views\views.py:143 msgid "You do not have the required permissions to perform this action!" msgstr "No teniu els permisos necessaris per dur a terme aquesta acció!" -#: .\cookbook\views\views.py:189 +#: .\cookbook\views\views.py:154 msgid "Comment saved!" msgstr "Comentari Desat!" -#: .\cookbook\views\views.py:264 -msgid "This feature is not available in the demo version!" -msgstr "Funció no està disponible a la versió de demostració!" - -#: .\cookbook\views\views.py:324 +#: .\cookbook\views\views.py:253 msgid "You must select at least one field to search!" msgstr "Heu de seleccionar almenys un camp per cercar!" -#: .\cookbook\views\views.py:329 +#: .\cookbook\views\views.py:258 msgid "" "To use this search method you must select at least one full text search " "field!" @@ -2790,11 +2624,11 @@ msgstr "" "Per utilitzar aquest mètode de cerca, heu de seleccionar almenys un camp de " "cerca de text complet!" -#: .\cookbook\views\views.py:333 +#: .\cookbook\views\views.py:262 msgid "Fuzzy search is not compatible with this search method!" msgstr "Cerca difusa no és compatible amb aquest mètode de cerca!" -#: .\cookbook\views\views.py:463 +#: .\cookbook\views\views.py:338 msgid "" "The setup page can only be used to create the first user! If you have " "forgotten your superuser credentials please consult the django documentation " @@ -2804,27 +2638,27 @@ msgstr "" "Si heu oblidat les vostres credencials de superusuari, consulteu la " "documentació de django sobre com restablir les contrasenyes." -#: .\cookbook\views\views.py:470 +#: .\cookbook\views\views.py:345 msgid "Passwords dont match!" msgstr "Les contrasenyes no coincideixen!" -#: .\cookbook\views\views.py:478 +#: .\cookbook\views\views.py:353 msgid "User has been created, please login!" msgstr "L'usuari s'ha creat, si us plau inicieu la sessió!" -#: .\cookbook\views\views.py:494 +#: .\cookbook\views\views.py:369 msgid "Malformed Invite Link supplied!" msgstr "S'ha proporcionat un enllaç d'invitació mal format." -#: .\cookbook\views\views.py:510 +#: .\cookbook\views\views.py:386 msgid "Successfully joined space." msgstr "Unit correctament a l'espai." -#: .\cookbook\views\views.py:516 +#: .\cookbook\views\views.py:392 msgid "Invite Link not valid or already used!" msgstr "L'enllaç d'invitació no és vàlid o ja s'ha utilitzat." -#: .\cookbook\views\views.py:530 +#: .\cookbook\views\views.py:409 msgid "" "Reporting share links is not enabled for this instance. Please notify the " "page administrator to report problems." @@ -2832,7 +2666,7 @@ msgstr "" "Notificació d'enllaços compartits no activada en aquesta instància. Aviseu " "l'administrador per informar dels problemes." -#: .\cookbook\views\views.py:536 +#: .\cookbook\views\views.py:415 msgid "" "Recipe sharing link has been disabled! For additional information please " "contact the page administrator." @@ -2840,6 +2674,169 @@ msgstr "" "L'enllaç per compartir receptes s'ha desactivat! Per obtenir informació " "addicional, poseu-vos en contacte amb l'administrador." +#~ msgid "Ingredients" +#~ msgstr "Ingredients" + +#~ msgid "Show recent recipes" +#~ msgstr "Mostra Receptes Recents" + +#~ msgid "Search style" +#~ msgstr "Estil de Cerca" + +#~ msgid "Show recently viewed recipes on search page." +#~ msgstr "Mostra les receptes vistes recentment a la pàgina de cerca." + +#~ msgid "Small" +#~ msgstr "Petit" + +#~ msgid "Large" +#~ msgstr "Gran" + +#~ msgid "Edit Ingredients" +#~ msgstr "Edita Ingredients" + +#~ msgid "" +#~ "\n" +#~ " The following form can be used if, accidentally, two (or more) " +#~ "units or ingredients where created that should be\n" +#~ " the same.\n" +#~ " It merges two units or ingredients and updates all recipes using " +#~ "them.\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ " Es pot utilitzar el següent formulari si, de manera accidental " +#~ "dues (o més) unitats o ingredients es van crear haurien\n" +#~ " de ser el mateix.\n" +#~ " Combina dues unitats o ingredients i actualitza totes les " +#~ "receptes amb ells\n" +#~ " " + +#~ msgid "Are you sure that you want to merge these two units?" +#~ msgstr "Estàs segur que vols combinar aquestes dues unitats?" + +#~ msgid "Merge" +#~ msgstr "Combina" + +#~ msgid "Are you sure that you want to merge these two ingredients?" +#~ msgstr "Estàs segur que vols combinar aquests dos ingredients?" + +#~ msgid "Import Recipes" +#~ msgstr "Importar Receptes" + +#~ msgid "Close" +#~ msgstr "Tanca" + +#~ msgid "Open Recipe" +#~ msgstr "Obrir Recepta" + +#~ msgid "Meal Plan View" +#~ msgstr "Vista Pla de menjars" + +#~ msgid "Created by" +#~ msgstr "Creat per" + +#~ msgid "Shared with" +#~ msgstr "Compartit per" + +#~ msgid "Last cooked" +#~ msgstr "Darrera cocció" + +#~ msgid "Never cooked before." +#~ msgstr "No cuinat abans." + +#~ msgid "Other meals on this day" +#~ msgstr "Altres menjars en aquest dia" + +#~ msgid "Recipe Image" +#~ msgstr "Imatge de la Recepta" + +#~ msgid "Preparation time ca." +#~ msgstr "Temps de Preparació ca." + +#~ msgid "Waiting time ca." +#~ msgstr "Temps d'Espera ca." + +#~ msgid "External" +#~ msgstr "Extern" + +#~ msgid "Log Cooking" +#~ msgstr "Registre de Cuines" + +#~ msgid "Account" +#~ msgstr "Compte" + +#~ msgid "Preferences" +#~ msgstr "Preferències" + +#~ msgid "API-Settings" +#~ msgstr "Opcions API" + +#~ msgid "Search-Settings" +#~ msgstr "Cerca-Opcions" + +#~ msgid "Shopping-Settings" +#~ msgstr "Compres-Opcions" + +#~ msgid "Name Settings" +#~ msgstr "Noms Opcions" + +#~ msgid "Account Settings" +#~ msgstr "Opcions de Compte" + +#~ msgid "Emails" +#~ msgstr "Emails" + +#~ msgid "Language" +#~ msgstr "Idioma" + +#~ msgid "Style" +#~ msgstr "Estil" + +#~ msgid "API Token" +#~ msgstr "Token API" + +#~ msgid "" +#~ "You can use both basic authentication and token based authentication to " +#~ "access the REST API." +#~ msgstr "" +#~ "Podeu utilitzar tant l’autenticació bàsica com l’autenticació basada en " +#~ "token per accedir a l’API REST." + +#~ msgid "" +#~ "Use the token as an Authorization header prefixed by the word token as " +#~ "shown in the following examples:" +#~ msgstr "" +#~ "Utilitzeu el testimoni com a capçalera d'autorització prefixada per la " +#~ "paraula símbol tal com es mostra als exemples següents:" + +#~ msgid "or" +#~ msgstr "o" + +#~ msgid "Shopping Settings" +#~ msgstr "Opcions de Compra" + +#~ msgid "Stats" +#~ msgstr "Estadístiques" + +#~ msgid "Statistics" +#~ msgstr "Estadístiques" + +#~ msgid "Number of objects" +#~ msgstr "Nombre d'objectes" + +#~ msgid "Recipe Imports" +#~ msgstr "Importacions de receptes" + +#~ msgid "Objects stats" +#~ msgstr "Estadístiques d'objectes" + +#~ msgid "Recipes without Keywords" +#~ msgstr "Receptes sense paraules clau" + +#~ msgid "Internal Recipes" +#~ msgstr "Receptes Internes" + #~ msgid "Show Links" #~ msgstr "Mostra Enllaços" @@ -2980,9 +2977,6 @@ msgstr "" #~ msgid "Text dragged here will be appended to the name." #~ msgstr "Text arrossegat aquí s'afegirà al nom." -#~ msgid "Description" -#~ msgstr "Descripció" - #~ msgid "Text dragged here will be appended to the description." #~ msgstr "Text arrossegat aquí s'afegirà a la descripció." @@ -3001,9 +2995,6 @@ msgstr "" #~ msgid "Ingredients dragged here will be appended to current list." #~ msgstr "Ingredients arrossegats aquí s'afegiran a la llista actual." -#~ msgid "Instructions" -#~ msgstr "Instruccions" - #~ msgid "" #~ "Recipe instructions dragged here will be appended to current instructions." #~ msgstr "" diff --git a/cookbook/locale/cs/LC_MESSAGES/django.mo b/cookbook/locale/cs/LC_MESSAGES/django.mo index 023437f59..fe70e404d 100644 Binary files a/cookbook/locale/cs/LC_MESSAGES/django.mo and b/cookbook/locale/cs/LC_MESSAGES/django.mo differ diff --git a/cookbook/locale/cs/LC_MESSAGES/django.po b/cookbook/locale/cs/LC_MESSAGES/django.po index b0de47e99..18f4d74f6 100644 --- a/cookbook/locale/cs/LC_MESSAGES/django.po +++ b/cookbook/locale/cs/LC_MESSAGES/django.po @@ -6,20 +6,22 @@ # Translators: # Pavel Solař , 2021 # -#, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-02-09 18:01+0100\n" -"PO-Revision-Date: 2020-06-02 19:28+0000\n" -"Last-Translator: Pavel Solař , 2021\n" -"Language-Team: Czech (https://www.transifex.com/django-recipes/teams/110507/cs/)\n" +"PO-Revision-Date: 2023-03-25 11:32+0000\n" +"Last-Translator: Matěj Kubla \n" +"Language-Team: Czech \n" +"Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: cs\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n " +"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" +"X-Generator: Weblate 4.15\n" #: .\cookbook\filters.py:22 .\cookbook\templates\base.html:87 #: .\cookbook\templates\forms\edit_internal_recipe.html:219 @@ -173,7 +175,7 @@ msgstr "Potravina, která by měla být nahrazena." #: .\cookbook\forms.py:198 msgid "Add your comment: " -msgstr "Přidat vlastní komentář:" +msgstr "Přidat vlastní komentář: " #: .\cookbook\forms.py:229 msgid "Leave empty for dropbox and enter app password for nextcloud." @@ -551,7 +553,7 @@ msgstr "Cesta musí být v následujícím formátu" #: .\cookbook\templates\batch\monitor.html:27 msgid "Sync Now!" -msgstr "Zahájit synchronizaci" +msgstr "Zahájit synchronizaci!" #: .\cookbook\templates\batch\waiting.html:4 #: .\cookbook\templates\batch\waiting.html:10 @@ -1034,7 +1036,7 @@ msgstr "Tento text je kurzívou" #: .\cookbook\templates\markdown_info.html:61 #: .\cookbook\templates\markdown_info.html:77 msgid "Blockquotes are also possible" -msgstr "Lze použít i kvotace " +msgstr "Lze použít i kvotace" #: .\cookbook\templates\markdown_info.html:84 msgid "Lists" @@ -1104,8 +1106,8 @@ msgid "" "rel=\"noreferrer noopener\" target=\"_blank\">this one." msgstr "" "Ruční vytváření tabulek pomocí značek je složité. Doporučujeme použít " -"například tento tabulkový editor." +"například tento tabulkový editor." #: .\cookbook\templates\markdown_info.html:155 #: .\cookbook\templates\markdown_info.html:157 @@ -1254,22 +1256,36 @@ msgid "" " " msgstr "" "\n" -"

    Modul jídelníčku umožňuje plánovat jídlo pomocí receptů i poznámek.

    \n" -"

    Jednoduše vyberte recept ze seznamu naposledy navštívených receptů, nebo ho vyhledejte\n" -" s přetáhněte na požadovaný den v rozvrhu. Můžete také přidat poznámku s popiskem\n" -" a poté přetáhnout recept pro vytvoření plánu s vlatními popisky. Vytvořením samotné poznámky\n" -" je možné přetažením pole poznámky do rozvrhu.

    \n" -"

    Kliknutím na recept zobrazíte detailní náhled. Odtud lze také přidat položky\n" -" do nákupního seznamu. Do nákupního seznamu můžete také přidat všechny recepty na daný den\n" -" kliknutím na ikonu nákupního košíku na horní straně tabulky.

    \n" -"

    V běžném případě se jídelníček plánuje hromadně, proto můžete v nastavení definovat\n" -" se kterými uživateli si přejete jídelníčky sdílet.\n" +"

    Modul jídelníčku umožňuje plánovat jídlo " +"pomocí receptů i poznámek.

    \n" +"

    Jednoduše vyberte recept ze seznamu naposledy " +"navštívených receptů, nebo ho vyhledejte\n" +" s přetáhněte na požadovaný den v rozvrhu. " +"Můžete také přidat poznámku s popiskem\n" +" a poté přetáhnout recept pro vytvoření plánu " +"s vlatními popisky. Vytvořením samotné poznámky\n" +" je možné přetažením pole poznámky do " +"rozvrhu.

    \n" +"

    Kliknutím na recept zobrazíte detailní " +"náhled. Odtud lze také přidat položky\n" +" do nákupního seznamu. Do nákupního seznamu " +"můžete také přidat všechny recepty na daný den\n" +" kliknutím na ikonu nákupního košíku na horní " +"straně tabulky.

    \n" +"

    V běžném případě se jídelníček plánuje " +"hromadně, proto můžete v nastavení definovat\n" +" se kterými uživateli si přejete jídelníčky " +"sdílet.\n" "

    \n" -"

    Můžete také upravovat typy jídel, které si přejete naplánovat. Pokud budete sdílet jídelníček \n" +"

    Můžete také upravovat typy jídel, které si " +"přejete naplánovat. Pokud budete sdílet jídelníček \n" " s někým, kdo\n" -" má přidána jiná jídla, jeho typy jídel se objeví i ve vašem seznamu. Pro předcházení\n" +" má přidána jiná jídla, jeho typy jídel se " +"objeví i ve vašem seznamu. Pro předcházení\n" " duplicitám (např. Ostatní, Jiná)\n" -" pojmenujte váš typ jídla stejně, jako uživatel se kterým své seznamy sdílíte. Tím budou seznamy sloučeny.

    \n" +" pojmenujte váš typ jídla stejně, jako " +"uživatel se kterým své seznamy sdílíte. Tím budou seznamy\n" +" sloučeny.

    \n" " " #: .\cookbook\templates\meal_plan_entry.html:6 @@ -1331,12 +1347,12 @@ msgstr "Obrázek receptu" #: .\cookbook\templates\recipes_table.html:46 #: .\cookbook\templates\url_import.html:55 msgid "Preparation time ca." -msgstr "Doba přípravy cca" +msgstr "Doba přípravy cca." #: .\cookbook\templates\recipes_table.html:52 #: .\cookbook\templates\url_import.html:60 msgid "Waiting time ca." -msgstr "Doba čekání cca" +msgstr "Doba čekání cca." #: .\cookbook\templates\recipes_table.html:55 msgid "External" @@ -1384,7 +1400,7 @@ msgid "" " in the following examples:" msgstr "" "Použijte tajný klíč jako autorizační hlavičku definovanou slovním klíčem, " -"jak je uvedeno v následujících příkladech." +"jak je uvedeno v následujících příkladech:" #: .\cookbook\templates\settings.html:94 msgid "or" @@ -1806,7 +1822,7 @@ msgstr "Import není pro tohoto poskytovatele implementován!" #: .\cookbook\views\import_export.py:58 msgid "Exporting is not implemented for this provider" -msgstr "Eport není pro tohoto poskytovatele implementován!" +msgstr "Export není pro tohoto poskytovatele implementován!" #: .\cookbook\views\lists.py:42 msgid "Import Log" @@ -1838,7 +1854,7 @@ msgstr "Komentář uložen!" #: .\cookbook\views\views.py:152 msgid "This recipe is already linked to the book!" -msgstr "Tento recept už v kuchařce existuje." +msgstr "Tento recept už v kuchařce existuje!" #: .\cookbook\views\views.py:158 msgid "Bookmark saved!" diff --git a/cookbook/locale/da/LC_MESSAGES/django.mo b/cookbook/locale/da/LC_MESSAGES/django.mo index f0c157bec..8da304df2 100644 Binary files a/cookbook/locale/da/LC_MESSAGES/django.mo and b/cookbook/locale/da/LC_MESSAGES/django.mo differ diff --git a/cookbook/locale/da/LC_MESSAGES/django.po b/cookbook/locale/da/LC_MESSAGES/django.po index ebe0c1cca..8d3738735 100644 --- a/cookbook/locale/da/LC_MESSAGES/django.po +++ b/cookbook/locale/da/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ 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-08-18 14:32+0000\n" -"Last-Translator: Mathias Rasmussen \n" +"PO-Revision-Date: 2023-04-12 11:55+0000\n" +"Last-Translator: noxonad \n" "Language-Team: Danish \n" "Language: da\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.10.1\n" +"X-Generator: Weblate 4.15\n" #: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 #: .\cookbook\templates\space.html:49 .\cookbook\templates\stats.html:28 @@ -1806,7 +1806,7 @@ msgid "" msgstr "" " \n" " Heltekstsøgning forsøger at normalisere de givne ord så de " -"matcher stammevarianter. F.eks: 'skeen', 'skeer' og 'sket' vil alt " +"matcher stammevarianter. F.eks: 'skeen', 'skeer' og 'sket' vil alt " "normaliseres til 'ske'.\n" " Der er flere metoder tilgængelige, beskrevet herunder, som vil " "bestemme hvordan søgningen skal opfører sig når flere søgeord er angivet.\n" @@ -2122,9 +2122,9 @@ msgid "" "return more results than needed to make sure you find what you are looking " "for." msgstr "" -"Find hvad du har brug for selvom opskriften har stavefejl. Kan måske " -"returnere flere resultater end du har brug for, for at være sikker på at du " -"finder hvad du leder efter." +"Find hvad du har brug for, selvom opskriften har stavefejl. Kan måske " +"returnere flere resultater end du har brug for, for at være sikker på, at du " +"finder, hvad du leder efter." #: .\cookbook\templates\settings.html:182 msgid "This is the default behavior" @@ -2196,8 +2196,7 @@ msgid "" "You can sign in to your account using any of the following third party\n" " accounts:" msgstr "" -"Du kan logge ind på din konto med enhver af de følgende tredjepartsapps\n" -" kontoer:" +"Du kan logge ind på din konto med enhver af de følgende tredjepartskontoer:" #: .\cookbook\templates\socialaccount\connections.html:52 msgid "" @@ -2212,7 +2211,7 @@ msgstr "Tilføj en tredjepartskonto" #: .\cookbook\templates\socialaccount\signup.html:5 msgid "Signup" -msgstr "Registrering" +msgstr "Registrer" #: .\cookbook\templates\socialaccount\signup.html:10 #, python-format diff --git a/cookbook/locale/de/LC_MESSAGES/django.mo b/cookbook/locale/de/LC_MESSAGES/django.mo index 53f0abb83..da2c5568a 100644 Binary files a/cookbook/locale/de/LC_MESSAGES/django.mo and b/cookbook/locale/de/LC_MESSAGES/django.mo differ diff --git a/cookbook/locale/de/LC_MESSAGES/django.po b/cookbook/locale/de/LC_MESSAGES/django.po index 4eab5983f..b2361c937 100644 --- a/cookbook/locale/de/LC_MESSAGES/django.po +++ b/cookbook/locale/de/LC_MESSAGES/django.po @@ -14,81 +14,68 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 19:20+0200\n" -"PO-Revision-Date: 2022-11-21 19:09+0000\n" -"Last-Translator: Alex \n" -"Language-Team: German \n" +"POT-Creation-Date: 2023-04-26 07:46+0200\n" +"PO-Revision-Date: 2023-02-09 13:55+0000\n" +"Last-Translator: Marion Kämpfer \n" +"Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.1\n" +"X-Generator: Weblate 4.15\n" -#: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 -#: .\cookbook\templates\stats.html:28 -msgid "Ingredients" -msgstr "Zutaten" - -#: .\cookbook\forms.py:53 +#: .\cookbook\forms.py:52 msgid "Default unit" msgstr "Standardeinheit" -#: .\cookbook\forms.py:54 +#: .\cookbook\forms.py:53 msgid "Use fractions" msgstr "Brüche verwenden" -#: .\cookbook\forms.py:55 +#: .\cookbook\forms.py:54 msgid "Use KJ" msgstr "Kilojoule verwenden" -#: .\cookbook\forms.py:56 +#: .\cookbook\forms.py:55 msgid "Theme" msgstr "Theme" -#: .\cookbook\forms.py:57 +#: .\cookbook\forms.py:56 msgid "Navbar color" msgstr "Farbe der Navigationsleiste" -#: .\cookbook\forms.py:58 +#: .\cookbook\forms.py:57 msgid "Sticky navbar" msgstr "Navigationsleiste anheften" -#: .\cookbook\forms.py:59 +#: .\cookbook\forms.py:58 msgid "Default page" msgstr "Standardseite" -#: .\cookbook\forms.py:60 -msgid "Show recent recipes" -msgstr "Zuletzt betrachtete Rezepte anzeigen" - -#: .\cookbook\forms.py:61 -msgid "Search style" -msgstr "Suchmethode" - -#: .\cookbook\forms.py:62 +#: .\cookbook\forms.py:59 msgid "Plan sharing" msgstr "Essensplan teilen" -#: .\cookbook\forms.py:63 +#: .\cookbook\forms.py:60 msgid "Ingredient decimal places" msgstr "Nachkommastellen für Zutaten" -#: .\cookbook\forms.py:64 +#: .\cookbook\forms.py:61 msgid "Shopping list auto sync period" msgstr "Synchronisierungshäufigkeit der Einkaufsliste" -#: .\cookbook\forms.py:65 .\cookbook\templates\recipe_view.html:21 -#: .\cookbook\templates\stats.html:47 +#: .\cookbook\forms.py:62 .\cookbook\templates\recipe_view.html:36 +#: .\cookbook\templates\recipe_view.html:21 msgid "Comments" msgstr "Kommentare" -#: .\cookbook\forms.py:66 +#: .\cookbook\forms.py:63 msgid "Left-handed mode" msgstr "Linkshänder-Modus" -#: .\cookbook\forms.py:70 +#: .\cookbook\forms.py:67 msgid "" "Color of the top navigation bar. Not all colors work with all themes, just " "try them out!" @@ -96,13 +83,13 @@ msgstr "" "Farbe der oberen Navigationsleiste. Nicht alle Farben passen, daher einfach " "mal ausprobieren!" -#: .\cookbook\forms.py:72 +#: .\cookbook\forms.py:69 msgid "Default Unit to be used when inserting a new ingredient into a recipe." msgstr "" "Standardeinheit, die beim Einfügen einer neuen Zutat in ein Rezept zu " "verwenden ist." -#: .\cookbook\forms.py:74 +#: .\cookbook\forms.py:71 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" @@ -110,34 +97,30 @@ msgstr "" "Unterstützung für Brüche in Zutaten aktivieren (dadurch werden Dezimalzahlen " "automatisch mit Brüchen ersetzt)" -#: .\cookbook\forms.py:76 +#: .\cookbook\forms.py:73 msgid "Display nutritional energy amounts in joules instead of calories" msgstr "Nährwerte in Joule statt Kalorien anzeigen" -#: .\cookbook\forms.py:77 +#: .\cookbook\forms.py:74 msgid "Users with whom newly created meal plans should be shared by default." msgstr "" "Nutzer, mit denen neue Essenspläne standardmäßig geteilt werden sollen." -#: .\cookbook\forms.py:78 +#: .\cookbook\forms.py:75 msgid "Users with whom to share shopping lists." msgstr "Benutzer, mit denen Einkaufslisten geteilt werden sollen." -#: .\cookbook\forms.py:80 -msgid "Show recently viewed recipes on search page." -msgstr "Zuletzt angeschaute Rezepte bei der Suche anzeigen." - -#: .\cookbook\forms.py:81 +#: .\cookbook\forms.py:76 msgid "Number of decimals to round ingredients." msgstr "Anzahl an Dezimalstellen, auf die gerundet werden soll." -#: .\cookbook\forms.py:82 +#: .\cookbook\forms.py:77 msgid "If you want to be able to create and see comments underneath recipes." msgstr "" "Wenn du in der Lage sein willst, Kommentare unter Rezepten zu erstellen und " "zu sehen." -#: .\cookbook\forms.py:84 .\cookbook\forms.py:496 +#: .\cookbook\forms.py:79 .\cookbook\forms.py:492 .\cookbook\forms.py:491 msgid "" "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. " @@ -149,23 +132,23 @@ msgstr "" "aktualisiert. Dies ist nützlich, wenn mehrere Personen eine Liste beim " "Einkaufen verwenden, benötigt jedoch etwas Datenvolumen." -#: .\cookbook\forms.py:87 +#: .\cookbook\forms.py:82 msgid "Makes the navbar stick to the top of the page." msgstr "Navigationsleiste wird oben angeheftet." -#: .\cookbook\forms.py:88 .\cookbook\forms.py:499 +#: .\cookbook\forms.py:83 .\cookbook\forms.py:495 .\cookbook\forms.py:494 msgid "Automatically add meal plan ingredients to shopping list." msgstr "Fügt die Zutaten des Speiseplans automatisch zur Einkaufsliste hinzu." -#: .\cookbook\forms.py:89 +#: .\cookbook\forms.py:84 msgid "Exclude ingredients that are on hand." msgstr "Zutaten, die vorrätig sind, ausschließen." -#: .\cookbook\forms.py:90 +#: .\cookbook\forms.py:85 msgid "Will optimize the UI for use with your left hand." msgstr "Optimiert die Darstellung für die Benutzung mit der linken Hand." -#: .\cookbook\forms.py:107 +#: .\cookbook\forms.py:102 msgid "" "Both fields are optional. If none are given the username will be displayed " "instead" @@ -173,36 +156,37 @@ msgstr "" "Beide Felder sind optional. Wenn keins von beiden gegeben ist, wird der " "Nutzername angezeigt" -#: .\cookbook\forms.py:128 .\cookbook\forms.py:301 +#: .\cookbook\forms.py:123 .\cookbook\forms.py:297 .\cookbook\forms.py:296 msgid "Name" msgstr "Name" -#: .\cookbook\forms.py:129 .\cookbook\forms.py:302 -#: .\cookbook\templates\stats.html:24 .\cookbook\views\lists.py:88 +#: .\cookbook\forms.py:124 .\cookbook\forms.py:298 .\cookbook\views\lists.py:88 +#: .\cookbook\forms.py:297 msgid "Keywords" msgstr "Stichwörter" -#: .\cookbook\forms.py:130 +#: .\cookbook\forms.py:125 msgid "Preparation time in minutes" msgstr "Zubereitungszeit in Minuten" -#: .\cookbook\forms.py:131 +#: .\cookbook\forms.py:126 msgid "Waiting time (cooking/baking) in minutes" msgstr "Wartezeit (kochen/backen) in Minuten" -#: .\cookbook\forms.py:132 .\cookbook\forms.py:270 .\cookbook\forms.py:303 +#: .\cookbook\forms.py:127 .\cookbook\forms.py:266 .\cookbook\forms.py:299 +#: .\cookbook\forms.py:265 .\cookbook\forms.py:298 msgid "Path" msgstr "Pfad" -#: .\cookbook\forms.py:133 +#: .\cookbook\forms.py:128 msgid "Storage UID" msgstr "Speicher-UID" -#: .\cookbook\forms.py:165 +#: .\cookbook\forms.py:161 .\cookbook\forms.py:160 msgid "Default" msgstr "Standard" -#: .\cookbook\forms.py:177 +#: .\cookbook\forms.py:173 .\cookbook\forms.py:172 msgid "" "To prevent duplicates recipes with the same name as existing ones are " "ignored. Check this box to import everything." @@ -210,19 +194,19 @@ msgstr "" "Um Duplikate zu vermeiden werden Rezepte mit dem gleichen Namen ignoriert. " "Aktivieren Sie dieses Kontrollkästchen, um alles zu importieren." -#: .\cookbook\forms.py:200 +#: .\cookbook\forms.py:196 .\cookbook\forms.py:195 msgid "Add your comment: " msgstr "Schreibe einen Kommentar: " -#: .\cookbook\forms.py:215 +#: .\cookbook\forms.py:211 .\cookbook\forms.py:210 msgid "Leave empty for dropbox and enter app password for nextcloud." msgstr "Für Dropbox leer lassen, bei Nextcloud App-Passwort eingeben." -#: .\cookbook\forms.py:222 +#: .\cookbook\forms.py:218 .\cookbook\forms.py:217 msgid "Leave empty for nextcloud and enter api token for dropbox." msgstr "Für Nextcloud leer lassen, für Dropbox API-Token eingeben." -#: .\cookbook\forms.py:231 +#: .\cookbook\forms.py:227 .\cookbook\forms.py:226 msgid "" "Leave empty for dropbox and enter only base url for nextcloud (/remote." "php/webdav/ is added automatically)" @@ -230,33 +214,33 @@ msgstr "" "Für Dropbox leer lassen, für Nextcloud Server-URL angeben (/remote.php/" "webdav/ wird automatisch hinzugefügt)" -#: .\cookbook\forms.py:269 .\cookbook\views\edit.py:157 +#: .\cookbook\forms.py:265 .\cookbook\views\edit.py:157 .\cookbook\forms.py:264 msgid "Storage" msgstr "Speicher" -#: .\cookbook\forms.py:271 +#: .\cookbook\forms.py:267 .\cookbook\forms.py:266 msgid "Active" msgstr "Aktiv" -#: .\cookbook\forms.py:277 +#: .\cookbook\forms.py:273 .\cookbook\forms.py:272 msgid "Search String" msgstr "Suchwort" -#: .\cookbook\forms.py:304 +#: .\cookbook\forms.py:300 .\cookbook\forms.py:299 msgid "File ID" msgstr "Datei-ID" -#: .\cookbook\forms.py:326 +#: .\cookbook\forms.py:322 .\cookbook\forms.py:321 msgid "You must provide at least a recipe or a title." msgstr "Mindestens ein Rezept oder ein Titel müssen angegeben werden." -#: .\cookbook\forms.py:339 +#: .\cookbook\forms.py:335 .\cookbook\forms.py:334 msgid "You can list default users to share recipes with in the settings." msgstr "" "Sie können in den Einstellungen Standardbenutzer auflisten, für die Sie " "Rezepte freigeben möchten." -#: .\cookbook\forms.py:340 +#: .\cookbook\forms.py:336 .\cookbook\forms.py:335 msgid "" "You can use markdown to format this field. See the docs here" @@ -264,15 +248,15 @@ msgstr "" "Markdown kann genutzt werden, um dieses Feld zu formatieren. Siehe hier für weitere Information" -#: .\cookbook\forms.py:366 +#: .\cookbook\forms.py:362 .\cookbook\forms.py:361 msgid "Maximum number of users for this space reached." msgstr "Maximale Nutzer-Anzahl wurde für diesen Space erreicht." -#: .\cookbook\forms.py:372 +#: .\cookbook\forms.py:368 .\cookbook\forms.py:367 msgid "Email address already taken!" msgstr "Email-Adresse ist bereits vergeben!" -#: .\cookbook\forms.py:380 +#: .\cookbook\forms.py:376 .\cookbook\forms.py:375 msgid "" "An email address is not required but if present the invite link will be sent " "to the user." @@ -280,15 +264,15 @@ msgstr "" "Eine Email-Adresse wird nicht benötigt, aber falls vorhanden, wird der " "Einladungslink zum Benutzer geschickt." -#: .\cookbook\forms.py:395 +#: .\cookbook\forms.py:391 .\cookbook\forms.py:390 msgid "Name already taken." msgstr "Name wird bereits verwendet." -#: .\cookbook\forms.py:406 +#: .\cookbook\forms.py:402 .\cookbook\forms.py:401 msgid "Accept Terms and Privacy" msgstr "AGB und Datenschutzerklärung akzeptieren" -#: .\cookbook\forms.py:438 +#: .\cookbook\forms.py:434 .\cookbook\forms.py:433 msgid "" "Determines how fuzzy a search is if it uses trigram similarity matching (e." "g. low values mean more typos are ignored)." @@ -296,7 +280,7 @@ msgstr "" "Legt fest wie unscharf eine Suche ist, falls Trigramme verwendet werden (i." "A. führen niedrigere Werte zum ignorieren von mehr Tippfehlern)." -#: .\cookbook\forms.py:448 +#: .\cookbook\forms.py:444 .\cookbook\forms.py:443 msgid "" "Select type method of search. Click here for " "full description of choices." @@ -304,7 +288,7 @@ msgstr "" "Suchmethode auswählen. Klicke hier für eine " "vollständige Erklärung der Optionen." -#: .\cookbook\forms.py:449 +#: .\cookbook\forms.py:445 .\cookbook\forms.py:444 msgid "" "Use fuzzy matching on units, keywords and ingredients when editing and " "importing recipes." @@ -312,23 +296,23 @@ msgstr "" "Benutze die unscharfe Suche für Einheiten, Schlüsselwörter und Zutaten beim " "ändern und importieren von Rezepten." -#: .\cookbook\forms.py:451 +#: .\cookbook\forms.py:447 .\cookbook\forms.py:446 msgid "" "Fields to search ignoring accents. Selecting this option can improve or " "degrade search quality depending on language" msgstr "" -"Felder bei welchen Akzente ignoriert werden. Das aktivieren dieser Option " +"Felder bei welchen Akzente ignoriert werden. Das aktivieren dieser Option " "kann die Suchqualität je nach Sprache verbessern oder verschlechtern" -#: .\cookbook\forms.py:453 +#: .\cookbook\forms.py:449 .\cookbook\forms.py:448 msgid "" "Fields to search for partial matches. (e.g. searching for 'Pie' will return " "'pie' and 'piece' and 'soapie')" msgstr "" "Felder welche auf partielle Treffer durchsucht werden. (z.B. eine Suche " -"nach \"Spa\" wird \"Spaghetti\", \"Spargel\" und \"Grünspargel\" liefern.)" +"nach 'Spa' wird 'Spaghetti', 'Spargel' und 'Grünspargel' liefern.)" -#: .\cookbook\forms.py:455 +#: .\cookbook\forms.py:451 .\cookbook\forms.py:450 msgid "" "Fields to search for beginning of word matches. (e.g. searching for 'sa' " "will return 'salad' and 'sandwich')" @@ -336,7 +320,7 @@ msgstr "" "Felder welche auf übereinstimmenden Wortbeginn durchsucht werden. (z.B. eine " "Suche nach \"Spa\" wird \"Spaghetti\" und \"Spargel\" liefern.)" -#: .\cookbook\forms.py:457 +#: .\cookbook\forms.py:453 .\cookbook\forms.py:452 msgid "" "Fields to 'fuzzy' search. (e.g. searching for 'recpie' will find 'recipe'.) " "Note: this option will conflict with 'web' and 'raw' methods of search." @@ -345,7 +329,7 @@ msgstr "" "\"Kuhcen\" wird \"Kuchen\" liefern.) Tipp: Diese Option konfligiert mit den " "\"web\" und \"raw\" Suchtypen." -#: .\cookbook\forms.py:459 +#: .\cookbook\forms.py:455 .\cookbook\forms.py:454 msgid "" "Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " "only function with fulltext fields." @@ -353,35 +337,35 @@ msgstr "" "Felder welche im Volltext durchsucht werden sollen. Tipp: Die Suchtypen \"web" "\", \"raw\" und \"phrase\" funktionieren nur mit Volltext-Feldern." -#: .\cookbook\forms.py:463 +#: .\cookbook\forms.py:459 .\cookbook\forms.py:458 msgid "Search Method" msgstr "Suchmethode" -#: .\cookbook\forms.py:464 +#: .\cookbook\forms.py:460 .\cookbook\forms.py:459 msgid "Fuzzy Lookups" msgstr "Unscharfe Suche" -#: .\cookbook\forms.py:465 +#: .\cookbook\forms.py:461 .\cookbook\forms.py:460 msgid "Ignore Accent" msgstr "Akzente ignorieren" -#: .\cookbook\forms.py:466 +#: .\cookbook\forms.py:462 .\cookbook\forms.py:461 msgid "Partial Match" msgstr "Teilweise Übereinstimmung" -#: .\cookbook\forms.py:467 +#: .\cookbook\forms.py:463 .\cookbook\forms.py:462 msgid "Starts With" msgstr "Beginnt mit" -#: .\cookbook\forms.py:468 +#: .\cookbook\forms.py:464 .\cookbook\forms.py:463 msgid "Fuzzy Search" msgstr "Unpräzise Suche" -#: .\cookbook\forms.py:469 +#: .\cookbook\forms.py:465 .\cookbook\forms.py:464 msgid "Full Text" msgstr "Volltext" -#: .\cookbook\forms.py:494 +#: .\cookbook\forms.py:490 .\cookbook\forms.py:489 msgid "" "Users will see all items you add to your shopping list. They must add you " "to see items on their list." @@ -390,7 +374,7 @@ msgstr "" "Benutzer müssen Sie hinzufügen, damit Sie Artikel auf der Liste der Benutzer " "sehen können." -#: .\cookbook\forms.py:500 +#: .\cookbook\forms.py:496 .\cookbook\forms.py:495 msgid "" "When adding a meal plan to the shopping list (manually or automatically), " "include all related recipes." @@ -398,7 +382,7 @@ msgstr "" "Wenn Sie einen Essensplan zur Einkaufsliste hinzufügen (manuell oder " "automatisch), fügen Sie alle zugehörigen Rezepte hinzu." -#: .\cookbook\forms.py:501 +#: .\cookbook\forms.py:497 .\cookbook\forms.py:496 msgid "" "When adding a meal plan to the shopping list (manually or automatically), " "exclude ingredients that are on hand." @@ -406,98 +390,102 @@ msgstr "" "Wenn Sie einen Essensplan zur Einkaufsliste hinzufügen (manuell oder " "automatisch), schließen Sie Zutaten aus, die Sie gerade zur Hand haben." -#: .\cookbook\forms.py:502 +#: .\cookbook\forms.py:498 .\cookbook\forms.py:497 msgid "Default number of hours to delay a shopping list entry." msgstr "" "Voreingestellte Anzahl von Stunden für die Verzögerung eines " "Einkaufslisteneintrags." -#: .\cookbook\forms.py:503 +#: .\cookbook\forms.py:499 .\cookbook\forms.py:498 msgid "Filter shopping list to only include supermarket categories." msgstr "" "Nur für den Supermarkt konfigurierte Kategorien in Einkaufsliste anzeigen." -#: .\cookbook\forms.py:504 +#: .\cookbook\forms.py:500 .\cookbook\forms.py:499 msgid "Days of recent shopping list entries to display." msgstr "" "Tage der letzten Einträge in der Einkaufsliste, die angezeigt werden sollen." -#: .\cookbook\forms.py:505 +#: .\cookbook\forms.py:501 .\cookbook\forms.py:500 msgid "Mark food 'On Hand' when checked off shopping list." msgstr "" "Lebensmittel als vorrätig markieren, wenn es in der Einkaufliste abgehakt " "wurde." -#: .\cookbook\forms.py:506 +#: .\cookbook\forms.py:502 .\cookbook\forms.py:501 msgid "Delimiter to use for CSV exports." msgstr "Separator für CSV-Export." -#: .\cookbook\forms.py:507 +#: .\cookbook\forms.py:503 .\cookbook\forms.py:502 msgid "Prefix to add when copying list to the clipboard." msgstr "Zusatz wird der in die Zwischenablage kopierten Liste vorangestellt." -#: .\cookbook\forms.py:511 +#: .\cookbook\forms.py:507 .\cookbook\forms.py:506 msgid "Share Shopping List" msgstr "Einkaufsliste teilen" -#: .\cookbook\forms.py:512 +#: .\cookbook\forms.py:508 .\cookbook\forms.py:507 msgid "Autosync" msgstr "Automatischer Abgleich" -#: .\cookbook\forms.py:513 +#: .\cookbook\forms.py:509 .\cookbook\forms.py:508 msgid "Auto Add Meal Plan" msgstr "automatisch dem Menüplan hinzufügen" -#: .\cookbook\forms.py:514 +#: .\cookbook\forms.py:510 .\cookbook\forms.py:509 msgid "Exclude On Hand" msgstr "Ausgenommen Vorrätiges" -#: .\cookbook\forms.py:515 +#: .\cookbook\forms.py:511 .\cookbook\forms.py:510 msgid "Include Related" msgstr "dazugehörend" -#: .\cookbook\forms.py:516 +#: .\cookbook\forms.py:512 .\cookbook\forms.py:511 msgid "Default Delay Hours" msgstr "Standardmäßige Verzögerung in Stunden" -#: .\cookbook\forms.py:517 +#: .\cookbook\forms.py:513 .\cookbook\forms.py:512 msgid "Filter to Supermarket" msgstr "Supermarkt filtern" -#: .\cookbook\forms.py:518 +#: .\cookbook\forms.py:514 .\cookbook\forms.py:513 msgid "Recent Days" msgstr "Vergangene Tage" -#: .\cookbook\forms.py:519 +#: .\cookbook\forms.py:515 .\cookbook\forms.py:514 msgid "CSV Delimiter" msgstr "CSV Trennzeichen" -#: .\cookbook\forms.py:520 +#: .\cookbook\forms.py:516 .\cookbook\forms.py:515 msgid "List Prefix" msgstr "Listenpräfix" -#: .\cookbook\forms.py:521 +#: .\cookbook\forms.py:517 .\cookbook\forms.py:516 msgid "Auto On Hand" msgstr "Automatisch als vorrätig markieren" -#: .\cookbook\forms.py:531 +#: .\cookbook\forms.py:527 .\cookbook\forms.py:526 msgid "Reset Food Inheritance" msgstr "Lebensmittelvererbung zurücksetzen" -#: .\cookbook\forms.py:532 +#: .\cookbook\forms.py:528 .\cookbook\forms.py:527 msgid "Reset all food to inherit the fields configured." msgstr "" "Alle Lebensmittel zurücksetzen, um die konfigurierten Felder zu übernehmen." -#: .\cookbook\forms.py:544 +#: .\cookbook\forms.py:540 .\cookbook\forms.py:539 msgid "Fields on food that should be inherited by default." msgstr "Zutaten, die standardmäßig übernommen werden sollen." -#: .\cookbook\forms.py:545 +#: .\cookbook\forms.py:541 .\cookbook\forms.py:540 msgid "Show recipe counts on search filters" msgstr "Rezeptanzahl im Suchfiltern anzeigen" -#: .\cookbook\helper\AllAuthCustomAdapter.py:36 +#: .\cookbook\forms.py:542 .\cookbook\forms.py:541 +msgid "Use the plural form for units and food inside this space." +msgstr "Pluralform für Einheiten und Essen in diesem Space verwenden." + +#: .\cookbook\helper\AllAuthCustomAdapter.py:39 msgid "" "In order to prevent spam, the requested email was not send. Please wait a " "few minutes and try again." @@ -505,63 +493,102 @@ msgstr "" "Um Spam zu vermeiden, wurde die angeforderte Email nicht gesendet. Bitte " "warte ein paar Minuten und versuche es erneut." -#: .\cookbook\helper\permission_helper.py:149 -#: .\cookbook\helper\permission_helper.py:172 .\cookbook\views\views.py:152 +#: .\cookbook\helper\permission_helper.py:164 +#: .\cookbook\helper\permission_helper.py:187 .\cookbook\views\views.py:117 +#: .\cookbook\views\views.py:114 msgid "You are not logged in and therefore cannot view this page!" msgstr "Du bist nicht angemeldet, daher kannst du diese Seite nicht sehen!" -#: .\cookbook\helper\permission_helper.py:153 -#: .\cookbook\helper\permission_helper.py:159 -#: .\cookbook\helper\permission_helper.py:184 -#: .\cookbook\helper\permission_helper.py:254 -#: .\cookbook\helper\permission_helper.py:268 -#: .\cookbook\helper\permission_helper.py:279 -#: .\cookbook\helper\permission_helper.py:290 .\cookbook\views\data.py:33 -#: .\cookbook\views\views.py:163 .\cookbook\views\views.py:170 -#: .\cookbook\views\views.py:249 +#: .\cookbook\helper\permission_helper.py:168 +#: .\cookbook\helper\permission_helper.py:174 +#: .\cookbook\helper\permission_helper.py:199 +#: .\cookbook\helper\permission_helper.py:269 +#: .\cookbook\helper\permission_helper.py:283 +#: .\cookbook\helper\permission_helper.py:294 +#: .\cookbook\helper\permission_helper.py:305 +#: .\cookbook\helper\permission_helper.py:321 +#: .\cookbook\helper\permission_helper.py:342 .\cookbook\views\data.py:36 +#: .\cookbook\views\views.py:128 .\cookbook\views\views.py:135 +#: .\cookbook\views\views.py:125 .\cookbook\views\views.py:132 msgid "You do not have the required permissions to view this page!" msgstr "Du hast nicht die notwendigen Rechte um diese Seite zu sehen!" -#: .\cookbook\helper\permission_helper.py:177 -#: .\cookbook\helper\permission_helper.py:200 -#: .\cookbook\helper\permission_helper.py:222 +#: .\cookbook\helper\permission_helper.py:192 +#: .\cookbook\helper\permission_helper.py:215 #: .\cookbook\helper\permission_helper.py:237 +#: .\cookbook\helper\permission_helper.py:252 msgid "You cannot interact with this object as it is not owned by you!" msgstr "" "Du kannst mit diesem Objekt nicht interagieren, da es dir nicht gehört!" -#: .\cookbook\helper\permission_helper.py:321 +#: .\cookbook\helper\permission_helper.py:403 msgid "You have reached the maximum number of recipes for your space." msgstr "Du hast die maximale Anzahl an Rezepten für Deinen Space erreicht." -#: .\cookbook\helper\permission_helper.py:333 +#: .\cookbook\helper\permission_helper.py:415 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:565 +#: .\cookbook\helper\recipe_search.py:630 +#: .\cookbook\helper\recipe_search.py:570 msgid "One of queryset or hash_key must be provided" msgstr "Es muss die Abfrage oder der Hash_Key angeben werden" +#: .\cookbook\helper\recipe_url_import.py:266 +#: .\cookbook\helper\recipe_url_import.py:265 +msgid "reverse rotation" +msgstr "Linkslauf" + +#: .\cookbook\helper\recipe_url_import.py:267 +#: .\cookbook\helper\recipe_url_import.py:266 +msgid "careful rotation" +msgstr "Kochlöffel" + +#: .\cookbook\helper\recipe_url_import.py:268 +#: .\cookbook\helper\recipe_url_import.py:267 +msgid "knead" +msgstr "Kneten" + +#: .\cookbook\helper\recipe_url_import.py:269 +#: .\cookbook\helper\recipe_url_import.py:268 +msgid "thicken" +msgstr "Andicken" + +#: .\cookbook\helper\recipe_url_import.py:270 +#: .\cookbook\helper\recipe_url_import.py:269 +msgid "warm up" +msgstr "Erwärmen" + +#: .\cookbook\helper\recipe_url_import.py:271 +#: .\cookbook\helper\recipe_url_import.py:270 +msgid "ferment" +msgstr "Fermentieren" + +#: .\cookbook\helper\recipe_url_import.py:272 +#: .\cookbook\helper\recipe_url_import.py:271 +msgid "sous-vide" +msgstr "Sous-vide" + +#: .\cookbook\helper\shopping_helper.py:157 #: .\cookbook\helper\shopping_helper.py:152 msgid "You must supply a servings size" msgstr "Sie müssen eine Portionsgröße angeben" -#: .\cookbook\helper\template_helper.py:64 -#: .\cookbook\helper\template_helper.py:66 +#: .\cookbook\helper\template_helper.py:79 +#: .\cookbook\helper\template_helper.py:81 msgid "Could not parse template code." msgstr "Konnte den Template code nicht verarbeiten." -#: .\cookbook\integration\copymethat.py:41 +#: .\cookbook\integration\copymethat.py:44 #: .\cookbook\integration\melarecipes.py:37 msgid "Favorite" msgstr "Favorit" -#: .\cookbook\integration\copymethat.py:70 -#: .\cookbook\integration\recettetek.py:54 -#: .\cookbook\integration\recipekeeper.py:63 -msgid "Imported from" -msgstr "Importiert von" +#: .\cookbook\integration\copymethat.py:50 +msgid "I made this" +msgstr "Von mir gekocht" +#: .\cookbook\integration\integration.py:218 #: .\cookbook\integration\integration.py:223 msgid "" "Importer expected a .zip file. Did you choose the correct importer type for " @@ -570,6 +597,7 @@ msgstr "" "Importer erwartet eine .zip Datei. Hast du den richtigen Importer-Typ für " "deine Daten ausgewählt?" +#: .\cookbook\integration\integration.py:221 #: .\cookbook\integration\integration.py:226 msgid "" "An unexpected error occurred during the import. Please make sure you have " @@ -578,27 +606,39 @@ msgstr "" "Ein unerwarteter Fehler trat beim Importieren auf. Bitte stelle sicher, dass " "die hochgeladene Datei gültig ist." +#: .\cookbook\integration\integration.py:226 #: .\cookbook\integration\integration.py:231 msgid "The following recipes were ignored because they already existed:" msgstr "Die folgenden Rezepte wurden ignoriert da sie bereits existieren:" +#: .\cookbook\integration\integration.py:230 #: .\cookbook\integration\integration.py:235 #, python-format msgid "Imported %s recipes." msgstr "%s Rezepte importiert." -#: .\cookbook\integration\paprika.py:46 +#: .\cookbook\integration\openeats.py:26 +#, fuzzy +msgid "Recipe source:" +msgstr "Rezept-Hauptseite" + +#: .\cookbook\integration\paprika.py:49 .\cookbook\integration\paprika.py:46 msgid "Notes" msgstr "Notizen" -#: .\cookbook\integration\paprika.py:49 +#: .\cookbook\integration\paprika.py:52 .\cookbook\integration\paprika.py:49 msgid "Nutritional Information" msgstr "Nährwert Informationen" -#: .\cookbook\integration\paprika.py:53 +#: .\cookbook\integration\paprika.py:56 .\cookbook\integration\paprika.py:53 msgid "Source" msgstr "Quelle" +#: .\cookbook\integration\recettetek.py:54 +#: .\cookbook\integration\recipekeeper.py:70 +msgid "Imported from" +msgstr "Importiert von" + #: .\cookbook\integration\saffron.py:23 msgid "Servings" msgstr "Portionen" @@ -611,9 +651,7 @@ msgstr "Wartezeit" msgid "Preparation Time" msgstr "Vorbereitungszeit" -#: .\cookbook\integration\saffron.py:29 -#: .\cookbook\templates\forms\ingredients.html:7 -#: .\cookbook\templates\index.html:7 +#: .\cookbook\integration\saffron.py:29 .\cookbook\templates\index.html:7 msgid "Cookbook" msgstr "Kochbuch" @@ -655,7 +693,7 @@ msgstr "Abendessen" msgid "Other" msgstr "Andere" -#: .\cookbook\models.py:251 +#: .\cookbook\models.py:261 msgid "" "Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " "upload." @@ -663,136 +701,138 @@ msgstr "" "Maximale Datei-Speichergröße in MB. 0 für unbegrenzt, -1 um den Datei-Upload " "zu deaktivieren." -#: .\cookbook\models.py:353 .\cookbook\templates\search.html:7 -#: .\cookbook\templates\space_manage.html:7 +#: .\cookbook\models.py:365 .\cookbook\templates\search.html:7 +#: .\cookbook\templates\settings.html:18 +#: .\cookbook\templates\space_manage.html:7 .\cookbook\models.py:364 msgid "Search" msgstr "Suchen" -#: .\cookbook\models.py:354 .\cookbook\templates\base.html:107 +#: .\cookbook\models.py:366 .\cookbook\templates\base.html:110 #: .\cookbook\templates\meal_plan.html:7 .\cookbook\views\delete.py:178 #: .\cookbook\views\edit.py:211 .\cookbook\views\new.py:179 +#: .\cookbook\models.py:365 msgid "Meal-Plan" msgstr "Essensplan" -#: .\cookbook\models.py:355 .\cookbook\templates\base.html:115 +#: .\cookbook\models.py:367 .\cookbook\templates\base.html:118 +#: .\cookbook\models.py:366 msgid "Books" msgstr "Bücher" -#: .\cookbook\models.py:363 -msgid "Small" -msgstr "Klein" - -#: .\cookbook\models.py:363 -msgid "Large" -msgstr "Groß" - -#: .\cookbook\models.py:363 .\cookbook\templates\generic\new_template.html:6 -#: .\cookbook\templates\generic\new_template.html:14 -msgid "New" -msgstr "Neu" - -#: .\cookbook\models.py:584 +#: .\cookbook\models.py:580 .\cookbook\models.py:579 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:1162 .\cookbook\templates\search_info.html:28 +#: .\cookbook\models.py:1181 .\cookbook\templates\search_info.html:28 +#: .\cookbook\models.py:1180 msgid "Simple" msgstr "Einfach" -#: .\cookbook\models.py:1163 .\cookbook\templates\search_info.html:33 +#: .\cookbook\models.py:1182 .\cookbook\templates\search_info.html:33 +#: .\cookbook\models.py:1181 msgid "Phrase" msgstr "Satz" -#: .\cookbook\models.py:1164 .\cookbook\templates\search_info.html:38 +#: .\cookbook\models.py:1183 .\cookbook\templates\search_info.html:38 +#: .\cookbook\models.py:1182 msgid "Web" msgstr "Web" -#: .\cookbook\models.py:1165 .\cookbook\templates\search_info.html:47 +#: .\cookbook\models.py:1184 .\cookbook\templates\search_info.html:47 +#: .\cookbook\models.py:1183 msgid "Raw" msgstr "Rohdaten" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 .\cookbook\models.py:1230 msgid "Food Alias" msgstr "Lebensmittel Alias" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 .\cookbook\models.py:1230 msgid "Unit Alias" msgstr "Einheiten Alias" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 .\cookbook\models.py:1230 msgid "Keyword Alias" msgstr "Stichwort Alias" -#: .\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 +#: .\cookbook\models.py:1231 +msgid "Description Replace" +msgstr "Beschreibung ersetzen" + +#: .\cookbook\models.py:1231 +msgid "Instruction Replace" +msgstr "Anleitung ersetzen" + +#: .\cookbook\models.py:1258 .\cookbook\views\delete.py:36 +#: .\cookbook\views\edit.py:251 .\cookbook\views\new.py:48 +#: .\cookbook\models.py:1257 msgid "Recipe" msgstr "Rezept" -#: .\cookbook\models.py:1228 +#: .\cookbook\models.py:1259 .\cookbook\models.py:1258 msgid "Food" msgstr "Lebensmittel" -#: .\cookbook\models.py:1229 .\cookbook\templates\base.html:138 +#: .\cookbook\models.py:1260 .\cookbook\templates\base.html:141 +#: .\cookbook\models.py:1259 msgid "Keyword" msgstr "Schlüsselwort" -#: .\cookbook\serializer.py:207 -msgid "Cannot modify Space owner permission." -msgstr "Die Eigentumsberechtigung am Space kann nicht geändert werden." - -#: .\cookbook\serializer.py:290 +#: .\cookbook\serializer.py:198 msgid "File uploads are not enabled for this Space." msgstr "Datei-Uploads sind in diesem Space nicht aktiviert." -#: .\cookbook\serializer.py:301 +#: .\cookbook\serializer.py:209 msgid "You have reached your file upload limit." msgstr "Du hast Dein Datei-Uploadlimit erreicht." -#: .\cookbook\serializer.py:1081 +#: .\cookbook\serializer.py:291 +msgid "Cannot modify Space owner permission." +msgstr "Die Eigentumsberechtigung am Space kann nicht geändert werden." + +#: .\cookbook\serializer.py:1093 .\cookbook\serializer.py:1085 msgid "Hello" msgstr "Hallo" -#: .\cookbook\serializer.py:1081 +#: .\cookbook\serializer.py:1093 .\cookbook\serializer.py:1085 msgid "You have been invited by " msgstr "Du wurdest eingeladen von " -#: .\cookbook\serializer.py:1082 +#: .\cookbook\serializer.py:1094 .\cookbook\serializer.py:1086 msgid " to join their Tandoor Recipes space " msgstr " um deren Tandoor Recipes Instanz beizutreten " -#: .\cookbook\serializer.py:1083 +#: .\cookbook\serializer.py:1095 .\cookbook\serializer.py:1087 msgid "Click the following link to activate your account: " msgstr "Klicke auf den folgenden Link, um deinen Account zu aktivieren: " -#: .\cookbook\serializer.py:1084 +#: .\cookbook\serializer.py:1096 .\cookbook\serializer.py:1088 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:1085 +#: .\cookbook\serializer.py:1097 .\cookbook\serializer.py:1089 msgid "The invitation is valid until " msgstr "Die Einladung ist gültig bis " -#: .\cookbook\serializer.py:1086 +#: .\cookbook\serializer.py:1098 .\cookbook\serializer.py:1090 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:1089 +#: .\cookbook\serializer.py:1101 .\cookbook\serializer.py:1093 msgid "Tandoor Recipes Invite" msgstr "Tandoor Recipes Einladung" -#: .\cookbook\serializer.py:1209 +#: .\cookbook\serializer.py:1242 .\cookbook\serializer.py:1234 msgid "Existing shopping list to update" msgstr "Bestehende Einkaufliste, die aktualisiert werden soll" -#: .\cookbook\serializer.py:1211 +#: .\cookbook\serializer.py:1244 .\cookbook\serializer.py:1236 msgid "" "List of ingredient IDs from the recipe to add, if not provided all " "ingredients will be added." @@ -800,39 +840,32 @@ msgstr "" "Liste der Zutaten-IDs aus dem Rezept, wenn keine Angabe erfolgt, werden alle " "Zutaten hinzugefügt." -#: .\cookbook\serializer.py:1213 +#: .\cookbook\serializer.py:1246 .\cookbook\serializer.py:1238 msgid "" "Providing a list_recipe ID and servings of 0 will delete that shopping list." msgstr "" "Wenn Sie eine list_recipe ID und Portion mit dem Wert 0 angeben, wird diese " "Einkaufsliste gelöscht." -#: .\cookbook\serializer.py:1222 +#: .\cookbook\serializer.py:1255 .\cookbook\serializer.py:1247 msgid "Amount of food to add to the shopping list" msgstr "" "Menge des Lebensmittels, welches der Einkaufsliste hinzugefügt werden soll" -#: .\cookbook\serializer.py:1224 +#: .\cookbook\serializer.py:1257 .\cookbook\serializer.py:1249 msgid "ID of unit to use for the shopping list" msgstr "ID der Einheit, die für die Einkaufsliste verwendet werden soll" -#: .\cookbook\serializer.py:1226 +#: .\cookbook\serializer.py:1259 .\cookbook\serializer.py:1251 msgid "When set to true will delete all food from active shopping lists." msgstr "" "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 -#: .\cookbook\templates\recipes_table.html:82 -msgid "Edit" -msgstr "Bearbeiten" - -#: .\cookbook\tables.py:116 .\cookbook\tables.py:131 +#: .\cookbook\tables.py:61 .\cookbook\tables.py:75 #: .\cookbook\templates\generic\delete_template.html:7 #: .\cookbook\templates\generic\delete_template.html:15 #: .\cookbook\templates\generic\edit_template.html:28 -#: .\cookbook\templates\recipes_table.html:90 msgid "Delete" msgstr "Löschen" @@ -860,9 +893,10 @@ msgstr "Email-Adressen" #: .\cookbook\templates\account\email.html:12 #: .\cookbook\templates\account\password_change.html:11 #: .\cookbook\templates\account\password_set.html:11 -#: .\cookbook\templates\base.html:293 .\cookbook\templates\settings.html:6 +#: .\cookbook\templates\base.html:296 .\cookbook\templates\settings.html:6 #: .\cookbook\templates\settings.html:17 #: .\cookbook\templates\socialaccount\connections.html:10 +#: .\cookbook\templates\user_settings.html:8 msgid "Settings" msgstr "Einstellungen" @@ -955,12 +989,12 @@ msgid "" " issue a new e-mail confirmation " "request." msgstr "" -"Dieser Email-Bestätigungslink ist abgelaufen oder ungültig. Bitte \n" +"Dieser Email-Bestätigungslink ist abgelaufen oder ungültig. Bitte\n" " beantrage einen neuen Email-" "Bestätigungslink." -#: .\cookbook\templates\account\login.html:8 -#: .\cookbook\templates\base.html:340 .\cookbook\templates\openid\login.html:8 +#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:343 +#: .\cookbook\templates\openid\login.html:8 msgid "Login" msgstr "Anmelden" @@ -980,21 +1014,20 @@ msgstr "Einloggen" msgid "Sign Up" msgstr "Registrieren" +#: .\cookbook\templates\account\login.html:38 +msgid "Lost your password?" +msgstr "Passwort vergessen?" + #: .\cookbook\templates\account\login.html:39 -#: .\cookbook\templates\account\login.html:41 #: .\cookbook\templates\account\password_reset.html:29 msgid "Reset My Password" msgstr "Passwort zurücksetzen" -#: .\cookbook\templates\account\login.html:40 -msgid "Lost your password?" -msgstr "Passwort vergessen?" - -#: .\cookbook\templates\account\login.html:52 +#: .\cookbook\templates\account\login.html:50 msgid "Social Login" msgstr "Social Login" -#: .\cookbook\templates\account\login.html:53 +#: .\cookbook\templates\account\login.html:51 msgid "You can use any of the following providers to sign in." msgstr "Du kannst jeden der folgenden Anbieter zum Einloggen verwenden." @@ -1020,7 +1053,6 @@ msgstr "Passwort ändern" #: .\cookbook\templates\account\password_change.html:12 #: .\cookbook\templates\account\password_set.html:12 -#: .\cookbook\templates\settings.html:76 msgid "Password" msgstr "Passwort" @@ -1073,7 +1105,7 @@ msgstr "" #: .\cookbook\templates\account\password_reset_from_key.html:33 msgid "change password" -msgstr "Passwort ändern" +msgstr "passwort ändern" #: .\cookbook\templates\account\password_reset_from_key.html:36 #: .\cookbook\templates\account\password_reset_from_key_done.html:19 @@ -1131,129 +1163,124 @@ 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:330 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:333 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "API-Dokumentation" -#: .\cookbook\templates\base.html:103 .\cookbook\templates\index.html:87 -#: .\cookbook\templates\stats.html:22 +#: .\cookbook\templates\base.html:106 .\cookbook\templates\index.html:87 msgid "Recipes" msgstr "Rezepte" -#: .\cookbook\templates\base.html:111 +#: .\cookbook\templates\base.html:114 msgid "Shopping" msgstr "Einkaufsliste" -#: .\cookbook\templates\base.html:150 .\cookbook\views\lists.py:105 +#: .\cookbook\templates\base.html:153 .\cookbook\views\lists.py:105 msgid "Foods" msgstr "Lebensmittel" -#: .\cookbook\templates\base.html:162 -#: .\cookbook\templates\forms\ingredients.html:24 -#: .\cookbook\templates\stats.html:26 .\cookbook\views\lists.py:122 +#: .\cookbook\templates\base.html:165 .\cookbook\views\lists.py:122 msgid "Units" msgstr "Einheiten" -#: .\cookbook\templates\base.html:176 .\cookbook\templates\supermarket.html:7 +#: .\cookbook\templates\base.html:179 .\cookbook\templates\supermarket.html:7 msgid "Supermarket" msgstr "Supermarkt" -#: .\cookbook\templates\base.html:188 +#: .\cookbook\templates\base.html:191 msgid "Supermarket Category" msgstr "Supermarkt-Kategorie" -#: .\cookbook\templates\base.html:200 .\cookbook\views\lists.py:171 +#: .\cookbook\templates\base.html:203 .\cookbook\views\lists.py:171 msgid "Automations" msgstr "Automatisierungen" -#: .\cookbook\templates\base.html:214 .\cookbook\views\lists.py:207 +#: .\cookbook\templates\base.html:217 .\cookbook\views\lists.py:207 msgid "Files" msgstr "Dateien" -#: .\cookbook\templates\base.html:226 +#: .\cookbook\templates\base.html:229 msgid "Batch Edit" msgstr "Massenbearbeitung" -#: .\cookbook\templates\base.html:238 .\cookbook\templates\history.html:6 +#: .\cookbook\templates\base.html:241 .\cookbook\templates\history.html:6 #: .\cookbook\templates\history.html:14 msgid "History" msgstr "Verlauf" -#: .\cookbook\templates\base.html:252 +#: .\cookbook\templates\base.html:255 #: .\cookbook\templates\ingredient_editor.html:7 #: .\cookbook\templates\ingredient_editor.html:13 msgid "Ingredient Editor" msgstr "Zutateneditor" -#: .\cookbook\templates\base.html:264 +#: .\cookbook\templates\base.html:267 #: .\cookbook\templates\export_response.html:7 #: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 msgid "Export" msgstr "Exportieren" -#: .\cookbook\templates\base.html:280 .\cookbook\templates\index.html:47 +#: .\cookbook\templates\base.html:283 .\cookbook\templates\index.html:47 msgid "Import Recipe" msgstr "Rezept importieren" -#: .\cookbook\templates\base.html:282 +#: .\cookbook\templates\base.html:285 msgid "Create" msgstr "Erstellen" -#: .\cookbook\templates\base.html:295 +#: .\cookbook\templates\base.html:298 #: .\cookbook\templates\generic\list_template.html:14 -#: .\cookbook\templates\stats.html:43 msgid "External Recipes" msgstr "Externe Rezepte" -#: .\cookbook\templates\base.html:298 -#: .\cookbook\templates\space_manage.html:15 +#: .\cookbook\templates\base.html:301 .\cookbook\templates\space_manage.html:15 msgid "Space Settings" msgstr "Space Einstellungen" -#: .\cookbook\templates\base.html:303 .\cookbook\templates\system.html:13 +#: .\cookbook\templates\base.html:306 .\cookbook\templates\system.html:13 msgid "System" msgstr "System" -#: .\cookbook\templates\base.html:305 +#: .\cookbook\templates\base.html:308 msgid "Admin" msgstr "Admin" -#: .\cookbook\templates\base.html:309 +#: .\cookbook\templates\base.html:312 #: .\cookbook\templates\space_overview.html:25 msgid "Your Spaces" msgstr "Deine Spaces" -#: .\cookbook\templates\base.html:320 +#: .\cookbook\templates\base.html:323 #: .\cookbook\templates\space_overview.html:6 msgid "Overview" msgstr "Übersicht" -#: .\cookbook\templates\base.html:324 +#: .\cookbook\templates\base.html:327 msgid "Markdown Guide" msgstr "Markdown-Anleitung" -#: .\cookbook\templates\base.html:326 +#: .\cookbook\templates\base.html:329 msgid "GitHub" msgstr "GitHub" -#: .\cookbook\templates\base.html:328 +#: .\cookbook\templates\base.html:331 msgid "Translate Tandoor" msgstr "Tandoor übersetzen" -#: .\cookbook\templates\base.html:332 +#: .\cookbook\templates\base.html:335 msgid "API Browser" msgstr "API Browser" -#: .\cookbook\templates\base.html:335 +#: .\cookbook\templates\base.html:338 msgid "Log out" msgstr "Ausloggen" -#: .\cookbook\templates\base.html:357 +#: .\cookbook\templates\base.html:360 msgid "You are using the free version of Tandor" -msgstr "Du benützt die Gratis-Version von Tandoor" +msgstr "Du benutzt die Gratis-Version von Tandoor" -#: .\cookbook\templates\base.html:358 +#: .\cookbook\templates\base.html:361 msgid "Upgrade Now" msgstr "Jetzt upgraden" @@ -1295,11 +1322,7 @@ msgstr "Der Pfad muss folgendes Format haben" #: .\cookbook\templates\forms\edit_import_recipe.html:14 #: .\cookbook\templates\generic\edit_template.html:23 #: .\cookbook\templates\generic\new_template.html:23 -#: .\cookbook\templates\settings.html:70 -#: .\cookbook\templates\settings.html:112 -#: .\cookbook\templates\settings.html:130 -#: .\cookbook\templates\settings.html:202 -#: .\cookbook\templates\settings.html:213 +#: .\cookbook\templates\settings.html:57 msgid "Save" msgstr "Speichern" @@ -1349,43 +1372,6 @@ msgstr "Rezept importieren" msgid "Edit Recipe" msgstr "Rezept bearbeiten" -#: .\cookbook\templates\forms\ingredients.html:15 -msgid "Edit Ingredients" -msgstr "Zutaten bearbeiten" - -#: .\cookbook\templates\forms\ingredients.html:16 -msgid "" -"\n" -" The following form can be used if, accidentally, two (or more) units " -"or ingredients where created that should be\n" -" the same.\n" -" It merges two units or ingredients and updates all recipes using " -"them.\n" -" " -msgstr "" -"\n" -" Dieses Formular kann genutzt werden, wenn versehentlich zwei (oder " -"mehr) Einheiten oder Zutaten erstellt wurden, die eigentlich identisch\n" -" sein sollen.\n" -" Es vereint zwei Zutaten oder Einheiten und aktualisiert alle " -"entsprechenden Rezepte.\n" -" " - -#: .\cookbook\templates\forms\ingredients.html:26 -msgid "Are you sure that you want to merge these two units?" -msgstr "" -"Bist du dir sicher, dass du diese beiden Einheiten zusammenführen möchtest?" - -#: .\cookbook\templates\forms\ingredients.html:31 -#: .\cookbook\templates\forms\ingredients.html:40 -msgid "Merge" -msgstr "Zusammenführen" - -#: .\cookbook\templates\forms\ingredients.html:36 -msgid "Are you sure that you want to merge these two ingredients?" -msgstr "" -"Bist du dir sicher, dass du diese beiden Zutaten zusammenführen möchtest?" - #: .\cookbook\templates\generic\delete_template.html:21 #, python-format msgid "Are you sure you want to delete the %(title)s: %(object)s " @@ -1408,6 +1394,11 @@ msgstr "Kaskadierung" msgid "Cancel" msgstr "Abbrechen" +#: .\cookbook\templates\generic\edit_template.html:6 +#: .\cookbook\templates\generic\edit_template.html:14 +msgid "Edit" +msgstr "Bearbeiten" + #: .\cookbook\templates\generic\edit_template.html:32 msgid "View" msgstr "Ansicht" @@ -1429,13 +1420,16 @@ msgstr "Filter" msgid "Import all" msgstr "Alle importieren" +#: .\cookbook\templates\generic\new_template.html:6 +#: .\cookbook\templates\generic\new_template.html:14 +msgid "New" +msgstr "Neu" + #: .\cookbook\templates\generic\table_template.html:76 -#: .\cookbook\templates\recipes_table.html:121 msgid "previous" msgstr "vorherige" #: .\cookbook\templates\generic\table_template.html:98 -#: .\cookbook\templates\recipes_table.html:143 msgid "next" msgstr "nächste" @@ -1447,24 +1441,11 @@ msgstr "Anschau-Verlauf" msgid "Cook Log" msgstr "Kochverlauf" -#: .\cookbook\templates\import.html:6 -msgid "Import Recipes" -msgstr "Rezepte importieren" - -#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 #: .\cookbook\templates\import_response.html:7 .\cookbook\views\delete.py:86 #: .\cookbook\views\edit.py:191 msgid "Import" msgstr "Importieren" -#: .\cookbook\templates\include\recipe_open_modal.html:18 -msgid "Close" -msgstr "Schließen" - -#: .\cookbook\templates\include\recipe_open_modal.html:32 -msgid "Open Recipe" -msgstr "Rezept öffnen" - #: .\cookbook\templates\include\storage_backend_warning.html:4 msgid "Security Warning" msgstr "Sicherheitswarnung" @@ -1493,7 +1474,7 @@ msgstr "" #: .\cookbook\templates\index.html:29 msgid "Search recipe ..." -msgstr "Rezept suchen..." +msgstr "Rezept suchen ..." #: .\cookbook\templates\index.html:44 msgid "New Recipe" @@ -1667,31 +1648,6 @@ msgstr "Überschrift" msgid "Cell" msgstr "Zelle" -#: .\cookbook\templates\meal_plan_entry.html:6 -msgid "Meal Plan View" -msgstr "Plan-Ansicht" - -#: .\cookbook\templates\meal_plan_entry.html:18 -msgid "Created by" -msgstr "Erstellt von" - -#: .\cookbook\templates\meal_plan_entry.html:20 -msgid "Shared with" -msgstr "Geteilt mit" - -#: .\cookbook\templates\meal_plan_entry.html:48 -#: .\cookbook\templates\recipes_table.html:64 -msgid "Last cooked" -msgstr "Zuletzt gekocht" - -#: .\cookbook\templates\meal_plan_entry.html:50 -msgid "Never cooked before." -msgstr "Noch nie gekocht." - -#: .\cookbook\templates\meal_plan_entry.html:76 -msgid "Other meals on this day" -msgstr "Andere Mahlzeiten an diesem Tag" - #: .\cookbook\templates\no_groups_info.html:5 #: .\cookbook\templates\no_groups_info.html:12 msgid "No Permissions" @@ -1740,43 +1696,27 @@ msgstr "" msgid "Back" msgstr "Zurück" +#: .\cookbook\templates\profile.html:7 +msgid "Profile" +msgstr "Profil" + +#: .\cookbook\templates\recipe_view.html:41 #: .\cookbook\templates\recipe_view.html:26 msgid "by" msgstr "von" -#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:144 -#: .\cookbook\views\edit.py:171 +#: .\cookbook\templates\recipe_view.html:59 .\cookbook\views\delete.py:144 +#: .\cookbook\views\edit.py:171 .\cookbook\templates\recipe_view.html:44 msgid "Comment" msgstr "Kommentar" -#: .\cookbook\templates\recipes_table.html:19 -#: .\cookbook\templates\recipes_table.html:23 -msgid "Recipe Image" -msgstr "Rezeptbild" - -#: .\cookbook\templates\recipes_table.html:51 -msgid "Preparation time ca." -msgstr "Zubereitungszeit ca." - -#: .\cookbook\templates\recipes_table.html:57 -msgid "Waiting time ca." -msgstr "Wartezeit ca." - -#: .\cookbook\templates\recipes_table.html:60 -msgid "External" -msgstr "Extern" - -#: .\cookbook\templates\recipes_table.html:86 -msgid "Log Cooking" -msgstr "Kochen protokollieren" - #: .\cookbook\templates\rest_framework\api.html:5 msgid "Recipe Home" msgstr "Rezept-Hauptseite" #: .\cookbook\templates\search_info.html:5 #: .\cookbook\templates\search_info.html:9 -#: .\cookbook\templates\settings.html:172 +#: .\cookbook\templates\settings.html:24 msgid "Search Settings" msgstr "Sucheinstellungen" @@ -1820,8 +1760,8 @@ msgid "" msgstr "" " \n" " Die Volltextsuche versucht Wörter in übliche Varianten zu " -"normalisieren. z.B.: \"Kürbis\", \"Kürbissuppe\", \"Kürbiskuchen\" werden " -"alle zu \"Kürbis\" normalisiert..\n" +"normalisieren. z.B.: 'Kürbis', 'Kürbissuppe', 'Kürbiskuchen' werden alle zu " +"'Kürbis' normalisiert..\n" " Es sind verschiedene Methoden verfügbar, welche weiter unten " "genau beschrieben werden. Diese beeinflussen das Suchergebnis bei einer " "Suche mit mehreren Wörtern.\n" @@ -1841,8 +1781,8 @@ msgid "" " " msgstr "" " \n" -" Einfache Suchen ignorieren Satzzeichen und Füllwörter wie \"und\"" -", \"der\", \"ein\". Alle anderen 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\" und \"Mehl\" in einem der ausgewählten Suchfeldern enthalten.\n" " " @@ -1890,11 +1830,11 @@ msgstr "" " \"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" +"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" +"Butter\" liefert alle Suchergebnisse die entweder \"Apfelkuchen mit Sahne" +"\" \n" " oder Torte (oder beides) enthalten, schließt aber Ergebnisse " "welche Butter enthalten aus.\n" " " @@ -1929,8 +1869,8 @@ msgstr "" " Eine weitere Suchmethode (welche ebenfalls PostgreSQL erfordert) " "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 " "\"Apfel\", Tippfehler in Suchfeldern (wie z.B. \"Afpel\") finden.\n" @@ -2024,85 +1964,16 @@ msgstr "" " Die Indizes für alle Felder können auf der Admin Seite neu " "erstellt werden.'\n" " Ansonsten können die Indizes auch mit dem management command " -"\"python manage.py rebuildindex\" neu erstellt werden.\n" +"'python manage.py rebuildindex' neu erstellt werden.\n" " " -#: .\cookbook\templates\settings.html:28 -msgid "Account" -msgstr "Account" - -#: .\cookbook\templates\settings.html:35 -msgid "Preferences" -msgstr "Präferenzen" - -#: .\cookbook\templates\settings.html:42 -msgid "API-Settings" -msgstr "API-Einstellungen" - -#: .\cookbook\templates\settings.html:49 -msgid "Search-Settings" -msgstr "Sucheinstellungen" - -#: .\cookbook\templates\settings.html:56 -msgid "Shopping-Settings" -msgstr "Einstellungen Einkaufsliste" - -#: .\cookbook\templates\settings.html:65 -msgid "Name Settings" -msgstr "Namen-Einstellungen" - -#: .\cookbook\templates\settings.html:73 -msgid "Account Settings" -msgstr "Account-Einstellungen" - -#: .\cookbook\templates\settings.html:75 -msgid "Emails" -msgstr "E-Mail Adressen" - -#: .\cookbook\templates\settings.html:78 -#: .\cookbook\templates\socialaccount\connections.html:11 -msgid "Social" -msgstr "Social" - -#: .\cookbook\templates\settings.html:91 -msgid "Language" -msgstr "Sprache" - -#: .\cookbook\templates\settings.html:121 -msgid "Style" -msgstr "Stil" - -#: .\cookbook\templates\settings.html:142 -msgid "API Token" -msgstr "API-Token" - -#: .\cookbook\templates\settings.html:143 -msgid "" -"You can use both basic authentication and token based authentication to " -"access the REST API." -msgstr "" -"Sowohl Basic Authentication als auch tokenbasierte Authentifizierung können " -"für die REST-API verwendet werden." - -#: .\cookbook\templates\settings.html:160 -msgid "" -"Use the token as an Authorization header prefixed by the word token as shown " -"in the following examples:" -msgstr "" -"Nutz den Token als Authorization-Header mit der Präfix \"Token\" wie in " -"folgendem Beispiel:" - -#: .\cookbook\templates\settings.html:162 -msgid "or" -msgstr "oder" - -#: .\cookbook\templates\settings.html:173 +#: .\cookbook\templates\settings.html:25 msgid "" "There are many options to configure the search depending on your personal " "preferences." msgstr "Die Suche kann je nach Präferenz vielfältig Individualisiert werden." -#: .\cookbook\templates\settings.html:174 +#: .\cookbook\templates\settings.html:26 msgid "" "Usually you do not need to configure any of them and can just stick " "with either the default or one of the following presets." @@ -2111,7 +1982,7 @@ msgstr "" "Meist erreichen die Standardeinstellungen oder eine der folgenden " "Suchprofile sehr gute Suchergebnisse." -#: .\cookbook\templates\settings.html:175 +#: .\cookbook\templates\settings.html:27 msgid "" "If you do want to configure the search you can read about the different " "options here." @@ -2119,11 +1990,11 @@ msgstr "" "Weitere Informationen zu den einzelnen Optionen sind hier zu finden." -#: .\cookbook\templates\settings.html:180 +#: .\cookbook\templates\settings.html:32 msgid "Fuzzy" msgstr "Unscharf" -#: .\cookbook\templates\settings.html:181 +#: .\cookbook\templates\settings.html:33 msgid "" "Find what you need even if your search or the recipe contains typos. Might " "return more results than needed to make sure you find what you are looking " @@ -2132,20 +2003,19 @@ msgstr "" "Liefert alle erwartbaren Suchergebnisse auch wenn Tippfehler im Suchbegriff " "sind. Kann jedoch mehr Ergebnisse als notwendig liefern." -#: .\cookbook\templates\settings.html:182 +#: .\cookbook\templates\settings.html:34 msgid "This is the default behavior" msgstr "Dies ist die Standardeinstellung" -#: .\cookbook\templates\settings.html:183 -#: .\cookbook\templates\settings.html:191 +#: .\cookbook\templates\settings.html:37 .\cookbook\templates\settings.html:46 msgid "Apply" msgstr "Anwenden" -#: .\cookbook\templates\settings.html:188 +#: .\cookbook\templates\settings.html:42 msgid "Precise" msgstr "Präzise" -#: .\cookbook\templates\settings.html:189 +#: .\cookbook\templates\settings.html:43 msgid "" "Allows fine control over search results but might not return results if too " "many spelling mistakes are made." @@ -2153,14 +2023,10 @@ msgstr "" "Erlaubt eine feine Steuerung der Suchergebnisse, aber es könnten keine " "Ergebnisse geliefert werden, wenn zu viele Tippfehler gemacht wurden." -#: .\cookbook\templates\settings.html:190 +#: .\cookbook\templates\settings.html:44 msgid "Perfect for large Databases" msgstr "Ideal für große Datenbanken" -#: .\cookbook\templates\settings.html:207 -msgid "Shopping Settings" -msgstr "Einstellungen Einkaufsliste" - #: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5 msgid "Cookbook Setup" msgstr "Kochbuch-Setup" @@ -2196,6 +2062,10 @@ msgstr "" msgid "Account Connections" msgstr "Account-Verbindungen" +#: .\cookbook\templates\socialaccount\connections.html:11 +msgid "Social" +msgstr "Social" + #: .\cookbook\templates\socialaccount\connections.html:18 msgid "" "You can sign in to your account using any of the following third party\n" @@ -2298,24 +2168,24 @@ msgstr "" "Du kannst entweder in einen existierenden Space eingeladen werden oder " "Deinen eigenen erstellen." -#: .\cookbook\templates\space_overview.html:45 +#: .\cookbook\templates\space_overview.html:53 msgid "Owner" msgstr "Eigentümer" -#: .\cookbook\templates\space_overview.html:49 +#: .\cookbook\templates\space_overview.html:57 msgid "Leave Space" msgstr "Space verlassen" -#: .\cookbook\templates\space_overview.html:70 -#: .\cookbook\templates\space_overview.html:80 +#: .\cookbook\templates\space_overview.html:78 +#: .\cookbook\templates\space_overview.html:88 msgid "Join Space" msgstr "Space beitreten" -#: .\cookbook\templates\space_overview.html:73 +#: .\cookbook\templates\space_overview.html:81 msgid "Join an existing space." msgstr "Existierenden Space beitreten." -#: .\cookbook\templates\space_overview.html:75 +#: .\cookbook\templates\space_overview.html:83 msgid "" "To join an existing space either enter your invite token or click on the " "invite link the space owner send you." @@ -2324,47 +2194,19 @@ msgstr "" "Einladungstoken eingeben oder auf den Einladungslink des Space-Eigentümers " "klicken." -#: .\cookbook\templates\space_overview.html:88 -#: .\cookbook\templates\space_overview.html:97 +#: .\cookbook\templates\space_overview.html:96 +#: .\cookbook\templates\space_overview.html:105 msgid "Create Space" msgstr "Space erstellen" -#: .\cookbook\templates\space_overview.html:91 +#: .\cookbook\templates\space_overview.html:99 msgid "Create your own recipe space." msgstr "Erstelle Deinen eigenen Rezept-Space." -#: .\cookbook\templates\space_overview.html:93 +#: .\cookbook\templates\space_overview.html:101 msgid "Start your own recipe space and invite other users to it." msgstr "Starte deinen eigenen Rezept-Space und lade andere Benutzer ein." -#: .\cookbook\templates\stats.html:4 -msgid "Stats" -msgstr "Statistiken" - -#: .\cookbook\templates\stats.html:10 -msgid "Statistics" -msgstr "Statistiken" - -#: .\cookbook\templates\stats.html:19 -msgid "Number of objects" -msgstr "Anzahl an Objekten" - -#: .\cookbook\templates\stats.html:30 -msgid "Recipe Imports" -msgstr "Importierte Rezepte" - -#: .\cookbook\templates\stats.html:38 -msgid "Objects stats" -msgstr "Objekt-Statistiken" - -#: .\cookbook\templates\stats.html:41 -msgid "Recipes without Keywords" -msgstr "Rezepte ohne Schlagwort" - -#: .\cookbook\templates\stats.html:45 -msgid "Internal Recipes" -msgstr "Interne Rezepte" - #: .\cookbook\templates\system.html:20 msgid "System Information" msgstr "Systeminformation" @@ -2492,76 +2334,89 @@ msgstr "" msgid "URL Import" msgstr "URL-Import" -#: .\cookbook\views\api.py:105 .\cookbook\views\api.py:197 +#: .\cookbook\views\api.py:110 .\cookbook\views\api.py:202 +#: .\cookbook\views\api.py:109 .\cookbook\views\api.py:201 msgid "Parameter updated_at incorrectly formatted" msgstr "Der Parameter updated_at ist falsch formatiert" -#: .\cookbook\views\api.py:217 .\cookbook\views\api.py:320 +#: .\cookbook\views\api.py:222 .\cookbook\views\api.py:325 +#: .\cookbook\views\api.py:221 .\cookbook\views\api.py:324 +#, python-brace-format msgid "No {self.basename} with id {pk} exists" msgstr "Kein {self.basename} mit der ID {pk} existiert" -#: .\cookbook\views\api.py:221 +#: .\cookbook\views\api.py:226 .\cookbook\views\api.py:225 msgid "Cannot merge with the same object!" msgstr "Zusammenführen mit selben Objekt nicht möglich!" -#: .\cookbook\views\api.py:228 +#: .\cookbook\views\api.py:233 .\cookbook\views\api.py:232 +#, python-brace-format msgid "No {self.basename} with id {target} exists" msgstr "Kein {self.basename} mit der ID {target} existiert" -#: .\cookbook\views\api.py:233 +#: .\cookbook\views\api.py:238 .\cookbook\views\api.py:237 msgid "Cannot merge with child object!" msgstr "Zusammenführen mit untergeordnetem Objekt nicht möglich!" -#: .\cookbook\views\api.py:266 +#: .\cookbook\views\api.py:271 .\cookbook\views\api.py:270 +#, python-brace-format msgid "{source.name} was merged successfully with {target.name}" msgstr "{source.name} wurde erfolgreich mit {target.name} zusammengeführt" -#: .\cookbook\views\api.py:271 +#: .\cookbook\views\api.py:276 .\cookbook\views\api.py:275 +#, python-brace-format 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:329 +#: .\cookbook\views\api.py:334 .\cookbook\views\api.py:333 +#, python-brace-format msgid "{child.name} was moved successfully to the root." msgstr "{child.name} wurde erfolgreich zur Wurzel verschoben." -#: .\cookbook\views\api.py:332 .\cookbook\views\api.py:350 +#: .\cookbook\views\api.py:337 .\cookbook\views\api.py:355 +#: .\cookbook\views\api.py:336 .\cookbook\views\api.py:354 msgid "An error occurred attempting to move " msgstr "Fehler aufgetreten beim verschieben von " -#: .\cookbook\views\api.py:335 +#: .\cookbook\views\api.py:340 .\cookbook\views\api.py:339 msgid "Cannot move an object to itself!" msgstr "Ein Element kann nicht in sich selbst verschoben werden!" -#: .\cookbook\views\api.py:341 +#: .\cookbook\views\api.py:346 .\cookbook\views\api.py:345 +#, python-brace-format msgid "No {self.basename} with id {parent} exists" msgstr "Kein {self.basename} mit ID {parent} existiert" -#: .\cookbook\views\api.py:347 +#: .\cookbook\views\api.py:352 .\cookbook\views\api.py:351 +#, python-brace-format msgid "{child.name} was moved successfully to parent {parent.name}" msgstr "" "{child.name} wurde erfolgreich zum Überelement {parent.name} verschoben" -#: .\cookbook\views\api.py:542 +#: .\cookbook\views\api.py:553 .\cookbook\views\api.py:547 +#, python-brace-format msgid "{obj.name} was removed from the shopping list." msgstr "{obj.name} wurde von der Einkaufsliste entfernt." -#: .\cookbook\views\api.py:547 .\cookbook\views\api.py:879 -#: .\cookbook\views\api.py:892 +#: .\cookbook\views\api.py:558 .\cookbook\views\api.py:888 +#: .\cookbook\views\api.py:901 .\cookbook\views\api.py:552 +#: .\cookbook\views\api.py:882 .\cookbook\views\api.py:895 +#, python-brace-format msgid "{obj.name} was added to the shopping list." msgstr "{obj.name} wurde der Einkaufsliste hinzugefügt." -#: .\cookbook\views\api.py:674 +#: .\cookbook\views\api.py:685 .\cookbook\views\api.py:679 msgid "ID of recipe a step is part of. For multiple repeat parameter." msgstr "" "ID des Rezeptes zu dem ein Schritt gehört. Kann mehrfach angegeben werden." -#: .\cookbook\views\api.py:676 +#: .\cookbook\views\api.py:687 .\cookbook\views\api.py:681 msgid "Query string matched (fuzzy) against object name." msgstr "Abfragezeichenfolge, die mit dem Objektnamen übereinstimmt (ungenau)." -#: .\cookbook\views\api.py:720 +#: .\cookbook\views\api.py:731 .\cookbook\views\api.py:725 msgid "" "Query string matched (fuzzy) against recipe name. In the future also " "fulltext search." @@ -2569,7 +2424,7 @@ msgstr "" "Suchbegriff wird mit dem Rezeptnamen abgeglichen. In Zukunft auch " "Volltextsuche." -#: .\cookbook\views\api.py:722 +#: .\cookbook\views\api.py:733 .\cookbook\views\api.py:727 msgid "" "ID of keyword a recipe should have. For multiple repeat parameter. " "Equivalent to keywords_or" @@ -2577,69 +2432,69 @@ msgstr "" "ID des Stichwortes, das ein Rezept haben muss. Kann mehrfach angegeben " "werden. Äquivalent zu keywords_or" -#: .\cookbook\views\api.py:725 +#: .\cookbook\views\api.py:736 .\cookbook\views\api.py:730 msgid "" "Keyword IDs, repeat for multiple. Return recipes with any of the keywords" msgstr "" "Stichwort IDs. Kann mehrfach angegeben werden. Listet Rezepte zu jedem der " "angegebenen Stichwörter" -#: .\cookbook\views\api.py:728 +#: .\cookbook\views\api.py:739 .\cookbook\views\api.py:733 msgid "" "Keyword IDs, repeat for multiple. Return recipes with all of the keywords." msgstr "" "Stichwort IDs. Kann mehrfach angegeben werden. Listet Rezepte mit allen " "angegebenen Stichwörtern." -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:742 .\cookbook\views\api.py:736 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords." msgstr "" "Stichwort ID. Kann mehrfach angegeben werden. Schließt Rezepte einem der " "angegebenen Stichwörtern aus." -#: .\cookbook\views\api.py:734 +#: .\cookbook\views\api.py:745 .\cookbook\views\api.py:739 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords." msgstr "" "Stichwort IDs. Kann mehrfach angegeben werden. Schließt Rezepte mit allen " "angegebenen Stichwörtern aus." -#: .\cookbook\views\api.py:736 +#: .\cookbook\views\api.py:747 .\cookbook\views\api.py:741 msgid "ID of food a recipe should have. For multiple repeat parameter." msgstr "" "ID einer Zutat, zu der Rezepte gelistet werden sollen. Kann mehrfach " "angegeben werden." -#: .\cookbook\views\api.py:739 +#: .\cookbook\views\api.py:750 .\cookbook\views\api.py:744 msgid "Food IDs, repeat for multiple. Return recipes with any of the foods" msgstr "" "Zutat ID. Kann mehrfach angegeben werden. Listet Rezepte mindestens einer " "der Zutaten" -#: .\cookbook\views\api.py:741 +#: .\cookbook\views\api.py:752 .\cookbook\views\api.py:746 msgid "Food IDs, repeat for multiple. Return recipes with all of the foods." msgstr "" "Zutat ID. Kann mehrfach angegeben werden. Listet Rezepte mit allen " "angegebenen Zutaten." -#: .\cookbook\views\api.py:743 +#: .\cookbook\views\api.py:754 .\cookbook\views\api.py:748 msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods." msgstr "" "Zutat ID. Kann mehrfach angegeben werden. Schließt Rezepte aus, die eine der " "angegebenen Zutaten enthalten." -#: .\cookbook\views\api.py:745 +#: .\cookbook\views\api.py:756 .\cookbook\views\api.py:750 msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods." msgstr "" "Zutat ID. Kann mehrfach angegeben werden. Schließt Rezepte aus, die alle " "angegebenen Zutaten enthalten." -#: .\cookbook\views\api.py:746 +#: .\cookbook\views\api.py:757 .\cookbook\views\api.py:751 msgid "ID of unit a recipe should have." msgstr "ID der Einheit, die ein Rezept haben sollte." -#: .\cookbook\views\api.py:748 +#: .\cookbook\views\api.py:759 .\cookbook\views\api.py:753 msgid "" "Rating a recipe should have or greater. [0 - 5] Negative value filters " "rating less than." @@ -2647,50 +2502,50 @@ msgstr "" "Mindestbewertung eines Rezeptes (0-5). Negative Werte filtern nach " "Maximalbewertung." -#: .\cookbook\views\api.py:749 +#: .\cookbook\views\api.py:760 .\cookbook\views\api.py:754 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 +#: .\cookbook\views\api.py:762 .\cookbook\views\api.py:756 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 +#: .\cookbook\views\api.py:764 .\cookbook\views\api.py:758 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 +#: .\cookbook\views\api.py:766 .\cookbook\views\api.py:760 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 +#: .\cookbook\views\api.py:768 .\cookbook\views\api.py:762 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 +#: .\cookbook\views\api.py:770 .\cookbook\views\api.py:764 msgid "If only internal recipes should be returned. [true/false]" msgstr "Nur interne Rezepte sollen gelistet werden. [ja/nein]" -#: .\cookbook\views\api.py:761 +#: .\cookbook\views\api.py:772 .\cookbook\views\api.py:766 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 +#: .\cookbook\views\api.py:774 .\cookbook\views\api.py:768 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 +#: .\cookbook\views\api.py:776 .\cookbook\views\api.py:770 msgid "" "Filter recipes cooked X times or more. Negative values returns cooked less " "than X times" @@ -2698,7 +2553,7 @@ msgstr "" "Rezepte listen, die mindestens x-mal gekocht wurden. Eine negative Zahl " "listet Rezepte, die weniger als x-mal gekocht wurden" -#: .\cookbook\views\api.py:767 +#: .\cookbook\views\api.py:778 .\cookbook\views\api.py:772 msgid "" "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on " "or before date." @@ -2707,7 +2562,7 @@ msgstr "" "wurden. Mit vorangestelltem - , werden Rezepte am oder vor dem Datum " "gelistet." -#: .\cookbook\views\api.py:769 +#: .\cookbook\views\api.py:780 .\cookbook\views\api.py:774 msgid "" "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or " "before date." @@ -2715,7 +2570,7 @@ msgstr "" "Rezepte listen, die am angegebenen Datum oder später erstellt wurden. Wenn - " "vorangestellt wird, wird am oder vor dem Datum gelistet." -#: .\cookbook\views\api.py:771 +#: .\cookbook\views\api.py:782 .\cookbook\views\api.py:776 msgid "" "Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or " "before date." @@ -2723,7 +2578,7 @@ msgstr "" "Rezepte listen, die am angegebenen Datum oder später aktualisiert wurden. " "Wenn - vorangestellt wird, wird am oder vor dem Datum gelistet." -#: .\cookbook\views\api.py:773 +#: .\cookbook\views\api.py:784 .\cookbook\views\api.py:778 msgid "" "Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on " "or before date." @@ -2731,13 +2586,13 @@ msgstr "" "Rezepte listen, die am angegebenen Datum oder später zuletzt angesehen " "wurden. Wenn - vorangestellt wird, wird am oder vor dem Datum gelistet." -#: .\cookbook\views\api.py:775 +#: .\cookbook\views\api.py:786 .\cookbook\views\api.py:780 msgid "Filter recipes that can be made with OnHand food. [true/false]" msgstr "" "Rezepte listen, die mit vorhandenen Zutaten gekocht werden können. [ja/" "nein]" -#: .\cookbook\views\api.py:937 +#: .\cookbook\views\api.py:946 .\cookbook\views\api.py:940 msgid "" "Returns the shopping list entry with a primary key of id. Multiple values " "allowed." @@ -2745,54 +2600,60 @@ msgstr "" "Zeigt denjenigen Eintrag auf der Einkaufliste mit der angegebenen ID. Kann " "mehrfach angegeben werden." -#: .\cookbook\views\api.py:942 +#: .\cookbook\views\api.py:951 .\cookbook\views\api.py:945 msgid "" -"Filter shopping list entries on checked. [true, false, both, recent]" -"
    - recent includes unchecked items and recently completed items." +"Filter shopping list entries on checked. [true, false, both, recent]
    - recent includes unchecked items and recently completed items." msgstr "" "Einkaufslisteneinträge nach Häkchen filtern. [ja, nein, beides, " "kürzlich]
    - kürzlich enthält nicht abgehakte Einträge und " "kürzlich abgeschlossene Einträge." -#: .\cookbook\views\api.py:945 +#: .\cookbook\views\api.py:954 .\cookbook\views\api.py:948 msgid "Returns the shopping list entries sorted by supermarket category order." msgstr "" "Listet die Einträge der Einkaufsliste sortiert nach Supermarktkategorie." -#: .\cookbook\views\api.py:1140 +#: .\cookbook\views\api.py:1166 .\cookbook\views\api.py:1160 msgid "Nothing to do." msgstr "Nichts zu tun." -#: .\cookbook\views\api.py:1160 +#: .\cookbook\views\api.py:1198 .\cookbook\views\api.py:1180 msgid "Invalid Url" msgstr "Ungültige URL" -#: .\cookbook\views\api.py:1167 +#: .\cookbook\views\api.py:1205 .\cookbook\views\api.py:1187 msgid "Connection Refused." msgstr "Verbindung fehlgeschlagen." -#: .\cookbook\views\api.py:1172 +#: .\cookbook\views\api.py:1210 .\cookbook\views\api.py:1192 msgid "Bad URL Schema." msgstr "Ungültiges URL Schema." -#: .\cookbook\views\api.py:1195 +#: .\cookbook\views\api.py:1233 .\cookbook\views\api.py:1215 msgid "No usable data could be found." msgstr "Es konnten keine nutzbaren Daten gefunden werden." -#: .\cookbook\views\api.py:1303 .\cookbook\views\data.py:28 +#: .\cookbook\views\api.py:1326 .\cookbook\views\import_export.py:117 +#: .\cookbook\views\api.py:1308 .\cookbook\views\import_export.py:114 +msgid "Importing is not implemented for this provider" +msgstr "Importieren ist für diesen Anbieter noch nicht implementiert" + +#: .\cookbook\views\api.py:1372 .\cookbook\views\data.py:31 #: .\cookbook\views\edit.py:120 .\cookbook\views\new.py:90 +#: .\cookbook\views\api.py:1352 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:1325 +#: .\cookbook\views\api.py:1394 .\cookbook\views\api.py:1374 msgid "Sync successful!" msgstr "Synchronisation erfolgreich!" -#: .\cookbook\views\api.py:1330 +#: .\cookbook\views\api.py:1399 .\cookbook\views\api.py:1379 msgid "Error synchronizing with Storage" msgstr "Fehler beim Synchronisieren" -#: .\cookbook\views\data.py:97 +#: .\cookbook\views\data.py:100 #, python-format msgid "Batch edit done. %(count)d recipe was updated." msgid_plural "Batch edit done. %(count)d Recipes where updated." @@ -2852,11 +2713,7 @@ msgstr "Änderungen gespeichert!" msgid "Error saving changes!" msgstr "Fehler beim Speichern der Daten!" -#: .\cookbook\views\import_export.py:111 .\cookbook\views\import_export.py:150 -msgid "Importing is not implemented for this provider" -msgstr "Importieren ist für diesen Anbieter noch nicht implementiert" - -#: .\cookbook\views\import_export.py:137 +#: .\cookbook\views\import_export.py:104 .\cookbook\views\import_export.py:101 msgid "" "The PDF Exporter is not enabled on this instance as it is still in an " "experimental state." @@ -2904,7 +2761,14 @@ msgstr "Neues Rezept importiert!" msgid "There was an error importing this recipe!" msgstr "Beim Importieren des Rezeptes ist ein Fehler aufgetreten!" -#: .\cookbook\views\views.py:124 +#: .\cookbook\views\views.py:73 .\cookbook\views\views.py:191 +#: .\cookbook\views\views.py:213 .\cookbook\views\views.py:399 +#: .\cookbook\views\views.py:188 .\cookbook\views\views.py:210 +#: .\cookbook\views\views.py:396 +msgid "This feature is not available in the demo version!" +msgstr "Diese Funktion ist in der Demo-Version nicht verfügbar!" + +#: .\cookbook\views\views.py:89 .\cookbook\views\views.py:86 msgid "" "You have successfully created your own recipe space. Start by adding some " "recipes or invite other people to join you." @@ -2912,24 +2776,20 @@ msgstr "" "Du hast erfolgreich deinen eigenen Rezept-Space erstellt. Beginne, indem Du " "ein paar Rezepte hinzufügst oder weitere Leute einlädst." -#: .\cookbook\views\views.py:178 +#: .\cookbook\views\views.py:143 .\cookbook\views\views.py:140 msgid "You do not have the required permissions to perform this action!" msgstr "" "Du hast nicht die notwendige Berechtigung, um diese Aktion durchzuführen!" -#: .\cookbook\views\views.py:189 +#: .\cookbook\views\views.py:154 .\cookbook\views\views.py:151 msgid "Comment saved!" msgstr "Kommentar gespeichert!" -#: .\cookbook\views\views.py:264 -msgid "This feature is not available in the demo version!" -msgstr "Diese Funktion ist in der Demo-Version nicht verfügbar!" - -#: .\cookbook\views\views.py:324 +#: .\cookbook\views\views.py:253 .\cookbook\views\views.py:250 msgid "You must select at least one field to search!" msgstr "Es muss mindestens ein Feld ausgewählt sein!" -#: .\cookbook\views\views.py:329 +#: .\cookbook\views\views.py:258 .\cookbook\views\views.py:255 msgid "" "To use this search method you must select at least one full text search " "field!" @@ -2937,11 +2797,11 @@ msgstr "" "Um diese Suchmethode zu verwenden muss mindestens ein Feld für die " "Volltextsuche ausgewählt sein!" -#: .\cookbook\views\views.py:333 +#: .\cookbook\views\views.py:262 .\cookbook\views\views.py:259 msgid "Fuzzy search is not compatible with this search method!" msgstr "Die \"Ungenaue\" Suche ist mit diesem Suchtyp nicht kompatibel!" -#: .\cookbook\views\views.py:463 +#: .\cookbook\views\views.py:338 .\cookbook\views\views.py:335 msgid "" "The setup page can only be used to create the first user! If you have " "forgotten your superuser credentials please consult the django documentation " @@ -2950,27 +2810,27 @@ msgstr "" "Die Setup-Seite kann nur für den ersten Nutzer verwendet werden. Zum " "Zurücksetzen von Passwörtern bitte der Django-Dokumentation folgen." -#: .\cookbook\views\views.py:470 +#: .\cookbook\views\views.py:345 .\cookbook\views\views.py:342 msgid "Passwords dont match!" msgstr "Passwörter stimmen nicht überein!" -#: .\cookbook\views\views.py:478 +#: .\cookbook\views\views.py:353 .\cookbook\views\views.py:350 msgid "User has been created, please login!" msgstr "Benutzer wurde erstellt, bitte einloggen!" -#: .\cookbook\views\views.py:494 +#: .\cookbook\views\views.py:369 .\cookbook\views\views.py:366 msgid "Malformed Invite Link supplied!" msgstr "Fehlerhafter Einladungslink angegeben!" -#: .\cookbook\views\views.py:510 +#: .\cookbook\views\views.py:386 .\cookbook\views\views.py:383 msgid "Successfully joined space." msgstr "Space erfolgreich beigetreten." -#: .\cookbook\views\views.py:516 +#: .\cookbook\views\views.py:392 .\cookbook\views\views.py:389 msgid "Invite Link not valid or already used!" msgstr "Einladungslink ungültig oder bereits genutzt!" -#: .\cookbook\views\views.py:530 +#: .\cookbook\views\views.py:409 .\cookbook\views\views.py:406 msgid "" "Reporting share links is not enabled for this instance. Please notify the " "page administrator to report problems." @@ -2978,7 +2838,7 @@ msgstr "" "Das melden von Links ist in dieser Instanz nicht aktiviert. Bitte " "kontaktieren sie den Seitenadministrator um Probleme zu melden." -#: .\cookbook\views\views.py:536 +#: .\cookbook\views\views.py:415 .\cookbook\views\views.py:412 msgid "" "Recipe sharing link has been disabled! For additional information please " "contact the page administrator." @@ -2986,6 +2846,173 @@ msgstr "" "Dieser Link wurde deaktiviert! Bitte kontaktieren sie den " "Seitenadministrator für weitere Informationen." +#~ msgid "Ingredients" +#~ msgstr "Zutaten" + +#~ msgid "Show recent recipes" +#~ msgstr "Zuletzt betrachtete Rezepte anzeigen" + +#~ msgid "Search style" +#~ msgstr "Suchmethode" + +#~ msgid "Show recently viewed recipes on search page." +#~ msgstr "Zuletzt angeschaute Rezepte bei der Suche anzeigen." + +#~ msgid "Small" +#~ msgstr "Klein" + +#~ msgid "Large" +#~ msgstr "Groß" + +#~ msgid "Edit Ingredients" +#~ msgstr "Zutaten bearbeiten" + +#~ msgid "" +#~ "\n" +#~ " The following form can be used if, accidentally, two (or more) " +#~ "units or ingredients where created that should be\n" +#~ " the same.\n" +#~ " It merges two units or ingredients and updates all recipes using " +#~ "them.\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ " Dieses Formular kann genutzt werden, wenn versehentlich zwei " +#~ "(oder mehr) Einheiten oder Zutaten erstellt wurden, die eigentlich " +#~ "identisch\n" +#~ " sein sollen.\n" +#~ " Es vereint zwei Zutaten oder Einheiten und aktualisiert alle " +#~ "entsprechenden Rezepte.\n" +#~ " " + +#~ msgid "Are you sure that you want to merge these two units?" +#~ msgstr "" +#~ "Bist du dir sicher, dass du diese beiden Einheiten zusammenführen " +#~ "möchtest?" + +#~ msgid "Merge" +#~ msgstr "Zusammenführen" + +#~ msgid "Are you sure that you want to merge these two ingredients?" +#~ msgstr "" +#~ "Bist du dir sicher, dass du diese beiden Zutaten zusammenführen möchtest?" + +#~ msgid "Import Recipes" +#~ msgstr "Rezepte importieren" + +#~ msgid "Close" +#~ msgstr "Schließen" + +#~ msgid "Open Recipe" +#~ msgstr "Rezept öffnen" + +#~ msgid "Meal Plan View" +#~ msgstr "Plan-Ansicht" + +#~ msgid "Created by" +#~ msgstr "Erstellt von" + +#~ msgid "Shared with" +#~ msgstr "Geteilt mit" + +#~ msgid "Last cooked" +#~ msgstr "Zuletzt gekocht" + +#~ msgid "Never cooked before." +#~ msgstr "Noch nie gekocht." + +#~ msgid "Other meals on this day" +#~ msgstr "Andere Mahlzeiten an diesem Tag" + +#~ msgid "Recipe Image" +#~ msgstr "Rezeptbild" + +#~ msgid "Preparation time ca." +#~ msgstr "Zubereitungszeit ca." + +#~ msgid "Waiting time ca." +#~ msgstr "Wartezeit ca." + +#~ msgid "External" +#~ msgstr "Extern" + +#~ msgid "Log Cooking" +#~ msgstr "Kochen protokollieren" + +#~ msgid "Account" +#~ msgstr "Account" + +#~ msgid "Preferences" +#~ msgstr "Präferenzen" + +#~ msgid "API-Settings" +#~ msgstr "API-Einstellungen" + +#~ msgid "Search-Settings" +#~ msgstr "Sucheinstellungen" + +#~ msgid "Shopping-Settings" +#~ msgstr "Einstellungen Einkaufsliste" + +#~ msgid "Name Settings" +#~ msgstr "Namen-Einstellungen" + +#~ msgid "Account Settings" +#~ msgstr "Account-Einstellungen" + +#~ msgid "Emails" +#~ msgstr "E-Mail Adressen" + +#~ msgid "Language" +#~ msgstr "Sprache" + +#~ msgid "Style" +#~ msgstr "Stil" + +#~ msgid "API Token" +#~ msgstr "API-Token" + +#~ msgid "" +#~ "You can use both basic authentication and token based authentication to " +#~ "access the REST API." +#~ msgstr "" +#~ "Sowohl Basic Authentication als auch tokenbasierte Authentifizierung " +#~ "können für die REST-API verwendet werden." + +#~ msgid "" +#~ "Use the token as an Authorization header prefixed by the word token as " +#~ "shown in the following examples:" +#~ msgstr "" +#~ "Nutz den Token als Authorization-Header mit der Präfix \"Token\" wie in " +#~ "folgendem Beispiel:" + +#~ msgid "or" +#~ msgstr "oder" + +#~ msgid "Shopping Settings" +#~ msgstr "Einstellungen Einkaufsliste" + +#~ msgid "Stats" +#~ msgstr "Statistiken" + +#~ msgid "Statistics" +#~ msgstr "Statistiken" + +#~ msgid "Number of objects" +#~ msgstr "Anzahl an Objekten" + +#~ msgid "Recipe Imports" +#~ msgstr "Importierte Rezepte" + +#~ msgid "Objects stats" +#~ msgstr "Objekt-Statistiken" + +#~ msgid "Recipes without Keywords" +#~ msgstr "Rezepte ohne Schlagwort" + +#~ msgid "Internal Recipes" +#~ msgstr "Interne Rezepte" + #~ msgid "Show Links" #~ msgstr "Links anzeigen" @@ -3083,7 +3110,6 @@ msgstr "" #~ msgstr "Erledigt" #, fuzzy -#~| msgid "You are offline, shopping list might not syncronize." #~ msgid "You are offline, shopping list might not synchronize." #~ msgstr "Du bist offline, die Einkaufsliste wird ggf. nicht synchronisiert." @@ -3132,9 +3158,6 @@ msgstr "" #~ msgid "Text dragged here will be appended to the name." #~ msgstr "Text welcher hierhin gezogen wird, wird an den Namen angehängt." -#~ msgid "Description" -#~ msgstr "Beschreibung" - #~ msgid "Text dragged here will be appended to the description." #~ msgstr "" #~ "Text welcher hierhin gezogen wird, wird an die Beschreibung angehängt." @@ -3158,9 +3181,6 @@ msgstr "" #~ "Zutaten welche hierhin gezogen werden, werden zur aktuellen Liste " #~ "hinzugefügt." -#~ msgid "Instructions" -#~ msgstr "Anleitung" - #~ msgid "" #~ "Recipe instructions dragged here will be appended to current instructions." #~ msgstr "" @@ -3514,7 +3534,6 @@ msgstr "" #~ msgstr "Datei auswählen" #, fuzzy -#~| msgid "Delete Recipe" #~ msgid "Select Recipe" #~ msgstr "Rezept löschen" diff --git a/cookbook/locale/el/LC_MESSAGES/django.mo b/cookbook/locale/el/LC_MESSAGES/django.mo index 89e256400..9771bde9e 100644 Binary files a/cookbook/locale/el/LC_MESSAGES/django.mo and b/cookbook/locale/el/LC_MESSAGES/django.mo differ diff --git a/cookbook/locale/en/LC_MESSAGES/django.po b/cookbook/locale/en/LC_MESSAGES/django.po index 822068d7c..c197fd524 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-07-12 19:20+0200\n" +"POT-Creation-Date: 2023-04-26 07:46+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,109 +18,91 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 -#: .\cookbook\templates\stats.html:28 -msgid "Ingredients" -msgstr "" - -#: .\cookbook\forms.py:53 +#: .\cookbook\forms.py:52 msgid "Default unit" msgstr "" -#: .\cookbook\forms.py:54 +#: .\cookbook\forms.py:53 msgid "Use fractions" msgstr "" -#: .\cookbook\forms.py:55 +#: .\cookbook\forms.py:54 msgid "Use KJ" msgstr "" -#: .\cookbook\forms.py:56 +#: .\cookbook\forms.py:55 msgid "Theme" msgstr "" -#: .\cookbook\forms.py:57 +#: .\cookbook\forms.py:56 msgid "Navbar color" msgstr "" -#: .\cookbook\forms.py:58 +#: .\cookbook\forms.py:57 msgid "Sticky navbar" msgstr "" -#: .\cookbook\forms.py:59 +#: .\cookbook\forms.py:58 msgid "Default page" msgstr "" -#: .\cookbook\forms.py:60 -msgid "Show recent recipes" -msgstr "" - -#: .\cookbook\forms.py:61 -msgid "Search style" -msgstr "" - -#: .\cookbook\forms.py:62 +#: .\cookbook\forms.py:59 msgid "Plan sharing" msgstr "" -#: .\cookbook\forms.py:63 +#: .\cookbook\forms.py:60 msgid "Ingredient decimal places" msgstr "" -#: .\cookbook\forms.py:64 +#: .\cookbook\forms.py:61 msgid "Shopping list auto sync period" msgstr "" -#: .\cookbook\forms.py:65 .\cookbook\templates\recipe_view.html:21 -#: .\cookbook\templates\stats.html:47 +#: .\cookbook\forms.py:62 .\cookbook\templates\recipe_view.html:36 msgid "Comments" msgstr "" -#: .\cookbook\forms.py:66 +#: .\cookbook\forms.py:63 msgid "Left-handed mode" msgstr "" -#: .\cookbook\forms.py:70 +#: .\cookbook\forms.py:67 msgid "" "Color of the top navigation bar. Not all colors work with all themes, just " "try them out!" msgstr "" -#: .\cookbook\forms.py:72 +#: .\cookbook\forms.py:69 msgid "Default Unit to be used when inserting a new ingredient into a recipe." msgstr "" -#: .\cookbook\forms.py:74 +#: .\cookbook\forms.py:71 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" msgstr "" -#: .\cookbook\forms.py:76 +#: .\cookbook\forms.py:73 msgid "Display nutritional energy amounts in joules instead of calories" msgstr "" -#: .\cookbook\forms.py:77 +#: .\cookbook\forms.py:74 msgid "Users with whom newly created meal plans should be shared by default." msgstr "" -#: .\cookbook\forms.py:78 +#: .\cookbook\forms.py:75 msgid "Users with whom to share shopping lists." msgstr "" -#: .\cookbook\forms.py:80 -msgid "Show recently viewed recipes on search page." -msgstr "" - -#: .\cookbook\forms.py:81 +#: .\cookbook\forms.py:76 msgid "Number of decimals to round ingredients." msgstr "" -#: .\cookbook\forms.py:82 +#: .\cookbook\forms.py:77 msgid "If you want to be able to create and see comments underneath recipes." msgstr "" -#: .\cookbook\forms.py:84 .\cookbook\forms.py:496 +#: .\cookbook\forms.py:79 .\cookbook\forms.py:492 msgid "" "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. " @@ -128,406 +110,445 @@ msgid "" "mobile data. If lower than instance limit it is reset when saving." msgstr "" -#: .\cookbook\forms.py:87 +#: .\cookbook\forms.py:82 msgid "Makes the navbar stick to the top of the page." msgstr "" -#: .\cookbook\forms.py:88 .\cookbook\forms.py:499 +#: .\cookbook\forms.py:83 .\cookbook\forms.py:495 msgid "Automatically add meal plan ingredients to shopping list." msgstr "" -#: .\cookbook\forms.py:89 +#: .\cookbook\forms.py:84 msgid "Exclude ingredients that are on hand." msgstr "" -#: .\cookbook\forms.py:90 +#: .\cookbook\forms.py:85 msgid "Will optimize the UI for use with your left hand." msgstr "" -#: .\cookbook\forms.py:107 +#: .\cookbook\forms.py:102 msgid "" "Both fields are optional. If none are given the username will be displayed " "instead" msgstr "" -#: .\cookbook\forms.py:128 .\cookbook\forms.py:301 +#: .\cookbook\forms.py:123 .\cookbook\forms.py:297 msgid "Name" msgstr "" -#: .\cookbook\forms.py:129 .\cookbook\forms.py:302 -#: .\cookbook\templates\stats.html:24 .\cookbook\views\lists.py:88 +#: .\cookbook\forms.py:124 .\cookbook\forms.py:298 .\cookbook\views\lists.py:88 msgid "Keywords" msgstr "" -#: .\cookbook\forms.py:130 +#: .\cookbook\forms.py:125 msgid "Preparation time in minutes" msgstr "" -#: .\cookbook\forms.py:131 +#: .\cookbook\forms.py:126 msgid "Waiting time (cooking/baking) in minutes" msgstr "" -#: .\cookbook\forms.py:132 .\cookbook\forms.py:270 .\cookbook\forms.py:303 +#: .\cookbook\forms.py:127 .\cookbook\forms.py:266 .\cookbook\forms.py:299 msgid "Path" msgstr "" -#: .\cookbook\forms.py:133 +#: .\cookbook\forms.py:128 msgid "Storage UID" msgstr "" -#: .\cookbook\forms.py:165 +#: .\cookbook\forms.py:161 msgid "Default" msgstr "" -#: .\cookbook\forms.py:177 +#: .\cookbook\forms.py:173 msgid "" "To prevent duplicates recipes with the same name as existing ones are " "ignored. Check this box to import everything." msgstr "" -#: .\cookbook\forms.py:200 +#: .\cookbook\forms.py:196 msgid "Add your comment: " msgstr "" -#: .\cookbook\forms.py:215 +#: .\cookbook\forms.py:211 msgid "Leave empty for dropbox and enter app password for nextcloud." msgstr "" -#: .\cookbook\forms.py:222 +#: .\cookbook\forms.py:218 msgid "Leave empty for nextcloud and enter api token for dropbox." msgstr "" -#: .\cookbook\forms.py:231 +#: .\cookbook\forms.py:227 msgid "" "Leave empty for dropbox and enter only base url for nextcloud (/remote." "php/webdav/ is added automatically)" msgstr "" -#: .\cookbook\forms.py:269 .\cookbook\views\edit.py:157 +#: .\cookbook\forms.py:265 .\cookbook\views\edit.py:157 msgid "Storage" msgstr "" -#: .\cookbook\forms.py:271 +#: .\cookbook\forms.py:267 msgid "Active" msgstr "" -#: .\cookbook\forms.py:277 +#: .\cookbook\forms.py:273 msgid "Search String" msgstr "" -#: .\cookbook\forms.py:304 +#: .\cookbook\forms.py:300 msgid "File ID" msgstr "" -#: .\cookbook\forms.py:326 +#: .\cookbook\forms.py:322 msgid "You must provide at least a recipe or a title." msgstr "" -#: .\cookbook\forms.py:339 +#: .\cookbook\forms.py:335 msgid "You can list default users to share recipes with in the settings." msgstr "" -#: .\cookbook\forms.py:340 +#: .\cookbook\forms.py:336 msgid "" "You can use markdown to format this field. See the docs here" msgstr "" -#: .\cookbook\forms.py:366 +#: .\cookbook\forms.py:362 msgid "Maximum number of users for this space reached." msgstr "" -#: .\cookbook\forms.py:372 +#: .\cookbook\forms.py:368 msgid "Email address already taken!" msgstr "" -#: .\cookbook\forms.py:380 +#: .\cookbook\forms.py:376 msgid "" "An email address is not required but if present the invite link will be sent " "to the user." msgstr "" -#: .\cookbook\forms.py:395 +#: .\cookbook\forms.py:391 msgid "Name already taken." msgstr "" -#: .\cookbook\forms.py:406 +#: .\cookbook\forms.py:402 msgid "Accept Terms and Privacy" msgstr "" -#: .\cookbook\forms.py:438 +#: .\cookbook\forms.py:434 msgid "" "Determines how fuzzy a search is if it uses trigram similarity matching (e." "g. low values mean more typos are ignored)." msgstr "" -#: .\cookbook\forms.py:448 +#: .\cookbook\forms.py:444 msgid "" "Select type method of search. Click here for " "full description of choices." msgstr "" -#: .\cookbook\forms.py:449 +#: .\cookbook\forms.py:445 msgid "" "Use fuzzy matching on units, keywords and ingredients when editing and " "importing recipes." msgstr "" -#: .\cookbook\forms.py:451 +#: .\cookbook\forms.py:447 msgid "" "Fields to search ignoring accents. Selecting this option can improve or " "degrade search quality depending on language" msgstr "" -#: .\cookbook\forms.py:453 +#: .\cookbook\forms.py:449 msgid "" "Fields to search for partial matches. (e.g. searching for 'Pie' will return " "'pie' and 'piece' and 'soapie')" msgstr "" -#: .\cookbook\forms.py:455 +#: .\cookbook\forms.py:451 msgid "" "Fields to search for beginning of word matches. (e.g. searching for 'sa' " "will return 'salad' and 'sandwich')" msgstr "" -#: .\cookbook\forms.py:457 +#: .\cookbook\forms.py:453 msgid "" "Fields to 'fuzzy' search. (e.g. searching for 'recpie' will find 'recipe'.) " "Note: this option will conflict with 'web' and 'raw' methods of search." msgstr "" -#: .\cookbook\forms.py:459 +#: .\cookbook\forms.py:455 msgid "" "Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " "only function with fulltext fields." msgstr "" -#: .\cookbook\forms.py:463 +#: .\cookbook\forms.py:459 msgid "Search Method" msgstr "" -#: .\cookbook\forms.py:464 +#: .\cookbook\forms.py:460 msgid "Fuzzy Lookups" msgstr "" -#: .\cookbook\forms.py:465 +#: .\cookbook\forms.py:461 msgid "Ignore Accent" msgstr "" -#: .\cookbook\forms.py:466 +#: .\cookbook\forms.py:462 msgid "Partial Match" msgstr "" -#: .\cookbook\forms.py:467 +#: .\cookbook\forms.py:463 msgid "Starts With" msgstr "" -#: .\cookbook\forms.py:468 +#: .\cookbook\forms.py:464 msgid "Fuzzy Search" msgstr "" -#: .\cookbook\forms.py:469 +#: .\cookbook\forms.py:465 msgid "Full Text" msgstr "" -#: .\cookbook\forms.py:494 +#: .\cookbook\forms.py:490 msgid "" "Users will see all items you add to your shopping list. They must add you " "to see items on their list." msgstr "" -#: .\cookbook\forms.py:500 +#: .\cookbook\forms.py:496 msgid "" "When adding a meal plan to the shopping list (manually or automatically), " "include all related recipes." msgstr "" -#: .\cookbook\forms.py:501 +#: .\cookbook\forms.py:497 msgid "" "When adding a meal plan to the shopping list (manually or automatically), " "exclude ingredients that are on hand." msgstr "" -#: .\cookbook\forms.py:502 +#: .\cookbook\forms.py:498 msgid "Default number of hours to delay a shopping list entry." msgstr "" -#: .\cookbook\forms.py:503 +#: .\cookbook\forms.py:499 msgid "Filter shopping list to only include supermarket categories." msgstr "" -#: .\cookbook\forms.py:504 +#: .\cookbook\forms.py:500 msgid "Days of recent shopping list entries to display." msgstr "" -#: .\cookbook\forms.py:505 +#: .\cookbook\forms.py:501 msgid "Mark food 'On Hand' when checked off shopping list." msgstr "" -#: .\cookbook\forms.py:506 +#: .\cookbook\forms.py:502 msgid "Delimiter to use for CSV exports." msgstr "" -#: .\cookbook\forms.py:507 +#: .\cookbook\forms.py:503 msgid "Prefix to add when copying list to the clipboard." msgstr "" -#: .\cookbook\forms.py:511 +#: .\cookbook\forms.py:507 msgid "Share Shopping List" msgstr "" -#: .\cookbook\forms.py:512 +#: .\cookbook\forms.py:508 msgid "Autosync" msgstr "" -#: .\cookbook\forms.py:513 +#: .\cookbook\forms.py:509 msgid "Auto Add Meal Plan" msgstr "" -#: .\cookbook\forms.py:514 +#: .\cookbook\forms.py:510 msgid "Exclude On Hand" msgstr "" -#: .\cookbook\forms.py:515 +#: .\cookbook\forms.py:511 msgid "Include Related" msgstr "" -#: .\cookbook\forms.py:516 +#: .\cookbook\forms.py:512 msgid "Default Delay Hours" msgstr "" -#: .\cookbook\forms.py:517 +#: .\cookbook\forms.py:513 msgid "Filter to Supermarket" msgstr "" -#: .\cookbook\forms.py:518 +#: .\cookbook\forms.py:514 msgid "Recent Days" msgstr "" -#: .\cookbook\forms.py:519 +#: .\cookbook\forms.py:515 msgid "CSV Delimiter" msgstr "" -#: .\cookbook\forms.py:520 +#: .\cookbook\forms.py:516 msgid "List Prefix" msgstr "" -#: .\cookbook\forms.py:521 +#: .\cookbook\forms.py:517 msgid "Auto On Hand" msgstr "" -#: .\cookbook\forms.py:531 +#: .\cookbook\forms.py:527 msgid "Reset Food Inheritance" msgstr "" -#: .\cookbook\forms.py:532 +#: .\cookbook\forms.py:528 msgid "Reset all food to inherit the fields configured." msgstr "" -#: .\cookbook\forms.py:544 +#: .\cookbook\forms.py:540 msgid "Fields on food that should be inherited by default." msgstr "" -#: .\cookbook\forms.py:545 +#: .\cookbook\forms.py:541 msgid "Show recipe counts on search filters" msgstr "" -#: .\cookbook\helper\AllAuthCustomAdapter.py:36 +#: .\cookbook\forms.py:542 +msgid "Use the plural form for units and food inside this space." +msgstr "" + +#: .\cookbook\helper\AllAuthCustomAdapter.py:39 msgid "" "In order to prevent spam, the requested email was not send. Please wait a " "few minutes and try again." msgstr "" -#: .\cookbook\helper\permission_helper.py:149 -#: .\cookbook\helper\permission_helper.py:172 .\cookbook\views\views.py:152 +#: .\cookbook\helper\permission_helper.py:164 +#: .\cookbook\helper\permission_helper.py:187 .\cookbook\views\views.py:117 msgid "You are not logged in and therefore cannot view this page!" msgstr "" -#: .\cookbook\helper\permission_helper.py:153 -#: .\cookbook\helper\permission_helper.py:159 -#: .\cookbook\helper\permission_helper.py:184 -#: .\cookbook\helper\permission_helper.py:254 -#: .\cookbook\helper\permission_helper.py:268 -#: .\cookbook\helper\permission_helper.py:279 -#: .\cookbook\helper\permission_helper.py:290 .\cookbook\views\data.py:33 -#: .\cookbook\views\views.py:163 .\cookbook\views\views.py:170 -#: .\cookbook\views\views.py:249 +#: .\cookbook\helper\permission_helper.py:168 +#: .\cookbook\helper\permission_helper.py:174 +#: .\cookbook\helper\permission_helper.py:199 +#: .\cookbook\helper\permission_helper.py:269 +#: .\cookbook\helper\permission_helper.py:283 +#: .\cookbook\helper\permission_helper.py:294 +#: .\cookbook\helper\permission_helper.py:305 +#: .\cookbook\helper\permission_helper.py:321 +#: .\cookbook\helper\permission_helper.py:342 .\cookbook\views\data.py:36 +#: .\cookbook\views\views.py:128 .\cookbook\views\views.py:135 msgid "You do not have the required permissions to view this page!" msgstr "" -#: .\cookbook\helper\permission_helper.py:177 -#: .\cookbook\helper\permission_helper.py:200 -#: .\cookbook\helper\permission_helper.py:222 +#: .\cookbook\helper\permission_helper.py:192 +#: .\cookbook\helper\permission_helper.py:215 #: .\cookbook\helper\permission_helper.py:237 +#: .\cookbook\helper\permission_helper.py:252 msgid "You cannot interact with this object as it is not owned by you!" msgstr "" -#: .\cookbook\helper\permission_helper.py:321 +#: .\cookbook\helper\permission_helper.py:403 msgid "You have reached the maximum number of recipes for your space." msgstr "" -#: .\cookbook\helper\permission_helper.py:333 +#: .\cookbook\helper\permission_helper.py:415 msgid "You have more users than allowed in your space." msgstr "" -#: .\cookbook\helper\recipe_search.py:565 +#: .\cookbook\helper\recipe_search.py:630 msgid "One of queryset or hash_key must be provided" msgstr "" -#: .\cookbook\helper\shopping_helper.py:152 +#: .\cookbook\helper\recipe_url_import.py:266 +msgid "reverse rotation" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:267 +msgid "careful rotation" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:268 +msgid "knead" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:269 +msgid "thicken" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:270 +msgid "warm up" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:271 +msgid "ferment" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:272 +msgid "sous-vide" +msgstr "" + +#: .\cookbook\helper\shopping_helper.py:157 msgid "You must supply a servings size" msgstr "" -#: .\cookbook\helper\template_helper.py:64 -#: .\cookbook\helper\template_helper.py:66 +#: .\cookbook\helper\template_helper.py:79 +#: .\cookbook\helper\template_helper.py:81 msgid "Could not parse template code." msgstr "" -#: .\cookbook\integration\copymethat.py:41 +#: .\cookbook\integration\copymethat.py:44 #: .\cookbook\integration\melarecipes.py:37 msgid "Favorite" msgstr "" -#: .\cookbook\integration\copymethat.py:70 -#: .\cookbook\integration\recettetek.py:54 -#: .\cookbook\integration\recipekeeper.py:63 -msgid "Imported from" +#: .\cookbook\integration\copymethat.py:50 +msgid "I made this" msgstr "" -#: .\cookbook\integration\integration.py:223 +#: .\cookbook\integration\integration.py:218 msgid "" "Importer expected a .zip file. Did you choose the correct importer type for " "your data ?" msgstr "" -#: .\cookbook\integration\integration.py:226 +#: .\cookbook\integration\integration.py:221 msgid "" "An unexpected error occurred during the import. Please make sure you have " "uploaded a valid file." msgstr "" -#: .\cookbook\integration\integration.py:231 +#: .\cookbook\integration\integration.py:226 msgid "The following recipes were ignored because they already existed:" msgstr "" -#: .\cookbook\integration\integration.py:235 +#: .\cookbook\integration\integration.py:230 #, python-format msgid "Imported %s recipes." msgstr "" -#: .\cookbook\integration\paprika.py:46 -msgid "Notes" +#: .\cookbook\integration\openeats.py:26 +msgid "Recipe source:" msgstr "" #: .\cookbook\integration\paprika.py:49 +msgid "Notes" +msgstr "" + +#: .\cookbook\integration\paprika.py:52 msgid "Nutritional Information" msgstr "" -#: .\cookbook\integration\paprika.py:53 +#: .\cookbook\integration\paprika.py:56 msgid "Source" msgstr "" +#: .\cookbook\integration\recettetek.py:54 +#: .\cookbook\integration\recipekeeper.py:70 +msgid "Imported from" +msgstr "" + #: .\cookbook\integration\saffron.py:23 msgid "Servings" msgstr "" @@ -540,9 +561,7 @@ msgstr "" msgid "Preparation Time" msgstr "" -#: .\cookbook\integration\saffron.py:29 -#: .\cookbook\templates\forms\ingredients.html:7 -#: .\cookbook\templates\index.html:7 +#: .\cookbook\integration\saffron.py:29 .\cookbook\templates\index.html:7 msgid "Cookbook" msgstr "" @@ -582,171 +601,158 @@ msgstr "" msgid "Other" msgstr "" -#: .\cookbook\models.py:251 +#: .\cookbook\models.py:261 msgid "" "Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " "upload." msgstr "" -#: .\cookbook\models.py:353 .\cookbook\templates\search.html:7 +#: .\cookbook\models.py:365 .\cookbook\templates\search.html:7 +#: .\cookbook\templates\settings.html:18 #: .\cookbook\templates\space_manage.html:7 msgid "Search" msgstr "" -#: .\cookbook\models.py:354 .\cookbook\templates\base.html:107 +#: .\cookbook\models.py:366 .\cookbook\templates\base.html:110 #: .\cookbook\templates\meal_plan.html:7 .\cookbook\views\delete.py:178 #: .\cookbook\views\edit.py:211 .\cookbook\views\new.py:179 msgid "Meal-Plan" msgstr "" -#: .\cookbook\models.py:355 .\cookbook\templates\base.html:115 +#: .\cookbook\models.py:367 .\cookbook\templates\base.html:118 msgid "Books" msgstr "" -#: .\cookbook\models.py:363 -msgid "Small" -msgstr "" - -#: .\cookbook\models.py:363 -msgid "Large" -msgstr "" - -#: .\cookbook\models.py:363 .\cookbook\templates\generic\new_template.html:6 -#: .\cookbook\templates\generic\new_template.html:14 -msgid "New" -msgstr "" - -#: .\cookbook\models.py:584 +#: .\cookbook\models.py:580 msgid " is part of a recipe step and cannot be deleted" msgstr "" -#: .\cookbook\models.py:1162 .\cookbook\templates\search_info.html:28 +#: .\cookbook\models.py:1181 .\cookbook\templates\search_info.html:28 msgid "Simple" msgstr "" -#: .\cookbook\models.py:1163 .\cookbook\templates\search_info.html:33 +#: .\cookbook\models.py:1182 .\cookbook\templates\search_info.html:33 msgid "Phrase" msgstr "" -#: .\cookbook\models.py:1164 .\cookbook\templates\search_info.html:38 +#: .\cookbook\models.py:1183 .\cookbook\templates\search_info.html:38 msgid "Web" msgstr "" -#: .\cookbook\models.py:1165 .\cookbook\templates\search_info.html:47 +#: .\cookbook\models.py:1184 .\cookbook\templates\search_info.html:47 msgid "Raw" msgstr "" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 msgid "Food Alias" msgstr "" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 msgid "Unit Alias" msgstr "" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 msgid "Keyword Alias" msgstr "" -#: .\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 +#: .\cookbook\models.py:1232 +msgid "Description Replace" +msgstr "" + +#: .\cookbook\models.py:1232 +msgid "Instruction Replace" +msgstr "" + +#: .\cookbook\models.py:1258 .\cookbook\views\delete.py:36 +#: .\cookbook\views\edit.py:251 .\cookbook\views\new.py:48 msgid "Recipe" msgstr "" -#: .\cookbook\models.py:1228 +#: .\cookbook\models.py:1259 msgid "Food" msgstr "" -#: .\cookbook\models.py:1229 .\cookbook\templates\base.html:138 +#: .\cookbook\models.py:1260 .\cookbook\templates\base.html:141 msgid "Keyword" msgstr "" -#: .\cookbook\serializer.py:207 -msgid "Cannot modify Space owner permission." -msgstr "" - -#: .\cookbook\serializer.py:290 +#: .\cookbook\serializer.py:198 msgid "File uploads are not enabled for this Space." msgstr "" -#: .\cookbook\serializer.py:301 +#: .\cookbook\serializer.py:209 msgid "You have reached your file upload limit." msgstr "" -#: .\cookbook\serializer.py:1081 +#: .\cookbook\serializer.py:291 +msgid "Cannot modify Space owner permission." +msgstr "" + +#: .\cookbook\serializer.py:1093 msgid "Hello" msgstr "" -#: .\cookbook\serializer.py:1081 +#: .\cookbook\serializer.py:1093 msgid "You have been invited by " msgstr "" -#: .\cookbook\serializer.py:1082 +#: .\cookbook\serializer.py:1094 msgid " to join their Tandoor Recipes space " msgstr "" -#: .\cookbook\serializer.py:1083 +#: .\cookbook\serializer.py:1095 msgid "Click the following link to activate your account: " msgstr "" -#: .\cookbook\serializer.py:1084 +#: .\cookbook\serializer.py:1096 msgid "" "If the link does not work use the following code to manually join the space: " msgstr "" -#: .\cookbook\serializer.py:1085 +#: .\cookbook\serializer.py:1097 msgid "The invitation is valid until " msgstr "" -#: .\cookbook\serializer.py:1086 +#: .\cookbook\serializer.py:1098 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " msgstr "" -#: .\cookbook\serializer.py:1089 +#: .\cookbook\serializer.py:1101 msgid "Tandoor Recipes Invite" msgstr "" -#: .\cookbook\serializer.py:1209 +#: .\cookbook\serializer.py:1242 msgid "Existing shopping list to update" msgstr "" -#: .\cookbook\serializer.py:1211 +#: .\cookbook\serializer.py:1244 msgid "" "List of ingredient IDs from the recipe to add, if not provided all " "ingredients will be added." msgstr "" -#: .\cookbook\serializer.py:1213 +#: .\cookbook\serializer.py:1246 msgid "" "Providing a list_recipe ID and servings of 0 will delete that shopping list." msgstr "" -#: .\cookbook\serializer.py:1222 +#: .\cookbook\serializer.py:1255 msgid "Amount of food to add to the shopping list" msgstr "" -#: .\cookbook\serializer.py:1224 +#: .\cookbook\serializer.py:1257 msgid "ID of unit to use for the shopping list" msgstr "" -#: .\cookbook\serializer.py:1226 +#: .\cookbook\serializer.py:1259 msgid "When set to true will delete all food from active shopping lists." msgstr "" -#: .\cookbook\tables.py:36 .\cookbook\templates\generic\edit_template.html:6 -#: .\cookbook\templates\generic\edit_template.html:14 -#: .\cookbook\templates\recipes_table.html:82 -msgid "Edit" -msgstr "" - -#: .\cookbook\tables.py:116 .\cookbook\tables.py:131 +#: .\cookbook\tables.py:61 .\cookbook\tables.py:75 #: .\cookbook\templates\generic\delete_template.html:7 #: .\cookbook\templates\generic\delete_template.html:15 #: .\cookbook\templates\generic\edit_template.html:28 -#: .\cookbook\templates\recipes_table.html:90 msgid "Delete" msgstr "" @@ -774,9 +780,10 @@ msgstr "" #: .\cookbook\templates\account\email.html:12 #: .\cookbook\templates\account\password_change.html:11 #: .\cookbook\templates\account\password_set.html:11 -#: .\cookbook\templates\base.html:293 .\cookbook\templates\settings.html:6 +#: .\cookbook\templates\base.html:296 .\cookbook\templates\settings.html:6 #: .\cookbook\templates\settings.html:17 #: .\cookbook\templates\socialaccount\connections.html:10 +#: .\cookbook\templates\user_settings.html:8 msgid "Settings" msgstr "" @@ -863,8 +870,8 @@ msgid "" "request." msgstr "" -#: .\cookbook\templates\account\login.html:8 -#: .\cookbook\templates\base.html:340 .\cookbook\templates\openid\login.html:8 +#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:343 +#: .\cookbook\templates\openid\login.html:8 msgid "Login" msgstr "" @@ -884,21 +891,20 @@ msgstr "" msgid "Sign Up" msgstr "" +#: .\cookbook\templates\account\login.html:38 +msgid "Lost your password?" +msgstr "" + #: .\cookbook\templates\account\login.html:39 -#: .\cookbook\templates\account\login.html:41 #: .\cookbook\templates\account\password_reset.html:29 msgid "Reset My Password" msgstr "" -#: .\cookbook\templates\account\login.html:40 -msgid "Lost your password?" -msgstr "" - -#: .\cookbook\templates\account\login.html:52 +#: .\cookbook\templates\account\login.html:50 msgid "Social Login" msgstr "" -#: .\cookbook\templates\account\login.html:53 +#: .\cookbook\templates\account\login.html:51 msgid "You can use any of the following providers to sign in." msgstr "" @@ -924,7 +930,6 @@ msgstr "" #: .\cookbook\templates\account\password_change.html:12 #: .\cookbook\templates\account\password_set.html:12 -#: .\cookbook\templates\settings.html:76 msgid "Password" msgstr "" @@ -1028,129 +1033,124 @@ msgstr "" msgid "We are sorry, but the sign up is currently closed." msgstr "" -#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:330 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:333 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "" -#: .\cookbook\templates\base.html:103 .\cookbook\templates\index.html:87 -#: .\cookbook\templates\stats.html:22 +#: .\cookbook\templates\base.html:106 .\cookbook\templates\index.html:87 msgid "Recipes" msgstr "" -#: .\cookbook\templates\base.html:111 +#: .\cookbook\templates\base.html:114 msgid "Shopping" msgstr "" -#: .\cookbook\templates\base.html:150 .\cookbook\views\lists.py:105 +#: .\cookbook\templates\base.html:153 .\cookbook\views\lists.py:105 msgid "Foods" msgstr "" -#: .\cookbook\templates\base.html:162 -#: .\cookbook\templates\forms\ingredients.html:24 -#: .\cookbook\templates\stats.html:26 .\cookbook\views\lists.py:122 +#: .\cookbook\templates\base.html:165 .\cookbook\views\lists.py:122 msgid "Units" msgstr "" -#: .\cookbook\templates\base.html:176 .\cookbook\templates\supermarket.html:7 +#: .\cookbook\templates\base.html:179 .\cookbook\templates\supermarket.html:7 msgid "Supermarket" msgstr "" -#: .\cookbook\templates\base.html:188 +#: .\cookbook\templates\base.html:191 msgid "Supermarket Category" msgstr "" -#: .\cookbook\templates\base.html:200 .\cookbook\views\lists.py:171 +#: .\cookbook\templates\base.html:203 .\cookbook\views\lists.py:171 msgid "Automations" msgstr "" -#: .\cookbook\templates\base.html:214 .\cookbook\views\lists.py:207 +#: .\cookbook\templates\base.html:217 .\cookbook\views\lists.py:207 msgid "Files" msgstr "" -#: .\cookbook\templates\base.html:226 +#: .\cookbook\templates\base.html:229 msgid "Batch Edit" msgstr "" -#: .\cookbook\templates\base.html:238 .\cookbook\templates\history.html:6 +#: .\cookbook\templates\base.html:241 .\cookbook\templates\history.html:6 #: .\cookbook\templates\history.html:14 msgid "History" msgstr "" -#: .\cookbook\templates\base.html:252 +#: .\cookbook\templates\base.html:255 #: .\cookbook\templates\ingredient_editor.html:7 #: .\cookbook\templates\ingredient_editor.html:13 msgid "Ingredient Editor" msgstr "" -#: .\cookbook\templates\base.html:264 +#: .\cookbook\templates\base.html:267 #: .\cookbook\templates\export_response.html:7 #: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 msgid "Export" msgstr "" -#: .\cookbook\templates\base.html:280 .\cookbook\templates\index.html:47 +#: .\cookbook\templates\base.html:283 .\cookbook\templates\index.html:47 msgid "Import Recipe" msgstr "" -#: .\cookbook\templates\base.html:282 +#: .\cookbook\templates\base.html:285 msgid "Create" msgstr "" -#: .\cookbook\templates\base.html:295 +#: .\cookbook\templates\base.html:298 #: .\cookbook\templates\generic\list_template.html:14 -#: .\cookbook\templates\stats.html:43 msgid "External Recipes" msgstr "" -#: .\cookbook\templates\base.html:298 -#: .\cookbook\templates\space_manage.html:15 +#: .\cookbook\templates\base.html:301 .\cookbook\templates\space_manage.html:15 msgid "Space Settings" msgstr "" -#: .\cookbook\templates\base.html:303 .\cookbook\templates\system.html:13 +#: .\cookbook\templates\base.html:306 .\cookbook\templates\system.html:13 msgid "System" msgstr "" -#: .\cookbook\templates\base.html:305 +#: .\cookbook\templates\base.html:308 msgid "Admin" msgstr "" -#: .\cookbook\templates\base.html:309 +#: .\cookbook\templates\base.html:312 #: .\cookbook\templates\space_overview.html:25 msgid "Your Spaces" msgstr "" -#: .\cookbook\templates\base.html:320 +#: .\cookbook\templates\base.html:323 #: .\cookbook\templates\space_overview.html:6 msgid "Overview" msgstr "" -#: .\cookbook\templates\base.html:324 +#: .\cookbook\templates\base.html:327 msgid "Markdown Guide" msgstr "" -#: .\cookbook\templates\base.html:326 +#: .\cookbook\templates\base.html:329 msgid "GitHub" msgstr "" -#: .\cookbook\templates\base.html:328 +#: .\cookbook\templates\base.html:331 msgid "Translate Tandoor" msgstr "" -#: .\cookbook\templates\base.html:332 +#: .\cookbook\templates\base.html:335 msgid "API Browser" msgstr "" -#: .\cookbook\templates\base.html:335 +#: .\cookbook\templates\base.html:338 msgid "Log out" msgstr "" -#: .\cookbook\templates\base.html:357 +#: .\cookbook\templates\base.html:360 msgid "You are using the free version of Tandor" msgstr "" -#: .\cookbook\templates\base.html:358 +#: .\cookbook\templates\base.html:361 msgid "Upgrade Now" msgstr "" @@ -1188,11 +1188,7 @@ msgstr "" #: .\cookbook\templates\forms\edit_import_recipe.html:14 #: .\cookbook\templates\generic\edit_template.html:23 #: .\cookbook\templates\generic\new_template.html:23 -#: .\cookbook\templates\settings.html:70 -#: .\cookbook\templates\settings.html:112 -#: .\cookbook\templates\settings.html:130 -#: .\cookbook\templates\settings.html:202 -#: .\cookbook\templates\settings.html:213 +#: .\cookbook\templates\settings.html:57 msgid "Save" msgstr "" @@ -1240,34 +1236,6 @@ msgstr "" msgid "Edit Recipe" msgstr "" -#: .\cookbook\templates\forms\ingredients.html:15 -msgid "Edit Ingredients" -msgstr "" - -#: .\cookbook\templates\forms\ingredients.html:16 -msgid "" -"\n" -" The following form can be used if, accidentally, two (or more) units " -"or ingredients where created that should be\n" -" the same.\n" -" It merges two units or ingredients and updates all recipes using " -"them.\n" -" " -msgstr "" - -#: .\cookbook\templates\forms\ingredients.html:26 -msgid "Are you sure that you want to merge these two units?" -msgstr "" - -#: .\cookbook\templates\forms\ingredients.html:31 -#: .\cookbook\templates\forms\ingredients.html:40 -msgid "Merge" -msgstr "" - -#: .\cookbook\templates\forms\ingredients.html:36 -msgid "Are you sure that you want to merge these two ingredients?" -msgstr "" - #: .\cookbook\templates\generic\delete_template.html:21 #, python-format msgid "Are you sure you want to delete the %(title)s: %(object)s " @@ -1289,6 +1257,11 @@ msgstr "" msgid "Cancel" msgstr "" +#: .\cookbook\templates\generic\edit_template.html:6 +#: .\cookbook\templates\generic\edit_template.html:14 +msgid "Edit" +msgstr "" + #: .\cookbook\templates\generic\edit_template.html:32 msgid "View" msgstr "" @@ -1310,13 +1283,16 @@ msgstr "" msgid "Import all" msgstr "" +#: .\cookbook\templates\generic\new_template.html:6 +#: .\cookbook\templates\generic\new_template.html:14 +msgid "New" +msgstr "" + #: .\cookbook\templates\generic\table_template.html:76 -#: .\cookbook\templates\recipes_table.html:121 msgid "previous" msgstr "" #: .\cookbook\templates\generic\table_template.html:98 -#: .\cookbook\templates\recipes_table.html:143 msgid "next" msgstr "" @@ -1328,24 +1304,11 @@ msgstr "" msgid "Cook Log" msgstr "" -#: .\cookbook\templates\import.html:6 -msgid "Import Recipes" -msgstr "" - -#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 #: .\cookbook\templates\import_response.html:7 .\cookbook\views\delete.py:86 #: .\cookbook\views\edit.py:191 msgid "Import" msgstr "" -#: .\cookbook\templates\include\recipe_open_modal.html:18 -msgid "Close" -msgstr "" - -#: .\cookbook\templates\include\recipe_open_modal.html:32 -msgid "Open Recipe" -msgstr "" - #: .\cookbook\templates\include\storage_backend_warning.html:4 msgid "Security Warning" msgstr "" @@ -1522,31 +1485,6 @@ msgstr "" msgid "Cell" msgstr "" -#: .\cookbook\templates\meal_plan_entry.html:6 -msgid "Meal Plan View" -msgstr "" - -#: .\cookbook\templates\meal_plan_entry.html:18 -msgid "Created by" -msgstr "" - -#: .\cookbook\templates\meal_plan_entry.html:20 -msgid "Shared with" -msgstr "" - -#: .\cookbook\templates\meal_plan_entry.html:48 -#: .\cookbook\templates\recipes_table.html:64 -msgid "Last cooked" -msgstr "" - -#: .\cookbook\templates\meal_plan_entry.html:50 -msgid "Never cooked before." -msgstr "" - -#: .\cookbook\templates\meal_plan_entry.html:76 -msgid "Other meals on this day" -msgstr "" - #: .\cookbook\templates\no_groups_info.html:5 #: .\cookbook\templates\no_groups_info.html:12 msgid "No Permissions" @@ -1591,43 +1529,26 @@ msgstr "" msgid "Back" msgstr "" -#: .\cookbook\templates\recipe_view.html:26 +#: .\cookbook\templates\profile.html:7 +msgid "Profile" +msgstr "" + +#: .\cookbook\templates\recipe_view.html:41 msgid "by" msgstr "" -#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:144 +#: .\cookbook\templates\recipe_view.html:59 .\cookbook\views\delete.py:144 #: .\cookbook\views\edit.py:171 msgid "Comment" msgstr "" -#: .\cookbook\templates\recipes_table.html:19 -#: .\cookbook\templates\recipes_table.html:23 -msgid "Recipe Image" -msgstr "" - -#: .\cookbook\templates\recipes_table.html:51 -msgid "Preparation time ca." -msgstr "" - -#: .\cookbook\templates\recipes_table.html:57 -msgid "Waiting time ca." -msgstr "" - -#: .\cookbook\templates\recipes_table.html:60 -msgid "External" -msgstr "" - -#: .\cookbook\templates\recipes_table.html:86 -msgid "Log Cooking" -msgstr "" - #: .\cookbook\templates\rest_framework\api.html:5 msgid "Recipe Home" msgstr "" #: .\cookbook\templates\search_info.html:5 #: .\cookbook\templates\search_info.html:9 -#: .\cookbook\templates\settings.html:172 +#: .\cookbook\templates\settings.html:24 msgid "Search Settings" msgstr "" @@ -1782,127 +1703,57 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\settings.html:28 -msgid "Account" -msgstr "" - -#: .\cookbook\templates\settings.html:35 -msgid "Preferences" -msgstr "" - -#: .\cookbook\templates\settings.html:42 -msgid "API-Settings" -msgstr "" - -#: .\cookbook\templates\settings.html:49 -msgid "Search-Settings" -msgstr "" - -#: .\cookbook\templates\settings.html:56 -msgid "Shopping-Settings" -msgstr "" - -#: .\cookbook\templates\settings.html:65 -msgid "Name Settings" -msgstr "" - -#: .\cookbook\templates\settings.html:73 -msgid "Account Settings" -msgstr "" - -#: .\cookbook\templates\settings.html:75 -msgid "Emails" -msgstr "" - -#: .\cookbook\templates\settings.html:78 -#: .\cookbook\templates\socialaccount\connections.html:11 -msgid "Social" -msgstr "" - -#: .\cookbook\templates\settings.html:91 -msgid "Language" -msgstr "" - -#: .\cookbook\templates\settings.html:121 -msgid "Style" -msgstr "" - -#: .\cookbook\templates\settings.html:142 -msgid "API Token" -msgstr "" - -#: .\cookbook\templates\settings.html:143 -msgid "" -"You can use both basic authentication and token based authentication to " -"access the REST API." -msgstr "" - -#: .\cookbook\templates\settings.html:160 -msgid "" -"Use the token as an Authorization header prefixed by the word token as shown " -"in the following examples:" -msgstr "" - -#: .\cookbook\templates\settings.html:162 -msgid "or" -msgstr "" - -#: .\cookbook\templates\settings.html:173 +#: .\cookbook\templates\settings.html:25 msgid "" "There are many options to configure the search depending on your personal " "preferences." msgstr "" -#: .\cookbook\templates\settings.html:174 +#: .\cookbook\templates\settings.html:26 msgid "" "Usually you do not need to configure any of them and can just stick " "with either the default or one of the following presets." msgstr "" -#: .\cookbook\templates\settings.html:175 +#: .\cookbook\templates\settings.html:27 msgid "" "If you do want to configure the search you can read about the different " "options here." msgstr "" -#: .\cookbook\templates\settings.html:180 +#: .\cookbook\templates\settings.html:32 msgid "Fuzzy" msgstr "" -#: .\cookbook\templates\settings.html:181 +#: .\cookbook\templates\settings.html:33 msgid "" "Find what you need even if your search or the recipe contains typos. Might " "return more results than needed to make sure you find what you are looking " "for." msgstr "" -#: .\cookbook\templates\settings.html:182 +#: .\cookbook\templates\settings.html:34 msgid "This is the default behavior" msgstr "" -#: .\cookbook\templates\settings.html:183 -#: .\cookbook\templates\settings.html:191 +#: .\cookbook\templates\settings.html:37 .\cookbook\templates\settings.html:46 msgid "Apply" msgstr "" -#: .\cookbook\templates\settings.html:188 +#: .\cookbook\templates\settings.html:42 msgid "Precise" msgstr "" -#: .\cookbook\templates\settings.html:189 +#: .\cookbook\templates\settings.html:43 msgid "" "Allows fine control over search results but might not return results if too " "many spelling mistakes are made." msgstr "" -#: .\cookbook\templates\settings.html:190 +#: .\cookbook\templates\settings.html:44 msgid "Perfect for large Databases" msgstr "" -#: .\cookbook\templates\settings.html:207 -msgid "Shopping Settings" -msgstr "" - #: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5 msgid "Cookbook Setup" msgstr "" @@ -1935,6 +1786,10 @@ msgstr "" msgid "Account Connections" msgstr "" +#: .\cookbook\templates\socialaccount\connections.html:11 +msgid "Social" +msgstr "" + #: .\cookbook\templates\socialaccount\connections.html:18 msgid "" "You can sign in to your account using any of the following third party\n" @@ -2027,70 +1882,42 @@ msgid "" "You can either be invited into an existing space or create your own one." msgstr "" -#: .\cookbook\templates\space_overview.html:45 +#: .\cookbook\templates\space_overview.html:53 msgid "Owner" msgstr "" -#: .\cookbook\templates\space_overview.html:49 +#: .\cookbook\templates\space_overview.html:57 msgid "Leave Space" msgstr "" -#: .\cookbook\templates\space_overview.html:70 -#: .\cookbook\templates\space_overview.html:80 +#: .\cookbook\templates\space_overview.html:78 +#: .\cookbook\templates\space_overview.html:88 msgid "Join Space" msgstr "" -#: .\cookbook\templates\space_overview.html:73 +#: .\cookbook\templates\space_overview.html:81 msgid "Join an existing space." msgstr "" -#: .\cookbook\templates\space_overview.html:75 +#: .\cookbook\templates\space_overview.html:83 msgid "" "To join an existing space either enter your invite token or click on the " "invite link the space owner send you." msgstr "" -#: .\cookbook\templates\space_overview.html:88 -#: .\cookbook\templates\space_overview.html:97 +#: .\cookbook\templates\space_overview.html:96 +#: .\cookbook\templates\space_overview.html:105 msgid "Create Space" msgstr "" -#: .\cookbook\templates\space_overview.html:91 +#: .\cookbook\templates\space_overview.html:99 msgid "Create your own recipe space." msgstr "" -#: .\cookbook\templates\space_overview.html:93 +#: .\cookbook\templates\space_overview.html:101 msgid "Start your own recipe space and invite other users to it." msgstr "" -#: .\cookbook\templates\stats.html:4 -msgid "Stats" -msgstr "" - -#: .\cookbook\templates\stats.html:10 -msgid "Statistics" -msgstr "" - -#: .\cookbook\templates\stats.html:19 -msgid "Number of objects" -msgstr "" - -#: .\cookbook\templates\stats.html:30 -msgid "Recipe Imports" -msgstr "" - -#: .\cookbook\templates\stats.html:38 -msgid "Objects stats" -msgstr "" - -#: .\cookbook\templates\stats.html:41 -msgid "Recipes without Keywords" -msgstr "" - -#: .\cookbook\templates\stats.html:45 -msgid "Internal Recipes" -msgstr "" - #: .\cookbook\templates\system.html:20 msgid "System Information" msgstr "" @@ -2188,249 +2015,262 @@ msgstr "" msgid "URL Import" msgstr "" -#: .\cookbook\views\api.py:105 .\cookbook\views\api.py:197 +#: .\cookbook\views\api.py:110 .\cookbook\views\api.py:202 msgid "Parameter updated_at incorrectly formatted" msgstr "" -#: .\cookbook\views\api.py:217 .\cookbook\views\api.py:320 +#: .\cookbook\views\api.py:222 .\cookbook\views\api.py:325 +#, python-brace-format msgid "No {self.basename} with id {pk} exists" msgstr "" -#: .\cookbook\views\api.py:221 +#: .\cookbook\views\api.py:226 msgid "Cannot merge with the same object!" msgstr "" -#: .\cookbook\views\api.py:228 +#: .\cookbook\views\api.py:233 +#, python-brace-format msgid "No {self.basename} with id {target} exists" msgstr "" -#: .\cookbook\views\api.py:233 +#: .\cookbook\views\api.py:238 msgid "Cannot merge with child object!" msgstr "" -#: .\cookbook\views\api.py:266 +#: .\cookbook\views\api.py:271 +#, python-brace-format msgid "{source.name} was merged successfully with {target.name}" msgstr "" -#: .\cookbook\views\api.py:271 +#: .\cookbook\views\api.py:276 +#, python-brace-format msgid "An error occurred attempting to merge {source.name} with {target.name}" msgstr "" -#: .\cookbook\views\api.py:329 +#: .\cookbook\views\api.py:334 +#, python-brace-format msgid "{child.name} was moved successfully to the root." msgstr "" -#: .\cookbook\views\api.py:332 .\cookbook\views\api.py:350 +#: .\cookbook\views\api.py:337 .\cookbook\views\api.py:355 msgid "An error occurred attempting to move " msgstr "" -#: .\cookbook\views\api.py:335 +#: .\cookbook\views\api.py:340 msgid "Cannot move an object to itself!" msgstr "" -#: .\cookbook\views\api.py:341 +#: .\cookbook\views\api.py:346 +#, python-brace-format msgid "No {self.basename} with id {parent} exists" msgstr "" -#: .\cookbook\views\api.py:347 +#: .\cookbook\views\api.py:352 +#, python-brace-format msgid "{child.name} was moved successfully to parent {parent.name}" msgstr "" -#: .\cookbook\views\api.py:542 +#: .\cookbook\views\api.py:553 +#, python-brace-format msgid "{obj.name} was removed from the shopping list." msgstr "" -#: .\cookbook\views\api.py:547 .\cookbook\views\api.py:879 -#: .\cookbook\views\api.py:892 +#: .\cookbook\views\api.py:558 .\cookbook\views\api.py:888 +#: .\cookbook\views\api.py:901 +#, python-brace-format msgid "{obj.name} was added to the shopping list." msgstr "" -#: .\cookbook\views\api.py:674 +#: .\cookbook\views\api.py:685 msgid "ID of recipe a step is part of. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:676 +#: .\cookbook\views\api.py:687 msgid "Query string matched (fuzzy) against object name." msgstr "" -#: .\cookbook\views\api.py:720 +#: .\cookbook\views\api.py:731 msgid "" "Query string matched (fuzzy) against recipe name. In the future also " "fulltext search." msgstr "" -#: .\cookbook\views\api.py:722 +#: .\cookbook\views\api.py:733 msgid "" "ID of keyword a recipe should have. For multiple repeat parameter. " "Equivalent to keywords_or" msgstr "" -#: .\cookbook\views\api.py:725 +#: .\cookbook\views\api.py:736 msgid "" "Keyword IDs, repeat for multiple. Return recipes with any of the keywords" msgstr "" -#: .\cookbook\views\api.py:728 +#: .\cookbook\views\api.py:739 msgid "" "Keyword IDs, repeat for multiple. Return recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:742 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords." msgstr "" -#: .\cookbook\views\api.py:734 +#: .\cookbook\views\api.py:745 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:736 +#: .\cookbook\views\api.py:747 msgid "ID of food a recipe should have. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:739 +#: .\cookbook\views\api.py:750 msgid "Food IDs, repeat for multiple. Return recipes with any of the foods" msgstr "" -#: .\cookbook\views\api.py:741 +#: .\cookbook\views\api.py:752 msgid "Food IDs, repeat for multiple. Return recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:743 +#: .\cookbook\views\api.py:754 msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods." msgstr "" -#: .\cookbook\views\api.py:745 +#: .\cookbook\views\api.py:756 msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:746 +#: .\cookbook\views\api.py:757 msgid "ID of unit a recipe should have." msgstr "" -#: .\cookbook\views\api.py:748 +#: .\cookbook\views\api.py:759 msgid "" "Rating a recipe should have or greater. [0 - 5] Negative value filters " "rating less than." msgstr "" -#: .\cookbook\views\api.py:749 +#: .\cookbook\views\api.py:760 msgid "ID of book a recipe should be in. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:751 +#: .\cookbook\views\api.py:762 msgid "Book IDs, repeat for multiple. Return recipes with any of the books" msgstr "" -#: .\cookbook\views\api.py:753 +#: .\cookbook\views\api.py:764 msgid "Book IDs, repeat for multiple. Return recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:755 +#: .\cookbook\views\api.py:766 msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books." msgstr "" -#: .\cookbook\views\api.py:757 +#: .\cookbook\views\api.py:768 msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:759 +#: .\cookbook\views\api.py:770 msgid "If only internal recipes should be returned. [true/false]" msgstr "" -#: .\cookbook\views\api.py:761 +#: .\cookbook\views\api.py:772 msgid "Returns the results in randomized order. [true/false]" msgstr "" -#: .\cookbook\views\api.py:763 +#: .\cookbook\views\api.py:774 msgid "Returns new results first in search results. [true/false]" msgstr "" -#: .\cookbook\views\api.py:765 +#: .\cookbook\views\api.py:776 msgid "" "Filter recipes cooked X times or more. Negative values returns cooked less " "than X times" msgstr "" -#: .\cookbook\views\api.py:767 +#: .\cookbook\views\api.py:778 msgid "" "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:769 +#: .\cookbook\views\api.py:780 msgid "" "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:771 +#: .\cookbook\views\api.py:782 msgid "" "Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:773 +#: .\cookbook\views\api.py:784 msgid "" "Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:775 +#: .\cookbook\views\api.py:786 msgid "Filter recipes that can be made with OnHand food. [true/false]" msgstr "" -#: .\cookbook\views\api.py:937 +#: .\cookbook\views\api.py:946 msgid "" "Returns the shopping list entry with a primary key of id. Multiple values " "allowed." msgstr "" -#: .\cookbook\views\api.py:942 +#: .\cookbook\views\api.py:951 msgid "" -"Filter shopping list entries on checked. [true, false, both, recent]" -"
    - recent includes unchecked items and recently completed items." +"Filter shopping list entries on checked. [true, false, both, recent]
    - recent includes unchecked items and recently completed items." msgstr "" -#: .\cookbook\views\api.py:945 +#: .\cookbook\views\api.py:954 msgid "Returns the shopping list entries sorted by supermarket category order." msgstr "" -#: .\cookbook\views\api.py:1140 +#: .\cookbook\views\api.py:1166 msgid "Nothing to do." msgstr "" -#: .\cookbook\views\api.py:1160 +#: .\cookbook\views\api.py:1198 msgid "Invalid Url" msgstr "" -#: .\cookbook\views\api.py:1167 +#: .\cookbook\views\api.py:1205 msgid "Connection Refused." msgstr "" -#: .\cookbook\views\api.py:1172 +#: .\cookbook\views\api.py:1210 msgid "Bad URL Schema." msgstr "" -#: .\cookbook\views\api.py:1195 +#: .\cookbook\views\api.py:1233 msgid "No usable data could be found." msgstr "" -#: .\cookbook\views\api.py:1303 .\cookbook\views\data.py:28 +#: .\cookbook\views\api.py:1326 .\cookbook\views\import_export.py:117 +msgid "Importing is not implemented for this provider" +msgstr "" + +#: .\cookbook\views\api.py:1372 .\cookbook\views\data.py:31 #: .\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:1325 +#: .\cookbook\views\api.py:1394 msgid "Sync successful!" msgstr "" -#: .\cookbook\views\api.py:1330 +#: .\cookbook\views\api.py:1399 msgid "Error synchronizing with Storage" msgstr "" -#: .\cookbook\views\data.py:97 +#: .\cookbook\views\data.py:100 #, python-format msgid "Batch edit done. %(count)d recipe was updated." msgid_plural "Batch edit done. %(count)d Recipes where updated." @@ -2487,11 +2327,7 @@ msgstr "" msgid "Error saving changes!" msgstr "" -#: .\cookbook\views\import_export.py:111 .\cookbook\views\import_export.py:150 -msgid "Importing is not implemented for this provider" -msgstr "" - -#: .\cookbook\views\import_export.py:137 +#: .\cookbook\views\import_export.py:104 msgid "" "The PDF Exporter is not enabled on this instance as it is still in an " "experimental state." @@ -2537,72 +2373,73 @@ msgstr "" msgid "There was an error importing this recipe!" msgstr "" -#: .\cookbook\views\views.py:124 +#: .\cookbook\views\views.py:73 .\cookbook\views\views.py:191 +#: .\cookbook\views\views.py:213 .\cookbook\views\views.py:399 +msgid "This feature is not available in the demo version!" +msgstr "" + +#: .\cookbook\views\views.py:89 msgid "" "You have successfully created your own recipe space. Start by adding some " "recipes or invite other people to join you." msgstr "" -#: .\cookbook\views\views.py:178 +#: .\cookbook\views\views.py:143 msgid "You do not have the required permissions to perform this action!" msgstr "" -#: .\cookbook\views\views.py:189 +#: .\cookbook\views\views.py:154 msgid "Comment saved!" msgstr "" -#: .\cookbook\views\views.py:264 -msgid "This feature is not available in the demo version!" -msgstr "" - -#: .\cookbook\views\views.py:324 +#: .\cookbook\views\views.py:253 msgid "You must select at least one field to search!" msgstr "" -#: .\cookbook\views\views.py:329 +#: .\cookbook\views\views.py:258 msgid "" "To use this search method you must select at least one full text search " "field!" msgstr "" -#: .\cookbook\views\views.py:333 +#: .\cookbook\views\views.py:262 msgid "Fuzzy search is not compatible with this search method!" msgstr "" -#: .\cookbook\views\views.py:463 +#: .\cookbook\views\views.py:338 msgid "" "The setup page can only be used to create the first user! If you have " "forgotten your superuser credentials please consult the django documentation " "on how to reset passwords." msgstr "" -#: .\cookbook\views\views.py:470 +#: .\cookbook\views\views.py:345 msgid "Passwords dont match!" msgstr "" -#: .\cookbook\views\views.py:478 +#: .\cookbook\views\views.py:353 msgid "User has been created, please login!" msgstr "" -#: .\cookbook\views\views.py:494 +#: .\cookbook\views\views.py:369 msgid "Malformed Invite Link supplied!" msgstr "" -#: .\cookbook\views\views.py:510 +#: .\cookbook\views\views.py:386 msgid "Successfully joined space." msgstr "" -#: .\cookbook\views\views.py:516 +#: .\cookbook\views\views.py:392 msgid "Invite Link not valid or already used!" msgstr "" -#: .\cookbook\views\views.py:530 +#: .\cookbook\views\views.py:409 msgid "" "Reporting share links is not enabled for this instance. Please notify the " "page administrator to report problems." msgstr "" -#: .\cookbook\views\views.py:536 +#: .\cookbook\views\views.py:415 msgid "" "Recipe sharing link has been disabled! For additional information please " "contact the page administrator." diff --git a/cookbook/locale/es/LC_MESSAGES/django.mo b/cookbook/locale/es/LC_MESSAGES/django.mo index 6f9831ce8..faabf0ed7 100644 Binary files a/cookbook/locale/es/LC_MESSAGES/django.mo and b/cookbook/locale/es/LC_MESSAGES/django.mo differ diff --git a/cookbook/locale/es/LC_MESSAGES/django.po b/cookbook/locale/es/LC_MESSAGES/django.po index 754c9b2fe..3aa41cdc7 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-07-12 19:20+0200\n" -"PO-Revision-Date: 2022-08-12 21:32+0000\n" -"Last-Translator: Thorin \n" +"POT-Creation-Date: 2023-04-26 07:46+0200\n" +"PO-Revision-Date: 2023-03-13 06:55+0000\n" +"Last-Translator: Amara Ude \n" "Language-Team: Spanish \n" "Language: es\n" @@ -23,71 +23,57 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.10.1\n" +"X-Generator: Weblate 4.15\n" -#: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 -#: .\cookbook\templates\stats.html:28 -msgid "Ingredients" -msgstr "Ingredientes" - -#: .\cookbook\forms.py:53 +#: .\cookbook\forms.py:52 msgid "Default unit" msgstr "Unidad por defecto" -#: .\cookbook\forms.py:54 +#: .\cookbook\forms.py:53 msgid "Use fractions" msgstr "Usar fracciones" -#: .\cookbook\forms.py:55 +#: .\cookbook\forms.py:54 msgid "Use KJ" msgstr "Usar KJ" -#: .\cookbook\forms.py:56 +#: .\cookbook\forms.py:55 msgid "Theme" msgstr "Tema" -#: .\cookbook\forms.py:57 +#: .\cookbook\forms.py:56 msgid "Navbar color" msgstr "Color de la barra de navegación" -#: .\cookbook\forms.py:58 +#: .\cookbook\forms.py:57 msgid "Sticky navbar" msgstr "Barra de navegación pegajosa" -#: .\cookbook\forms.py:59 +#: .\cookbook\forms.py:58 msgid "Default page" msgstr "Página por defecto" -#: .\cookbook\forms.py:60 -msgid "Show recent recipes" -msgstr "Mostrar recetas recientes" - -#: .\cookbook\forms.py:61 -msgid "Search style" -msgstr "Estilo de búsqueda" - -#: .\cookbook\forms.py:62 +#: .\cookbook\forms.py:59 msgid "Plan sharing" msgstr "Compartir régimen" -#: .\cookbook\forms.py:63 +#: .\cookbook\forms.py:60 msgid "Ingredient decimal places" msgstr "Número de decimales del ingrediente" -#: .\cookbook\forms.py:64 +#: .\cookbook\forms.py:61 msgid "Shopping list auto sync period" msgstr "Período de sincronización automática de la lista de compras" -#: .\cookbook\forms.py:65 .\cookbook\templates\recipe_view.html:21 -#: .\cookbook\templates\stats.html:47 +#: .\cookbook\forms.py:62 .\cookbook\templates\recipe_view.html:36 msgid "Comments" msgstr "Comentarios" -#: .\cookbook\forms.py:66 +#: .\cookbook\forms.py:63 msgid "Left-handed mode" msgstr "Modo para zurdos" -#: .\cookbook\forms.py:70 +#: .\cookbook\forms.py:67 msgid "" "Color of the top navigation bar. Not all colors work with all themes, just " "try them out!" @@ -95,13 +81,13 @@ msgstr "" "Color de la barra de navegación superior. No todos los colores funcionan con " "todos los temas, ¡pruébalos!" -#: .\cookbook\forms.py:72 +#: .\cookbook\forms.py:69 msgid "Default Unit to be used when inserting a new ingredient into a recipe." msgstr "" "Unidad predeterminada que se utilizará al insertar un nuevo ingrediente en " "una receta." -#: .\cookbook\forms.py:74 +#: .\cookbook\forms.py:71 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" @@ -109,33 +95,29 @@ msgstr "" "Permite utilizar fracciones en cantidades de ingredientes (e.g. convierte " "los decimales en fracciones automáticamente)" -#: .\cookbook\forms.py:76 +#: .\cookbook\forms.py:73 msgid "Display nutritional energy amounts in joules instead of calories" msgstr "Mostrar los valores nutricionales en Julios en vez de calorías" -#: .\cookbook\forms.py:77 +#: .\cookbook\forms.py:74 msgid "Users with whom newly created meal plans should be shared by default." msgstr "" "Usuarios con los que las entradas recién creadas del plan de comida deben " "compartirse de forma predeterminada." -#: .\cookbook\forms.py:78 +#: .\cookbook\forms.py:75 msgid "Users with whom to share shopping lists." msgstr "Usuarios con quienes compartir listas de compra." -#: .\cookbook\forms.py:80 -msgid "Show recently viewed recipes on search page." -msgstr "Muestra recetas vistas recientemente en la página de búsqueda." - -#: .\cookbook\forms.py:81 +#: .\cookbook\forms.py:76 msgid "Number of decimals to round ingredients." msgstr "Número de decimales para redondear los ingredientes." -#: .\cookbook\forms.py:82 +#: .\cookbook\forms.py:77 msgid "If you want to be able to create and see comments underneath recipes." msgstr "Si desea poder crear y ver comentarios debajo de las recetas." -#: .\cookbook\forms.py:84 .\cookbook\forms.py:496 +#: .\cookbook\forms.py:79 .\cookbook\forms.py:492 msgid "" "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. " @@ -149,25 +131,25 @@ msgstr "" "valor establecido es inferior al límite de la instancia, este se " "restablecerá al guardar." -#: .\cookbook\forms.py:87 +#: .\cookbook\forms.py:82 msgid "Makes the navbar stick to the top of the page." msgstr "Hace la barra de navegación fija en la parte superior de la página." -#: .\cookbook\forms.py:88 .\cookbook\forms.py:499 +#: .\cookbook\forms.py:83 .\cookbook\forms.py:495 msgid "Automatically add meal plan ingredients to shopping list." msgstr "" "Añadir de manera automática los ingredientes del plan a la lista de la " "compra." -#: .\cookbook\forms.py:89 +#: .\cookbook\forms.py:84 msgid "Exclude ingredients that are on hand." -msgstr "" +msgstr "Excluir ingredientes que están disponibles." -#: .\cookbook\forms.py:90 +#: .\cookbook\forms.py:85 msgid "Will optimize the UI for use with your left hand." msgstr "Se optimizará la UI para su uso con la mano izquierda." -#: .\cookbook\forms.py:107 +#: .\cookbook\forms.py:102 msgid "" "Both fields are optional. If none are given the username will be displayed " "instead" @@ -175,36 +157,35 @@ msgstr "" "Ambos campos son opcionales. Si no se proporciona ninguno, se mostrará el " "nombre de usuario en su lugar" -#: .\cookbook\forms.py:128 .\cookbook\forms.py:301 +#: .\cookbook\forms.py:123 .\cookbook\forms.py:297 msgid "Name" msgstr "Nombre" -#: .\cookbook\forms.py:129 .\cookbook\forms.py:302 -#: .\cookbook\templates\stats.html:24 .\cookbook\views\lists.py:88 +#: .\cookbook\forms.py:124 .\cookbook\forms.py:298 .\cookbook\views\lists.py:88 msgid "Keywords" msgstr "Palabras clave" -#: .\cookbook\forms.py:130 +#: .\cookbook\forms.py:125 msgid "Preparation time in minutes" msgstr "Tiempo de preparación en minutos" -#: .\cookbook\forms.py:131 +#: .\cookbook\forms.py:126 msgid "Waiting time (cooking/baking) in minutes" msgstr "Tiempo de espera (cocinar/hornear) en minutos" -#: .\cookbook\forms.py:132 .\cookbook\forms.py:270 .\cookbook\forms.py:303 +#: .\cookbook\forms.py:127 .\cookbook\forms.py:266 .\cookbook\forms.py:299 msgid "Path" msgstr "Ruta" -#: .\cookbook\forms.py:133 +#: .\cookbook\forms.py:128 msgid "Storage UID" msgstr "UID de almacenamiento" -#: .\cookbook\forms.py:165 +#: .\cookbook\forms.py:161 msgid "Default" msgstr "Por defecto" -#: .\cookbook\forms.py:177 +#: .\cookbook\forms.py:173 msgid "" "To prevent duplicates recipes with the same name as existing ones are " "ignored. Check this box to import everything." @@ -212,22 +193,22 @@ msgstr "" "Para evitar duplicados, las recetas con el mismo nombre serán ignoradas. " "Marca esta opción para importar todas las recetas." -#: .\cookbook\forms.py:200 +#: .\cookbook\forms.py:196 msgid "Add your comment: " msgstr "Añada su comentario: " -#: .\cookbook\forms.py:215 +#: .\cookbook\forms.py:211 msgid "Leave empty for dropbox and enter app password for nextcloud." msgstr "" "Déjelo vacío para Dropbox e ingrese la contraseña de la aplicación para " "nextcloud." -#: .\cookbook\forms.py:222 +#: .\cookbook\forms.py:218 msgid "Leave empty for nextcloud and enter api token for dropbox." msgstr "" "Déjelo en blanco para nextcloud e ingrese el token de api para dropbox." -#: .\cookbook\forms.py:231 +#: .\cookbook\forms.py:227 msgid "" "Leave empty for dropbox and enter only base url for nextcloud (/remote." "php/webdav/ is added automatically)" @@ -235,33 +216,33 @@ msgstr "" "Dejar vació para Dropbox e introducir sólo la URL base para Nextcloud " "(/remote.php/webdav/ se añade automáticamente)" -#: .\cookbook\forms.py:269 .\cookbook\views\edit.py:157 +#: .\cookbook\forms.py:265 .\cookbook\views\edit.py:157 msgid "Storage" msgstr "Almacenamiento" -#: .\cookbook\forms.py:271 +#: .\cookbook\forms.py:267 msgid "Active" msgstr "Activo" -#: .\cookbook\forms.py:277 +#: .\cookbook\forms.py:273 msgid "Search String" msgstr "Cadena de búsqueda" -#: .\cookbook\forms.py:304 +#: .\cookbook\forms.py:300 msgid "File ID" msgstr "ID de Fichero" -#: .\cookbook\forms.py:326 +#: .\cookbook\forms.py:322 msgid "You must provide at least a recipe or a title." msgstr "Debe proporcionar al menos una receta o un título." -#: .\cookbook\forms.py:339 +#: .\cookbook\forms.py:335 msgid "You can list default users to share recipes with in the settings." msgstr "" "Puede enumerar los usuarios predeterminados con los que compartir recetas en " "la configuración." -#: .\cookbook\forms.py:340 +#: .\cookbook\forms.py:336 msgid "" "You can use markdown to format this field. See the docs here" @@ -269,15 +250,15 @@ msgstr "" "Puede utilizar Markdown para formatear este campo. Vea la documentación aqui" -#: .\cookbook\forms.py:366 +#: .\cookbook\forms.py:362 msgid "Maximum number of users for this space reached." msgstr "Se ha alcanzado el número máximo de usuarios en este espacio." -#: .\cookbook\forms.py:372 +#: .\cookbook\forms.py:368 msgid "Email address already taken!" msgstr "¡El correo electrónico ya existe!" -#: .\cookbook\forms.py:380 +#: .\cookbook\forms.py:376 msgid "" "An email address is not required but if present the invite link will be sent " "to the user." @@ -285,15 +266,15 @@ msgstr "" "El correo electrónico es opcional. Si se añade uno se mandará un link de " "invitación." -#: .\cookbook\forms.py:395 +#: .\cookbook\forms.py:391 msgid "Name already taken." msgstr "El nombre ya existe." -#: .\cookbook\forms.py:406 +#: .\cookbook\forms.py:402 msgid "Accept Terms and Privacy" msgstr "Aceptar términos y condiciones" -#: .\cookbook\forms.py:438 +#: .\cookbook\forms.py:434 msgid "" "Determines how fuzzy a search is if it uses trigram similarity matching (e." "g. low values mean more typos are ignored)." @@ -302,7 +283,7 @@ msgstr "" "similitud de trigramas(Ej. Valores más pequeños indican que más fallos se " "van a ignorar)." -#: .\cookbook\forms.py:448 +#: .\cookbook\forms.py:444 msgid "" "Select type method of search. Click here for " "full description of choices." @@ -310,239 +291,295 @@ msgstr "" "Selecciona el tipo de búsqueda. Haz click aquí para una descripción completa de las opciones." -#: .\cookbook\forms.py:449 +#: .\cookbook\forms.py:445 msgid "" "Use fuzzy matching on units, keywords and ingredients when editing and " "importing recipes." msgstr "" +"Utilizar comparación difusa en unidades, palabras clave e ingredientes al " +"editar e importar recetas." -#: .\cookbook\forms.py:451 +#: .\cookbook\forms.py:447 msgid "" "Fields to search ignoring accents. Selecting this option can improve or " "degrade search quality depending on language" msgstr "" +"Campos de búsqueda ignorando acentos.  La selección de esta opción puede " +"mejorar o degradar la calidad de la búsqueda dependiendo del idioma" -#: .\cookbook\forms.py:453 +#: .\cookbook\forms.py:449 msgid "" "Fields to search for partial matches. (e.g. searching for 'Pie' will return " "'pie' and 'piece' and 'soapie')" msgstr "" +"Campos de búsqueda para coincidencias parciales. (por ejemplo, buscar 'Pie' " +"devolverá 'pie' y 'piece' y 'soapie')" -#: .\cookbook\forms.py:455 +#: .\cookbook\forms.py:451 msgid "" "Fields to search for beginning of word matches. (e.g. searching for 'sa' " "will return 'salad' and 'sandwich')" msgstr "" +"Campos de búsqueda para coincidencias al principio de la palabra. (por " +"ejemplo, buscar 'sa' devolverá 'ensalada' y 'sándwich')" -#: .\cookbook\forms.py:457 +#: .\cookbook\forms.py:453 msgid "" "Fields to 'fuzzy' search. (e.g. searching for 'recpie' will find 'recipe'.) " "Note: this option will conflict with 'web' and 'raw' methods of search." msgstr "" +"Campos para búsqueda \"difusa\". (por ejemplo, buscar 'recpie' encontrará " +"'receta'). Nota: esta opción entrará en conflicto con los métodos de " +"búsqueda 'web' y 'raw'." -#: .\cookbook\forms.py:459 +#: .\cookbook\forms.py:455 msgid "" "Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " "only function with fulltext fields." msgstr "" +"Campos para búsqueda de texto completo. Nota: los métodos de búsqueda 'web', " +"'phrase' y 'raw' solo funcionan con campos de texto completo." -#: .\cookbook\forms.py:463 +#: .\cookbook\forms.py:459 msgid "Search Method" msgstr "Método de Búsqueda" -#: .\cookbook\forms.py:464 +#: .\cookbook\forms.py:460 msgid "Fuzzy Lookups" -msgstr "" +msgstr "Búsquedas difusas" + +#: .\cookbook\forms.py:461 +msgid "Ignore Accent" +msgstr "Ignorar Acento" + +#: .\cookbook\forms.py:462 +msgid "Partial Match" +msgstr "Coincidencia Parcial" + +#: .\cookbook\forms.py:463 +msgid "Starts With" +msgstr "Comienza Con" + +#: .\cookbook\forms.py:464 +msgid "Fuzzy Search" +msgstr "Búsqueda Difusa" #: .\cookbook\forms.py:465 -msgid "Ignore Accent" -msgstr "" - -#: .\cookbook\forms.py:466 -msgid "Partial Match" -msgstr "" - -#: .\cookbook\forms.py:467 -msgid "Starts With" -msgstr "" - -#: .\cookbook\forms.py:468 -#, fuzzy -#| msgid "Search" -msgid "Fuzzy Search" -msgstr "Buscar" - -#: .\cookbook\forms.py:469 msgid "Full Text" msgstr "Texto Completo" -#: .\cookbook\forms.py:494 +#: .\cookbook\forms.py:490 msgid "" "Users will see all items you add to your shopping list. They must add you " "to see items on their list." msgstr "" +"Los usuarios verán todos los elementos que agregues a tu lista de compras. " +"Deben agregarte para ver los elementos en su lista." -#: .\cookbook\forms.py:500 +#: .\cookbook\forms.py:496 msgid "" "When adding a meal plan to the shopping list (manually or automatically), " "include all related recipes." msgstr "" +"Al agregar un plan de comidas a la lista de compras (manualmente o " +"automáticamente), incluir todas las recetas relacionadas." -#: .\cookbook\forms.py:501 +#: .\cookbook\forms.py:497 msgid "" "When adding a meal plan to the shopping list (manually or automatically), " "exclude ingredients that are on hand." msgstr "" +"Al agregar un plan de comidas a la lista de compras (manualmente o " +"automáticamente), excluir los ingredientes que están disponibles." -#: .\cookbook\forms.py:502 +#: .\cookbook\forms.py:498 msgid "Default number of hours to delay a shopping list entry." msgstr "" +"Número predeterminado de horas para retrasar una entrada en la lista de " +"compras." -#: .\cookbook\forms.py:503 +#: .\cookbook\forms.py:499 msgid "Filter shopping list to only include supermarket categories." msgstr "" +"Filtrar la lista de compras para incluir solo categorías de supermercados." -#: .\cookbook\forms.py:504 +#: .\cookbook\forms.py:500 msgid "Days of recent shopping list entries to display." -msgstr "" +msgstr "Días de entradas recientes en la lista de compras a mostrar." -#: .\cookbook\forms.py:505 +#: .\cookbook\forms.py:501 msgid "Mark food 'On Hand' when checked off shopping list." msgstr "" +"Marcar los alimentos como 'Disponible' cuando se marca en la lista de " +"compras." -#: .\cookbook\forms.py:506 +#: .\cookbook\forms.py:502 msgid "Delimiter to use for CSV exports." -msgstr "" +msgstr "Delimitador a utilizar para exportaciones CSV." + +#: .\cookbook\forms.py:503 +msgid "Prefix to add when copying list to the clipboard." +msgstr "Prefijo a agregar al copiar la lista al portapapeles." #: .\cookbook\forms.py:507 -msgid "Prefix to add when copying list to the clipboard." -msgstr "" - -#: .\cookbook\forms.py:511 msgid "Share Shopping List" msgstr "Compartir Lista de la Compra" -#: .\cookbook\forms.py:512 +#: .\cookbook\forms.py:508 msgid "Autosync" -msgstr "" +msgstr "Autosincronización" + +#: .\cookbook\forms.py:509 +msgid "Auto Add Meal Plan" +msgstr "Agregar Plan de Comidas automáticamente" + +#: .\cookbook\forms.py:510 +msgid "Exclude On Hand" +msgstr "Excluir Disponible" + +#: .\cookbook\forms.py:511 +msgid "Include Related" +msgstr "Incluir Relacionados" + +#: .\cookbook\forms.py:512 +msgid "Default Delay Hours" +msgstr "Horas de Retraso Predeterminadas" #: .\cookbook\forms.py:513 -msgid "Auto Add Meal Plan" -msgstr "" - -#: .\cookbook\forms.py:514 -msgid "Exclude On Hand" -msgstr "" - -#: .\cookbook\forms.py:515 -msgid "Include Related" -msgstr "" - -#: .\cookbook\forms.py:516 -msgid "Default Delay Hours" -msgstr "" - -#: .\cookbook\forms.py:517 msgid "Filter to Supermarket" msgstr "Filtrar según Supermercado" -#: .\cookbook\forms.py:518 +#: .\cookbook\forms.py:514 msgid "Recent Days" -msgstr "" +msgstr "Días Recientes" -#: .\cookbook\forms.py:519 +#: .\cookbook\forms.py:515 msgid "CSV Delimiter" -msgstr "" +msgstr "Delimitador CSV" -#: .\cookbook\forms.py:520 +#: .\cookbook\forms.py:516 msgid "List Prefix" msgstr "Prefijo de la lista" -#: .\cookbook\forms.py:521 +#: .\cookbook\forms.py:517 msgid "Auto On Hand" -msgstr "" +msgstr "Auto en existencia" -#: .\cookbook\forms.py:531 +#: .\cookbook\forms.py:527 msgid "Reset Food Inheritance" -msgstr "" +msgstr "Restablecer la herencia de alimentos" -#: .\cookbook\forms.py:532 +#: .\cookbook\forms.py:528 msgid "Reset all food to inherit the fields configured." -msgstr "" +msgstr "Reiniciar todos los alimentos para heredar los campos configurados." -#: .\cookbook\forms.py:544 -#, fuzzy -#| msgid "Food that should be replaced." +#: .\cookbook\forms.py:540 msgid "Fields on food that should be inherited by default." -msgstr "Alimento que se va a reemplazar." +msgstr "Campos en los alimentos que deben ser heredados por defecto." -#: .\cookbook\forms.py:545 +#: .\cookbook\forms.py:541 msgid "Show recipe counts on search filters" msgstr "Mostrar cantidad de recetas en los filtros de búsquedas" -#: .\cookbook\helper\AllAuthCustomAdapter.py:36 +#: .\cookbook\forms.py:542 +msgid "Use the plural form for units and food inside this space." +msgstr "" +"Utilice la forma plural para las unidades y alimentos dentro de este espacio." + +#: .\cookbook\helper\AllAuthCustomAdapter.py:39 msgid "" "In order to prevent spam, the requested email was not send. Please wait a " "few minutes and try again." msgstr "" +"Para prevenir el spam, el correo electrónico solicitado no se envió. Por " +"favor, espere unos minutos e inténtelo de nuevo." -#: .\cookbook\helper\permission_helper.py:149 -#: .\cookbook\helper\permission_helper.py:172 .\cookbook\views\views.py:152 +#: .\cookbook\helper\permission_helper.py:164 +#: .\cookbook\helper\permission_helper.py:187 .\cookbook\views\views.py:117 msgid "You are not logged in and therefore cannot view this page!" msgstr "¡No ha iniciado sesión y por lo tanto no puede ver esta página!" -#: .\cookbook\helper\permission_helper.py:153 -#: .\cookbook\helper\permission_helper.py:159 -#: .\cookbook\helper\permission_helper.py:184 -#: .\cookbook\helper\permission_helper.py:254 -#: .\cookbook\helper\permission_helper.py:268 -#: .\cookbook\helper\permission_helper.py:279 -#: .\cookbook\helper\permission_helper.py:290 .\cookbook\views\data.py:33 -#: .\cookbook\views\views.py:163 .\cookbook\views\views.py:170 -#: .\cookbook\views\views.py:249 +#: .\cookbook\helper\permission_helper.py:168 +#: .\cookbook\helper\permission_helper.py:174 +#: .\cookbook\helper\permission_helper.py:199 +#: .\cookbook\helper\permission_helper.py:269 +#: .\cookbook\helper\permission_helper.py:283 +#: .\cookbook\helper\permission_helper.py:294 +#: .\cookbook\helper\permission_helper.py:305 +#: .\cookbook\helper\permission_helper.py:321 +#: .\cookbook\helper\permission_helper.py:342 .\cookbook\views\data.py:36 +#: .\cookbook\views\views.py:128 .\cookbook\views\views.py:135 msgid "You do not have the required permissions to view this page!" msgstr "¡No tienes los permisos necesarios para ver esta página!" -#: .\cookbook\helper\permission_helper.py:177 -#: .\cookbook\helper\permission_helper.py:200 -#: .\cookbook\helper\permission_helper.py:222 +#: .\cookbook\helper\permission_helper.py:192 +#: .\cookbook\helper\permission_helper.py:215 #: .\cookbook\helper\permission_helper.py:237 +#: .\cookbook\helper\permission_helper.py:252 msgid "You cannot interact with this object as it is not owned by you!" msgstr "¡No puede interactuar con este objeto ya que no es de tu propiedad!" -#: .\cookbook\helper\permission_helper.py:321 +#: .\cookbook\helper\permission_helper.py:403 msgid "You have reached the maximum number of recipes for your space." -msgstr "" +msgstr "Ha alcanzado el número máximo de recetas para su espacio." -#: .\cookbook\helper\permission_helper.py:333 +#: .\cookbook\helper\permission_helper.py:415 msgid "You have more users than allowed in your space." msgstr "" -#: .\cookbook\helper\recipe_search.py:565 +#: .\cookbook\helper\recipe_search.py:630 msgid "One of queryset or hash_key must be provided" msgstr "" -#: .\cookbook\helper\shopping_helper.py:152 +#: .\cookbook\helper\recipe_url_import.py:266 +#, fuzzy +#| msgid "Use fractions" +msgid "reverse rotation" +msgstr "Usar fracciones" + +#: .\cookbook\helper\recipe_url_import.py:267 +msgid "careful rotation" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:268 +msgid "knead" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:269 +msgid "thicken" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:270 +msgid "warm up" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:271 +msgid "ferment" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:272 +msgid "sous-vide" +msgstr "" + +#: .\cookbook\helper\shopping_helper.py:157 msgid "You must supply a servings size" msgstr "Debe proporcionar un tamaño de porción" -#: .\cookbook\helper\template_helper.py:64 -#: .\cookbook\helper\template_helper.py:66 +#: .\cookbook\helper\template_helper.py:79 +#: .\cookbook\helper\template_helper.py:81 msgid "Could not parse template code." msgstr "" -#: .\cookbook\integration\copymethat.py:41 +#: .\cookbook\integration\copymethat.py:44 #: .\cookbook\integration\melarecipes.py:37 msgid "Favorite" msgstr "" -#: .\cookbook\integration\copymethat.py:70 -#: .\cookbook\integration\recettetek.py:54 -#: .\cookbook\integration\recipekeeper.py:63 -msgid "Imported from" -msgstr "Importado de" +#: .\cookbook\integration\copymethat.py:50 +msgid "I made this" +msgstr "" -#: .\cookbook\integration\integration.py:223 +#: .\cookbook\integration\integration.py:218 msgid "" "Importer expected a .zip file. Did you choose the correct importer type for " "your data ?" @@ -550,33 +587,44 @@ msgstr "" "El importador esperaba un fichero.zip. ¿Has escogido el tipo de importador " "correcto para tus datos?" -#: .\cookbook\integration\integration.py:226 +#: .\cookbook\integration\integration.py:221 msgid "" "An unexpected error occurred during the import. Please make sure you have " "uploaded a valid file." msgstr "" -#: .\cookbook\integration\integration.py:231 +#: .\cookbook\integration\integration.py:226 msgid "The following recipes were ignored because they already existed:" msgstr "Las siguentes recetas han sido ignordas por que ya existen:" -#: .\cookbook\integration\integration.py:235 +#: .\cookbook\integration\integration.py:230 #, python-format msgid "Imported %s recipes." msgstr "Se importaron %s recetas." -#: .\cookbook\integration\paprika.py:46 +#: .\cookbook\integration\openeats.py:26 +#, fuzzy +#| msgid "Recipe Home" +msgid "Recipe source:" +msgstr "Página de inicio" + +#: .\cookbook\integration\paprika.py:49 msgid "Notes" msgstr "Notas" -#: .\cookbook\integration\paprika.py:49 +#: .\cookbook\integration\paprika.py:52 msgid "Nutritional Information" msgstr "Información Nutricional" -#: .\cookbook\integration\paprika.py:53 +#: .\cookbook\integration\paprika.py:56 msgid "Source" msgstr "Fuente" +#: .\cookbook\integration\recettetek.py:54 +#: .\cookbook\integration\recipekeeper.py:70 +msgid "Imported from" +msgstr "Importado de" + #: .\cookbook\integration\saffron.py:23 msgid "Servings" msgstr "Raciones" @@ -589,9 +637,7 @@ msgstr "Tiempo de espera" msgid "Preparation Time" msgstr "Tiempo de Preparación" -#: .\cookbook\integration\saffron.py:29 -#: .\cookbook\templates\forms\ingredients.html:7 -#: .\cookbook\templates\index.html:7 +#: .\cookbook\integration\saffron.py:29 .\cookbook\templates\index.html:7 msgid "Cookbook" msgstr "Libro de cocina" @@ -631,177 +677,168 @@ msgstr "Cena" msgid "Other" msgstr "Otro" -#: .\cookbook\models.py:251 +#: .\cookbook\models.py:261 msgid "" "Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " "upload." msgstr "" -#: .\cookbook\models.py:353 .\cookbook\templates\search.html:7 +#: .\cookbook\models.py:365 .\cookbook\templates\search.html:7 +#: .\cookbook\templates\settings.html:18 #: .\cookbook\templates\space_manage.html:7 msgid "Search" msgstr "Buscar" -#: .\cookbook\models.py:354 .\cookbook\templates\base.html:107 +#: .\cookbook\models.py:366 .\cookbook\templates\base.html:110 #: .\cookbook\templates\meal_plan.html:7 .\cookbook\views\delete.py:178 #: .\cookbook\views\edit.py:211 .\cookbook\views\new.py:179 msgid "Meal-Plan" msgstr "Régimen de comidas" -#: .\cookbook\models.py:355 .\cookbook\templates\base.html:115 +#: .\cookbook\models.py:367 .\cookbook\templates\base.html:118 msgid "Books" msgstr "Libros" -#: .\cookbook\models.py:363 -msgid "Small" -msgstr "Pequeño" - -#: .\cookbook\models.py:363 -msgid "Large" -msgstr "Grande" - -#: .\cookbook\models.py:363 .\cookbook\templates\generic\new_template.html:6 -#: .\cookbook\templates\generic\new_template.html:14 -msgid "New" -msgstr "Nuevo" - -#: .\cookbook\models.py:584 +#: .\cookbook\models.py:580 msgid " is part of a recipe step and cannot be deleted" msgstr "" -#: .\cookbook\models.py:1162 .\cookbook\templates\search_info.html:28 +#: .\cookbook\models.py:1181 .\cookbook\templates\search_info.html:28 msgid "Simple" msgstr "" -#: .\cookbook\models.py:1163 .\cookbook\templates\search_info.html:33 +#: .\cookbook\models.py:1182 .\cookbook\templates\search_info.html:33 msgid "Phrase" msgstr "" -#: .\cookbook\models.py:1164 .\cookbook\templates\search_info.html:38 +#: .\cookbook\models.py:1183 .\cookbook\templates\search_info.html:38 msgid "Web" msgstr "" -#: .\cookbook\models.py:1165 .\cookbook\templates\search_info.html:47 +#: .\cookbook\models.py:1184 .\cookbook\templates\search_info.html:47 msgid "Raw" msgstr "" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 msgid "Food Alias" msgstr "Alias de la Comida" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 #, fuzzy #| msgid "Units" msgid "Unit Alias" msgstr "Unidades" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 #, fuzzy #| msgid "Keywords" msgid "Keyword Alias" msgstr "Palabras clave" -#: .\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 +#: .\cookbook\models.py:1232 +#, fuzzy +#| msgid "Description" +msgid "Description Replace" +msgstr "Descripción" + +#: .\cookbook\models.py:1232 +#, fuzzy +#| msgid "Instructions" +msgid "Instruction Replace" +msgstr "Instrucciones" + +#: .\cookbook\models.py:1258 .\cookbook\views\delete.py:36 +#: .\cookbook\views\edit.py:251 .\cookbook\views\new.py:48 msgid "Recipe" msgstr "Receta" -#: .\cookbook\models.py:1228 +#: .\cookbook\models.py:1259 #, fuzzy #| msgid "Food" msgid "Food" msgstr "Comida" -#: .\cookbook\models.py:1229 .\cookbook\templates\base.html:138 +#: .\cookbook\models.py:1260 .\cookbook\templates\base.html:141 msgid "Keyword" msgstr "Palabra clave" -#: .\cookbook\serializer.py:207 -msgid "Cannot modify Space owner permission." -msgstr "" - -#: .\cookbook\serializer.py:290 +#: .\cookbook\serializer.py:198 msgid "File uploads are not enabled for this Space." msgstr "" -#: .\cookbook\serializer.py:301 +#: .\cookbook\serializer.py:209 msgid "You have reached your file upload limit." msgstr "" -#: .\cookbook\serializer.py:1081 +#: .\cookbook\serializer.py:291 +msgid "Cannot modify Space owner permission." +msgstr "" + +#: .\cookbook\serializer.py:1093 msgid "Hello" msgstr "" -#: .\cookbook\serializer.py:1081 +#: .\cookbook\serializer.py:1093 msgid "You have been invited by " msgstr "" -#: .\cookbook\serializer.py:1082 +#: .\cookbook\serializer.py:1094 msgid " to join their Tandoor Recipes space " msgstr "" -#: .\cookbook\serializer.py:1083 +#: .\cookbook\serializer.py:1095 msgid "Click the following link to activate your account: " msgstr "" -#: .\cookbook\serializer.py:1084 +#: .\cookbook\serializer.py:1096 msgid "" "If the link does not work use the following code to manually join the space: " msgstr "" -#: .\cookbook\serializer.py:1085 +#: .\cookbook\serializer.py:1097 msgid "The invitation is valid until " msgstr "" -#: .\cookbook\serializer.py:1086 +#: .\cookbook\serializer.py:1098 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " msgstr "" -#: .\cookbook\serializer.py:1089 +#: .\cookbook\serializer.py:1101 msgid "Tandoor Recipes Invite" msgstr "" -#: .\cookbook\serializer.py:1209 +#: .\cookbook\serializer.py:1242 msgid "Existing shopping list to update" msgstr "" -#: .\cookbook\serializer.py:1211 +#: .\cookbook\serializer.py:1244 msgid "" "List of ingredient IDs from the recipe to add, if not provided all " "ingredients will be added." msgstr "" -#: .\cookbook\serializer.py:1213 +#: .\cookbook\serializer.py:1246 msgid "" "Providing a list_recipe ID and servings of 0 will delete that shopping list." msgstr "" -#: .\cookbook\serializer.py:1222 +#: .\cookbook\serializer.py:1255 msgid "Amount of food to add to the shopping list" msgstr "" -#: .\cookbook\serializer.py:1224 +#: .\cookbook\serializer.py:1257 msgid "ID of unit to use for the shopping list" msgstr "" -#: .\cookbook\serializer.py:1226 +#: .\cookbook\serializer.py:1259 msgid "When set to true will delete all food from active shopping lists." msgstr "" -#: .\cookbook\tables.py:36 .\cookbook\templates\generic\edit_template.html:6 -#: .\cookbook\templates\generic\edit_template.html:14 -#: .\cookbook\templates\recipes_table.html:82 -msgid "Edit" -msgstr "Editar" - -#: .\cookbook\tables.py:116 .\cookbook\tables.py:131 +#: .\cookbook\tables.py:61 .\cookbook\tables.py:75 #: .\cookbook\templates\generic\delete_template.html:7 #: .\cookbook\templates\generic\delete_template.html:15 #: .\cookbook\templates\generic\edit_template.html:28 -#: .\cookbook\templates\recipes_table.html:90 msgid "Delete" msgstr "Eliminar" @@ -829,9 +866,10 @@ msgstr "" #: .\cookbook\templates\account\email.html:12 #: .\cookbook\templates\account\password_change.html:11 #: .\cookbook\templates\account\password_set.html:11 -#: .\cookbook\templates\base.html:293 .\cookbook\templates\settings.html:6 +#: .\cookbook\templates\base.html:296 .\cookbook\templates\settings.html:6 #: .\cookbook\templates\settings.html:17 #: .\cookbook\templates\socialaccount\connections.html:10 +#: .\cookbook\templates\user_settings.html:8 msgid "Settings" msgstr "Opciones" @@ -920,8 +958,8 @@ msgid "" "request." msgstr "" -#: .\cookbook\templates\account\login.html:8 -#: .\cookbook\templates\base.html:340 .\cookbook\templates\openid\login.html:8 +#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:343 +#: .\cookbook\templates\openid\login.html:8 msgid "Login" msgstr "Iniciar sesión" @@ -943,21 +981,20 @@ msgstr "Iniciar sesión" msgid "Sign Up" msgstr "Iniciar sesión" +#: .\cookbook\templates\account\login.html:38 +msgid "Lost your password?" +msgstr "" + #: .\cookbook\templates\account\login.html:39 -#: .\cookbook\templates\account\login.html:41 #: .\cookbook\templates\account\password_reset.html:29 msgid "Reset My Password" msgstr "" -#: .\cookbook\templates\account\login.html:40 -msgid "Lost your password?" -msgstr "" - -#: .\cookbook\templates\account\login.html:52 +#: .\cookbook\templates\account\login.html:50 msgid "Social Login" msgstr "Inicio de sesión social" -#: .\cookbook\templates\account\login.html:53 +#: .\cookbook\templates\account\login.html:51 msgid "You can use any of the following providers to sign in." msgstr "" "Puedes usar cualquiera de los siguientes proveedores de inicio de sesión." @@ -984,7 +1021,6 @@ msgstr "Cambiar contraseña" #: .\cookbook\templates\account\password_change.html:12 #: .\cookbook\templates\account\password_set.html:12 -#: .\cookbook\templates\settings.html:76 #, fuzzy #| msgid "Password Reset" msgid "Password" @@ -1096,64 +1132,61 @@ msgstr "" msgid "We are sorry, but the sign up is currently closed." msgstr "" -#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:330 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:333 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "Documentación de API" -#: .\cookbook\templates\base.html:103 .\cookbook\templates\index.html:87 -#: .\cookbook\templates\stats.html:22 +#: .\cookbook\templates\base.html:106 .\cookbook\templates\index.html:87 msgid "Recipes" msgstr "Recetas" -#: .\cookbook\templates\base.html:111 +#: .\cookbook\templates\base.html:114 msgid "Shopping" msgstr "Compras" -#: .\cookbook\templates\base.html:150 .\cookbook\views\lists.py:105 +#: .\cookbook\templates\base.html:153 .\cookbook\views\lists.py:105 #, fuzzy #| msgid "Food" msgid "Foods" msgstr "Comida" -#: .\cookbook\templates\base.html:162 -#: .\cookbook\templates\forms\ingredients.html:24 -#: .\cookbook\templates\stats.html:26 .\cookbook\views\lists.py:122 +#: .\cookbook\templates\base.html:165 .\cookbook\views\lists.py:122 msgid "Units" msgstr "Unidades" -#: .\cookbook\templates\base.html:176 .\cookbook\templates\supermarket.html:7 +#: .\cookbook\templates\base.html:179 .\cookbook\templates\supermarket.html:7 msgid "Supermarket" msgstr "Supermercado" -#: .\cookbook\templates\base.html:188 +#: .\cookbook\templates\base.html:191 #, fuzzy #| msgid "Supermarket" msgid "Supermarket Category" msgstr "Supermercado" -#: .\cookbook\templates\base.html:200 .\cookbook\views\lists.py:171 +#: .\cookbook\templates\base.html:203 .\cookbook\views\lists.py:171 #, fuzzy #| msgid "Information" msgid "Automations" msgstr "Información" -#: .\cookbook\templates\base.html:214 .\cookbook\views\lists.py:207 +#: .\cookbook\templates\base.html:217 .\cookbook\views\lists.py:207 #, fuzzy #| msgid "File ID" msgid "Files" msgstr "ID de Fichero" -#: .\cookbook\templates\base.html:226 +#: .\cookbook\templates\base.html:229 msgid "Batch Edit" msgstr "Edición Masiva" -#: .\cookbook\templates\base.html:238 .\cookbook\templates\history.html:6 +#: .\cookbook\templates\base.html:241 .\cookbook\templates\history.html:6 #: .\cookbook\templates\history.html:14 msgid "History" msgstr "Historial" -#: .\cookbook\templates\base.html:252 +#: .\cookbook\templates\base.html:255 #: .\cookbook\templates\ingredient_editor.html:7 #: .\cookbook\templates\ingredient_editor.html:13 #, fuzzy @@ -1161,78 +1194,76 @@ msgstr "Historial" msgid "Ingredient Editor" msgstr "Ingredientes" -#: .\cookbook\templates\base.html:264 +#: .\cookbook\templates\base.html:267 #: .\cookbook\templates\export_response.html:7 #: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 msgid "Export" msgstr "Exportar" -#: .\cookbook\templates\base.html:280 .\cookbook\templates\index.html:47 +#: .\cookbook\templates\base.html:283 .\cookbook\templates\index.html:47 msgid "Import Recipe" msgstr "Importar receta" -#: .\cookbook\templates\base.html:282 +#: .\cookbook\templates\base.html:285 msgid "Create" msgstr "Crear" -#: .\cookbook\templates\base.html:295 +#: .\cookbook\templates\base.html:298 #: .\cookbook\templates\generic\list_template.html:14 -#: .\cookbook\templates\stats.html:43 msgid "External Recipes" msgstr "Recetas Externas" -#: .\cookbook\templates\base.html:298 -#: .\cookbook\templates\space_manage.html:15 +#: .\cookbook\templates\base.html:301 .\cookbook\templates\space_manage.html:15 #, fuzzy #| msgid "Settings" msgid "Space Settings" msgstr "Opciones" -#: .\cookbook\templates\base.html:303 .\cookbook\templates\system.html:13 +#: .\cookbook\templates\base.html:306 .\cookbook\templates\system.html:13 msgid "System" msgstr "Sistema" -#: .\cookbook\templates\base.html:305 +#: .\cookbook\templates\base.html:308 msgid "Admin" msgstr "Administrador" -#: .\cookbook\templates\base.html:309 +#: .\cookbook\templates\base.html:312 #: .\cookbook\templates\space_overview.html:25 #, fuzzy #| msgid "Create User" msgid "Your Spaces" msgstr "Crear Usuario" -#: .\cookbook\templates\base.html:320 +#: .\cookbook\templates\base.html:323 #: .\cookbook\templates\space_overview.html:6 msgid "Overview" msgstr "" -#: .\cookbook\templates\base.html:324 +#: .\cookbook\templates\base.html:327 msgid "Markdown Guide" msgstr "Guia Markdown" -#: .\cookbook\templates\base.html:326 +#: .\cookbook\templates\base.html:329 msgid "GitHub" msgstr "GitHub" -#: .\cookbook\templates\base.html:328 +#: .\cookbook\templates\base.html:331 msgid "Translate Tandoor" msgstr "" -#: .\cookbook\templates\base.html:332 +#: .\cookbook\templates\base.html:335 msgid "API Browser" msgstr "Explorador de API" -#: .\cookbook\templates\base.html:335 +#: .\cookbook\templates\base.html:338 msgid "Log out" msgstr "" -#: .\cookbook\templates\base.html:357 +#: .\cookbook\templates\base.html:360 msgid "You are using the free version of Tandor" msgstr "" -#: .\cookbook\templates\base.html:358 +#: .\cookbook\templates\base.html:361 msgid "Upgrade Now" msgstr "" @@ -1274,11 +1305,7 @@ msgstr "La ruta debe tener el siguiente formato" #: .\cookbook\templates\forms\edit_import_recipe.html:14 #: .\cookbook\templates\generic\edit_template.html:23 #: .\cookbook\templates\generic\new_template.html:23 -#: .\cookbook\templates\settings.html:70 -#: .\cookbook\templates\settings.html:112 -#: .\cookbook\templates\settings.html:130 -#: .\cookbook\templates\settings.html:202 -#: .\cookbook\templates\settings.html:213 +#: .\cookbook\templates\settings.html:57 msgid "Save" msgstr "Guardar" @@ -1332,41 +1359,6 @@ msgstr "Importar nueva receta" msgid "Edit Recipe" msgstr "Editar receta" -#: .\cookbook\templates\forms\ingredients.html:15 -msgid "Edit Ingredients" -msgstr "Editar ingredientes" - -#: .\cookbook\templates\forms\ingredients.html:16 -msgid "" -"\n" -" The following form can be used if, accidentally, two (or more) units " -"or ingredients where created that should be\n" -" the same.\n" -" It merges two units or ingredients and updates all recipes using " -"them.\n" -" " -msgstr "" -"\n" -" La siguiente forma puede utilizarse si, accidentalmente, se crean " -"dos (o más) unidades o ingredientes que deberían ser\n" -" iguales.\n" -" Fusiona dos unidades o ingredientes y actualiza todas las recetas " -"que los usan.\n" -" " - -#: .\cookbook\templates\forms\ingredients.html:26 -msgid "Are you sure that you want to merge these two units?" -msgstr "¿Estás seguro de que quieres combinar estas dos unidades?" - -#: .\cookbook\templates\forms\ingredients.html:31 -#: .\cookbook\templates\forms\ingredients.html:40 -msgid "Merge" -msgstr "Combinar" - -#: .\cookbook\templates\forms\ingredients.html:36 -msgid "Are you sure that you want to merge these two ingredients?" -msgstr "¿Estás seguro de que quieres combinar estos dos ingredientes?" - #: .\cookbook\templates\generic\delete_template.html:21 #, python-format msgid "Are you sure you want to delete the %(title)s: %(object)s " @@ -1388,6 +1380,11 @@ msgstr "" msgid "Cancel" msgstr "" +#: .\cookbook\templates\generic\edit_template.html:6 +#: .\cookbook\templates\generic\edit_template.html:14 +msgid "Edit" +msgstr "Editar" + #: .\cookbook\templates\generic\edit_template.html:32 msgid "View" msgstr "Ver" @@ -1409,13 +1406,16 @@ msgstr "Filtro" msgid "Import all" msgstr "Importar todo" +#: .\cookbook\templates\generic\new_template.html:6 +#: .\cookbook\templates\generic\new_template.html:14 +msgid "New" +msgstr "Nuevo" + #: .\cookbook\templates\generic\table_template.html:76 -#: .\cookbook\templates\recipes_table.html:121 msgid "previous" msgstr "anterior" #: .\cookbook\templates\generic\table_template.html:98 -#: .\cookbook\templates\recipes_table.html:143 msgid "next" msgstr "siguiente" @@ -1427,24 +1427,11 @@ msgstr "Ver registro" msgid "Cook Log" msgstr "Registro de cocina" -#: .\cookbook\templates\import.html:6 -msgid "Import Recipes" -msgstr "Importar recetas" - -#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 #: .\cookbook\templates\import_response.html:7 .\cookbook\views\delete.py:86 #: .\cookbook\views\edit.py:191 msgid "Import" msgstr "Importar" -#: .\cookbook\templates\include\recipe_open_modal.html:18 -msgid "Close" -msgstr "Cerrar" - -#: .\cookbook\templates\include\recipe_open_modal.html:32 -msgid "Open Recipe" -msgstr "Abrir Receta" - #: .\cookbook\templates\include\storage_backend_warning.html:4 msgid "Security Warning" msgstr "Advertencia de seguridad" @@ -1654,31 +1641,6 @@ msgstr "Cabecera" msgid "Cell" msgstr "Celda" -#: .\cookbook\templates\meal_plan_entry.html:6 -msgid "Meal Plan View" -msgstr "Vista de menú" - -#: .\cookbook\templates\meal_plan_entry.html:18 -msgid "Created by" -msgstr "Creado por" - -#: .\cookbook\templates\meal_plan_entry.html:20 -msgid "Shared with" -msgstr "Compartido con" - -#: .\cookbook\templates\meal_plan_entry.html:48 -#: .\cookbook\templates\recipes_table.html:64 -msgid "Last cooked" -msgstr "Cocinado por última vez" - -#: .\cookbook\templates\meal_plan_entry.html:50 -msgid "Never cooked before." -msgstr "Nunca antes cocinado." - -#: .\cookbook\templates\meal_plan_entry.html:76 -msgid "Other meals on this day" -msgstr "Otras comidas en este día" - #: .\cookbook\templates\no_groups_info.html:5 #: .\cookbook\templates\no_groups_info.html:12 msgid "No Permissions" @@ -1734,43 +1696,26 @@ msgstr "" msgid "Back" msgstr "" -#: .\cookbook\templates\recipe_view.html:26 +#: .\cookbook\templates\profile.html:7 +msgid "Profile" +msgstr "" + +#: .\cookbook\templates\recipe_view.html:41 msgid "by" msgstr "por" -#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:144 +#: .\cookbook\templates\recipe_view.html:59 .\cookbook\views\delete.py:144 #: .\cookbook\views\edit.py:171 msgid "Comment" msgstr "Comentario" -#: .\cookbook\templates\recipes_table.html:19 -#: .\cookbook\templates\recipes_table.html:23 -msgid "Recipe Image" -msgstr "Imagen de la receta" - -#: .\cookbook\templates\recipes_table.html:51 -msgid "Preparation time ca." -msgstr "Tiempo de preparación ca." - -#: .\cookbook\templates\recipes_table.html:57 -msgid "Waiting time ca." -msgstr "Tiempo de espera ca." - -#: .\cookbook\templates\recipes_table.html:60 -msgid "External" -msgstr "Externo" - -#: .\cookbook\templates\recipes_table.html:86 -msgid "Log Cooking" -msgstr "Registrar receta cocinada" - #: .\cookbook\templates\rest_framework\api.html:5 msgid "Recipe Home" msgstr "Página de inicio" #: .\cookbook\templates\search_info.html:5 #: .\cookbook\templates\search_info.html:9 -#: .\cookbook\templates\settings.html:172 +#: .\cookbook\templates\settings.html:24 #, fuzzy #| msgid "Search String" msgid "Search Settings" @@ -1933,147 +1878,57 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\settings.html:28 -msgid "Account" -msgstr "Cuenta" - -#: .\cookbook\templates\settings.html:35 -msgid "Preferences" -msgstr "" - -#: .\cookbook\templates\settings.html:42 -#, fuzzy -#| msgid "Settings" -msgid "API-Settings" -msgstr "Opciones" - -#: .\cookbook\templates\settings.html:49 -#, fuzzy -#| msgid "Search String" -msgid "Search-Settings" -msgstr "Cadena de búsqueda" - -#: .\cookbook\templates\settings.html:56 -#, fuzzy -#| msgid "Search String" -msgid "Shopping-Settings" -msgstr "Cadena de búsqueda" - -#: .\cookbook\templates\settings.html:65 -#, fuzzy -#| msgid "Settings" -msgid "Name Settings" -msgstr "Opciones" - -#: .\cookbook\templates\settings.html:73 -#, fuzzy -#| msgid "Account Connections" -msgid "Account Settings" -msgstr "Conexiones de la cuenta" - -#: .\cookbook\templates\settings.html:75 -#, fuzzy -#| msgid "Settings" -msgid "Emails" -msgstr "Opciones" - -#: .\cookbook\templates\settings.html:78 -#: .\cookbook\templates\socialaccount\connections.html:11 -#, fuzzy -#| msgid "Social Login" -msgid "Social" -msgstr "Inicio de sesión social" - -#: .\cookbook\templates\settings.html:91 -msgid "Language" -msgstr "Idioma" - -#: .\cookbook\templates\settings.html:121 -msgid "Style" -msgstr "Estilo" - -#: .\cookbook\templates\settings.html:142 -msgid "API Token" -msgstr "Token API" - -#: .\cookbook\templates\settings.html:143 -msgid "" -"You can use both basic authentication and token based authentication to " -"access the REST API." -msgstr "" -"Puedes utilizar tanto la autenticación básica como la autenticación basada " -"en tokens para acceder a la API REST." - -#: .\cookbook\templates\settings.html:160 -msgid "" -"Use the token as an Authorization header prefixed by the word token as shown " -"in the following examples:" -msgstr "" -"Utilice el token como cabecera de autorización usando como prefijo la " -"palabra token, tal y como se muestra en los siguientes ejemplos:" - -#: .\cookbook\templates\settings.html:162 -msgid "or" -msgstr "o" - -#: .\cookbook\templates\settings.html:173 +#: .\cookbook\templates\settings.html:25 msgid "" "There are many options to configure the search depending on your personal " "preferences." msgstr "" -#: .\cookbook\templates\settings.html:174 +#: .\cookbook\templates\settings.html:26 msgid "" "Usually you do not need to configure any of them and can just stick " "with either the default or one of the following presets." msgstr "" -#: .\cookbook\templates\settings.html:175 +#: .\cookbook\templates\settings.html:27 msgid "" "If you do want to configure the search you can read about the different " "options here." msgstr "" -#: .\cookbook\templates\settings.html:180 +#: .\cookbook\templates\settings.html:32 msgid "Fuzzy" msgstr "" -#: .\cookbook\templates\settings.html:181 +#: .\cookbook\templates\settings.html:33 msgid "" "Find what you need even if your search or the recipe contains typos. Might " "return more results than needed to make sure you find what you are looking " "for." msgstr "" -#: .\cookbook\templates\settings.html:182 +#: .\cookbook\templates\settings.html:34 msgid "This is the default behavior" msgstr "" -#: .\cookbook\templates\settings.html:183 -#: .\cookbook\templates\settings.html:191 +#: .\cookbook\templates\settings.html:37 .\cookbook\templates\settings.html:46 msgid "Apply" msgstr "" -#: .\cookbook\templates\settings.html:188 +#: .\cookbook\templates\settings.html:42 msgid "Precise" msgstr "" -#: .\cookbook\templates\settings.html:189 +#: .\cookbook\templates\settings.html:43 msgid "" "Allows fine control over search results but might not return results if too " "many spelling mistakes are made." msgstr "" -#: .\cookbook\templates\settings.html:190 +#: .\cookbook\templates\settings.html:44 msgid "Perfect for large Databases" msgstr "" -#: .\cookbook\templates\settings.html:207 -#, fuzzy -#| msgid "Shopping List" -msgid "Shopping Settings" -msgstr "Lista de la Compra" - #: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5 msgid "Cookbook Setup" msgstr "Configuración del libro de recetas" @@ -2110,6 +1965,12 @@ msgstr "" msgid "Account Connections" msgstr "Conexiones de la cuenta" +#: .\cookbook\templates\socialaccount\connections.html:11 +#, fuzzy +#| msgid "Social Login" +msgid "Social" +msgstr "Inicio de sesión social" + #: .\cookbook\templates\socialaccount\connections.html:18 msgid "" "You can sign in to your account using any of the following third party\n" @@ -2210,74 +2071,46 @@ msgid "" "You can either be invited into an existing space or create your own one." msgstr "" -#: .\cookbook\templates\space_overview.html:45 +#: .\cookbook\templates\space_overview.html:53 msgid "Owner" msgstr "" -#: .\cookbook\templates\space_overview.html:49 +#: .\cookbook\templates\space_overview.html:57 #, fuzzy #| msgid "Create User" msgid "Leave Space" msgstr "Crear Usuario" -#: .\cookbook\templates\space_overview.html:70 -#: .\cookbook\templates\space_overview.html:80 +#: .\cookbook\templates\space_overview.html:78 +#: .\cookbook\templates\space_overview.html:88 msgid "Join Space" msgstr "" -#: .\cookbook\templates\space_overview.html:73 +#: .\cookbook\templates\space_overview.html:81 msgid "Join an existing space." msgstr "" -#: .\cookbook\templates\space_overview.html:75 +#: .\cookbook\templates\space_overview.html:83 msgid "" "To join an existing space either enter your invite token or click on the " "invite link the space owner send you." msgstr "" -#: .\cookbook\templates\space_overview.html:88 -#: .\cookbook\templates\space_overview.html:97 +#: .\cookbook\templates\space_overview.html:96 +#: .\cookbook\templates\space_overview.html:105 #, fuzzy #| msgid "Create User" msgid "Create Space" msgstr "Crear Usuario" -#: .\cookbook\templates\space_overview.html:91 +#: .\cookbook\templates\space_overview.html:99 msgid "Create your own recipe space." msgstr "" -#: .\cookbook\templates\space_overview.html:93 +#: .\cookbook\templates\space_overview.html:101 msgid "Start your own recipe space and invite other users to it." msgstr "" -#: .\cookbook\templates\stats.html:4 -msgid "Stats" -msgstr "Estadísticas" - -#: .\cookbook\templates\stats.html:10 -msgid "Statistics" -msgstr "Estadísticas" - -#: .\cookbook\templates\stats.html:19 -msgid "Number of objects" -msgstr "Número de objetos" - -#: .\cookbook\templates\stats.html:30 -msgid "Recipe Imports" -msgstr "Recetas importadas" - -#: .\cookbook\templates\stats.html:38 -msgid "Objects stats" -msgstr "Estadísticas de objetos" - -#: .\cookbook\templates\stats.html:41 -msgid "Recipes without Keywords" -msgstr "Recetas sin palabras clave" - -#: .\cookbook\templates\stats.html:45 -msgid "Internal Recipes" -msgstr "Recetas Internas" - #: .\cookbook\templates\system.html:20 msgid "System Information" msgstr "Información del Sistema" @@ -2410,257 +2243,270 @@ msgstr "" msgid "URL Import" msgstr "Importar URL" -#: .\cookbook\views\api.py:105 .\cookbook\views\api.py:197 +#: .\cookbook\views\api.py:110 .\cookbook\views\api.py:202 #, fuzzy #| msgid "Parameter filter_list incorrectly formatted" msgid "Parameter updated_at incorrectly formatted" msgstr "Parámetro filter_list formateado incorrectamente" -#: .\cookbook\views\api.py:217 .\cookbook\views\api.py:320 +#: .\cookbook\views\api.py:222 .\cookbook\views\api.py:325 +#, python-brace-format msgid "No {self.basename} with id {pk} exists" msgstr "" -#: .\cookbook\views\api.py:221 +#: .\cookbook\views\api.py:226 msgid "Cannot merge with the same object!" msgstr "¡No se puede unir con el mismo objeto!" -#: .\cookbook\views\api.py:228 +#: .\cookbook\views\api.py:233 +#, python-brace-format msgid "No {self.basename} with id {target} exists" msgstr "" -#: .\cookbook\views\api.py:233 +#: .\cookbook\views\api.py:238 #, 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:266 +#: .\cookbook\views\api.py:271 +#, python-brace-format msgid "{source.name} was merged successfully with {target.name}" msgstr "" -#: .\cookbook\views\api.py:271 +#: .\cookbook\views\api.py:276 +#, python-brace-format msgid "An error occurred attempting to merge {source.name} with {target.name}" msgstr "" -#: .\cookbook\views\api.py:329 +#: .\cookbook\views\api.py:334 +#, python-brace-format msgid "{child.name} was moved successfully to the root." msgstr "" -#: .\cookbook\views\api.py:332 .\cookbook\views\api.py:350 +#: .\cookbook\views\api.py:337 .\cookbook\views\api.py:355 msgid "An error occurred attempting to move " msgstr "" -#: .\cookbook\views\api.py:335 +#: .\cookbook\views\api.py:340 msgid "Cannot move an object to itself!" msgstr "" -#: .\cookbook\views\api.py:341 +#: .\cookbook\views\api.py:346 +#, python-brace-format msgid "No {self.basename} with id {parent} exists" msgstr "" -#: .\cookbook\views\api.py:347 +#: .\cookbook\views\api.py:352 +#, python-brace-format msgid "{child.name} was moved successfully to parent {parent.name}" msgstr "" -#: .\cookbook\views\api.py:542 +#: .\cookbook\views\api.py:553 +#, python-brace-format msgid "{obj.name} was removed from the shopping list." msgstr "" -#: .\cookbook\views\api.py:547 .\cookbook\views\api.py:879 -#: .\cookbook\views\api.py:892 +#: .\cookbook\views\api.py:558 .\cookbook\views\api.py:888 +#: .\cookbook\views\api.py:901 +#, python-brace-format msgid "{obj.name} was added to the shopping list." msgstr "" -#: .\cookbook\views\api.py:674 +#: .\cookbook\views\api.py:685 msgid "ID of recipe a step is part of. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:676 +#: .\cookbook\views\api.py:687 msgid "Query string matched (fuzzy) against object name." msgstr "" -#: .\cookbook\views\api.py:720 +#: .\cookbook\views\api.py:731 msgid "" "Query string matched (fuzzy) against recipe name. In the future also " "fulltext search." msgstr "" -#: .\cookbook\views\api.py:722 +#: .\cookbook\views\api.py:733 msgid "" "ID of keyword a recipe should have. For multiple repeat parameter. " "Equivalent to keywords_or" msgstr "" -#: .\cookbook\views\api.py:725 +#: .\cookbook\views\api.py:736 msgid "" "Keyword IDs, repeat for multiple. Return recipes with any of the keywords" msgstr "" -#: .\cookbook\views\api.py:728 +#: .\cookbook\views\api.py:739 msgid "" "Keyword IDs, repeat for multiple. Return recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:742 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords." msgstr "" -#: .\cookbook\views\api.py:734 +#: .\cookbook\views\api.py:745 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:736 +#: .\cookbook\views\api.py:747 msgid "ID of food a recipe should have. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:739 +#: .\cookbook\views\api.py:750 msgid "Food IDs, repeat for multiple. Return recipes with any of the foods" msgstr "" -#: .\cookbook\views\api.py:741 +#: .\cookbook\views\api.py:752 msgid "Food IDs, repeat for multiple. Return recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:743 +#: .\cookbook\views\api.py:754 msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods." msgstr "" -#: .\cookbook\views\api.py:745 +#: .\cookbook\views\api.py:756 msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:746 +#: .\cookbook\views\api.py:757 msgid "ID of unit a recipe should have." msgstr "" -#: .\cookbook\views\api.py:748 +#: .\cookbook\views\api.py:759 msgid "" "Rating a recipe should have or greater. [0 - 5] Negative value filters " "rating less than." msgstr "" -#: .\cookbook\views\api.py:749 +#: .\cookbook\views\api.py:760 msgid "ID of book a recipe should be in. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:751 +#: .\cookbook\views\api.py:762 msgid "Book IDs, repeat for multiple. Return recipes with any of the books" msgstr "" -#: .\cookbook\views\api.py:753 +#: .\cookbook\views\api.py:764 msgid "Book IDs, repeat for multiple. Return recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:755 +#: .\cookbook\views\api.py:766 msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books." msgstr "" -#: .\cookbook\views\api.py:757 +#: .\cookbook\views\api.py:768 msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:759 +#: .\cookbook\views\api.py:770 msgid "If only internal recipes should be returned. [true/false]" msgstr "" -#: .\cookbook\views\api.py:761 +#: .\cookbook\views\api.py:772 msgid "Returns the results in randomized order. [true/false]" msgstr "" -#: .\cookbook\views\api.py:763 +#: .\cookbook\views\api.py:774 msgid "Returns new results first in search results. [true/false]" msgstr "" -#: .\cookbook\views\api.py:765 +#: .\cookbook\views\api.py:776 msgid "" "Filter recipes cooked X times or more. Negative values returns cooked less " "than X times" msgstr "" -#: .\cookbook\views\api.py:767 +#: .\cookbook\views\api.py:778 msgid "" "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:769 +#: .\cookbook\views\api.py:780 msgid "" "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:771 +#: .\cookbook\views\api.py:782 msgid "" "Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:773 +#: .\cookbook\views\api.py:784 msgid "" "Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:775 +#: .\cookbook\views\api.py:786 msgid "Filter recipes that can be made with OnHand food. [true/false]" msgstr "" -#: .\cookbook\views\api.py:937 +#: .\cookbook\views\api.py:946 msgid "" "Returns the shopping list entry with a primary key of id. Multiple values " "allowed." msgstr "" -#: .\cookbook\views\api.py:942 +#: .\cookbook\views\api.py:951 msgid "" -"Filter shopping list entries on checked. [true, false, both, recent]" -"
    - recent includes unchecked items and recently completed items." +"Filter shopping list entries on checked. [true, false, both, recent]
    - recent includes unchecked items and recently completed items." msgstr "" -#: .\cookbook\views\api.py:945 +#: .\cookbook\views\api.py:954 msgid "Returns the shopping list entries sorted by supermarket category order." msgstr "" -#: .\cookbook\views\api.py:1140 +#: .\cookbook\views\api.py:1166 msgid "Nothing to do." msgstr "" -#: .\cookbook\views\api.py:1160 +#: .\cookbook\views\api.py:1198 msgid "Invalid Url" msgstr "" -#: .\cookbook\views\api.py:1167 +#: .\cookbook\views\api.py:1205 msgid "Connection Refused." msgstr "" -#: .\cookbook\views\api.py:1172 +#: .\cookbook\views\api.py:1210 msgid "Bad URL Schema." msgstr "" -#: .\cookbook\views\api.py:1195 +#: .\cookbook\views\api.py:1233 #, 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:1303 .\cookbook\views\data.py:28 +#: .\cookbook\views\api.py:1326 .\cookbook\views\import_export.py:117 +msgid "Importing is not implemented for this provider" +msgstr "La importación no está implementada para este proveedor" + +#: .\cookbook\views\api.py:1372 .\cookbook\views\data.py:31 #: .\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:1325 +#: .\cookbook\views\api.py:1394 msgid "Sync successful!" msgstr "¡Sincronización exitosa!" -#: .\cookbook\views\api.py:1330 +#: .\cookbook\views\api.py:1399 msgid "Error synchronizing with Storage" msgstr "Error de sincronización con el almacenamiento" -#: .\cookbook\views\data.py:97 +#: .\cookbook\views\data.py:100 #, python-format msgid "Batch edit done. %(count)d recipe was updated." msgid_plural "Batch edit done. %(count)d Recipes where updated." @@ -2719,11 +2565,7 @@ msgstr "¡Cambios guardados!" msgid "Error saving changes!" msgstr "¡Error al guardar los cambios!" -#: .\cookbook\views\import_export.py:111 .\cookbook\views\import_export.py:150 -msgid "Importing is not implemented for this provider" -msgstr "La importación no está implementada para este proveedor" - -#: .\cookbook\views\import_export.py:137 +#: .\cookbook\views\import_export.py:104 msgid "" "The PDF Exporter is not enabled on this instance as it is still in an " "experimental state." @@ -2775,39 +2617,40 @@ msgstr "¡Nueva receta importada!" msgid "There was an error importing this recipe!" msgstr "¡Hubo un error al importar esta receta!" -#: .\cookbook\views\views.py:124 +#: .\cookbook\views\views.py:73 .\cookbook\views\views.py:191 +#: .\cookbook\views\views.py:213 .\cookbook\views\views.py:399 +msgid "This feature is not available in the demo version!" +msgstr "¡Esta funcionalidad no está disponible en la versión demo!" + +#: .\cookbook\views\views.py:89 msgid "" "You have successfully created your own recipe space. Start by adding some " "recipes or invite other people to join you." msgstr "" -#: .\cookbook\views\views.py:178 +#: .\cookbook\views\views.py:143 msgid "You do not have the required permissions to perform this action!" msgstr "¡No tienes los permisos necesarios para realizar esta acción!" -#: .\cookbook\views\views.py:189 +#: .\cookbook\views\views.py:154 msgid "Comment saved!" msgstr "¡Comentario guardado!" -#: .\cookbook\views\views.py:264 -msgid "This feature is not available in the demo version!" -msgstr "¡Esta funcionalidad no está disponible en la versión demo!" - -#: .\cookbook\views\views.py:324 +#: .\cookbook\views\views.py:253 msgid "You must select at least one field to search!" msgstr "" -#: .\cookbook\views\views.py:329 +#: .\cookbook\views\views.py:258 msgid "" "To use this search method you must select at least one full text search " "field!" msgstr "" -#: .\cookbook\views\views.py:333 +#: .\cookbook\views\views.py:262 msgid "Fuzzy search is not compatible with this search method!" msgstr "" -#: .\cookbook\views\views.py:463 +#: .\cookbook\views\views.py:338 msgid "" "The setup page can only be used to create the first user! If you have " "forgotten your superuser credentials please consult the django documentation " @@ -2817,38 +2660,212 @@ msgstr "" "usuario. Si has olvidado tus credenciales de superusuario, por favor " "consulta la documentación de django sobre cómo restablecer las contraseñas." -#: .\cookbook\views\views.py:470 +#: .\cookbook\views\views.py:345 msgid "Passwords dont match!" msgstr "¡Las contraseñas no coinciden!" -#: .\cookbook\views\views.py:478 +#: .\cookbook\views\views.py:353 msgid "User has been created, please login!" msgstr "El usuario ha sido creado, ¡inicie sesión!" -#: .\cookbook\views\views.py:494 +#: .\cookbook\views\views.py:369 msgid "Malformed Invite Link supplied!" msgstr "¡Se proporcionó un enlace de invitación con formato incorrecto!" -#: .\cookbook\views\views.py:510 +#: .\cookbook\views\views.py:386 msgid "Successfully joined space." msgstr "" -#: .\cookbook\views\views.py:516 +#: .\cookbook\views\views.py:392 msgid "Invite Link not valid or already used!" msgstr "¡El enlace de invitación no es válido o ya se ha utilizado!" -#: .\cookbook\views\views.py:530 +#: .\cookbook\views\views.py:409 msgid "" "Reporting share links is not enabled for this instance. Please notify the " "page administrator to report problems." msgstr "" -#: .\cookbook\views\views.py:536 +#: .\cookbook\views\views.py:415 msgid "" "Recipe sharing link has been disabled! For additional information please " "contact the page administrator." msgstr "" +#~ msgid "Ingredients" +#~ msgstr "Ingredientes" + +#~ msgid "Show recent recipes" +#~ msgstr "Mostrar recetas recientes" + +#~ msgid "Search style" +#~ msgstr "Estilo de búsqueda" + +#~ msgid "Show recently viewed recipes on search page." +#~ msgstr "Muestra recetas vistas recientemente en la página de búsqueda." + +#~ msgid "Small" +#~ msgstr "Pequeño" + +#~ msgid "Large" +#~ msgstr "Grande" + +#~ msgid "Edit Ingredients" +#~ msgstr "Editar ingredientes" + +#~ msgid "" +#~ "\n" +#~ " The following form can be used if, accidentally, two (or more) " +#~ "units or ingredients where created that should be\n" +#~ " the same.\n" +#~ " It merges two units or ingredients and updates all recipes using " +#~ "them.\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ " La siguiente forma puede utilizarse si, accidentalmente, se crean " +#~ "dos (o más) unidades o ingredientes que deberían ser\n" +#~ " iguales.\n" +#~ " Fusiona dos unidades o ingredientes y actualiza todas las recetas " +#~ "que los usan.\n" +#~ " " + +#~ msgid "Are you sure that you want to merge these two units?" +#~ msgstr "¿Estás seguro de que quieres combinar estas dos unidades?" + +#~ msgid "Merge" +#~ msgstr "Combinar" + +#~ msgid "Are you sure that you want to merge these two ingredients?" +#~ msgstr "¿Estás seguro de que quieres combinar estos dos ingredientes?" + +#~ msgid "Import Recipes" +#~ msgstr "Importar recetas" + +#~ msgid "Close" +#~ msgstr "Cerrar" + +#~ msgid "Open Recipe" +#~ msgstr "Abrir Receta" + +#~ msgid "Meal Plan View" +#~ msgstr "Vista de menú" + +#~ msgid "Created by" +#~ msgstr "Creado por" + +#~ msgid "Shared with" +#~ msgstr "Compartido con" + +#~ msgid "Last cooked" +#~ msgstr "Cocinado por última vez" + +#~ msgid "Never cooked before." +#~ msgstr "Nunca antes cocinado." + +#~ msgid "Other meals on this day" +#~ msgstr "Otras comidas en este día" + +#~ msgid "Recipe Image" +#~ msgstr "Imagen de la receta" + +#~ msgid "Preparation time ca." +#~ msgstr "Tiempo de preparación ca." + +#~ msgid "Waiting time ca." +#~ msgstr "Tiempo de espera ca." + +#~ msgid "External" +#~ msgstr "Externo" + +#~ msgid "Log Cooking" +#~ msgstr "Registrar receta cocinada" + +#~ msgid "Account" +#~ msgstr "Cuenta" + +#, fuzzy +#~| msgid "Settings" +#~ msgid "API-Settings" +#~ msgstr "Opciones" + +#, fuzzy +#~| msgid "Search String" +#~ msgid "Search-Settings" +#~ msgstr "Cadena de búsqueda" + +#, fuzzy +#~| msgid "Search String" +#~ msgid "Shopping-Settings" +#~ msgstr "Cadena de búsqueda" + +#, fuzzy +#~| msgid "Settings" +#~ msgid "Name Settings" +#~ msgstr "Opciones" + +#, fuzzy +#~| msgid "Account Connections" +#~ msgid "Account Settings" +#~ msgstr "Conexiones de la cuenta" + +#, fuzzy +#~| msgid "Settings" +#~ msgid "Emails" +#~ msgstr "Opciones" + +#~ msgid "Language" +#~ msgstr "Idioma" + +#~ msgid "Style" +#~ msgstr "Estilo" + +#~ msgid "API Token" +#~ msgstr "Token API" + +#~ msgid "" +#~ "You can use both basic authentication and token based authentication to " +#~ "access the REST API." +#~ msgstr "" +#~ "Puedes utilizar tanto la autenticación básica como la autenticación " +#~ "basada en tokens para acceder a la API REST." + +#~ msgid "" +#~ "Use the token as an Authorization header prefixed by the word token as " +#~ "shown in the following examples:" +#~ msgstr "" +#~ "Utilice el token como cabecera de autorización usando como prefijo la " +#~ "palabra token, tal y como se muestra en los siguientes ejemplos:" + +#~ msgid "or" +#~ msgstr "o" + +#, fuzzy +#~| msgid "Shopping List" +#~ msgid "Shopping Settings" +#~ msgstr "Lista de la Compra" + +#~ msgid "Stats" +#~ msgstr "Estadísticas" + +#~ msgid "Statistics" +#~ msgstr "Estadísticas" + +#~ msgid "Number of objects" +#~ msgstr "Número de objetos" + +#~ msgid "Recipe Imports" +#~ msgstr "Recetas importadas" + +#~ msgid "Objects stats" +#~ msgstr "Estadísticas de objetos" + +#~ msgid "Recipes without Keywords" +#~ msgstr "Recetas sin palabras clave" + +#~ msgid "Internal Recipes" +#~ msgstr "Recetas Internas" + #~ msgid "Show Links" #~ msgstr "Mostrar Enlaces" @@ -2960,9 +2977,6 @@ msgstr "" #~ msgid "Preview Recipe Data" #~ msgstr "Ver la receta" -#~ msgid "Description" -#~ msgstr "Descripción" - #, fuzzy #~| msgid "Preparation Time" #~ msgid "Prep Time" @@ -2973,9 +2987,6 @@ msgstr "" #~ msgid "Cook Time" #~ msgstr "Tiempo" -#~ msgid "Instructions" -#~ msgstr "Instrucciones" - #, fuzzy #~| msgid "Discovered Recipes" #~ msgid "Discovered Attributes" diff --git a/cookbook/locale/fr/LC_MESSAGES/django.mo b/cookbook/locale/fr/LC_MESSAGES/django.mo index e812f2fda..6982ac613 100644 Binary files a/cookbook/locale/fr/LC_MESSAGES/django.mo and b/cookbook/locale/fr/LC_MESSAGES/django.mo differ diff --git a/cookbook/locale/fr/LC_MESSAGES/django.po b/cookbook/locale/fr/LC_MESSAGES/django.po index a2bc52ab8..52aea2455 100644 --- a/cookbook/locale/fr/LC_MESSAGES/django.po +++ b/cookbook/locale/fr/LC_MESSAGES/django.po @@ -13,95 +13,81 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 19:20+0200\n" -"PO-Revision-Date: 2022-09-26 16:33+0000\n" -"Last-Translator: Noé Feutry \n" -"Language-Team: French \n" +"POT-Creation-Date: 2023-04-26 07:46+0200\n" +"PO-Revision-Date: 2023-04-12 11:55+0000\n" +"Last-Translator: noxonad \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.10.1\n" +"X-Generator: Weblate 4.15\n" -#: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 -#: .\cookbook\templates\stats.html:28 -msgid "Ingredients" -msgstr "Ingrédients" - -#: .\cookbook\forms.py:53 +#: .\cookbook\forms.py:52 msgid "Default unit" msgstr "Unité par défaut" -#: .\cookbook\forms.py:54 +#: .\cookbook\forms.py:53 msgid "Use fractions" msgstr "Utiliser les fractions" -#: .\cookbook\forms.py:55 +#: .\cookbook\forms.py:54 msgid "Use KJ" msgstr "Utiliser les kJ" -#: .\cookbook\forms.py:56 +#: .\cookbook\forms.py:55 msgid "Theme" msgstr "Thème" -#: .\cookbook\forms.py:57 +#: .\cookbook\forms.py:56 msgid "Navbar color" msgstr "Couleur de la barre de navigation" -#: .\cookbook\forms.py:58 +#: .\cookbook\forms.py:57 msgid "Sticky navbar" msgstr "Barre de navigation permanente" -#: .\cookbook\forms.py:59 +#: .\cookbook\forms.py:58 msgid "Default page" msgstr "Page par défaut" -#: .\cookbook\forms.py:60 -msgid "Show recent recipes" -msgstr "Afficher les recettes récentes" - -#: .\cookbook\forms.py:61 -msgid "Search style" -msgstr "Rechercher" - -#: .\cookbook\forms.py:62 +#: .\cookbook\forms.py:59 msgid "Plan sharing" msgstr "Partage du planificateur" -#: .\cookbook\forms.py:63 +#: .\cookbook\forms.py:60 msgid "Ingredient decimal places" msgstr "Nombre de décimales pour les ingrédients" -#: .\cookbook\forms.py:64 +#: .\cookbook\forms.py:61 msgid "Shopping list auto sync period" msgstr "Période de synchro automatique de la liste de courses" -#: .\cookbook\forms.py:65 .\cookbook\templates\recipe_view.html:21 -#: .\cookbook\templates\stats.html:47 +#: .\cookbook\forms.py:62 .\cookbook\templates\recipe_view.html:36 msgid "Comments" msgstr "Commentaires" -#: .\cookbook\forms.py:66 +#: .\cookbook\forms.py:63 msgid "Left-handed mode" msgstr "Mode gaucher" -#: .\cookbook\forms.py:70 +#: .\cookbook\forms.py:67 msgid "" "Color of the top navigation bar. Not all colors work with all themes, just " "try them out!" msgstr "" "Couleur de la barre de navigation du haut. Les couleurs ne fonctionnent pas " -"toutes avec tous les thèmes, faites des essais !" +"avec tous les thèmes, faites des essais !" -#: .\cookbook\forms.py:72 +#: .\cookbook\forms.py:69 msgid "Default Unit to be used when inserting a new ingredient into a recipe." msgstr "" "Unité par défaut utilisée lors de l’ajout d’un nouvel ingrédient dans une " "recette." -#: .\cookbook\forms.py:74 +#: .\cookbook\forms.py:71 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" @@ -109,37 +95,33 @@ msgstr "" "Permet la prise en charge des fractions dans les quantités d’ingrédients " "(convertit les décimales en fractions automatiquement)" -#: .\cookbook\forms.py:76 +#: .\cookbook\forms.py:73 msgid "Display nutritional energy amounts in joules instead of calories" msgstr "" "Afficher les quantités d’énergie nutritionnelle en joules plutôt qu’en " "calories" -#: .\cookbook\forms.py:77 +#: .\cookbook\forms.py:74 msgid "Users with whom newly created meal plans should be shared by default." msgstr "" "Utilisateurs avec lesquels partager par défaut les menus de la semaines " "nouvellement créés." -#: .\cookbook\forms.py:78 +#: .\cookbook\forms.py:75 msgid "Users with whom to share shopping lists." msgstr "Utilisateurs avec lesquels partager des listes de courses." -#: .\cookbook\forms.py:80 -msgid "Show recently viewed recipes on search page." -msgstr "Afficher les recettes récemment consultées sur la page de recherche." - -#: .\cookbook\forms.py:81 +#: .\cookbook\forms.py:76 msgid "Number of decimals to round ingredients." msgstr "Nombre de décimales pour arrondir les ingrédients." -#: .\cookbook\forms.py:82 +#: .\cookbook\forms.py:77 msgid "If you want to be able to create and see comments underneath recipes." msgstr "" "Si vous souhaitez pouvoir créer et consulter des commentaires en dessous des " "recettes." -#: .\cookbook\forms.py:84 .\cookbook\forms.py:496 +#: .\cookbook\forms.py:79 .\cookbook\forms.py:492 msgid "" "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. " @@ -153,25 +135,25 @@ msgstr "" "données mobiles. Si la valeur est plus petite que les limites de l’instance, " "le paramètre sera réinitialisé." -#: .\cookbook\forms.py:87 +#: .\cookbook\forms.py:82 msgid "Makes the navbar stick to the top of the page." msgstr "Épingler la barre de navigation en haut de la page." -#: .\cookbook\forms.py:88 .\cookbook\forms.py:499 +#: .\cookbook\forms.py:83 .\cookbook\forms.py:495 msgid "Automatically add meal plan ingredients to shopping list." msgstr "" "Ajouter les ingrédients du menu de la semaine à la liste de courses " "automatiquement." -#: .\cookbook\forms.py:89 +#: .\cookbook\forms.py:84 msgid "Exclude ingredients that are on hand." msgstr "Exclure les ingrédients disponibles." -#: .\cookbook\forms.py:90 +#: .\cookbook\forms.py:85 msgid "Will optimize the UI for use with your left hand." -msgstr "" +msgstr "Optimisation de l'interface pour l'utilisation avec la main gauche." -#: .\cookbook\forms.py:107 +#: .\cookbook\forms.py:102 msgid "" "Both fields are optional. If none are given the username will be displayed " "instead" @@ -179,36 +161,35 @@ msgstr "" "Les deux champs sont facultatifs. Si aucun n’est rempli, le nom " "d’utilisateur sera affiché à la place" -#: .\cookbook\forms.py:128 .\cookbook\forms.py:301 +#: .\cookbook\forms.py:123 .\cookbook\forms.py:297 msgid "Name" msgstr "Nom" -#: .\cookbook\forms.py:129 .\cookbook\forms.py:302 -#: .\cookbook\templates\stats.html:24 .\cookbook\views\lists.py:88 +#: .\cookbook\forms.py:124 .\cookbook\forms.py:298 .\cookbook\views\lists.py:88 msgid "Keywords" msgstr "Mots-clés" -#: .\cookbook\forms.py:130 +#: .\cookbook\forms.py:125 msgid "Preparation time in minutes" msgstr "Temps de préparation en minutes" -#: .\cookbook\forms.py:131 +#: .\cookbook\forms.py:126 msgid "Waiting time (cooking/baking) in minutes" msgstr "Temps d’attente (cuisson) en minutes" -#: .\cookbook\forms.py:132 .\cookbook\forms.py:270 .\cookbook\forms.py:303 +#: .\cookbook\forms.py:127 .\cookbook\forms.py:266 .\cookbook\forms.py:299 msgid "Path" msgstr "Chemin" -#: .\cookbook\forms.py:133 +#: .\cookbook\forms.py:128 msgid "Storage UID" msgstr "UID de stockage" -#: .\cookbook\forms.py:165 +#: .\cookbook\forms.py:161 msgid "Default" msgstr "Par défaut" -#: .\cookbook\forms.py:177 +#: .\cookbook\forms.py:173 msgid "" "To prevent duplicates recipes with the same name as existing ones are " "ignored. Check this box to import everything." @@ -216,22 +197,22 @@ msgstr "" "Pour éviter les doublons, les recettes de même nom seront ignorées. Cocher " "cette case pour tout importer." -#: .\cookbook\forms.py:200 +#: .\cookbook\forms.py:196 msgid "Add your comment: " msgstr "Ajoutez votre commentaire : " -#: .\cookbook\forms.py:215 +#: .\cookbook\forms.py:211 msgid "Leave empty for dropbox and enter app password for nextcloud." msgstr "" "Laissez vide pour Dropbox et renseignez votre mot de passe d’application " "pour Nextcloud." -#: .\cookbook\forms.py:222 +#: .\cookbook\forms.py:218 msgid "Leave empty for nextcloud and enter api token for dropbox." msgstr "" "Laissez vide pour Nextcloud et renseignez votre jeton d’API pour Dropbox." -#: .\cookbook\forms.py:231 +#: .\cookbook\forms.py:227 msgid "" "Leave empty for dropbox and enter only base url for nextcloud (/remote." "php/webdav/ is added automatically)" @@ -239,33 +220,33 @@ msgstr "" "Laisser vide pour Dropbox et saisissez seulement l’URL de base pour " "Nextcloud (/remote.php/webdav/ est ajouté automatiquement)" -#: .\cookbook\forms.py:269 .\cookbook\views\edit.py:157 +#: .\cookbook\forms.py:265 .\cookbook\views\edit.py:157 msgid "Storage" msgstr "Stockage" -#: .\cookbook\forms.py:271 +#: .\cookbook\forms.py:267 msgid "Active" msgstr "Actif" -#: .\cookbook\forms.py:277 +#: .\cookbook\forms.py:273 msgid "Search String" msgstr "Texte recherché" -#: .\cookbook\forms.py:304 +#: .\cookbook\forms.py:300 msgid "File ID" msgstr "ID du fichier" -#: .\cookbook\forms.py:326 +#: .\cookbook\forms.py:322 msgid "You must provide at least a recipe or a title." msgstr "Vous devez au moins fournir une recette ou un titre." -#: .\cookbook\forms.py:339 +#: .\cookbook\forms.py:335 msgid "You can list default users to share recipes with in the settings." msgstr "" "Vous pouvez lister les utilisateurs par défaut avec qui partager des " "recettes dans les paramètres." -#: .\cookbook\forms.py:340 +#: .\cookbook\forms.py:336 msgid "" "You can use markdown to format this field. See the docs here" @@ -273,15 +254,15 @@ msgstr "" "Vous pouvez utiliser du markdown pour mettre en forme ce champ. Voir la documentation ici" -#: .\cookbook\forms.py:366 +#: .\cookbook\forms.py:362 msgid "Maximum number of users for this space reached." msgstr "Nombre maximum d’utilisateurs atteint pour ce groupe." -#: .\cookbook\forms.py:372 +#: .\cookbook\forms.py:368 msgid "Email address already taken!" msgstr "Adresse mail déjà utilisée !" -#: .\cookbook\forms.py:380 +#: .\cookbook\forms.py:376 msgid "" "An email address is not required but if present the invite link will be sent " "to the user." @@ -289,15 +270,15 @@ msgstr "" "Une adresse mail n’est pas requise mais si elle est renseignée, le lien " "d’invitation sera envoyé à l’utilisateur." -#: .\cookbook\forms.py:395 +#: .\cookbook\forms.py:391 msgid "Name already taken." msgstr "Nom déjà utilisé." -#: .\cookbook\forms.py:406 +#: .\cookbook\forms.py:402 msgid "Accept Terms and Privacy" msgstr "Accepter les conditions d’utilisation" -#: .\cookbook\forms.py:438 +#: .\cookbook\forms.py:434 msgid "" "Determines how fuzzy a search is if it uses trigram similarity matching (e." "g. low values mean more typos are ignored)." @@ -306,11 +287,7 @@ msgstr "" "par similarité de trigrammes (par exemple, des valeurs faibles signifient " "que davantage de fautes de frappe sont ignorées)." -#: .\cookbook\forms.py:448 -#, fuzzy -#| msgid "" -#| "Select type method of search. Click here " -#| "for full desciption of choices." +#: .\cookbook\forms.py:444 msgid "" "Select type method of search. Click here for " "full description of choices." @@ -318,7 +295,7 @@ msgstr "" "Sélectionner la méthode de recherche. Cliquer ici pour une description complète des choix." -#: .\cookbook\forms.py:449 +#: .\cookbook\forms.py:445 msgid "" "Use fuzzy matching on units, keywords and ingredients when editing and " "importing recipes." @@ -326,7 +303,7 @@ msgstr "" "Utilisez la correspondance floue sur les unités, les mots-clés et les " "ingrédients lors de l’édition et de l’importation de recettes." -#: .\cookbook\forms.py:451 +#: .\cookbook\forms.py:447 msgid "" "Fields to search ignoring accents. Selecting this option can improve or " "degrade search quality depending on language" @@ -335,7 +312,7 @@ msgstr "" "peut améliorer ou dégrader la qualité de la recherche en fonction de la " "langue." -#: .\cookbook\forms.py:453 +#: .\cookbook\forms.py:449 msgid "" "Fields to search for partial matches. (e.g. searching for 'Pie' will return " "'pie' and 'piece' and 'soapie')" @@ -343,7 +320,7 @@ msgstr "" "Champs à rechercher pour les correspondances partielles. (par exemple, la " "recherche de « Tarte » renverra « tarte », « tartelette » et « tartes »)" -#: .\cookbook\forms.py:455 +#: .\cookbook\forms.py:451 msgid "" "Fields to search for beginning of word matches. (e.g. searching for 'sa' " "will return 'salad' and 'sandwich')" @@ -352,7 +329,7 @@ msgstr "" "exemple, si vous recherchez « sa », vous obtiendrez « salade » et " "« sandwich»)." -#: .\cookbook\forms.py:457 +#: .\cookbook\forms.py:453 msgid "" "Fields to 'fuzzy' search. (e.g. searching for 'recpie' will find 'recipe'.) " "Note: this option will conflict with 'web' and 'raw' methods of search." @@ -361,7 +338,7 @@ msgstr "" "« rectte», vous trouverez « recette ».) Remarque : cette option est " "incompatible avec les méthodes de recherche « web » et « brute »." -#: .\cookbook\forms.py:459 +#: .\cookbook\forms.py:455 msgid "" "Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " "only function with fulltext fields." @@ -370,37 +347,35 @@ msgstr "" "« web », « phrase » et « brute » ne fonctionnent qu’avec des champs en texte " "intégral." -#: .\cookbook\forms.py:463 +#: .\cookbook\forms.py:459 msgid "Search Method" msgstr "Méthode de recherche" -#: .\cookbook\forms.py:464 +#: .\cookbook\forms.py:460 msgid "Fuzzy Lookups" msgstr "Recherches floues" -#: .\cookbook\forms.py:465 +#: .\cookbook\forms.py:461 msgid "Ignore Accent" msgstr "Ignorer les accents" -#: .\cookbook\forms.py:466 +#: .\cookbook\forms.py:462 msgid "Partial Match" msgstr "correspondance partielle" -#: .\cookbook\forms.py:467 -#, fuzzy -#| msgid "Starts Wtih" +#: .\cookbook\forms.py:463 msgid "Starts With" msgstr "Commence par" -#: .\cookbook\forms.py:468 +#: .\cookbook\forms.py:464 msgid "Fuzzy Search" msgstr "Recherche floue" -#: .\cookbook\forms.py:469 +#: .\cookbook\forms.py:465 msgid "Full Text" msgstr "Texte intégral" -#: .\cookbook\forms.py:494 +#: .\cookbook\forms.py:490 msgid "" "Users will see all items you add to your shopping list. They must add you " "to see items on their list." @@ -409,7 +384,7 @@ msgstr "" "courses. Ils doivent vous ajouter pour que vous puissiez voir les éléments " "de leur liste." -#: .\cookbook\forms.py:500 +#: .\cookbook\forms.py:496 msgid "" "When adding a meal plan to the shopping list (manually or automatically), " "include all related recipes." @@ -417,7 +392,7 @@ msgstr "" "Lors de l’ajout d’un menu de la semaine à la liste de courses (manuel ou " "automatique), inclure toutes les recettes connexes." -#: .\cookbook\forms.py:501 +#: .\cookbook\forms.py:497 msgid "" "When adding a meal plan to the shopping list (manually or automatically), " "exclude ingredients that are on hand." @@ -425,99 +400,102 @@ msgstr "" "Lors de l’ajout d’un menu de la semaine à la liste de courses (manuel ou " "automatique), exclure les ingrédients disponibles." -#: .\cookbook\forms.py:502 +#: .\cookbook\forms.py:498 msgid "Default number of hours to delay a shopping list entry." msgstr "" +"Nombre d'heures par défaut pour retarder l'ajoût d'un article à la liste de " +"courses." -#: .\cookbook\forms.py:503 +#: .\cookbook\forms.py:499 msgid "Filter shopping list to only include supermarket categories." msgstr "" "Filtrer la liste de courses pour n’inclure que des catégories de " "supermarchés." -#: .\cookbook\forms.py:504 +#: .\cookbook\forms.py:500 msgid "Days of recent shopping list entries to display." -msgstr "" +msgstr "Jours des entrées récentes de la liste de courses à afficher." -#: .\cookbook\forms.py:505 +#: .\cookbook\forms.py:501 msgid "Mark food 'On Hand' when checked off shopping list." msgstr "" "Marquer l’aliment comme disponible lorsqu’il est rayé de la liste de courses." -#: .\cookbook\forms.py:506 +#: .\cookbook\forms.py:502 msgid "Delimiter to use for CSV exports." msgstr "Caractère de séparation à utiliser pour les exportations CSV." -#: .\cookbook\forms.py:507 +#: .\cookbook\forms.py:503 msgid "Prefix to add when copying list to the clipboard." msgstr "Préfixe à ajouter lors de la copie de la liste dans le presse-papiers." -#: .\cookbook\forms.py:511 +#: .\cookbook\forms.py:507 msgid "Share Shopping List" msgstr "Partager la liste de courses" -#: .\cookbook\forms.py:512 +#: .\cookbook\forms.py:508 msgid "Autosync" msgstr "Synchronisation automatique" -#: .\cookbook\forms.py:513 +#: .\cookbook\forms.py:509 msgid "Auto Add Meal Plan" msgstr "Ajouter le menu de la semaine automatiquement" -#: .\cookbook\forms.py:514 +#: .\cookbook\forms.py:510 msgid "Exclude On Hand" msgstr "Exclure ingrédients disponibles" -#: .\cookbook\forms.py:515 +#: .\cookbook\forms.py:511 msgid "Include Related" msgstr "Inclure recettes connexes" -#: .\cookbook\forms.py:516 +#: .\cookbook\forms.py:512 msgid "Default Delay Hours" -msgstr "" +msgstr "Heures de retard par défaut" -#: .\cookbook\forms.py:517 -#, fuzzy -#| msgid "Select Supermarket" +#: .\cookbook\forms.py:513 msgid "Filter to Supermarket" -msgstr "Sélectionner un supermarché" +msgstr "Filtrer par supermarché" -#: .\cookbook\forms.py:518 +#: .\cookbook\forms.py:514 msgid "Recent Days" msgstr "Jours récents" -#: .\cookbook\forms.py:519 +#: .\cookbook\forms.py:515 msgid "CSV Delimiter" msgstr "Caractère de séparation CSV" -#: .\cookbook\forms.py:520 +#: .\cookbook\forms.py:516 msgid "List Prefix" msgstr "Préfixe de la liste" -#: .\cookbook\forms.py:521 +#: .\cookbook\forms.py:517 msgid "Auto On Hand" msgstr "Disponible automatique" -#: .\cookbook\forms.py:531 +#: .\cookbook\forms.py:527 msgid "Reset Food Inheritance" -msgstr "" +msgstr "Réinitialiser l'héritage alimentaire" -#: .\cookbook\forms.py:532 +#: .\cookbook\forms.py:528 msgid "Reset all food to inherit the fields configured." msgstr "Réinitialiser tous les aliments pour hériter les champs configurés." -#: .\cookbook\forms.py:544 -#, fuzzy -#| msgid "Food that should be replaced." +#: .\cookbook\forms.py:540 msgid "Fields on food that should be inherited by default." -msgstr "Aliment qui devrait être remplacé." +msgstr "Champs sur les aliments à hériter par défaut." -#: .\cookbook\forms.py:545 +#: .\cookbook\forms.py:541 msgid "Show recipe counts on search filters" msgstr "" "Afficher le nombre de consultations par recette sur les filtres de recherche" -#: .\cookbook\helper\AllAuthCustomAdapter.py:36 +#: .\cookbook\forms.py:542 +msgid "Use the plural form for units and food inside this space." +msgstr "" +"Utiliser la forme plurielle pour les unités et les aliments dans ce groupe." + +#: .\cookbook\helper\AllAuthCustomAdapter.py:39 msgid "" "In order to prevent spam, the requested email was not send. Please wait a " "few minutes and try again." @@ -525,70 +503,98 @@ msgstr "" "Pour éviter les courriers indésirables, l’email demandé n’a pas été envoyé. " "Veuillez patienter quelques minutes et réessayer." -#: .\cookbook\helper\permission_helper.py:149 -#: .\cookbook\helper\permission_helper.py:172 .\cookbook\views\views.py:152 +#: .\cookbook\helper\permission_helper.py:164 +#: .\cookbook\helper\permission_helper.py:187 .\cookbook\views\views.py:117 msgid "You are not logged in and therefore cannot view this page!" msgstr "" "Vous n’êtes pas connecté(e) et ne pouvez donc pas afficher cette page !" -#: .\cookbook\helper\permission_helper.py:153 -#: .\cookbook\helper\permission_helper.py:159 -#: .\cookbook\helper\permission_helper.py:184 -#: .\cookbook\helper\permission_helper.py:254 -#: .\cookbook\helper\permission_helper.py:268 -#: .\cookbook\helper\permission_helper.py:279 -#: .\cookbook\helper\permission_helper.py:290 .\cookbook\views\data.py:33 -#: .\cookbook\views\views.py:163 .\cookbook\views\views.py:170 -#: .\cookbook\views\views.py:249 +#: .\cookbook\helper\permission_helper.py:168 +#: .\cookbook\helper\permission_helper.py:174 +#: .\cookbook\helper\permission_helper.py:199 +#: .\cookbook\helper\permission_helper.py:269 +#: .\cookbook\helper\permission_helper.py:283 +#: .\cookbook\helper\permission_helper.py:294 +#: .\cookbook\helper\permission_helper.py:305 +#: .\cookbook\helper\permission_helper.py:321 +#: .\cookbook\helper\permission_helper.py:342 .\cookbook\views\data.py:36 +#: .\cookbook\views\views.py:128 .\cookbook\views\views.py:135 msgid "You do not have the required permissions to view this page!" msgstr "Vous ne disposez pas de droits suffisants pour afficher cette page !" -#: .\cookbook\helper\permission_helper.py:177 -#: .\cookbook\helper\permission_helper.py:200 -#: .\cookbook\helper\permission_helper.py:222 +#: .\cookbook\helper\permission_helper.py:192 +#: .\cookbook\helper\permission_helper.py:215 #: .\cookbook\helper\permission_helper.py:237 +#: .\cookbook\helper\permission_helper.py:252 msgid "You cannot interact with this object as it is not owned by you!" msgstr "" "Vous ne pouvez pas interagir avec cet objet car il appartient à un autre " "utilisateur !" -#: .\cookbook\helper\permission_helper.py:321 +#: .\cookbook\helper\permission_helper.py:403 msgid "You have reached the maximum number of recipes for your space." msgstr "Vous avez atteint le nombre maximum de recettes pour votre groupe." -#: .\cookbook\helper\permission_helper.py:333 +#: .\cookbook\helper\permission_helper.py:415 msgid "You have more users than allowed in your space." msgstr "" "Le nombre d’utilisateurs dans votre groupe dépasse le nombre d’utilisateurs " "autorisé." -#: .\cookbook\helper\recipe_search.py:565 +#: .\cookbook\helper\recipe_search.py:630 msgid "One of queryset or hash_key must be provided" +msgstr "Il est nécessaire de fournir soit le queryset, soit la clé de hachage" + +#: .\cookbook\helper\recipe_url_import.py:266 +#, fuzzy +#| msgid "Use fractions" +msgid "reverse rotation" +msgstr "Utiliser les fractions" + +#: .\cookbook\helper\recipe_url_import.py:267 +msgid "careful rotation" msgstr "" -#: .\cookbook\helper\shopping_helper.py:152 -#, fuzzy -#| msgid "You must supply a created_by" -msgid "You must supply a servings size" -msgstr "Vous devez fournir une information créé_par" +#: .\cookbook\helper\recipe_url_import.py:268 +msgid "knead" +msgstr "" -#: .\cookbook\helper\template_helper.py:64 -#: .\cookbook\helper\template_helper.py:66 +#: .\cookbook\helper\recipe_url_import.py:269 +msgid "thicken" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:270 +msgid "warm up" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:271 +msgid "ferment" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:272 +msgid "sous-vide" +msgstr "" + +#: .\cookbook\helper\shopping_helper.py:157 +msgid "You must supply a servings size" +msgstr "Vous devez fournir une information de portion" + +#: .\cookbook\helper\template_helper.py:79 +#: .\cookbook\helper\template_helper.py:81 msgid "Could not parse template code." msgstr "Impossible d’analyser le code du modèle." -#: .\cookbook\integration\copymethat.py:41 +#: .\cookbook\integration\copymethat.py:44 #: .\cookbook\integration\melarecipes.py:37 msgid "Favorite" -msgstr "" +msgstr "Favori" -#: .\cookbook\integration\copymethat.py:70 -#: .\cookbook\integration\recettetek.py:54 -#: .\cookbook\integration\recipekeeper.py:63 -msgid "Imported from" -msgstr "Importé depuis" +#: .\cookbook\integration\copymethat.py:50 +#, fuzzy +msgid "I made this" +msgstr "J'ai fait ça" -#: .\cookbook\integration\integration.py:223 +#: .\cookbook\integration\integration.py:218 msgid "" "Importer expected a .zip file. Did you choose the correct importer type for " "your data ?" @@ -596,7 +602,7 @@ msgstr "" "Un fichier .zip était attendu à l’importation. Avez-vous choisi le bon " "format pour vos données ?" -#: .\cookbook\integration\integration.py:226 +#: .\cookbook\integration\integration.py:221 msgid "" "An unexpected error occurred during the import. Please make sure you have " "uploaded a valid file." @@ -604,42 +610,51 @@ msgstr "" "Une erreur imprévue est survenue durant l’importation. Vérifiez que vous " "avez téléversé un fichier valide." -#: .\cookbook\integration\integration.py:231 +#: .\cookbook\integration\integration.py:226 msgid "The following recipes were ignored because they already existed:" msgstr "Les recettes suivantes ont été ignorées car elles existaient déjà :" -#: .\cookbook\integration\integration.py:235 +#: .\cookbook\integration\integration.py:230 #, python-format msgid "Imported %s recipes." msgstr "%s recettes importées." -#: .\cookbook\integration\paprika.py:46 +#: .\cookbook\integration\openeats.py:26 +#, fuzzy +#| msgid "Recipe Home" +msgid "Recipe source:" +msgstr "Page d’accueil" + +#: .\cookbook\integration\paprika.py:49 msgid "Notes" msgstr "Notes" -#: .\cookbook\integration\paprika.py:49 +#: .\cookbook\integration\paprika.py:52 msgid "Nutritional Information" msgstr "Informations nutritionnelles" -#: .\cookbook\integration\paprika.py:53 +#: .\cookbook\integration\paprika.py:56 msgid "Source" msgstr "Source" +#: .\cookbook\integration\recettetek.py:54 +#: .\cookbook\integration\recipekeeper.py:70 +msgid "Imported from" +msgstr "Importé depuis" + #: .\cookbook\integration\saffron.py:23 msgid "Servings" msgstr "Portions" #: .\cookbook\integration\saffron.py:25 msgid "Waiting time" -msgstr "Temps d’attente" +msgstr "temps d’attente" #: .\cookbook\integration\saffron.py:27 msgid "Preparation Time" msgstr "Temps de préparation" -#: .\cookbook\integration\saffron.py:29 -#: .\cookbook\templates\forms\ingredients.html:7 -#: .\cookbook\templates\index.html:7 +#: .\cookbook\integration\saffron.py:29 .\cookbook\templates\index.html:7 msgid "Cookbook" msgstr "Livre de recettes" @@ -652,11 +667,9 @@ msgid "Rebuilds full text search index on Recipe" msgstr "Reconstruction de l’index de recherche en texte intégral de Tandoor" #: .\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 "" -"Seules les bases de données Postgres utilisent la recherche en texte " +"Seules les bases de données Postgresql utilisent la recherche en texte " "intégral, sans index à reconstruire" #: .\cookbook\management\commands\rebuildindex.py:29 @@ -683,7 +696,7 @@ msgstr "Dîner" msgid "Other" msgstr "Autre" -#: .\cookbook\models.py:251 +#: .\cookbook\models.py:261 msgid "" "Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " "upload." @@ -691,171 +704,163 @@ msgstr "" "Le stockage maximal de fichiers pour ce groupe en Mo. Mettre 0 pour ne pas " "avoir de limite et -1 pour empêcher le téléversement de fichiers." -#: .\cookbook\models.py:353 .\cookbook\templates\search.html:7 +#: .\cookbook\models.py:365 .\cookbook\templates\search.html:7 +#: .\cookbook\templates\settings.html:18 #: .\cookbook\templates\space_manage.html:7 msgid "Search" msgstr "Rechercher" -#: .\cookbook\models.py:354 .\cookbook\templates\base.html:107 +#: .\cookbook\models.py:366 .\cookbook\templates\base.html:110 #: .\cookbook\templates\meal_plan.html:7 .\cookbook\views\delete.py:178 #: .\cookbook\views\edit.py:211 .\cookbook\views\new.py:179 msgid "Meal-Plan" msgstr "Menu de la semaine" -#: .\cookbook\models.py:355 .\cookbook\templates\base.html:115 +#: .\cookbook\models.py:367 .\cookbook\templates\base.html:118 msgid "Books" msgstr "Livres" -#: .\cookbook\models.py:363 -msgid "Small" -msgstr "Petit" - -#: .\cookbook\models.py:363 -msgid "Large" -msgstr "Grand" - -#: .\cookbook\models.py:363 .\cookbook\templates\generic\new_template.html:6 -#: .\cookbook\templates\generic\new_template.html:14 -msgid "New" -msgstr "Nouveau" - -#: .\cookbook\models.py:584 +#: .\cookbook\models.py:580 msgid " is part of a recipe step and cannot be deleted" msgstr " fait partie d’une étape de la recette et ne peut être supprimé(e)" -#: .\cookbook\models.py:1162 .\cookbook\templates\search_info.html:28 +#: .\cookbook\models.py:1181 .\cookbook\templates\search_info.html:28 msgid "Simple" msgstr "Simple" -#: .\cookbook\models.py:1163 .\cookbook\templates\search_info.html:33 +#: .\cookbook\models.py:1182 .\cookbook\templates\search_info.html:33 msgid "Phrase" msgstr "Phrase" -#: .\cookbook\models.py:1164 .\cookbook\templates\search_info.html:38 +#: .\cookbook\models.py:1183 .\cookbook\templates\search_info.html:38 msgid "Web" msgstr "Internet" -#: .\cookbook\models.py:1165 .\cookbook\templates\search_info.html:47 +#: .\cookbook\models.py:1184 .\cookbook\templates\search_info.html:47 msgid "Raw" msgstr "Brut" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 msgid "Food Alias" msgstr "Aliment équivalent" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 msgid "Unit Alias" msgstr "Unité équivalente" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 msgid "Keyword Alias" msgstr "Mot-clé équivalent" -#: .\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 +#: .\cookbook\models.py:1232 +msgid "Description Replace" +msgstr "Remplacer la Description" + +#: .\cookbook\models.py:1232 +msgid "Instruction Replace" +msgstr "Remplacer l'instruction" + +#: .\cookbook\models.py:1258 .\cookbook\views\delete.py:36 +#: .\cookbook\views\edit.py:251 .\cookbook\views\new.py:48 msgid "Recipe" msgstr "Recette" -#: .\cookbook\models.py:1228 -#, fuzzy -#| msgid "Foods" +#: .\cookbook\models.py:1259 msgid "Food" -msgstr "Aliments" +msgstr "Aliment" -#: .\cookbook\models.py:1229 .\cookbook\templates\base.html:138 +#: .\cookbook\models.py:1260 .\cookbook\templates\base.html:141 msgid "Keyword" msgstr "Mot-clé" -#: .\cookbook\serializer.py:207 -msgid "Cannot modify Space owner permission." -msgstr "" - -#: .\cookbook\serializer.py:290 +#: .\cookbook\serializer.py:198 msgid "File uploads are not enabled for this Space." msgstr "Le téléversement de fichiers n’est pas autorisé pour ce groupe." -#: .\cookbook\serializer.py:301 +#: .\cookbook\serializer.py:209 msgid "You have reached your file upload limit." msgstr "Vous avez atteint votre limite de téléversement de fichiers." -#: .\cookbook\serializer.py:1081 +#: .\cookbook\serializer.py:291 +msgid "Cannot modify Space owner permission." +msgstr "Impossible de modifier les permissions du propriétaire de groupe." + +#: .\cookbook\serializer.py:1093 msgid "Hello" msgstr "Bonjour" -#: .\cookbook\serializer.py:1081 +#: .\cookbook\serializer.py:1093 msgid "You have been invited by " msgstr "Vous avez été invité par " -#: .\cookbook\serializer.py:1082 +#: .\cookbook\serializer.py:1094 msgid " to join their Tandoor Recipes space " msgstr " pour rejoindre leur groupe Tandoor Recipes " -#: .\cookbook\serializer.py:1083 +#: .\cookbook\serializer.py:1095 msgid "Click the following link to activate your account: " msgstr "Cliquez le lien suivant pour activer votre compte : " -#: .\cookbook\serializer.py:1084 +#: .\cookbook\serializer.py:1096 msgid "" "If the link does not work use the following code to manually join the space: " msgstr "" "Si le lien ne fonctionne pas, utilisez le code suivant pour rejoindre le " "groupe manuellement : " -#: .\cookbook\serializer.py:1085 +#: .\cookbook\serializer.py:1097 msgid "The invitation is valid until " msgstr "L’invitation est valide jusqu’au " -#: .\cookbook\serializer.py:1086 +#: .\cookbook\serializer.py:1098 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " msgstr "" "Tandoor Recipes est un gestionnaire de recettes open source. Venez-voir " "notre Github " -#: .\cookbook\serializer.py:1089 +#: .\cookbook\serializer.py:1101 msgid "Tandoor Recipes Invite" msgstr "Invitation Tandoor Recipes" -#: .\cookbook\serializer.py:1209 +#: .\cookbook\serializer.py:1242 msgid "Existing shopping list to update" msgstr "Liste de courses existante à mettre à jour" -#: .\cookbook\serializer.py:1211 +#: .\cookbook\serializer.py:1244 msgid "" "List of ingredient IDs from the recipe to add, if not provided all " "ingredients will be added." msgstr "" +"Liste d’identifiants d’ingrédient de la recette à ajouter, si non renseigné, " +"tous les ingrédients seront ajoutés." -#: .\cookbook\serializer.py:1213 +#: .\cookbook\serializer.py:1246 msgid "" "Providing a list_recipe ID and servings of 0 will delete that shopping list." msgstr "" +"Fournir un identifiant de liste de courses et un nombre de portions de 0 " +"supprimera cette liste de courses." -#: .\cookbook\serializer.py:1222 +#: .\cookbook\serializer.py:1255 msgid "Amount of food to add to the shopping list" msgstr "Quantité d’aliments à ajouter à la liste de courses" -#: .\cookbook\serializer.py:1224 +#: .\cookbook\serializer.py:1257 msgid "ID of unit to use for the shopping list" msgstr "ID de l’unité à utiliser pour la liste de courses" -#: .\cookbook\serializer.py:1226 +#: .\cookbook\serializer.py:1259 +#, fuzzy msgid "When set to true will delete all food from active shopping lists." msgstr "" +"Lorsqu'il est défini sur \"true\", tous les aliments des listes de courses " +"actives seront supprimés." -#: .\cookbook\tables.py:36 .\cookbook\templates\generic\edit_template.html:6 -#: .\cookbook\templates\generic\edit_template.html:14 -#: .\cookbook\templates\recipes_table.html:82 -msgid "Edit" -msgstr "Modifier" - -#: .\cookbook\tables.py:116 .\cookbook\tables.py:131 +#: .\cookbook\tables.py:61 .\cookbook\tables.py:75 #: .\cookbook\templates\generic\delete_template.html:7 #: .\cookbook\templates\generic\delete_template.html:15 #: .\cookbook\templates\generic\edit_template.html:28 -#: .\cookbook\templates\recipes_table.html:90 msgid "Delete" msgstr "Supprimer" @@ -883,9 +888,10 @@ msgstr "Adresses mail" #: .\cookbook\templates\account\email.html:12 #: .\cookbook\templates\account\password_change.html:11 #: .\cookbook\templates\account\password_set.html:11 -#: .\cookbook\templates\base.html:293 .\cookbook\templates\settings.html:6 +#: .\cookbook\templates\base.html:296 .\cookbook\templates\settings.html:6 #: .\cookbook\templates\settings.html:17 #: .\cookbook\templates\socialaccount\connections.html:10 +#: .\cookbook\templates\user_settings.html:8 msgid "Settings" msgstr "Paramètres" @@ -976,12 +982,12 @@ msgid "" " issue a new e-mail confirmation " "request." msgstr "" -"Ce lien de confirmation reçu par mail est expiré ou invalide. Veuillez\n" +"Ce lien de confirmation reçu par mail est expiré ou non valide. Veuillez\n" " demander une nouvelle vérification " "par mail." -#: .\cookbook\templates\account\login.html:8 -#: .\cookbook\templates\base.html:340 .\cookbook\templates\openid\login.html:8 +#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:343 +#: .\cookbook\templates\openid\login.html:8 msgid "Login" msgstr "Connexion" @@ -1001,21 +1007,20 @@ msgstr "Connexion" msgid "Sign Up" msgstr "S’inscrire" +#: .\cookbook\templates\account\login.html:38 +msgid "Lost your password?" +msgstr "Mot de passe perdu ?" + #: .\cookbook\templates\account\login.html:39 -#: .\cookbook\templates\account\login.html:41 #: .\cookbook\templates\account\password_reset.html:29 msgid "Reset My Password" msgstr "Réinitialiser le mot de passe" -#: .\cookbook\templates\account\login.html:40 -msgid "Lost your password?" -msgstr "Mot de passe perdu ?" - -#: .\cookbook\templates\account\login.html:52 +#: .\cookbook\templates\account\login.html:50 msgid "Social Login" msgstr "Connexion par réseau social" -#: .\cookbook\templates\account\login.html:53 +#: .\cookbook\templates\account\login.html:51 msgid "You can use any of the following providers to sign in." msgstr "Vous pouvez utiliser les comptes suivants pour vous connecter." @@ -1041,7 +1046,6 @@ msgstr "Modifier le mot de passe" #: .\cookbook\templates\account\password_change.html:12 #: .\cookbook\templates\account\password_set.html:12 -#: .\cookbook\templates\settings.html:76 msgid "Password" msgstr "Mot de passe" @@ -1089,8 +1093,8 @@ msgid "" " Please request a new " "password reset." msgstr "" -"Le lien de changement du mot de passe est invalide, probablement parce qu’il " -"a déjà été utilisé.\n" +"Le lien de changement du mot de passe n’est pas valide, probablement parce " +"qu’il a déjà été utilisé.\n" " Merci de demander un nouveau changement de mot de passe." @@ -1154,135 +1158,126 @@ 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:330 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:333 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "Documentation API" -#: .\cookbook\templates\base.html:103 .\cookbook\templates\index.html:87 -#: .\cookbook\templates\stats.html:22 +#: .\cookbook\templates\base.html:106 .\cookbook\templates\index.html:87 msgid "Recipes" msgstr "Recettes" -#: .\cookbook\templates\base.html:111 +#: .\cookbook\templates\base.html:114 msgid "Shopping" msgstr "Courses" -#: .\cookbook\templates\base.html:150 .\cookbook\views\lists.py:105 +#: .\cookbook\templates\base.html:153 .\cookbook\views\lists.py:105 msgid "Foods" msgstr "Aliments" -#: .\cookbook\templates\base.html:162 -#: .\cookbook\templates\forms\ingredients.html:24 -#: .\cookbook\templates\stats.html:26 .\cookbook\views\lists.py:122 +#: .\cookbook\templates\base.html:165 .\cookbook\views\lists.py:122 msgid "Units" msgstr "Unités" -#: .\cookbook\templates\base.html:176 .\cookbook\templates\supermarket.html:7 +#: .\cookbook\templates\base.html:179 .\cookbook\templates\supermarket.html:7 msgid "Supermarket" msgstr "Supermarché" -#: .\cookbook\templates\base.html:188 +#: .\cookbook\templates\base.html:191 msgid "Supermarket Category" msgstr "Catégorie de supermarché" -#: .\cookbook\templates\base.html:200 .\cookbook\views\lists.py:171 +#: .\cookbook\templates\base.html:203 .\cookbook\views\lists.py:171 msgid "Automations" msgstr "Automatisations" -#: .\cookbook\templates\base.html:214 .\cookbook\views\lists.py:207 +#: .\cookbook\templates\base.html:217 .\cookbook\views\lists.py:207 msgid "Files" msgstr "Fichiers" -#: .\cookbook\templates\base.html:226 +#: .\cookbook\templates\base.html:229 msgid "Batch Edit" msgstr "Édition par lot" -#: .\cookbook\templates\base.html:238 .\cookbook\templates\history.html:6 +#: .\cookbook\templates\base.html:241 .\cookbook\templates\history.html:6 #: .\cookbook\templates\history.html:14 msgid "History" msgstr "Historique" -#: .\cookbook\templates\base.html:252 +#: .\cookbook\templates\base.html:255 #: .\cookbook\templates\ingredient_editor.html:7 #: .\cookbook\templates\ingredient_editor.html:13 -#, fuzzy -#| msgid "Ingredients" msgid "Ingredient Editor" -msgstr "Ingrédients" +msgstr "Éditeur d’ingrédients" -#: .\cookbook\templates\base.html:264 +#: .\cookbook\templates\base.html:267 #: .\cookbook\templates\export_response.html:7 #: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 msgid "Export" msgstr "Exporter" -#: .\cookbook\templates\base.html:280 .\cookbook\templates\index.html:47 +#: .\cookbook\templates\base.html:283 .\cookbook\templates\index.html:47 msgid "Import Recipe" msgstr "Importer une recette" -#: .\cookbook\templates\base.html:282 +#: .\cookbook\templates\base.html:285 msgid "Create" msgstr "Créer" -#: .\cookbook\templates\base.html:295 +#: .\cookbook\templates\base.html:298 #: .\cookbook\templates\generic\list_template.html:14 -#: .\cookbook\templates\stats.html:43 msgid "External Recipes" msgstr "Recettes externes" -#: .\cookbook\templates\base.html:298 -#: .\cookbook\templates\space_manage.html:15 +#: .\cookbook\templates\base.html:301 .\cookbook\templates\space_manage.html:15 msgid "Space Settings" msgstr "Paramètres de groupe" -#: .\cookbook\templates\base.html:303 .\cookbook\templates\system.html:13 +#: .\cookbook\templates\base.html:306 .\cookbook\templates\system.html:13 msgid "System" msgstr "Système" -#: .\cookbook\templates\base.html:305 +#: .\cookbook\templates\base.html:308 msgid "Admin" msgstr "Admin" -#: .\cookbook\templates\base.html:309 +#: .\cookbook\templates\base.html:312 #: .\cookbook\templates\space_overview.html:25 -#, fuzzy -#| msgid "No Space" msgid "Your Spaces" -msgstr "Aucun groupe" +msgstr "Vos groupes" -#: .\cookbook\templates\base.html:320 +#: .\cookbook\templates\base.html:323 #: .\cookbook\templates\space_overview.html:6 msgid "Overview" -msgstr "" +msgstr "Aperçu" -#: .\cookbook\templates\base.html:324 +#: .\cookbook\templates\base.html:327 msgid "Markdown Guide" msgstr "Guide Markdown" -#: .\cookbook\templates\base.html:326 +#: .\cookbook\templates\base.html:329 msgid "GitHub" msgstr "GitHub" -#: .\cookbook\templates\base.html:328 +#: .\cookbook\templates\base.html:331 msgid "Translate Tandoor" msgstr "Traduire Tandoor" -#: .\cookbook\templates\base.html:332 +#: .\cookbook\templates\base.html:335 msgid "API Browser" msgstr "Navigateur API" -#: .\cookbook\templates\base.html:335 +#: .\cookbook\templates\base.html:338 msgid "Log out" msgstr "Déconnexion" -#: .\cookbook\templates\base.html:357 +#: .\cookbook\templates\base.html:360 msgid "You are using the free version of Tandor" -msgstr "" +msgstr "Vous utilisez la version gratuite de Tandoor" -#: .\cookbook\templates\base.html:358 +#: .\cookbook\templates\base.html:361 msgid "Upgrade Now" -msgstr "" +msgstr "Mettez à jour maintenant" #: .\cookbook\templates\batch\edit.html:6 msgid "Batch edit Category" @@ -1320,11 +1315,7 @@ msgstr "Le chemin doit être au format suivant" #: .\cookbook\templates\forms\edit_import_recipe.html:14 #: .\cookbook\templates\generic\edit_template.html:23 #: .\cookbook\templates\generic\new_template.html:23 -#: .\cookbook\templates\settings.html:70 -#: .\cookbook\templates\settings.html:112 -#: .\cookbook\templates\settings.html:130 -#: .\cookbook\templates\settings.html:202 -#: .\cookbook\templates\settings.html:213 +#: .\cookbook\templates\settings.html:57 msgid "Save" msgstr "Sauvegarder" @@ -1374,48 +1365,15 @@ msgstr "Importer une nouvelle recette" msgid "Edit Recipe" msgstr "Modifier une recette" -#: .\cookbook\templates\forms\ingredients.html:15 -msgid "Edit Ingredients" -msgstr "Modifier les ingrédients" - -#: .\cookbook\templates\forms\ingredients.html:16 -msgid "" -"\n" -" The following form can be used if, accidentally, two (or more) units " -"or ingredients where created that should be\n" -" the same.\n" -" It merges two units or ingredients and updates all recipes using " -"them.\n" -" " -msgstr "" -"\n" -" Le formulaire suivant est utile lorsqu'il y a des doublons dans les " -"unités ou les ingrédients.\n" -" Il fusionne deux unités ou ingrédients et met à jour toutes les " -"recettes les utilisant.\n" -" " - -#: .\cookbook\templates\forms\ingredients.html:26 -msgid "Are you sure that you want to merge these two units?" -msgstr "Êtes-vous sûr(e) de vouloir fusionner ces deux unités ?" - -#: .\cookbook\templates\forms\ingredients.html:31 -#: .\cookbook\templates\forms\ingredients.html:40 -msgid "Merge" -msgstr "Fusionner" - -#: .\cookbook\templates\forms\ingredients.html:36 -msgid "Are you sure that you want to merge these two ingredients?" -msgstr "Êtes-vous sûr(e) de vouloir fusionner ces deux ingrédients ?" - #: .\cookbook\templates\generic\delete_template.html:21 #, python-format msgid "Are you sure you want to delete the %(title)s: %(object)s " msgstr "Êtes-vous sûr(e) de vouloir supprimer %(title)s : %(object)s " #: .\cookbook\templates\generic\delete_template.html:22 +#, fuzzy msgid "This cannot be undone!" -msgstr "" +msgstr "Cela ne peut pas être annulé !" #: .\cookbook\templates\generic\delete_template.html:27 msgid "Protected" @@ -1429,6 +1387,11 @@ msgstr "Cascade" msgid "Cancel" msgstr "Annuler" +#: .\cookbook\templates\generic\edit_template.html:6 +#: .\cookbook\templates\generic\edit_template.html:14 +msgid "Edit" +msgstr "Modifier" + #: .\cookbook\templates\generic\edit_template.html:32 msgid "View" msgstr "Voir" @@ -1450,13 +1413,16 @@ msgstr "Filtre" msgid "Import all" msgstr "Tout importer" +#: .\cookbook\templates\generic\new_template.html:6 +#: .\cookbook\templates\generic\new_template.html:14 +msgid "New" +msgstr "Nouveau" + #: .\cookbook\templates\generic\table_template.html:76 -#: .\cookbook\templates\recipes_table.html:121 msgid "previous" msgstr "précédent" #: .\cookbook\templates\generic\table_template.html:98 -#: .\cookbook\templates\recipes_table.html:143 msgid "next" msgstr "suivant" @@ -1468,24 +1434,11 @@ msgstr "Voir l’historique" msgid "Cook Log" msgstr "Historique de cuisine" -#: .\cookbook\templates\import.html:6 -msgid "Import Recipes" -msgstr "Importer des recettes" - -#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 #: .\cookbook\templates\import_response.html:7 .\cookbook\views\delete.py:86 #: .\cookbook\views\edit.py:191 msgid "Import" msgstr "Importer" -#: .\cookbook\templates\include\recipe_open_modal.html:18 -msgid "Close" -msgstr "Fermer" - -#: .\cookbook\templates\include\recipe_open_modal.html:32 -msgid "Open Recipe" -msgstr "Ouvrir la recette" - #: .\cookbook\templates\include\storage_backend_warning.html:4 msgid "Security Warning" msgstr "Avertissement de sécurité" @@ -1513,7 +1466,7 @@ msgstr "" #: .\cookbook\templates\index.html:29 msgid "Search recipe ..." -msgstr "Rechercher une recette..." +msgstr "Rechercher une recette ..." #: .\cookbook\templates\index.html:44 msgid "New Recipe" @@ -1585,8 +1538,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 "ou en laissant une ligne vide entre deux." @@ -1610,16 +1561,12 @@ msgid "Lists" msgstr "Listes" #: .\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 "" "Les listes peuvent être ordonnées ou non. Il est important de laisser une " -"ligne vide avant la liste !" +"ligne vide avant la liste!
    " #: .\cookbook\templates\markdown_info.html:87 #: .\cookbook\templates\markdown_info.html:108 @@ -1698,31 +1645,6 @@ msgstr "En-tête" msgid "Cell" msgstr "Cellule" -#: .\cookbook\templates\meal_plan_entry.html:6 -msgid "Meal Plan View" -msgstr "Vue des menus" - -#: .\cookbook\templates\meal_plan_entry.html:18 -msgid "Created by" -msgstr "Créé par" - -#: .\cookbook\templates\meal_plan_entry.html:20 -msgid "Shared with" -msgstr "Partagé avec" - -#: .\cookbook\templates\meal_plan_entry.html:48 -#: .\cookbook\templates\recipes_table.html:64 -msgid "Last cooked" -msgstr "Cuisiné pour la dernière fois le" - -#: .\cookbook\templates\meal_plan_entry.html:50 -msgid "Never cooked before." -msgstr "Pas encore cuisiné." - -#: .\cookbook\templates\meal_plan_entry.html:76 -msgid "Other meals on this day" -msgstr "Autres repas ce jour" - #: .\cookbook\templates\no_groups_info.html:5 #: .\cookbook\templates\no_groups_info.html:12 msgid "No Permissions" @@ -1771,45 +1693,28 @@ msgstr "" #: .\cookbook\templates\openid\login.html:27 #: .\cookbook\templates\socialaccount\authentication_error.html:27 msgid "Back" -msgstr "" +msgstr "Retour" -#: .\cookbook\templates\recipe_view.html:26 +#: .\cookbook\templates\profile.html:7 +msgid "Profile" +msgstr "Profil" + +#: .\cookbook\templates\recipe_view.html:41 msgid "by" msgstr "par" -#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:144 +#: .\cookbook\templates\recipe_view.html:59 .\cookbook\views\delete.py:144 #: .\cookbook\views\edit.py:171 msgid "Comment" msgstr "Commentaire" -#: .\cookbook\templates\recipes_table.html:19 -#: .\cookbook\templates\recipes_table.html:23 -msgid "Recipe Image" -msgstr "Image de la recette" - -#: .\cookbook\templates\recipes_table.html:51 -msgid "Preparation time ca." -msgstr "Temps moyen de préparation" - -#: .\cookbook\templates\recipes_table.html:57 -msgid "Waiting time ca." -msgstr "Temps moyen d'attente" - -#: .\cookbook\templates\recipes_table.html:60 -msgid "External" -msgstr "Externe" - -#: .\cookbook\templates\recipes_table.html:86 -msgid "Log Cooking" -msgstr "Marquer comme cuisiné" - #: .\cookbook\templates\rest_framework\api.html:5 msgid "Recipe Home" msgstr "Page d’accueil" #: .\cookbook\templates\search_info.html:5 #: .\cookbook\templates\search_info.html:9 -#: .\cookbook\templates\settings.html:172 +#: .\cookbook\templates\settings.html:24 msgid "Search Settings" msgstr "Paramètres de recherche" @@ -1855,7 +1760,7 @@ msgstr "" " \n" " Les recherches en texte intégral tentent de normaliser les mots " "fournis pour qu'ils correspondent aux variantes courantes. Par exemple : " -"\"forked\", \"forking\", \"forks\" seront tous normalisés en \"fork\".\n" +"'forked', 'forking', 'forks' seront tous normalisés en 'fork'.\n" " Il existe plusieurs méthodes, décrites ci-dessous, qui " "permettent de contrôler la façon dont la recherche doit réagir lorsque " "plusieurs mots sont recherchés.\n" @@ -2114,84 +2019,13 @@ msgstr "" "efficacement. \n" " Vous pouvez reconstruire les index de tous les champs dans la " "page d'administration des recettes, en sélectionnant toutes les recettes et " -"en exécutant la commande \"rebuild index for selected recipes\".\n" +"en exécutant la commande 'rebuild index for selected recipes'.\n" " Vous pouvez également reconstruire les index en ligne de " -"commande en exécutant la commande de gestion \"python manage.py rebuildindex" -"\".\n" +"commande en exécutant la commande de gestion 'python manage.py " +"rebuildindex'.\n" " " -#: .\cookbook\templates\settings.html:28 -msgid "Account" -msgstr "Compte" - -#: .\cookbook\templates\settings.html:35 -msgid "Preferences" -msgstr "Préférences" - -#: .\cookbook\templates\settings.html:42 -msgid "API-Settings" -msgstr "Paramètres d’API" - -#: .\cookbook\templates\settings.html:49 -msgid "Search-Settings" -msgstr "Paramètres de recherche" - -#: .\cookbook\templates\settings.html:56 -#, fuzzy -#| msgid "Search-Settings" -msgid "Shopping-Settings" -msgstr "Paramètres de recherche" - -#: .\cookbook\templates\settings.html:65 -msgid "Name Settings" -msgstr "Paramètres de noms" - -#: .\cookbook\templates\settings.html:73 -msgid "Account Settings" -msgstr "Paramètres de compte" - -#: .\cookbook\templates\settings.html:75 -msgid "Emails" -msgstr "Adresses mail" - -#: .\cookbook\templates\settings.html:78 -#: .\cookbook\templates\socialaccount\connections.html:11 -msgid "Social" -msgstr "Réseaux sociaux" - -#: .\cookbook\templates\settings.html:91 -msgid "Language" -msgstr "Langue" - -#: .\cookbook\templates\settings.html:121 -msgid "Style" -msgstr "Style" - -#: .\cookbook\templates\settings.html:142 -msgid "API Token" -msgstr "Jeton API" - -#: .\cookbook\templates\settings.html:143 -msgid "" -"You can use both basic authentication and token based authentication to " -"access the REST API." -msgstr "" -"Vous pouvez utiliser à la fois l’authentification classique et " -"l’authentification par jeton pour accéder à l’API REST." - -#: .\cookbook\templates\settings.html:160 -msgid "" -"Use the token as an Authorization header prefixed by the word token as shown " -"in the following examples:" -msgstr "" -"Utilisez le jeton dans l’en-tête d’autorisation précédé du mot « token » " -"comme indiqué dans les exemples suivants :" - -#: .\cookbook\templates\settings.html:162 -msgid "or" -msgstr "ou" - -#: .\cookbook\templates\settings.html:173 +#: .\cookbook\templates\settings.html:25 msgid "" "There are many options to configure the search depending on your personal " "preferences." @@ -2199,7 +2033,7 @@ msgstr "" "Il existe de nombreuses options pour configurer la recherche en fonction de " "vos préférences personnelles." -#: .\cookbook\templates\settings.html:174 +#: .\cookbook\templates\settings.html:26 msgid "" "Usually you do not need to configure any of them and can just stick " "with either the default or one of the following presets." @@ -2208,7 +2042,7 @@ msgstr "" "pouvez simplement vous en tenir à la valeur par défaut ou à l’un des " "préréglages suivants." -#: .\cookbook\templates\settings.html:175 +#: .\cookbook\templates\settings.html:27 msgid "" "If you do want to configure the search you can read about the different " "options here." @@ -2216,11 +2050,11 @@ msgstr "" "Si vous souhaitez configurer la recherche, vous pouvez consulter les " "différentes options ici." -#: .\cookbook\templates\settings.html:180 +#: .\cookbook\templates\settings.html:32 msgid "Fuzzy" msgstr "Flou" -#: .\cookbook\templates\settings.html:181 +#: .\cookbook\templates\settings.html:33 msgid "" "Find what you need even if your search or the recipe contains typos. Might " "return more results than needed to make sure you find what you are looking " @@ -2230,20 +2064,19 @@ msgstr "" "contient des fautes de frappe. Il se peut que vous obteniez plus de " "résultats que nécessaire pour être sûr(e) de trouver ce que vous cherchez." -#: .\cookbook\templates\settings.html:182 +#: .\cookbook\templates\settings.html:34 msgid "This is the default behavior" msgstr "Il s’agit du comportement par défaut" -#: .\cookbook\templates\settings.html:183 -#: .\cookbook\templates\settings.html:191 +#: .\cookbook\templates\settings.html:37 .\cookbook\templates\settings.html:46 msgid "Apply" msgstr "Appliquer" -#: .\cookbook\templates\settings.html:188 +#: .\cookbook\templates\settings.html:42 msgid "Precise" msgstr "Préciser" -#: .\cookbook\templates\settings.html:189 +#: .\cookbook\templates\settings.html:43 msgid "" "Allows fine control over search results but might not return results if too " "many spelling mistakes are made." @@ -2251,16 +2084,10 @@ msgstr "" "Permet un contrôle fin des résultats de la recherche mais peut ne pas donner " "de résultats si le texte saisi contient trop de fautes d’orthographe." -#: .\cookbook\templates\settings.html:190 +#: .\cookbook\templates\settings.html:44 msgid "Perfect for large Databases" msgstr "Parfait pour les grandes bases de données" -#: .\cookbook\templates\settings.html:207 -#, fuzzy -#| msgid "Shopping List" -msgid "Shopping Settings" -msgstr "Liste de courses" - #: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5 msgid "Cookbook Setup" msgstr "Paramètres du livre de recettes" @@ -2282,23 +2109,25 @@ msgstr "Créer un compte superutilisateur" #: .\cookbook\templates\socialaccount\authentication_error.html:7 #: .\cookbook\templates\socialaccount\authentication_error.html:23 -#, fuzzy -#| msgid "Social Login" msgid "Social Network Login Failure" -msgstr "Connexion par réseau social" +msgstr "Échec de la connexion au réseau social" #: .\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 "Une erreur est survenue en essayant de déplacer " +msgstr "" +"Une erreur est survenue en essayant de vous connecter avec votre compte de " +"réseau social." #: .\cookbook\templates\socialaccount\connections.html:4 #: .\cookbook\templates\socialaccount\connections.html:15 msgid "Account Connections" msgstr "Comptes connectés" +#: .\cookbook\templates\socialaccount\connections.html:11 +msgid "Social" +msgstr "Réseaux sociaux" + #: .\cookbook\templates\socialaccount\connections.html:18 msgid "" "You can sign in to your account using any of the following third party\n" @@ -2326,26 +2155,30 @@ msgstr "S’inscrire" #: .\cookbook\templates\socialaccount\login.html:9 #, python-format msgid "Connect %(provider)s" -msgstr "" +msgstr "Connecter %(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 "" +"Vous êtes sur le point de connecter un nouveau compte tiers depuis " +"%(provider)s." #: .\cookbook\templates\socialaccount\login.html:13 #, python-format msgid "Sign In Via %(provider)s" -msgstr "" +msgstr "Se connecter via %(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 "" +"ous êtes sur le point de vous connecter en utilisant un compte tiers depuis " +"%(provider)s." #: .\cookbook\templates\socialaccount\login.html:20 msgid "Continue" -msgstr "" +msgstr "Continuer" #: .\cookbook\templates\socialaccount\signup.html:10 #, python-format @@ -2385,8 +2218,6 @@ msgid "Manage Subscription" msgstr "Gérer l’abonnement" #: .\cookbook\templates\space_overview.html:13 .\cookbook\views\delete.py:216 -#, fuzzy -#| msgid "Space:" msgid "Space" msgstr "Groupe :" @@ -2403,26 +2234,24 @@ msgid "" "You can either be invited into an existing space or create your own one." msgstr "Vous pouvez être invité dans un groupe existant ou en créer un." -#: .\cookbook\templates\space_overview.html:45 +#: .\cookbook\templates\space_overview.html:53 msgid "Owner" -msgstr "" +msgstr "Propriétaire" -#: .\cookbook\templates\space_overview.html:49 -#, fuzzy -#| msgid "Create Space" +#: .\cookbook\templates\space_overview.html:57 msgid "Leave Space" -msgstr "Créer un groupe" +msgstr "Quitter le groupe" -#: .\cookbook\templates\space_overview.html:70 -#: .\cookbook\templates\space_overview.html:80 +#: .\cookbook\templates\space_overview.html:78 +#: .\cookbook\templates\space_overview.html:88 msgid "Join Space" msgstr "Rejoindre un groupe" -#: .\cookbook\templates\space_overview.html:73 +#: .\cookbook\templates\space_overview.html:81 msgid "Join an existing space." msgstr "Rejoindre un groupe déjà existant." -#: .\cookbook\templates\space_overview.html:75 +#: .\cookbook\templates\space_overview.html:83 msgid "" "To join an existing space either enter your invite token or click on the " "invite link the space owner send you." @@ -2430,49 +2259,21 @@ msgstr "" "Pour rejoindre un groupe déjà existant, saisissez le jeton d’invitation ou " "cliquez sur le lien d’invitation que le créateur du groupe vous a envoyé." -#: .\cookbook\templates\space_overview.html:88 -#: .\cookbook\templates\space_overview.html:97 +#: .\cookbook\templates\space_overview.html:96 +#: .\cookbook\templates\space_overview.html:105 msgid "Create Space" msgstr "Créer un groupe" -#: .\cookbook\templates\space_overview.html:91 +#: .\cookbook\templates\space_overview.html:99 msgid "Create your own recipe space." msgstr "Créer votre propre groupe de partage de recettes." -#: .\cookbook\templates\space_overview.html:93 +#: .\cookbook\templates\space_overview.html:101 msgid "Start your own recipe space and invite other users to it." msgstr "" "Créez votre propre groupe de partage de recettes et invitez d’autres " "utilisateurs à l’utiliser." -#: .\cookbook\templates\stats.html:4 -msgid "Stats" -msgstr "Stats" - -#: .\cookbook\templates\stats.html:10 -msgid "Statistics" -msgstr "Statistiques" - -#: .\cookbook\templates\stats.html:19 -msgid "Number of objects" -msgstr "Nombre d’objets" - -#: .\cookbook\templates\stats.html:30 -msgid "Recipe Imports" -msgstr "Recettes importées" - -#: .\cookbook\templates\stats.html:38 -msgid "Objects stats" -msgstr "Statistiques d’objets" - -#: .\cookbook\templates\stats.html:41 -msgid "Recipes without Keywords" -msgstr "Recettes sans mots-clés" - -#: .\cookbook\templates\stats.html:45 -msgid "Internal Recipes" -msgstr "Recettes internes" - #: .\cookbook\templates\system.html:20 msgid "System Information" msgstr "Informations système" @@ -2603,255 +2404,268 @@ msgstr "" msgid "URL Import" msgstr "Import URL" -#: .\cookbook\views\api.py:105 .\cookbook\views\api.py:197 +#: .\cookbook\views\api.py:110 .\cookbook\views\api.py:202 msgid "Parameter updated_at incorrectly formatted" msgstr "Le paramètre « update_at » n'est pas correctement formaté" -#: .\cookbook\views\api.py:217 .\cookbook\views\api.py:320 +#: .\cookbook\views\api.py:222 .\cookbook\views\api.py:325 +#, python-brace-format msgid "No {self.basename} with id {pk} exists" msgstr "Il n’existe aucun(e) {self.basename} avec l’identifiant {pk}" -#: .\cookbook\views\api.py:221 +#: .\cookbook\views\api.py:226 msgid "Cannot merge with the same object!" msgstr "Impossible de fusionner un objet avec lui-même !" -#: .\cookbook\views\api.py:228 +#: .\cookbook\views\api.py:233 +#, python-brace-format msgid "No {self.basename} with id {target} exists" msgstr "Il n’existe aucun(e) {self.basename} avec l’id {target}" -#: .\cookbook\views\api.py:233 +#: .\cookbook\views\api.py:238 msgid "Cannot merge with child object!" msgstr "Impossible de fusionner avec l’objet enfant !" -#: .\cookbook\views\api.py:266 +#: .\cookbook\views\api.py:271 +#, python-brace-format 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:271 +#: .\cookbook\views\api.py:276 +#, python-brace-format 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:329 +#: .\cookbook\views\api.py:334 +#, python-brace-format 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:332 .\cookbook\views\api.py:350 +#: .\cookbook\views\api.py:337 .\cookbook\views\api.py:355 msgid "An error occurred attempting to move " msgstr "Une erreur est survenue en essayant de déplacer " -#: .\cookbook\views\api.py:335 +#: .\cookbook\views\api.py:340 msgid "Cannot move an object to itself!" msgstr "Impossible de déplacer un objet vers lui-même !" -#: .\cookbook\views\api.py:341 +#: .\cookbook\views\api.py:346 +#, python-brace-format msgid "No {self.basename} with id {parent} exists" msgstr "Il n’existe aucun(e) {self.basename} avec l’id {parent}" -#: .\cookbook\views\api.py:347 +#: .\cookbook\views\api.py:352 +#, python-brace-format 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:542 +#: .\cookbook\views\api.py:553 +#, python-brace-format 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:547 .\cookbook\views\api.py:879 -#: .\cookbook\views\api.py:892 +#: .\cookbook\views\api.py:558 .\cookbook\views\api.py:888 +#: .\cookbook\views\api.py:901 +#, python-brace-format msgid "{obj.name} was added to the shopping list." msgstr "{obj.name} a été ajouté(e) à la liste de courses." -#: .\cookbook\views\api.py:674 +#: .\cookbook\views\api.py:685 msgid "ID of recipe a step is part of. For multiple repeat parameter." msgstr "" +"Identifiant de la recette dont fait partie une étape. Pour plusieurs " +"paramètres de répétition." -#: .\cookbook\views\api.py:676 +#: .\cookbook\views\api.py:687 msgid "Query string matched (fuzzy) against object name." msgstr "" -#: .\cookbook\views\api.py:720 +#: .\cookbook\views\api.py:731 msgid "" "Query string matched (fuzzy) against recipe name. In the future also " "fulltext search." msgstr "" -#: .\cookbook\views\api.py:722 +#: .\cookbook\views\api.py:733 msgid "" "ID of keyword a recipe should have. For multiple repeat parameter. " "Equivalent to keywords_or" msgstr "" -#: .\cookbook\views\api.py:725 +#: .\cookbook\views\api.py:736 msgid "" "Keyword IDs, repeat for multiple. Return recipes with any of the keywords" msgstr "" -#: .\cookbook\views\api.py:728 +#: .\cookbook\views\api.py:739 msgid "" "Keyword IDs, repeat for multiple. Return recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:742 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords." msgstr "" -#: .\cookbook\views\api.py:734 +#: .\cookbook\views\api.py:745 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:736 +#: .\cookbook\views\api.py:747 msgid "ID of food a recipe should have. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:739 +#: .\cookbook\views\api.py:750 msgid "Food IDs, repeat for multiple. Return recipes with any of the foods" msgstr "" -#: .\cookbook\views\api.py:741 +#: .\cookbook\views\api.py:752 msgid "Food IDs, repeat for multiple. Return recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:743 +#: .\cookbook\views\api.py:754 msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods." msgstr "" -#: .\cookbook\views\api.py:745 +#: .\cookbook\views\api.py:756 msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:746 +#: .\cookbook\views\api.py:757 msgid "ID of unit a recipe should have." msgstr "" -#: .\cookbook\views\api.py:748 +#: .\cookbook\views\api.py:759 msgid "" "Rating a recipe should have or greater. [0 - 5] Negative value filters " "rating less than." msgstr "" -#: .\cookbook\views\api.py:749 +#: .\cookbook\views\api.py:760 msgid "ID of book a recipe should be in. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:751 +#: .\cookbook\views\api.py:762 msgid "Book IDs, repeat for multiple. Return recipes with any of the books" msgstr "" -#: .\cookbook\views\api.py:753 +#: .\cookbook\views\api.py:764 msgid "Book IDs, repeat for multiple. Return recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:755 +#: .\cookbook\views\api.py:766 msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books." msgstr "" -#: .\cookbook\views\api.py:757 +#: .\cookbook\views\api.py:768 msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:759 +#: .\cookbook\views\api.py:770 msgid "If only internal recipes should be returned. [true/false]" msgstr "" -#: .\cookbook\views\api.py:761 +#: .\cookbook\views\api.py:772 msgid "Returns the results in randomized order. [true/false]" msgstr "" -#: .\cookbook\views\api.py:763 +#: .\cookbook\views\api.py:774 msgid "Returns new results first in search results. [true/false]" msgstr "" -#: .\cookbook\views\api.py:765 +#: .\cookbook\views\api.py:776 msgid "" "Filter recipes cooked X times or more. Negative values returns cooked less " "than X times" msgstr "" -#: .\cookbook\views\api.py:767 +#: .\cookbook\views\api.py:778 msgid "" "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:769 +#: .\cookbook\views\api.py:780 msgid "" "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:771 +#: .\cookbook\views\api.py:782 msgid "" "Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:773 +#: .\cookbook\views\api.py:784 msgid "" "Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:775 +#: .\cookbook\views\api.py:786 msgid "Filter recipes that can be made with OnHand food. [true/false]" msgstr "" -#: .\cookbook\views\api.py:937 +#: .\cookbook\views\api.py:946 msgid "" "Returns the shopping list entry with a primary key of id. Multiple values " "allowed." msgstr "" -#: .\cookbook\views\api.py:942 +#: .\cookbook\views\api.py:951 msgid "" -"Filter shopping list entries on checked. [true, false, both, recent]" -"
    - recent includes unchecked items and recently completed items." +"Filter shopping list entries on checked. [true, false, both, recent]
    - recent includes unchecked items and recently completed items." msgstr "" -#: .\cookbook\views\api.py:945 +#: .\cookbook\views\api.py:954 msgid "Returns the shopping list entries sorted by supermarket category order." msgstr "" -#: .\cookbook\views\api.py:1140 +#: .\cookbook\views\api.py:1166 msgid "Nothing to do." msgstr "Rien à faire." -#: .\cookbook\views\api.py:1160 +#: .\cookbook\views\api.py:1198 msgid "Invalid Url" -msgstr "" +msgstr "Url non valide" -#: .\cookbook\views\api.py:1167 +#: .\cookbook\views\api.py:1205 msgid "Connection Refused." msgstr "Connexion refusée." -#: .\cookbook\views\api.py:1172 +#: .\cookbook\views\api.py:1210 msgid "Bad URL Schema." -msgstr "" +msgstr "Mauvais schéma d’URL." -#: .\cookbook\views\api.py:1195 -#, fuzzy -#| msgid "No useable data could be found." +#: .\cookbook\views\api.py:1233 msgid "No usable data could be found." msgstr "Aucune information utilisable n'a été trouvée." -#: .\cookbook\views\api.py:1303 .\cookbook\views\data.py:28 +#: .\cookbook\views\api.py:1326 .\cookbook\views\import_export.py:117 +msgid "Importing is not implemented for this provider" +msgstr "L’importation n’est pas implémentée pour ce fournisseur" + +#: .\cookbook\views\api.py:1372 .\cookbook\views\data.py:31 #: .\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:1325 +#: .\cookbook\views\api.py:1394 msgid "Sync successful!" msgstr "Synchro réussie !" -#: .\cookbook\views\api.py:1330 +#: .\cookbook\views\api.py:1399 msgid "Error synchronizing with Storage" msgstr "Erreur lors de la synchronisation avec le stockage" -#: .\cookbook\views\data.py:97 +#: .\cookbook\views\data.py:100 #, python-format msgid "Batch edit done. %(count)d recipe was updated." msgid_plural "Batch edit done. %(count)d Recipes where updated." @@ -2913,11 +2727,7 @@ msgstr "Modifications sauvegardées !" msgid "Error saving changes!" msgstr "Erreur lors de la sauvegarde des modifications !" -#: .\cookbook\views\import_export.py:111 .\cookbook\views\import_export.py:150 -msgid "Importing is not implemented for this provider" -msgstr "L’importation n’est pas implémentée pour ce fournisseur" - -#: .\cookbook\views\import_export.py:137 +#: .\cookbook\views\import_export.py:104 msgid "" "The PDF Exporter is not enabled on this instance as it is still in an " "experimental state." @@ -2948,10 +2758,8 @@ msgid "Shopping Categories" msgstr "Catégories de courses" #: .\cookbook\views\lists.py:187 -#, fuzzy -#| msgid "Filter" msgid "Custom Filters" -msgstr "Filtre" +msgstr "Filtre personnalisé" #: .\cookbook\views\lists.py:224 msgid "Steps" @@ -2965,7 +2773,12 @@ msgstr "Nouvelle recette importée !" msgid "There was an error importing this recipe!" msgstr "Une erreur est survenue lors de l’importation de cette recette !" -#: .\cookbook\views\views.py:124 +#: .\cookbook\views\views.py:73 .\cookbook\views\views.py:191 +#: .\cookbook\views\views.py:213 .\cookbook\views\views.py:399 +msgid "This feature is not available in the demo version!" +msgstr "Cette fonctionnalité n’est pas disponible dans la version d’essai !" + +#: .\cookbook\views\views.py:89 msgid "" "You have successfully created your own recipe space. Start by adding some " "recipes or invite other people to join you." @@ -2974,24 +2787,20 @@ msgstr "" "Commencez à ajoutez des recettes ou invitez d’autres personnes à vous " "rejoindre." -#: .\cookbook\views\views.py:178 +#: .\cookbook\views\views.py:143 msgid "You do not have the required permissions to perform this action!" msgstr "Vous n’êtes pas autorisé(e) à effectuer cette action !" -#: .\cookbook\views\views.py:189 +#: .\cookbook\views\views.py:154 msgid "Comment saved!" msgstr "Commentaire sauvegardé !" -#: .\cookbook\views\views.py:264 -msgid "This feature is not available in the demo version!" -msgstr "Cette fonctionnalité n’est pas disponible dans la version d’essai !" - -#: .\cookbook\views\views.py:324 +#: .\cookbook\views\views.py:253 msgid "You must select at least one field to search!" msgstr "" "Vous devez sélectionner au moins un champ pour effectuer une recherche !" -#: .\cookbook\views\views.py:329 +#: .\cookbook\views\views.py:258 msgid "" "To use this search method you must select at least one full text search " "field!" @@ -2999,12 +2808,12 @@ msgstr "" "Pour utiliser cette méthode de recherche, vous devez sélectionner au moins " "un champ de recherche en texte intégral !" -#: .\cookbook\views\views.py:333 +#: .\cookbook\views\views.py:262 msgid "Fuzzy search is not compatible with this search method!" msgstr "" "La recherche floue n’est pas compatible avec cette méthode de recherche !" -#: .\cookbook\views\views.py:463 +#: .\cookbook\views\views.py:338 msgid "" "The setup page can only be used to create the first user! If you have " "forgotten your superuser credentials please consult the django documentation " @@ -3015,27 +2824,27 @@ msgstr "" "utilisateur, counsultez la documentation Django pour savoir comment " "réinitialiser le mot de passe." -#: .\cookbook\views\views.py:470 +#: .\cookbook\views\views.py:345 msgid "Passwords dont match!" msgstr "Les mots de passe ne correspondent pas !" -#: .\cookbook\views\views.py:478 +#: .\cookbook\views\views.py:353 msgid "User has been created, please login!" msgstr "L’utilisateur a été créé, veuillez vous connecter !" -#: .\cookbook\views\views.py:494 +#: .\cookbook\views\views.py:369 msgid "Malformed Invite Link supplied!" msgstr "Le lien d’invitation fourni est mal formé !" -#: .\cookbook\views\views.py:510 +#: .\cookbook\views\views.py:386 msgid "Successfully joined space." msgstr "Vous avez bien rejoint le groupe." -#: .\cookbook\views\views.py:516 +#: .\cookbook\views\views.py:392 msgid "Invite Link not valid or already used!" msgstr "Le lien d’invitation est invalide ou déjà utilisé !" -#: .\cookbook\views\views.py:530 +#: .\cookbook\views\views.py:409 msgid "" "Reporting share links is not enabled for this instance. Please notify the " "page administrator to report problems." @@ -3043,7 +2852,7 @@ msgstr "" "Le signalement de liens partagés n’est pas autorisé pour cette installation. " "Veuillez contacter l’administrateur de la page pour signaler le problème." -#: .\cookbook\views\views.py:536 +#: .\cookbook\views\views.py:415 msgid "" "Recipe sharing link has been disabled! For additional information please " "contact the page administrator." @@ -3051,6 +2860,173 @@ msgstr "" "Le lien de partage de la recette a été désactivé ! Pour plus d’informations, " "veuillez contacter l’administrateur de la page." +#~ msgid "Ingredients" +#~ msgstr "Ingrédients" + +#~ msgid "Show recent recipes" +#~ msgstr "Afficher les recettes récentes" + +#~ msgid "Search style" +#~ msgstr "Rechercher" + +#~ msgid "Show recently viewed recipes on search page." +#~ msgstr "" +#~ "Afficher les recettes récemment consultées sur la page de recherche." + +#~ msgid "Small" +#~ msgstr "Petit" + +#~ msgid "Large" +#~ msgstr "Grand" + +#~ msgid "Edit Ingredients" +#~ msgstr "Modifier les ingrédients" + +#~ msgid "" +#~ "\n" +#~ " The following form can be used if, accidentally, two (or more) " +#~ "units or ingredients where created that should be\n" +#~ " the same.\n" +#~ " It merges two units or ingredients and updates all recipes using " +#~ "them.\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ " Le formulaire suivant est utile lorsqu'il y a des doublons dans " +#~ "les unités ou les ingrédients.\n" +#~ " Il fusionne deux unités ou ingrédients et met à jour toutes les " +#~ "recettes les utilisant.\n" +#~ " " + +#~ msgid "Are you sure that you want to merge these two units?" +#~ msgstr "Êtes-vous sûr(e) de vouloir fusionner ces deux unités ?" + +#~ msgid "Merge" +#~ msgstr "Fusionner" + +#~ msgid "Are you sure that you want to merge these two ingredients?" +#~ msgstr "Êtes-vous sûr(e) de vouloir fusionner ces deux ingrédients ?" + +#~ msgid "Import Recipes" +#~ msgstr "Importer des recettes" + +#~ msgid "Close" +#~ msgstr "Fermer" + +#~ msgid "Open Recipe" +#~ msgstr "Ouvrir la recette" + +#~ msgid "Meal Plan View" +#~ msgstr "Vue des menus" + +#~ msgid "Created by" +#~ msgstr "Créé par" + +#~ msgid "Shared with" +#~ msgstr "Partagé avec" + +#~ msgid "Last cooked" +#~ msgstr "Cuisiné pour la dernière fois le" + +#~ msgid "Never cooked before." +#~ msgstr "Pas encore cuisiné." + +#~ msgid "Other meals on this day" +#~ msgstr "Autres repas ce jour" + +#~ msgid "Recipe Image" +#~ msgstr "Image de la recette" + +#~ msgid "Preparation time ca." +#~ msgstr "Temps moyen de préparation" + +#~ msgid "Waiting time ca." +#~ msgstr "Temps moyen d'attente" + +#~ msgid "External" +#~ msgstr "Externe" + +#~ msgid "Log Cooking" +#~ msgstr "Marquer comme cuisiné" + +#~ msgid "Account" +#~ msgstr "Compte" + +#~ msgid "Preferences" +#~ msgstr "Préférences" + +#~ msgid "API-Settings" +#~ msgstr "Paramètres d’API" + +#~ msgid "Search-Settings" +#~ msgstr "Paramètres de recherche" + +#, fuzzy +#~| msgid "Search-Settings" +#~ msgid "Shopping-Settings" +#~ msgstr "Paramètres de recherche" + +#~ msgid "Name Settings" +#~ msgstr "Paramètres de noms" + +#~ msgid "Account Settings" +#~ msgstr "Paramètres de compte" + +#~ msgid "Emails" +#~ msgstr "Adresses mail" + +#~ msgid "Language" +#~ msgstr "Langue" + +#~ msgid "Style" +#~ msgstr "Style" + +#~ msgid "API Token" +#~ msgstr "Jeton API" + +#~ msgid "" +#~ "You can use both basic authentication and token based authentication to " +#~ "access the REST API." +#~ msgstr "" +#~ "Vous pouvez utiliser à la fois l’authentification classique et " +#~ "l’authentification par jeton pour accéder à l’API REST." + +#~ msgid "" +#~ "Use the token as an Authorization header prefixed by the word token as " +#~ "shown in the following examples:" +#~ msgstr "" +#~ "Utilisez le jeton dans l’en-tête d’autorisation précédé du mot « token » " +#~ "comme indiqué dans les exemples suivants :" + +#~ msgid "or" +#~ msgstr "ou" + +#, fuzzy +#~| msgid "Shopping List" +#~ msgid "Shopping Settings" +#~ msgstr "Liste de courses" + +#~ msgid "Stats" +#~ msgstr "Stats" + +#~ msgid "Statistics" +#~ msgstr "Statistiques" + +#~ msgid "Number of objects" +#~ msgstr "Nombre d’objets" + +#~ msgid "Recipe Imports" +#~ msgstr "Recettes importées" + +#~ msgid "Objects stats" +#~ msgstr "Statistiques d’objets" + +#~ msgid "Recipes without Keywords" +#~ msgstr "Recettes sans mots-clés" + +#~ msgid "Internal Recipes" +#~ msgstr "Recettes internes" + #~ msgid "Show Links" #~ msgstr "Afficher les liens" @@ -3199,9 +3175,6 @@ msgstr "" #~ msgid "Text dragged here will be appended to the name." #~ msgstr "Le texte glissé ici sera ajouté au nom." -#~ msgid "Description" -#~ msgstr "Description" - #~ msgid "Text dragged here will be appended to the description." #~ msgstr "Le texte glissé ici sera ajouté à la description." @@ -3220,9 +3193,6 @@ msgstr "" #~ msgid "Ingredients dragged here will be appended to current list." #~ msgstr "Les ingrédients glissés ici seront ajoutés à la liste actuelle." -#~ msgid "Instructions" -#~ msgstr "Instructions" - #~ msgid "" #~ "Recipe instructions dragged here will be appended to current instructions." #~ msgstr "" diff --git a/cookbook/locale/hu_HU/LC_MESSAGES/django.mo b/cookbook/locale/hu_HU/LC_MESSAGES/django.mo index 2c74f346b..b35f518b5 100644 Binary files a/cookbook/locale/hu_HU/LC_MESSAGES/django.mo and b/cookbook/locale/hu_HU/LC_MESSAGES/django.mo differ diff --git a/cookbook/locale/hu_HU/LC_MESSAGES/django.po b/cookbook/locale/hu_HU/LC_MESSAGES/django.po index 5d62e79b4..db8b6503f 100644 --- a/cookbook/locale/hu_HU/LC_MESSAGES/django.po +++ b/cookbook/locale/hu_HU/LC_MESSAGES/django.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 19:20+0200\n" -"PO-Revision-Date: 2022-05-24 20:32+0000\n" -"Last-Translator: Krisztian Doka \n" +"POT-Creation-Date: 2023-04-26 07:46+0200\n" +"PO-Revision-Date: 2023-04-12 11:55+0000\n" +"Last-Translator: noxonad \n" "Language-Team: Hungarian \n" "Language: hu_HU\n" @@ -20,71 +20,57 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.10.1\n" +"X-Generator: Weblate 4.15\n" -#: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 -#: .\cookbook\templates\stats.html:28 -msgid "Ingredients" -msgstr "Hozzávalók" - -#: .\cookbook\forms.py:53 +#: .\cookbook\forms.py:52 msgid "Default unit" msgstr "Alapértelmezett mértékegység" -#: .\cookbook\forms.py:54 +#: .\cookbook\forms.py:53 msgid "Use fractions" msgstr "Törtek használata" -#: .\cookbook\forms.py:55 +#: .\cookbook\forms.py:54 msgid "Use KJ" msgstr "KJ használata" -#: .\cookbook\forms.py:56 +#: .\cookbook\forms.py:55 msgid "Theme" msgstr "Kinézet" -#: .\cookbook\forms.py:57 +#: .\cookbook\forms.py:56 msgid "Navbar color" msgstr "Navigációs sáv színe" -#: .\cookbook\forms.py:58 +#: .\cookbook\forms.py:57 msgid "Sticky navbar" msgstr "Ragadós navigációs sáv" -#: .\cookbook\forms.py:59 +#: .\cookbook\forms.py:58 msgid "Default page" msgstr "Alapértelmezett oldal" -#: .\cookbook\forms.py:60 -msgid "Show recent recipes" -msgstr "Legutóbbi receptek megjelenítése" - -#: .\cookbook\forms.py:61 -msgid "Search style" -msgstr "Keresés stílusa" - -#: .\cookbook\forms.py:62 +#: .\cookbook\forms.py:59 msgid "Plan sharing" msgstr "Terv megosztása" -#: .\cookbook\forms.py:63 +#: .\cookbook\forms.py:60 msgid "Ingredient decimal places" msgstr "Összetevők tizedesjegyei" -#: .\cookbook\forms.py:64 +#: .\cookbook\forms.py:61 msgid "Shopping list auto sync period" msgstr "Bevásárlólista automatikus szinkronizálásának periódusa" -#: .\cookbook\forms.py:65 .\cookbook\templates\recipe_view.html:21 -#: .\cookbook\templates\stats.html:47 +#: .\cookbook\forms.py:62 .\cookbook\templates\recipe_view.html:36 msgid "Comments" msgstr "Megjegyzések" -#: .\cookbook\forms.py:66 +#: .\cookbook\forms.py:63 msgid "Left-handed mode" msgstr "Balkezes üzemmód" -#: .\cookbook\forms.py:70 +#: .\cookbook\forms.py:67 msgid "" "Color of the top navigation bar. Not all colors work with all themes, just " "try them out!" @@ -92,12 +78,12 @@ msgstr "" "A felső navigációs sáv színe. Nem minden szín működik minden témával. " "Próbáld ki őket!" -#: .\cookbook\forms.py:72 +#: .\cookbook\forms.py:69 msgid "Default Unit to be used when inserting a new ingredient into a recipe." msgstr "" "Az alapértelmezett mértékegység, új hozzávaló receptbe való beillesztésekor." -#: .\cookbook\forms.py:74 +#: .\cookbook\forms.py:71 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" @@ -105,36 +91,32 @@ msgstr "" "Lehetővé teszi az összetevők mennyiségében a törtrészek használatát (pl. A " "tizedesjegyek automatikus törtrészekké alakítása)" -#: .\cookbook\forms.py:76 +#: .\cookbook\forms.py:73 msgid "Display nutritional energy amounts in joules instead of calories" msgstr "" "A tápanyag energiamennyiségek kalória helyett joule-ban történő megjelenítése" -#: .\cookbook\forms.py:77 +#: .\cookbook\forms.py:74 msgid "Users with whom newly created meal plans should be shared by default." msgstr "" "Azok a felhasználók, akikkel az újonnan létrehozott étkezési terveket " "alapértelmezés szerint meg kell osztani." -#: .\cookbook\forms.py:78 +#: .\cookbook\forms.py:75 msgid "Users with whom to share shopping lists." msgstr "Felhasználók, akikkel megosztja a bevásárlólistákat." -#: .\cookbook\forms.py:80 -msgid "Show recently viewed recipes on search page." -msgstr "Nemrég megtekintett receptek megjelenítése a keresési oldalon." - -#: .\cookbook\forms.py:81 +#: .\cookbook\forms.py:76 msgid "Number of decimals to round ingredients." msgstr "A kerekítendő összetevők tizedesjegyeinek száma." -#: .\cookbook\forms.py:82 +#: .\cookbook\forms.py:77 msgid "If you want to be able to create and see comments underneath recipes." msgstr "" "Ha azt szeretné, hogy hozzászólásokat tudjon létrehozni és látni a receptek " "alatt." -#: .\cookbook\forms.py:84 .\cookbook\forms.py:496 +#: .\cookbook\forms.py:79 .\cookbook\forms.py:492 msgid "" "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. " @@ -147,24 +129,24 @@ msgstr "" "emberrel együtt vásárol, de egy kicsit több mobiladatot használhat. Ha " "alacsonyabb, mint a lehetséges határérték, akkor a mentéskor visszaáll." -#: .\cookbook\forms.py:87 +#: .\cookbook\forms.py:82 msgid "Makes the navbar stick to the top of the page." msgstr "A navigációs sávot az oldal tetejére rögzíti." -#: .\cookbook\forms.py:88 .\cookbook\forms.py:499 +#: .\cookbook\forms.py:83 .\cookbook\forms.py:495 msgid "Automatically add meal plan ingredients to shopping list." msgstr "" "Automatikusan hozzáadja az étkezési terv hozzávalóit a bevásárlólistához." -#: .\cookbook\forms.py:89 +#: .\cookbook\forms.py:84 msgid "Exclude ingredients that are on hand." msgstr "Mellőzze a kéznél lévő összetevőket." -#: .\cookbook\forms.py:90 +#: .\cookbook\forms.py:85 msgid "Will optimize the UI for use with your left hand." msgstr "Optimalizálja a felületet, bal kézzel történő használatra." -#: .\cookbook\forms.py:107 +#: .\cookbook\forms.py:102 msgid "" "Both fields are optional. If none are given the username will be displayed " "instead" @@ -172,36 +154,35 @@ msgstr "" "Mindkét mező opcionális. Ha egyiket sem adjuk meg, akkor a felhasználónév " "jelenik meg helyette" -#: .\cookbook\forms.py:128 .\cookbook\forms.py:301 +#: .\cookbook\forms.py:123 .\cookbook\forms.py:297 msgid "Name" msgstr "Név" -#: .\cookbook\forms.py:129 .\cookbook\forms.py:302 -#: .\cookbook\templates\stats.html:24 .\cookbook\views\lists.py:88 +#: .\cookbook\forms.py:124 .\cookbook\forms.py:298 .\cookbook\views\lists.py:88 msgid "Keywords" msgstr "Kulcsszavak" -#: .\cookbook\forms.py:130 +#: .\cookbook\forms.py:125 msgid "Preparation time in minutes" msgstr "Előkészítési idő percben" -#: .\cookbook\forms.py:131 +#: .\cookbook\forms.py:126 msgid "Waiting time (cooking/baking) in minutes" msgstr "Várakozási idő (sütés/főzés) percben" -#: .\cookbook\forms.py:132 .\cookbook\forms.py:270 .\cookbook\forms.py:303 +#: .\cookbook\forms.py:127 .\cookbook\forms.py:266 .\cookbook\forms.py:299 msgid "Path" msgstr "Elérési útvonal" -#: .\cookbook\forms.py:133 +#: .\cookbook\forms.py:128 msgid "Storage UID" msgstr "Tárhely UID" -#: .\cookbook\forms.py:165 +#: .\cookbook\forms.py:161 msgid "Default" msgstr "Alapértelmezett" -#: .\cookbook\forms.py:177 +#: .\cookbook\forms.py:173 msgid "" "To prevent duplicates recipes with the same name as existing ones are " "ignored. Check this box to import everything." @@ -210,23 +191,23 @@ msgstr "" "recepteket a rendszer figyelmen kívül hagyja. Jelölje be ezt a négyzetet, ha " "mindent importálni szeretne." -#: .\cookbook\forms.py:200 +#: .\cookbook\forms.py:196 msgid "Add your comment: " msgstr "Add hozzá a kommented: " -#: .\cookbook\forms.py:215 +#: .\cookbook\forms.py:211 msgid "Leave empty for dropbox and enter app password for nextcloud." msgstr "" "A dropbox esetében hagyja üresen, a nextcloud esetében pedig adja meg az " "alkalmazás jelszavát." -#: .\cookbook\forms.py:222 +#: .\cookbook\forms.py:218 msgid "Leave empty for nextcloud and enter api token for dropbox." msgstr "" "A nextcloud esetében hagyja üresen, a dropbox esetében pedig adja meg az api " "tokent." -#: .\cookbook\forms.py:231 +#: .\cookbook\forms.py:227 msgid "" "Leave empty for dropbox and enter only base url for nextcloud (/remote." "php/webdav/ is added automatically)" @@ -234,33 +215,33 @@ msgstr "" "Hagyja üresen a dropbox esetén, és csak a nextcloud alap url-jét adja meg " "(/remote.php/webdav/ automatikusan hozzáadódik)" -#: .\cookbook\forms.py:269 .\cookbook\views\edit.py:157 +#: .\cookbook\forms.py:265 .\cookbook\views\edit.py:157 msgid "Storage" msgstr "Tárhely" -#: .\cookbook\forms.py:271 +#: .\cookbook\forms.py:267 msgid "Active" msgstr "Aktív" -#: .\cookbook\forms.py:277 +#: .\cookbook\forms.py:273 msgid "Search String" msgstr "Keresési kifejezés" -#: .\cookbook\forms.py:304 +#: .\cookbook\forms.py:300 msgid "File ID" msgstr "Fájl ID" -#: .\cookbook\forms.py:326 +#: .\cookbook\forms.py:322 msgid "You must provide at least a recipe or a title." msgstr "Legalább egy receptet vagy címet kell megadnia." -#: .\cookbook\forms.py:339 +#: .\cookbook\forms.py:335 msgid "You can list default users to share recipes with in the settings." msgstr "" "A beállításokban megadhatja a receptek megosztására szolgáló alapértelmezett " "felhasználókat." -#: .\cookbook\forms.py:340 +#: .\cookbook\forms.py:336 msgid "" "You can use markdown to format this field. See the docs here" @@ -268,15 +249,15 @@ msgstr "" "A mező formázásához használhatja a markdown formátumot. Lásd a dokumentációt itt" -#: .\cookbook\forms.py:366 +#: .\cookbook\forms.py:362 msgid "Maximum number of users for this space reached." msgstr "Elérte a felhasználók maximális számát ezen a területen." -#: .\cookbook\forms.py:372 +#: .\cookbook\forms.py:368 msgid "Email address already taken!" msgstr "Az e-mail cím már foglalt!" -#: .\cookbook\forms.py:380 +#: .\cookbook\forms.py:376 msgid "" "An email address is not required but if present the invite link will be sent " "to the user." @@ -284,15 +265,15 @@ msgstr "" "Az e-mail cím megadása nem kötelező, de ha van, a meghívó linket elküldi a " "felhasználónak." -#: .\cookbook\forms.py:395 +#: .\cookbook\forms.py:391 msgid "Name already taken." msgstr "A név már foglalt." -#: .\cookbook\forms.py:406 +#: .\cookbook\forms.py:402 msgid "Accept Terms and Privacy" msgstr "Feltételek és adatvédelem elfogadása" -#: .\cookbook\forms.py:438 +#: .\cookbook\forms.py:434 msgid "" "Determines how fuzzy a search is if it uses trigram similarity matching (e." "g. low values mean more typos are ignored)." @@ -301,7 +282,7 @@ msgstr "" "párosítást használ (pl. az alacsony értékek azt jelentik, hogy több gépelési " "hibát figyelmen kívül hagynak)." -#: .\cookbook\forms.py:448 +#: .\cookbook\forms.py:444 #, fuzzy #| msgid "" #| "Select type method of search. Click here " @@ -313,7 +294,7 @@ msgstr "" "Válassza ki a keresés típusát. Kattintson ide " "a lehetőségek teljes leírásáért." -#: .\cookbook\forms.py:449 +#: .\cookbook\forms.py:445 msgid "" "Use fuzzy matching on units, keywords and ingredients when editing and " "importing recipes." @@ -321,7 +302,7 @@ msgstr "" "A receptek szerkesztése és importálása során az egységek, kulcsszavak és " "összetevők bizonytalan megfeleltetése." -#: .\cookbook\forms.py:451 +#: .\cookbook\forms.py:447 msgid "" "Fields to search ignoring accents. Selecting this option can improve or " "degrade search quality depending on language" @@ -329,7 +310,7 @@ msgstr "" "Az ékezetek figyelmen kívül hagyásával keresendő mezők. Ennek az opciónak a " "kiválasztása javíthatja vagy ronthatja a keresés minőségét a nyelvtől függően" -#: .\cookbook\forms.py:453 +#: .\cookbook\forms.py:449 msgid "" "Fields to search for partial matches. (e.g. searching for 'Pie' will return " "'pie' and 'piece' and 'soapie')" @@ -337,7 +318,7 @@ msgstr "" "Részleges egyezések keresésére szolgáló mezők. (pl. a 'Pie' keresése a " "'pie' és a 'piece' és a 'soapie' kifejezéseket adja vissza.)" -#: .\cookbook\forms.py:455 +#: .\cookbook\forms.py:451 msgid "" "Fields to search for beginning of word matches. (e.g. searching for 'sa' " "will return 'salad' and 'sandwich')" @@ -345,7 +326,7 @@ msgstr "" "Mezők a szó eleji egyezések kereséséhez. (pl. a 'sa' keresés a 'salad' és a " "'sandwich' kifejezéseket adja vissza)" -#: .\cookbook\forms.py:457 +#: .\cookbook\forms.py:453 msgid "" "Fields to 'fuzzy' search. (e.g. searching for 'recpie' will find 'recipe'.) " "Note: this option will conflict with 'web' and 'raw' methods of search." @@ -354,7 +335,7 @@ msgstr "" "'recipe' szót.) Megjegyzés: ez az opció ütközik a 'web' és a 'raw' keresési " "módszerekkel." -#: .\cookbook\forms.py:459 +#: .\cookbook\forms.py:455 msgid "" "Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " "only function with fulltext fields." @@ -362,37 +343,37 @@ msgstr "" "Mezők a teljes szöveges kereséshez. Megjegyzés: A 'web', 'phrase' és 'raw' " "keresési módszerek csak teljes szöveges mezőkkel működnek." -#: .\cookbook\forms.py:463 +#: .\cookbook\forms.py:459 msgid "Search Method" msgstr "Keresési módszer" -#: .\cookbook\forms.py:464 +#: .\cookbook\forms.py:460 msgid "Fuzzy Lookups" msgstr "Bizonytalan keresések" -#: .\cookbook\forms.py:465 +#: .\cookbook\forms.py:461 msgid "Ignore Accent" msgstr "Ékezetek ignorálása" -#: .\cookbook\forms.py:466 +#: .\cookbook\forms.py:462 msgid "Partial Match" msgstr "Részleges találat" -#: .\cookbook\forms.py:467 +#: .\cookbook\forms.py:463 #, fuzzy #| msgid "Starts Wtih" msgid "Starts With" msgstr "Kezdődik a következővel" -#: .\cookbook\forms.py:468 +#: .\cookbook\forms.py:464 msgid "Fuzzy Search" msgstr "Bizonytalan keresés" -#: .\cookbook\forms.py:469 +#: .\cookbook\forms.py:465 msgid "Full Text" msgstr "Teljes szöveg" -#: .\cookbook\forms.py:494 +#: .\cookbook\forms.py:490 msgid "" "Users will see all items you add to your shopping list. They must add you " "to see items on their list." @@ -401,7 +382,7 @@ msgstr "" "Ahhoz, hogy láthassák a saját listájukon szereplő tételeket, hozzá kell " "adniuk téged." -#: .\cookbook\forms.py:500 +#: .\cookbook\forms.py:496 msgid "" "When adding a meal plan to the shopping list (manually or automatically), " "include all related recipes." @@ -409,7 +390,7 @@ msgstr "" "Amikor étkezési tervet ad hozzá a bevásárlólistához (kézzel vagy " "automatikusan), vegye fel az összes kapcsolódó receptet." -#: .\cookbook\forms.py:501 +#: .\cookbook\forms.py:497 msgid "" "When adding a meal plan to the shopping list (manually or automatically), " "exclude ingredients that are on hand." @@ -417,96 +398,100 @@ msgstr "" "Amikor étkezési tervet ad hozzá a bevásárlólistához (kézzel vagy " "automatikusan), zárja ki a kéznél lévő összetevőket." -#: .\cookbook\forms.py:502 +#: .\cookbook\forms.py:498 msgid "Default number of hours to delay a shopping list entry." msgstr "A bevásárlólista bejegyzés késleltetésének alapértelmezett ideje." -#: .\cookbook\forms.py:503 +#: .\cookbook\forms.py:499 msgid "Filter shopping list to only include supermarket categories." msgstr "" "Szűrje a bevásárlólistát úgy, hogy csak a szupermarket kategóriákat " "tartalmazza." -#: .\cookbook\forms.py:504 +#: .\cookbook\forms.py:500 msgid "Days of recent shopping list entries to display." msgstr "A legutóbbi bevásárlólista bejegyzések megjelenítendő napjai." -#: .\cookbook\forms.py:505 +#: .\cookbook\forms.py:501 msgid "Mark food 'On Hand' when checked off shopping list." msgstr "" "Jelölje meg a \" Kéznél van\" jelölést, ha a bevásárlólistáról kipipálta az " "élelmiszert." -#: .\cookbook\forms.py:506 +#: .\cookbook\forms.py:502 msgid "Delimiter to use for CSV exports." msgstr "A CSV exportáláshoz használandó elválasztójel." -#: .\cookbook\forms.py:507 +#: .\cookbook\forms.py:503 msgid "Prefix to add when copying list to the clipboard." msgstr "A lista vágólapra másolásakor hozzáadandó előtag." -#: .\cookbook\forms.py:511 +#: .\cookbook\forms.py:507 msgid "Share Shopping List" msgstr "Bevásárlólista megosztása" -#: .\cookbook\forms.py:512 +#: .\cookbook\forms.py:508 msgid "Autosync" msgstr "Automatikus szinkronizálás" -#: .\cookbook\forms.py:513 +#: .\cookbook\forms.py:509 msgid "Auto Add Meal Plan" msgstr "Automatikus étkezési terv hozzáadása" -#: .\cookbook\forms.py:514 +#: .\cookbook\forms.py:510 msgid "Exclude On Hand" msgstr "Kéznél levő kihagyása" -#: .\cookbook\forms.py:515 +#: .\cookbook\forms.py:511 msgid "Include Related" msgstr "Tartalmazza a kapcsolódókat" -#: .\cookbook\forms.py:516 +#: .\cookbook\forms.py:512 msgid "Default Delay Hours" msgstr "Alapértelmezett késleltetési órák" -#: .\cookbook\forms.py:517 +#: .\cookbook\forms.py:513 msgid "Filter to Supermarket" msgstr "Szűrő a szupermarkethez" -#: .\cookbook\forms.py:518 +#: .\cookbook\forms.py:514 msgid "Recent Days" msgstr "Legutóbbi napok" -#: .\cookbook\forms.py:519 +#: .\cookbook\forms.py:515 msgid "CSV Delimiter" msgstr "CSV elválasztó" -#: .\cookbook\forms.py:520 +#: .\cookbook\forms.py:516 msgid "List Prefix" msgstr "Lista előtagja" -#: .\cookbook\forms.py:521 +#: .\cookbook\forms.py:517 msgid "Auto On Hand" msgstr "Automatikus Kéznél lévő" -#: .\cookbook\forms.py:531 +#: .\cookbook\forms.py:527 msgid "Reset Food Inheritance" msgstr "Élelmiszer-öröklés visszaállítása" -#: .\cookbook\forms.py:532 +#: .\cookbook\forms.py:528 msgid "Reset all food to inherit the fields configured." msgstr "Állítsa vissza az összes ételt, hogy örökölje a konfigurált mezőket." -#: .\cookbook\forms.py:544 +#: .\cookbook\forms.py:540 msgid "Fields on food that should be inherited by default." msgstr "" "Az élelmiszerek azon mezői, amelyeket alapértelmezés szerint örökölni kell." -#: .\cookbook\forms.py:545 +#: .\cookbook\forms.py:541 msgid "Show recipe counts on search filters" msgstr "A receptek számának megjelenítése a keresési szűrőkön" -#: .\cookbook\helper\AllAuthCustomAdapter.py:36 +#: .\cookbook\forms.py:542 +msgid "Use the plural form for units and food inside this space." +msgstr "" + +#: .\cookbook\helper\AllAuthCustomAdapter.py:39 msgid "" "In order to prevent spam, the requested email was not send. Please wait a " "few minutes and try again." @@ -514,68 +499,95 @@ msgstr "" "A spamek elkerülése érdekében a kért e-mailt nem küldtük el. Kérjük, várjon " "néhány percet, és próbálja meg újra." -#: .\cookbook\helper\permission_helper.py:149 -#: .\cookbook\helper\permission_helper.py:172 .\cookbook\views\views.py:152 +#: .\cookbook\helper\permission_helper.py:164 +#: .\cookbook\helper\permission_helper.py:187 .\cookbook\views\views.py:117 msgid "You are not logged in and therefore cannot view this page!" msgstr "Ön nincs bejelentkezve, ezért nem tudja megtekinteni ezt az oldalt!" -#: .\cookbook\helper\permission_helper.py:153 -#: .\cookbook\helper\permission_helper.py:159 -#: .\cookbook\helper\permission_helper.py:184 -#: .\cookbook\helper\permission_helper.py:254 -#: .\cookbook\helper\permission_helper.py:268 -#: .\cookbook\helper\permission_helper.py:279 -#: .\cookbook\helper\permission_helper.py:290 .\cookbook\views\data.py:33 -#: .\cookbook\views\views.py:163 .\cookbook\views\views.py:170 -#: .\cookbook\views\views.py:249 +#: .\cookbook\helper\permission_helper.py:168 +#: .\cookbook\helper\permission_helper.py:174 +#: .\cookbook\helper\permission_helper.py:199 +#: .\cookbook\helper\permission_helper.py:269 +#: .\cookbook\helper\permission_helper.py:283 +#: .\cookbook\helper\permission_helper.py:294 +#: .\cookbook\helper\permission_helper.py:305 +#: .\cookbook\helper\permission_helper.py:321 +#: .\cookbook\helper\permission_helper.py:342 .\cookbook\views\data.py:36 +#: .\cookbook\views\views.py:128 .\cookbook\views\views.py:135 msgid "You do not have the required permissions to view this page!" msgstr "Nem rendelkezik a szükséges jogosultságokkal az oldal megtekintéséhez!" -#: .\cookbook\helper\permission_helper.py:177 -#: .\cookbook\helper\permission_helper.py:200 -#: .\cookbook\helper\permission_helper.py:222 +#: .\cookbook\helper\permission_helper.py:192 +#: .\cookbook\helper\permission_helper.py:215 #: .\cookbook\helper\permission_helper.py:237 +#: .\cookbook\helper\permission_helper.py:252 msgid "You cannot interact with this object as it is not owned by you!" msgstr "" "Nem léphetsz kapcsolatba ezzel az objektummal, mivel nem a te tulajdonod!" -#: .\cookbook\helper\permission_helper.py:321 +#: .\cookbook\helper\permission_helper.py:403 msgid "You have reached the maximum number of recipes for your space." msgstr "Elérte a maximális számú receptet a helyén." -#: .\cookbook\helper\permission_helper.py:333 +#: .\cookbook\helper\permission_helper.py:415 msgid "You have more users than allowed in your space." msgstr "Több felhasználója van, mint amennyit engedélyeztek a térben." -#: .\cookbook\helper\recipe_search.py:565 +#: .\cookbook\helper\recipe_search.py:630 msgid "One of queryset or hash_key must be provided" msgstr "A queryset vagy a hash_key valamelyikét meg kell adni" -#: .\cookbook\helper\shopping_helper.py:152 +#: .\cookbook\helper\recipe_url_import.py:266 +#, fuzzy +#| msgid "Use fractions" +msgid "reverse rotation" +msgstr "Törtek használata" + +#: .\cookbook\helper\recipe_url_import.py:267 +msgid "careful rotation" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:268 +msgid "knead" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:269 +msgid "thicken" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:270 +msgid "warm up" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:271 +msgid "ferment" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:272 +msgid "sous-vide" +msgstr "" + +#: .\cookbook\helper\shopping_helper.py:157 #, fuzzy #| msgid "You must supply a created_by" msgid "You must supply a servings size" msgstr "Meg kell adnia egy created_by" -#: .\cookbook\helper\template_helper.py:64 -#: .\cookbook\helper\template_helper.py:66 +#: .\cookbook\helper\template_helper.py:79 +#: .\cookbook\helper\template_helper.py:81 msgid "Could not parse template code." msgstr "Nem sikerült elemezni a sablon kódját." -#: .\cookbook\integration\copymethat.py:41 +#: .\cookbook\integration\copymethat.py:44 #: .\cookbook\integration\melarecipes.py:37 msgid "Favorite" msgstr "" -#: .\cookbook\integration\copymethat.py:70 -#: .\cookbook\integration\recettetek.py:54 -#: .\cookbook\integration\recipekeeper.py:63 -#, fuzzy -#| msgid "Import Log" -msgid "Imported from" -msgstr "Import napló" +#: .\cookbook\integration\copymethat.py:50 +msgid "I made this" +msgstr "" -#: .\cookbook\integration\integration.py:223 +#: .\cookbook\integration\integration.py:218 msgid "" "Importer expected a .zip file. Did you choose the correct importer type for " "your data ?" @@ -583,7 +595,7 @@ msgstr "" "Az importáló egy .zip fájlt várt. A megfelelő importálótípust választotta az " "adataihoz?" -#: .\cookbook\integration\integration.py:226 +#: .\cookbook\integration\integration.py:221 msgid "" "An unexpected error occurred during the import. Please make sure you have " "uploaded a valid file." @@ -591,27 +603,40 @@ msgstr "" "Az importálás során váratlan hiba történt. Kérjük, ellenőrizze, hogy " "érvényes fájlt töltött-e fel." -#: .\cookbook\integration\integration.py:231 +#: .\cookbook\integration\integration.py:226 msgid "The following recipes were ignored because they already existed:" msgstr "A következő recepteket figyelmen kívül hagytuk, mert már léteztek:" -#: .\cookbook\integration\integration.py:235 +#: .\cookbook\integration\integration.py:230 #, python-format msgid "Imported %s recipes." msgstr "Importálva %s recept." -#: .\cookbook\integration\paprika.py:46 +#: .\cookbook\integration\openeats.py:26 +#, fuzzy +#| msgid "Recipe Home" +msgid "Recipe source:" +msgstr "Recipe Home" + +#: .\cookbook\integration\paprika.py:49 msgid "Notes" msgstr "Jegyzetek" -#: .\cookbook\integration\paprika.py:49 +#: .\cookbook\integration\paprika.py:52 msgid "Nutritional Information" msgstr "Táplálkozási információk" -#: .\cookbook\integration\paprika.py:53 +#: .\cookbook\integration\paprika.py:56 msgid "Source" msgstr "Forrás" +#: .\cookbook\integration\recettetek.py:54 +#: .\cookbook\integration\recipekeeper.py:70 +#, fuzzy +#| msgid "Import Log" +msgid "Imported from" +msgstr "Import napló" + #: .\cookbook\integration\saffron.py:23 msgid "Servings" msgstr "Adagok" @@ -624,9 +649,7 @@ msgstr "Várakozási idő" msgid "Preparation Time" msgstr "Előkészítési idő" -#: .\cookbook\integration\saffron.py:29 -#: .\cookbook\templates\forms\ingredients.html:7 -#: .\cookbook\templates\index.html:7 +#: .\cookbook\integration\saffron.py:29 .\cookbook\templates\index.html:7 msgid "Cookbook" msgstr "Szakácskönyv" @@ -670,7 +693,7 @@ msgstr "Vacsora" msgid "Other" msgstr "Egyéb" -#: .\cookbook\models.py:251 +#: .\cookbook\models.py:261 msgid "" "Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " "upload." @@ -678,137 +701,135 @@ msgstr "" "Maximális tárhely a fájloknak MB-ban. 0 a korlátlan, -1 a fájlfeltöltés " "letiltásához." -#: .\cookbook\models.py:353 .\cookbook\templates\search.html:7 +#: .\cookbook\models.py:365 .\cookbook\templates\search.html:7 +#: .\cookbook\templates\settings.html:18 #: .\cookbook\templates\space_manage.html:7 msgid "Search" msgstr "Keresés" -#: .\cookbook\models.py:354 .\cookbook\templates\base.html:107 +#: .\cookbook\models.py:366 .\cookbook\templates\base.html:110 #: .\cookbook\templates\meal_plan.html:7 .\cookbook\views\delete.py:178 #: .\cookbook\views\edit.py:211 .\cookbook\views\new.py:179 msgid "Meal-Plan" msgstr "Étkezési terv" -#: .\cookbook\models.py:355 .\cookbook\templates\base.html:115 +#: .\cookbook\models.py:367 .\cookbook\templates\base.html:118 msgid "Books" msgstr "Könyvek" -#: .\cookbook\models.py:363 -msgid "Small" -msgstr "Kicsi" - -#: .\cookbook\models.py:363 -msgid "Large" -msgstr "Nagy" - -#: .\cookbook\models.py:363 .\cookbook\templates\generic\new_template.html:6 -#: .\cookbook\templates\generic\new_template.html:14 -msgid "New" -msgstr "Új" - -#: .\cookbook\models.py:584 +#: .\cookbook\models.py:580 msgid " is part of a recipe step and cannot be deleted" msgstr " egy recept része, ezért nem törölhető" -#: .\cookbook\models.py:1162 .\cookbook\templates\search_info.html:28 +#: .\cookbook\models.py:1181 .\cookbook\templates\search_info.html:28 msgid "Simple" msgstr "Egyszerű" -#: .\cookbook\models.py:1163 .\cookbook\templates\search_info.html:33 +#: .\cookbook\models.py:1182 .\cookbook\templates\search_info.html:33 msgid "Phrase" msgstr "Kifejezés" -#: .\cookbook\models.py:1164 .\cookbook\templates\search_info.html:38 +#: .\cookbook\models.py:1183 .\cookbook\templates\search_info.html:38 msgid "Web" msgstr "Web" -#: .\cookbook\models.py:1165 .\cookbook\templates\search_info.html:47 +#: .\cookbook\models.py:1184 .\cookbook\templates\search_info.html:47 msgid "Raw" msgstr "Nyers" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 msgid "Food Alias" msgstr "Élelmiszer álneve" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 msgid "Unit Alias" msgstr "Egység álneve" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 msgid "Keyword Alias" msgstr "Kulcsszó álneve" -#: .\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 +#: .\cookbook\models.py:1232 +#, fuzzy +#| msgid "Description" +msgid "Description Replace" +msgstr "Leírás" + +#: .\cookbook\models.py:1232 +#, fuzzy +#| msgid "Instructions" +msgid "Instruction Replace" +msgstr "Elkészítés" + +#: .\cookbook\models.py:1258 .\cookbook\views\delete.py:36 +#: .\cookbook\views\edit.py:251 .\cookbook\views\new.py:48 msgid "Recipe" msgstr "Recept" -#: .\cookbook\models.py:1228 +#: .\cookbook\models.py:1259 #, fuzzy #| msgid "Foods" msgid "Food" msgstr "Ételek" -#: .\cookbook\models.py:1229 .\cookbook\templates\base.html:138 +#: .\cookbook\models.py:1260 .\cookbook\templates\base.html:141 msgid "Keyword" msgstr "Kulcsszó" -#: .\cookbook\serializer.py:207 -msgid "Cannot modify Space owner permission." -msgstr "" - -#: .\cookbook\serializer.py:290 +#: .\cookbook\serializer.py:198 msgid "File uploads are not enabled for this Space." msgstr "A fájlok feltöltése nem engedélyezett ezen a tárhelyen." -#: .\cookbook\serializer.py:301 +#: .\cookbook\serializer.py:209 msgid "You have reached your file upload limit." msgstr "Elérte a fájlfeltöltési limitet." -#: .\cookbook\serializer.py:1081 +#: .\cookbook\serializer.py:291 +msgid "Cannot modify Space owner permission." +msgstr "" + +#: .\cookbook\serializer.py:1093 msgid "Hello" msgstr "Helló" -#: .\cookbook\serializer.py:1081 +#: .\cookbook\serializer.py:1093 msgid "You have been invited by " msgstr "Önt meghívta " -#: .\cookbook\serializer.py:1082 +#: .\cookbook\serializer.py:1094 msgid " to join their Tandoor Recipes space " msgstr " hogy csatlakozzon a Tandoor Receptek helyhez " -#: .\cookbook\serializer.py:1083 +#: .\cookbook\serializer.py:1095 msgid "Click the following link to activate your account: " msgstr "Kattintson az alábbi linkre fiókja aktiválásához: " -#: .\cookbook\serializer.py:1084 +#: .\cookbook\serializer.py:1096 msgid "" "If the link does not work use the following code to manually join the space: " msgstr "" "Ha a link nem működik, használja a következő kódot, hogy manuálisan " "csatlakozzon a térhez: " -#: .\cookbook\serializer.py:1085 +#: .\cookbook\serializer.py:1097 msgid "The invitation is valid until " msgstr "A meghívó a következő időpontig érvényes " -#: .\cookbook\serializer.py:1086 +#: .\cookbook\serializer.py:1098 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " msgstr "" "A Tandoor Receptek egy nyílt forráskódú receptkezelő. Nézze meg a GitHubon " -#: .\cookbook\serializer.py:1089 +#: .\cookbook\serializer.py:1101 msgid "Tandoor Recipes Invite" msgstr "Tandoor receptek meghívó" -#: .\cookbook\serializer.py:1209 +#: .\cookbook\serializer.py:1242 msgid "Existing shopping list to update" msgstr "Meglévő bevásárlólista frissítése" -#: .\cookbook\serializer.py:1211 +#: .\cookbook\serializer.py:1244 msgid "" "List of ingredient IDs from the recipe to add, if not provided all " "ingredients will be added." @@ -816,36 +837,29 @@ msgstr "" "A hozzáadandó összetevők azonosítóinak listája a receptből, ha nincs " "megadva, az összes összetevő hozzáadásra kerül." -#: .\cookbook\serializer.py:1213 +#: .\cookbook\serializer.py:1246 msgid "" "Providing a list_recipe ID and servings of 0 will delete that shopping list." msgstr "A list_recipe azonosító és a 0 adag megadása törli a bevásárlólistát." -#: .\cookbook\serializer.py:1222 +#: .\cookbook\serializer.py:1255 msgid "Amount of food to add to the shopping list" msgstr "A bevásárlólistához hozzáadandó élelmiszerek mennyisége" -#: .\cookbook\serializer.py:1224 +#: .\cookbook\serializer.py:1257 msgid "ID of unit to use for the shopping list" msgstr "A bevásárlólistához használandó egység azonosítója" -#: .\cookbook\serializer.py:1226 +#: .\cookbook\serializer.py:1259 msgid "When set to true will delete all food from active shopping lists." msgstr "" "Ha igazra van állítva, akkor minden élelmiszert töröl az aktív " "bevásárlólistákról." -#: .\cookbook\tables.py:36 .\cookbook\templates\generic\edit_template.html:6 -#: .\cookbook\templates\generic\edit_template.html:14 -#: .\cookbook\templates\recipes_table.html:82 -msgid "Edit" -msgstr "Szerkesztés" - -#: .\cookbook\tables.py:116 .\cookbook\tables.py:131 +#: .\cookbook\tables.py:61 .\cookbook\tables.py:75 #: .\cookbook\templates\generic\delete_template.html:7 #: .\cookbook\templates\generic\delete_template.html:15 #: .\cookbook\templates\generic\edit_template.html:28 -#: .\cookbook\templates\recipes_table.html:90 msgid "Delete" msgstr "Törlés" @@ -873,9 +887,10 @@ msgstr "E-mail címek" #: .\cookbook\templates\account\email.html:12 #: .\cookbook\templates\account\password_change.html:11 #: .\cookbook\templates\account\password_set.html:11 -#: .\cookbook\templates\base.html:293 .\cookbook\templates\settings.html:6 +#: .\cookbook\templates\base.html:296 .\cookbook\templates\settings.html:6 #: .\cookbook\templates\settings.html:17 #: .\cookbook\templates\socialaccount\connections.html:10 +#: .\cookbook\templates\user_settings.html:8 msgid "Settings" msgstr "Beállítások" @@ -971,8 +986,8 @@ msgstr "" " adj ki egy új e-mail megerősítési " "kérelmet." -#: .\cookbook\templates\account\login.html:8 -#: .\cookbook\templates\base.html:340 .\cookbook\templates\openid\login.html:8 +#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:343 +#: .\cookbook\templates\openid\login.html:8 msgid "Login" msgstr "Bejelentkezés" @@ -992,21 +1007,20 @@ msgstr "Bejelentkezés" msgid "Sign Up" msgstr "Regisztráció" +#: .\cookbook\templates\account\login.html:38 +msgid "Lost your password?" +msgstr "Elfelejtette a jelszavát?" + #: .\cookbook\templates\account\login.html:39 -#: .\cookbook\templates\account\login.html:41 #: .\cookbook\templates\account\password_reset.html:29 msgid "Reset My Password" msgstr "Jelszó visszaállítása" -#: .\cookbook\templates\account\login.html:40 -msgid "Lost your password?" -msgstr "Elfelejtette a jelszavát?" - -#: .\cookbook\templates\account\login.html:52 +#: .\cookbook\templates\account\login.html:50 msgid "Social Login" msgstr "Közösségi bejelentkezés" -#: .\cookbook\templates\account\login.html:53 +#: .\cookbook\templates\account\login.html:51 msgid "You can use any of the following providers to sign in." msgstr "A bejelentkezéshez a következő szolgáltatók bármelyikét használhatja." @@ -1032,7 +1046,6 @@ msgstr "Jelszó módosítása" #: .\cookbook\templates\account\password_change.html:12 #: .\cookbook\templates\account\password_set.html:12 -#: .\cookbook\templates\settings.html:76 msgid "Password" msgstr "Jelszó" @@ -1144,56 +1157,53 @@ 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:330 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:333 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "API dokumentáció" -#: .\cookbook\templates\base.html:103 .\cookbook\templates\index.html:87 -#: .\cookbook\templates\stats.html:22 +#: .\cookbook\templates\base.html:106 .\cookbook\templates\index.html:87 msgid "Recipes" msgstr "Receptek" -#: .\cookbook\templates\base.html:111 +#: .\cookbook\templates\base.html:114 msgid "Shopping" msgstr "Bevásárlás" -#: .\cookbook\templates\base.html:150 .\cookbook\views\lists.py:105 +#: .\cookbook\templates\base.html:153 .\cookbook\views\lists.py:105 msgid "Foods" msgstr "Ételek" -#: .\cookbook\templates\base.html:162 -#: .\cookbook\templates\forms\ingredients.html:24 -#: .\cookbook\templates\stats.html:26 .\cookbook\views\lists.py:122 +#: .\cookbook\templates\base.html:165 .\cookbook\views\lists.py:122 msgid "Units" msgstr "Egységek" -#: .\cookbook\templates\base.html:176 .\cookbook\templates\supermarket.html:7 +#: .\cookbook\templates\base.html:179 .\cookbook\templates\supermarket.html:7 msgid "Supermarket" msgstr "Szupermarket" -#: .\cookbook\templates\base.html:188 +#: .\cookbook\templates\base.html:191 msgid "Supermarket Category" msgstr "Szupermarket kategória" -#: .\cookbook\templates\base.html:200 .\cookbook\views\lists.py:171 +#: .\cookbook\templates\base.html:203 .\cookbook\views\lists.py:171 msgid "Automations" msgstr "Automatizációk" -#: .\cookbook\templates\base.html:214 .\cookbook\views\lists.py:207 +#: .\cookbook\templates\base.html:217 .\cookbook\views\lists.py:207 msgid "Files" msgstr "Fájlok" -#: .\cookbook\templates\base.html:226 +#: .\cookbook\templates\base.html:229 msgid "Batch Edit" msgstr "Csoportos szerkesztés" -#: .\cookbook\templates\base.html:238 .\cookbook\templates\history.html:6 +#: .\cookbook\templates\base.html:241 .\cookbook\templates\history.html:6 #: .\cookbook\templates\history.html:14 msgid "History" msgstr "Előzmények" -#: .\cookbook\templates\base.html:252 +#: .\cookbook\templates\base.html:255 #: .\cookbook\templates\ingredient_editor.html:7 #: .\cookbook\templates\ingredient_editor.html:13 #, fuzzy @@ -1201,76 +1211,74 @@ msgstr "Előzmények" msgid "Ingredient Editor" msgstr "Hozzávalók" -#: .\cookbook\templates\base.html:264 +#: .\cookbook\templates\base.html:267 #: .\cookbook\templates\export_response.html:7 #: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 msgid "Export" msgstr "Export" -#: .\cookbook\templates\base.html:280 .\cookbook\templates\index.html:47 +#: .\cookbook\templates\base.html:283 .\cookbook\templates\index.html:47 msgid "Import Recipe" msgstr "Recept importálása" -#: .\cookbook\templates\base.html:282 +#: .\cookbook\templates\base.html:285 msgid "Create" msgstr "Létrehozás" -#: .\cookbook\templates\base.html:295 +#: .\cookbook\templates\base.html:298 #: .\cookbook\templates\generic\list_template.html:14 -#: .\cookbook\templates\stats.html:43 msgid "External Recipes" msgstr "Külső receptek" -#: .\cookbook\templates\base.html:298 -#: .\cookbook\templates\space_manage.html:15 +#: .\cookbook\templates\base.html:301 .\cookbook\templates\space_manage.html:15 msgid "Space Settings" msgstr "Tér beállítások" -#: .\cookbook\templates\base.html:303 .\cookbook\templates\system.html:13 +#: .\cookbook\templates\base.html:306 .\cookbook\templates\system.html:13 msgid "System" msgstr "Rendszer" -#: .\cookbook\templates\base.html:305 +#: .\cookbook\templates\base.html:308 msgid "Admin" msgstr "Admin" -#: .\cookbook\templates\base.html:309 +#: .\cookbook\templates\base.html:312 #: .\cookbook\templates\space_overview.html:25 #, fuzzy #| msgid "No Space" msgid "Your Spaces" msgstr "Nincs hely" -#: .\cookbook\templates\base.html:320 +#: .\cookbook\templates\base.html:323 #: .\cookbook\templates\space_overview.html:6 msgid "Overview" msgstr "" -#: .\cookbook\templates\base.html:324 +#: .\cookbook\templates\base.html:327 msgid "Markdown Guide" msgstr "Markdown útmutató" -#: .\cookbook\templates\base.html:326 +#: .\cookbook\templates\base.html:329 msgid "GitHub" msgstr "GitHub" -#: .\cookbook\templates\base.html:328 +#: .\cookbook\templates\base.html:331 msgid "Translate Tandoor" msgstr "Tandoor fordítása" -#: .\cookbook\templates\base.html:332 +#: .\cookbook\templates\base.html:335 msgid "API Browser" msgstr "API böngésző" -#: .\cookbook\templates\base.html:335 +#: .\cookbook\templates\base.html:338 msgid "Log out" msgstr "Kijelentkezés" -#: .\cookbook\templates\base.html:357 +#: .\cookbook\templates\base.html:360 msgid "You are using the free version of Tandor" msgstr "" -#: .\cookbook\templates\base.html:358 +#: .\cookbook\templates\base.html:361 msgid "Upgrade Now" msgstr "" @@ -1312,11 +1320,7 @@ msgstr "Az elérési útnak a következő formátumúnak kell lennie" #: .\cookbook\templates\forms\edit_import_recipe.html:14 #: .\cookbook\templates\generic\edit_template.html:23 #: .\cookbook\templates\generic\new_template.html:23 -#: .\cookbook\templates\settings.html:70 -#: .\cookbook\templates\settings.html:112 -#: .\cookbook\templates\settings.html:130 -#: .\cookbook\templates\settings.html:202 -#: .\cookbook\templates\settings.html:213 +#: .\cookbook\templates\settings.html:57 msgid "Save" msgstr "Mentés" @@ -1366,41 +1370,6 @@ msgstr "Új recept importálása" msgid "Edit Recipe" msgstr "Recept szerkesztése" -#: .\cookbook\templates\forms\ingredients.html:15 -msgid "Edit Ingredients" -msgstr "Összetevők szerkesztése" - -#: .\cookbook\templates\forms\ingredients.html:16 -msgid "" -"\n" -" The following form can be used if, accidentally, two (or more) units " -"or ingredients where created that should be\n" -" the same.\n" -" It merges two units or ingredients and updates all recipes using " -"them.\n" -" " -msgstr "" -"\n" -" A következő űrlapot akkor lehet használni, ha véletlenül két (vagy " -"több) olyan egység vagy összetevő jött létre,\n" -" amelyeknek azonosnak kellene lennie.\n" -" Összevon két egységet vagy összetevőt, és frissíti az ezeket " -"használó összes receptet.\n" -" " - -#: .\cookbook\templates\forms\ingredients.html:26 -msgid "Are you sure that you want to merge these two units?" -msgstr "Biztos, hogy össze akarja vonni ezt a két egységet?" - -#: .\cookbook\templates\forms\ingredients.html:31 -#: .\cookbook\templates\forms\ingredients.html:40 -msgid "Merge" -msgstr "Egyesítés" - -#: .\cookbook\templates\forms\ingredients.html:36 -msgid "Are you sure that you want to merge these two ingredients?" -msgstr "Biztos vagy benne, hogy ezt a két összetevőt szeretnéd egyesíteni?" - #: .\cookbook\templates\generic\delete_template.html:21 #, python-format msgid "Are you sure you want to delete the %(title)s: %(object)s " @@ -1422,6 +1391,11 @@ msgstr "Kaszkád" msgid "Cancel" msgstr "Mégsem" +#: .\cookbook\templates\generic\edit_template.html:6 +#: .\cookbook\templates\generic\edit_template.html:14 +msgid "Edit" +msgstr "Szerkesztés" + #: .\cookbook\templates\generic\edit_template.html:32 msgid "View" msgstr "Megtekintés" @@ -1443,13 +1417,16 @@ msgstr "Szűrő" msgid "Import all" msgstr "Importáljon mindent" +#: .\cookbook\templates\generic\new_template.html:6 +#: .\cookbook\templates\generic\new_template.html:14 +msgid "New" +msgstr "Új" + #: .\cookbook\templates\generic\table_template.html:76 -#: .\cookbook\templates\recipes_table.html:121 msgid "previous" msgstr "előző" #: .\cookbook\templates\generic\table_template.html:98 -#: .\cookbook\templates\recipes_table.html:143 msgid "next" msgstr "következő" @@ -1461,24 +1438,11 @@ msgstr "Napló megtekintése" msgid "Cook Log" msgstr "Főzési napló" -#: .\cookbook\templates\import.html:6 -msgid "Import Recipes" -msgstr "Receptek importálása" - -#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 #: .\cookbook\templates\import_response.html:7 .\cookbook\views\delete.py:86 #: .\cookbook\views\edit.py:191 msgid "Import" msgstr "Importálás" -#: .\cookbook\templates\include\recipe_open_modal.html:18 -msgid "Close" -msgstr "Bezár" - -#: .\cookbook\templates\include\recipe_open_modal.html:32 -msgid "Open Recipe" -msgstr "Recept megnyitása" - #: .\cookbook\templates\include\storage_backend_warning.html:4 msgid "Security Warning" msgstr "Biztonsági figyelmeztetés" @@ -1507,7 +1471,7 @@ msgstr "" #: .\cookbook\templates\index.html:29 msgid "Search recipe ..." -msgstr "Recept keresése..." +msgstr "Recept keresése ..." #: .\cookbook\templates\index.html:44 msgid "New Recipe" @@ -1690,31 +1654,6 @@ msgstr "Fejléc" msgid "Cell" msgstr "Cella" -#: .\cookbook\templates\meal_plan_entry.html:6 -msgid "Meal Plan View" -msgstr "Étkezési terv nézet" - -#: .\cookbook\templates\meal_plan_entry.html:18 -msgid "Created by" -msgstr "Létrehozta" - -#: .\cookbook\templates\meal_plan_entry.html:20 -msgid "Shared with" -msgstr "Megosztva" - -#: .\cookbook\templates\meal_plan_entry.html:48 -#: .\cookbook\templates\recipes_table.html:64 -msgid "Last cooked" -msgstr "Utoljára főzve" - -#: .\cookbook\templates\meal_plan_entry.html:50 -msgid "Never cooked before." -msgstr "Soha nem főzött még." - -#: .\cookbook\templates\meal_plan_entry.html:76 -msgid "Other meals on this day" -msgstr "Egyéb ételek ezen a napon" - #: .\cookbook\templates\no_groups_info.html:5 #: .\cookbook\templates\no_groups_info.html:12 msgid "No Permissions" @@ -1764,43 +1703,26 @@ msgstr "" msgid "Back" msgstr "" -#: .\cookbook\templates\recipe_view.html:26 +#: .\cookbook\templates\profile.html:7 +msgid "Profile" +msgstr "" + +#: .\cookbook\templates\recipe_view.html:41 msgid "by" msgstr "által" -#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:144 +#: .\cookbook\templates\recipe_view.html:59 .\cookbook\views\delete.py:144 #: .\cookbook\views\edit.py:171 msgid "Comment" msgstr "Megjegyzés" -#: .\cookbook\templates\recipes_table.html:19 -#: .\cookbook\templates\recipes_table.html:23 -msgid "Recipe Image" -msgstr "Recept kép" - -#: .\cookbook\templates\recipes_table.html:51 -msgid "Preparation time ca." -msgstr "Elkészítési idő kb." - -#: .\cookbook\templates\recipes_table.html:57 -msgid "Waiting time ca." -msgstr "Várakozási idő kb." - -#: .\cookbook\templates\recipes_table.html:60 -msgid "External" -msgstr "Külső" - -#: .\cookbook\templates\recipes_table.html:86 -msgid "Log Cooking" -msgstr "Főzés naplózása" - #: .\cookbook\templates\rest_framework\api.html:5 msgid "Recipe Home" msgstr "Recipe Home" #: .\cookbook\templates\search_info.html:5 #: .\cookbook\templates\search_info.html:9 -#: .\cookbook\templates\settings.html:172 +#: .\cookbook\templates\settings.html:24 msgid "Search Settings" msgstr "Keresési beállítások" @@ -2099,76 +2021,7 @@ msgstr "" "rebuildindex' parancs végrehajtásával.\n" " " -#: .\cookbook\templates\settings.html:28 -msgid "Account" -msgstr "Fiók" - -#: .\cookbook\templates\settings.html:35 -msgid "Preferences" -msgstr "Beállítások" - -#: .\cookbook\templates\settings.html:42 -msgid "API-Settings" -msgstr "API beállítások" - -#: .\cookbook\templates\settings.html:49 -msgid "Search-Settings" -msgstr "Keresési beállítások" - -#: .\cookbook\templates\settings.html:56 -msgid "Shopping-Settings" -msgstr "Bevásárlási beállítások" - -#: .\cookbook\templates\settings.html:65 -msgid "Name Settings" -msgstr "Név beállításai" - -#: .\cookbook\templates\settings.html:73 -msgid "Account Settings" -msgstr "Fiók beállítások" - -#: .\cookbook\templates\settings.html:75 -msgid "Emails" -msgstr "E-mailek" - -#: .\cookbook\templates\settings.html:78 -#: .\cookbook\templates\socialaccount\connections.html:11 -msgid "Social" -msgstr "Social" - -#: .\cookbook\templates\settings.html:91 -msgid "Language" -msgstr "Nyelv" - -#: .\cookbook\templates\settings.html:121 -msgid "Style" -msgstr "Kinézet" - -#: .\cookbook\templates\settings.html:142 -msgid "API Token" -msgstr "API Token" - -#: .\cookbook\templates\settings.html:143 -msgid "" -"You can use both basic authentication and token based authentication to " -"access the REST API." -msgstr "" -"A REST API-hoz való hozzáféréshez alapszintű és tokenalapú hitelesítést is " -"használhat." - -#: .\cookbook\templates\settings.html:160 -msgid "" -"Use the token as an Authorization header prefixed by the word token as shown " -"in the following examples:" -msgstr "" -"Használja a tokent Engedélyezés fejlécként a token szó előtaggal, ahogy a " -"következő példákban látható:" - -#: .\cookbook\templates\settings.html:162 -msgid "or" -msgstr "vagy" - -#: .\cookbook\templates\settings.html:173 +#: .\cookbook\templates\settings.html:25 msgid "" "There are many options to configure the search depending on your personal " "preferences." @@ -2176,7 +2029,7 @@ msgstr "" "Számos lehetőség van a keresés konfigurálására a te személyes " "preferenciáidtól függően." -#: .\cookbook\templates\settings.html:174 +#: .\cookbook\templates\settings.html:26 msgid "" "Usually you do not need to configure any of them and can just stick " "with either the default or one of the following presets." @@ -2184,7 +2037,7 @@ msgstr "" "Általában nem kell egyiket sem konfigurálnod, és maradhatsz az " "alapértelmezett vagy az alábbi beállítások valamelyikénél." -#: .\cookbook\templates\settings.html:175 +#: .\cookbook\templates\settings.html:27 msgid "" "If you do want to configure the search you can read about the different " "options here." @@ -2192,11 +2045,11 @@ msgstr "" "Ha mégis konfigurálni szeretné a keresést, a különböző lehetőségekről itt olvashat." -#: .\cookbook\templates\settings.html:180 +#: .\cookbook\templates\settings.html:32 msgid "Fuzzy" msgstr "Bizonytalan" -#: .\cookbook\templates\settings.html:181 +#: .\cookbook\templates\settings.html:33 msgid "" "Find what you need even if your search or the recipe contains typos. Might " "return more results than needed to make sure you find what you are looking " @@ -2206,20 +2059,19 @@ msgstr "" "elírásokat tartalmaz. Lehet, hogy a szükségesnél több találatot ad vissza, " "hogy biztosan megtalálja, amit keres." -#: .\cookbook\templates\settings.html:182 +#: .\cookbook\templates\settings.html:34 msgid "This is the default behavior" msgstr "Ez az alapértelmezett viselkedés" -#: .\cookbook\templates\settings.html:183 -#: .\cookbook\templates\settings.html:191 +#: .\cookbook\templates\settings.html:37 .\cookbook\templates\settings.html:46 msgid "Apply" msgstr "Alkalmazás" -#: .\cookbook\templates\settings.html:188 +#: .\cookbook\templates\settings.html:42 msgid "Precise" msgstr "Pontos" -#: .\cookbook\templates\settings.html:189 +#: .\cookbook\templates\settings.html:43 msgid "" "Allows fine control over search results but might not return results if too " "many spelling mistakes are made." @@ -2227,14 +2079,10 @@ msgstr "" "Lehetővé teszi a keresési eredmények finom ellenőrzését, de előfordulhat, " "hogy nem ad vissza eredményeket, ha túl sok helyesírási hiba van." -#: .\cookbook\templates\settings.html:190 +#: .\cookbook\templates\settings.html:44 msgid "Perfect for large Databases" msgstr "Tökéletes nagy adatbázisokhoz" -#: .\cookbook\templates\settings.html:207 -msgid "Shopping Settings" -msgstr "Bevásárlási beállítások" - #: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5 msgid "Cookbook Setup" msgstr "Receptkönyv beállítása" @@ -2273,6 +2121,10 @@ msgstr "Hiba történt az áthelyezés közben " msgid "Account Connections" msgstr "Fiókkapcsolatok" +#: .\cookbook\templates\socialaccount\connections.html:11 +msgid "Social" +msgstr "Social" + #: .\cookbook\templates\socialaccount\connections.html:18 msgid "" "You can sign in to your account using any of the following third party\n" @@ -2376,26 +2228,26 @@ msgid "" "You can either be invited into an existing space or create your own one." msgstr "Meghívást kaphatsz egy meglévő térbe, vagy létrehozhatod a sajátodat." -#: .\cookbook\templates\space_overview.html:45 +#: .\cookbook\templates\space_overview.html:53 msgid "Owner" msgstr "" -#: .\cookbook\templates\space_overview.html:49 +#: .\cookbook\templates\space_overview.html:57 #, fuzzy #| msgid "Create Space" msgid "Leave Space" msgstr "Tér létrehozása" -#: .\cookbook\templates\space_overview.html:70 -#: .\cookbook\templates\space_overview.html:80 +#: .\cookbook\templates\space_overview.html:78 +#: .\cookbook\templates\space_overview.html:88 msgid "Join Space" msgstr "Csatlakozz a térhez" -#: .\cookbook\templates\space_overview.html:73 +#: .\cookbook\templates\space_overview.html:81 msgid "Join an existing space." msgstr "Csatlakozz egy meglévő térhez." -#: .\cookbook\templates\space_overview.html:75 +#: .\cookbook\templates\space_overview.html:83 msgid "" "To join an existing space either enter your invite token or click on the " "invite link the space owner send you." @@ -2403,47 +2255,19 @@ msgstr "" "Egy meglévő térhez való csatlakozáshoz add meg a meghívó tokenedet, vagy " "kattints a meghívó linkre, amelyet a tér tulajdonosa küldött neked." -#: .\cookbook\templates\space_overview.html:88 -#: .\cookbook\templates\space_overview.html:97 +#: .\cookbook\templates\space_overview.html:96 +#: .\cookbook\templates\space_overview.html:105 msgid "Create Space" msgstr "Tér létrehozása" -#: .\cookbook\templates\space_overview.html:91 +#: .\cookbook\templates\space_overview.html:99 msgid "Create your own recipe space." msgstr "Hozzon létre saját receptteret." -#: .\cookbook\templates\space_overview.html:93 +#: .\cookbook\templates\space_overview.html:101 msgid "Start your own recipe space and invite other users to it." msgstr "Indítsd el a saját receptteredet, és hívj meg oda más felhasználókat." -#: .\cookbook\templates\stats.html:4 -msgid "Stats" -msgstr "Statisztikák" - -#: .\cookbook\templates\stats.html:10 -msgid "Statistics" -msgstr "Statisztikák" - -#: .\cookbook\templates\stats.html:19 -msgid "Number of objects" -msgstr "Objektumok száma" - -#: .\cookbook\templates\stats.html:30 -msgid "Recipe Imports" -msgstr "Recept importálás" - -#: .\cookbook\templates\stats.html:38 -msgid "Objects stats" -msgstr "Objektumok statisztikái" - -#: .\cookbook\templates\stats.html:41 -msgid "Recipes without Keywords" -msgstr "Receptek kulcsszavak nélkül" - -#: .\cookbook\templates\stats.html:45 -msgid "Internal Recipes" -msgstr "Belső receptek" - #: .\cookbook\templates\system.html:20 msgid "System Information" msgstr "Rendszerinformáció" @@ -2576,74 +2400,83 @@ msgstr "" msgid "URL Import" msgstr "URL importálása" -#: .\cookbook\views\api.py:105 .\cookbook\views\api.py:197 +#: .\cookbook\views\api.py:110 .\cookbook\views\api.py:202 msgid "Parameter updated_at incorrectly formatted" msgstr "Az updated_at paraméter helytelenül van formázva" -#: .\cookbook\views\api.py:217 .\cookbook\views\api.py:320 +#: .\cookbook\views\api.py:222 .\cookbook\views\api.py:325 +#, python-brace-format msgid "No {self.basename} with id {pk} exists" msgstr "Nem létezik {self.basename} azonosítóval {pk}" -#: .\cookbook\views\api.py:221 +#: .\cookbook\views\api.py:226 msgid "Cannot merge with the same object!" msgstr "Nem egyesíthető ugyanazzal az objektummal!" -#: .\cookbook\views\api.py:228 +#: .\cookbook\views\api.py:233 +#, python-brace-format msgid "No {self.basename} with id {target} exists" msgstr "Nem létezik {self.basename} azonosítóval {target}" -#: .\cookbook\views\api.py:233 +#: .\cookbook\views\api.py:238 msgid "Cannot merge with child object!" msgstr "Nem lehet egyesíteni a gyermekobjektummal!" -#: .\cookbook\views\api.py:266 +#: .\cookbook\views\api.py:271 +#, python-brace-format msgid "{source.name} was merged successfully with {target.name}" msgstr "{source.name} sikeresen egyesült a {target.name} -vel" -#: .\cookbook\views\api.py:271 +#: .\cookbook\views\api.py:276 +#, python-brace-format 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:329 +#: .\cookbook\views\api.py:334 +#, python-brace-format msgid "{child.name} was moved successfully to the root." msgstr "{child.name} sikeresen átkerült a gyökérbe." -#: .\cookbook\views\api.py:332 .\cookbook\views\api.py:350 +#: .\cookbook\views\api.py:337 .\cookbook\views\api.py:355 msgid "An error occurred attempting to move " msgstr "Hiba történt az áthelyezés közben " -#: .\cookbook\views\api.py:335 +#: .\cookbook\views\api.py:340 msgid "Cannot move an object to itself!" msgstr "Nem lehet egy objektumot önmagába mozgatni!" -#: .\cookbook\views\api.py:341 +#: .\cookbook\views\api.py:346 +#, python-brace-format msgid "No {self.basename} with id {parent} exists" msgstr "Nem létezik {self.basename} azonosítóval {parent}" -#: .\cookbook\views\api.py:347 +#: .\cookbook\views\api.py:352 +#, python-brace-format 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:542 +#: .\cookbook\views\api.py:553 +#, python-brace-format 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:547 .\cookbook\views\api.py:879 -#: .\cookbook\views\api.py:892 +#: .\cookbook\views\api.py:558 .\cookbook\views\api.py:888 +#: .\cookbook\views\api.py:901 +#, python-brace-format 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:674 +#: .\cookbook\views\api.py:685 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:676 +#: .\cookbook\views\api.py:687 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:720 +#: .\cookbook\views\api.py:731 msgid "" "Query string matched (fuzzy) against recipe name. In the future also " "fulltext search." @@ -2651,7 +2484,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:722 +#: .\cookbook\views\api.py:733 #, fuzzy #| msgid "ID of keyword a recipe should have. For multiple repeat parameter." msgid "" @@ -2660,132 +2493,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:725 +#: .\cookbook\views\api.py:736 msgid "" "Keyword IDs, repeat for multiple. Return recipes with any of the keywords" msgstr "" -#: .\cookbook\views\api.py:728 +#: .\cookbook\views\api.py:739 msgid "" "Keyword IDs, repeat for multiple. Return recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:742 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords." msgstr "" -#: .\cookbook\views\api.py:734 +#: .\cookbook\views\api.py:745 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:736 +#: .\cookbook\views\api.py:747 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:739 +#: .\cookbook\views\api.py:750 msgid "Food IDs, repeat for multiple. Return recipes with any of the foods" msgstr "" -#: .\cookbook\views\api.py:741 +#: .\cookbook\views\api.py:752 msgid "Food IDs, repeat for multiple. Return recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:743 +#: .\cookbook\views\api.py:754 msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods." msgstr "" -#: .\cookbook\views\api.py:745 +#: .\cookbook\views\api.py:756 msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:746 +#: .\cookbook\views\api.py:757 msgid "ID of unit a recipe should have." msgstr "Az egység azonosítója, amellyel a receptnek rendelkeznie kell." -#: .\cookbook\views\api.py:748 +#: .\cookbook\views\api.py:759 msgid "" "Rating a recipe should have or greater. [0 - 5] Negative value filters " "rating less than." msgstr "" -#: .\cookbook\views\api.py:749 +#: .\cookbook\views\api.py:760 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:751 +#: .\cookbook\views\api.py:762 msgid "Book IDs, repeat for multiple. Return recipes with any of the books" msgstr "" -#: .\cookbook\views\api.py:753 +#: .\cookbook\views\api.py:764 msgid "Book IDs, repeat for multiple. Return recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:755 +#: .\cookbook\views\api.py:766 msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books." msgstr "" -#: .\cookbook\views\api.py:757 +#: .\cookbook\views\api.py:768 msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:759 +#: .\cookbook\views\api.py:770 msgid "If only internal recipes should be returned. [true/false]" msgstr "Ha csak a belső recepteket kell visszaadni. [true/false]" -#: .\cookbook\views\api.py:761 +#: .\cookbook\views\api.py:772 msgid "Returns the results in randomized order. [true/false]" msgstr "" "Az eredményeket véletlenszerű sorrendben adja vissza. [true/false]" -#: .\cookbook\views\api.py:763 +#: .\cookbook\views\api.py:774 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:765 +#: .\cookbook\views\api.py:776 msgid "" "Filter recipes cooked X times or more. Negative values returns cooked less " "than X times" msgstr "" -#: .\cookbook\views\api.py:767 +#: .\cookbook\views\api.py:778 msgid "" "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:769 +#: .\cookbook\views\api.py:780 msgid "" "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:771 +#: .\cookbook\views\api.py:782 msgid "" "Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:773 +#: .\cookbook\views\api.py:784 msgid "" "Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:775 +#: .\cookbook\views\api.py:786 #, 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:937 +#: .\cookbook\views\api.py:946 msgid "" "Returns the shopping list entry with a primary key of id. Multiple values " "allowed." @@ -2793,57 +2626,61 @@ msgstr "" "Visszaadja az id elsődleges kulccsal rendelkező bevásárlólista-bejegyzést. " "Több érték megengedett." -#: .\cookbook\views\api.py:942 +#: .\cookbook\views\api.py:951 msgid "" -"Filter shopping list entries on checked. [true, false, both, recent]" -"
    - recent includes unchecked items and recently completed items." +"Filter shopping list entries on checked. [true, false, both, recent]
    - recent includes unchecked items and recently completed items." msgstr "" "A bevásárlólista bejegyzéseinek szűrése a bejelölt oldalon. [true, false, " "mindkettő, legutóbbi]
    – a legutóbbi a nem bejelölt és a nemrég " "befejezett elemeket tartalmazza." -#: .\cookbook\views\api.py:945 +#: .\cookbook\views\api.py:954 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:1140 +#: .\cookbook\views\api.py:1166 msgid "Nothing to do." msgstr "Semmi feladat." -#: .\cookbook\views\api.py:1160 +#: .\cookbook\views\api.py:1198 msgid "Invalid Url" msgstr "" -#: .\cookbook\views\api.py:1167 +#: .\cookbook\views\api.py:1205 msgid "Connection Refused." msgstr "Kapcsolat megtagadva." -#: .\cookbook\views\api.py:1172 +#: .\cookbook\views\api.py:1210 msgid "Bad URL Schema." msgstr "" -#: .\cookbook\views\api.py:1195 +#: .\cookbook\views\api.py:1233 #, 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:1303 .\cookbook\views\data.py:28 +#: .\cookbook\views\api.py:1326 .\cookbook\views\import_export.py:117 +msgid "Importing is not implemented for this provider" +msgstr "Az importálás nincs implementálva ennél a szolgáltatónál" + +#: .\cookbook\views\api.py:1372 .\cookbook\views\data.py:31 #: .\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:1325 +#: .\cookbook\views\api.py:1394 msgid "Sync successful!" msgstr "Szinkronizálás sikeres!" -#: .\cookbook\views\api.py:1330 +#: .\cookbook\views\api.py:1399 msgid "Error synchronizing with Storage" msgstr "Hiba szinkronizálás közben a tárolóval" -#: .\cookbook\views\data.py:97 +#: .\cookbook\views\data.py:100 #, python-format msgid "Batch edit done. %(count)d recipe was updated." msgid_plural "Batch edit done. %(count)d Recipes where updated." @@ -2904,11 +2741,7 @@ msgstr "Változások mentve!" msgid "Error saving changes!" msgstr "Hiba a módosítások mentése közben!" -#: .\cookbook\views\import_export.py:111 .\cookbook\views\import_export.py:150 -msgid "Importing is not implemented for this provider" -msgstr "Az importálás nincs implementálva ennél a szolgáltatónál" - -#: .\cookbook\views\import_export.py:137 +#: .\cookbook\views\import_export.py:104 msgid "" "The PDF Exporter is not enabled on this instance as it is still in an " "experimental state." @@ -2958,7 +2791,12 @@ msgstr "Új recept importálva!" msgid "There was an error importing this recipe!" msgstr "Hiba történt a recept importálásakor!" -#: .\cookbook\views\views.py:124 +#: .\cookbook\views\views.py:73 .\cookbook\views\views.py:191 +#: .\cookbook\views\views.py:213 .\cookbook\views\views.py:399 +msgid "This feature is not available in the demo version!" +msgstr "Ez a funkció nem érhető el a demó verzióban!" + +#: .\cookbook\views\views.py:89 msgid "" "You have successfully created your own recipe space. Start by adding some " "recipes or invite other people to join you." @@ -2966,23 +2804,19 @@ msgstr "" "Sikeresen létrehozta saját receptterét. Kezdje el néhány recept " "hozzáadásával, vagy hívjon meg másokat is, hogy csatlakozzanak Önhöz." -#: .\cookbook\views\views.py:178 +#: .\cookbook\views\views.py:143 msgid "You do not have the required permissions to perform this action!" msgstr "Nem rendelkezik a művelet végrehajtásához szükséges jogosultságokkal!" -#: .\cookbook\views\views.py:189 +#: .\cookbook\views\views.py:154 msgid "Comment saved!" msgstr "Megjegyzés mentve!" -#: .\cookbook\views\views.py:264 -msgid "This feature is not available in the demo version!" -msgstr "Ez a funkció nem érhető el a demó verzióban!" - -#: .\cookbook\views\views.py:324 +#: .\cookbook\views\views.py:253 msgid "You must select at least one field to search!" msgstr "Legalább egy mezőt ki kell választania a kereséshez!" -#: .\cookbook\views\views.py:329 +#: .\cookbook\views\views.py:258 msgid "" "To use this search method you must select at least one full text search " "field!" @@ -2990,11 +2824,11 @@ msgstr "" "Ennek a keresési módszernek a használatához legalább egy teljes szöveges " "keresési mezőt ki kell választania!" -#: .\cookbook\views\views.py:333 +#: .\cookbook\views\views.py:262 msgid "Fuzzy search is not compatible with this search method!" msgstr "A bizonytalan keresés nem kompatibilis ezzel a keresési módszerrel!" -#: .\cookbook\views\views.py:463 +#: .\cookbook\views\views.py:338 msgid "" "The setup page can only be used to create the first user! If you have " "forgotten your superuser credentials please consult the django documentation " @@ -3004,27 +2838,27 @@ msgstr "" "elfelejtette a szuperfelhasználói hitelesítő adatait, kérjük, olvassa el a " "django dokumentációját a jelszavak visszaállításáról." -#: .\cookbook\views\views.py:470 +#: .\cookbook\views\views.py:345 msgid "Passwords dont match!" msgstr "A jelszavak nem egyeznek!" -#: .\cookbook\views\views.py:478 +#: .\cookbook\views\views.py:353 msgid "User has been created, please login!" msgstr "A felhasználó létre lett hozva, kérjük, jelentkezzen be!" -#: .\cookbook\views\views.py:494 +#: .\cookbook\views\views.py:369 msgid "Malformed Invite Link supplied!" msgstr "Hibás meghívó linket küldtek!" -#: .\cookbook\views\views.py:510 +#: .\cookbook\views\views.py:386 msgid "Successfully joined space." msgstr "Sikeresen csatlakozott az térhez." -#: .\cookbook\views\views.py:516 +#: .\cookbook\views\views.py:392 msgid "Invite Link not valid or already used!" msgstr "A meghívó link nem érvényes vagy már felhasználásra került!" -#: .\cookbook\views\views.py:530 +#: .\cookbook\views\views.py:409 msgid "" "Reporting share links is not enabled for this instance. Please notify the " "page administrator to report problems." @@ -3032,7 +2866,7 @@ msgstr "" "A megosztási hivatkozások jelentése nem engedélyezett ezen a példányon. " "Kérjük, a problémák jelentéséhez értesítse az oldal adminisztrátorát." -#: .\cookbook\views\views.py:536 +#: .\cookbook\views\views.py:415 msgid "" "Recipe sharing link has been disabled! For additional information please " "contact the page administrator." @@ -3040,6 +2874,169 @@ msgstr "" "A receptmegosztó linket letiltották! További információkért kérjük, " "forduljon az oldal adminisztrátorához." +#~ msgid "Ingredients" +#~ msgstr "Hozzávalók" + +#~ msgid "Show recent recipes" +#~ msgstr "Legutóbbi receptek megjelenítése" + +#~ msgid "Search style" +#~ msgstr "Keresés stílusa" + +#~ msgid "Show recently viewed recipes on search page." +#~ msgstr "Nemrég megtekintett receptek megjelenítése a keresési oldalon." + +#~ msgid "Small" +#~ msgstr "Kicsi" + +#~ msgid "Large" +#~ msgstr "Nagy" + +#~ msgid "Edit Ingredients" +#~ msgstr "Összetevők szerkesztése" + +#~ msgid "" +#~ "\n" +#~ " The following form can be used if, accidentally, two (or more) " +#~ "units or ingredients where created that should be\n" +#~ " the same.\n" +#~ " It merges two units or ingredients and updates all recipes using " +#~ "them.\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ " A következő űrlapot akkor lehet használni, ha véletlenül két " +#~ "(vagy több) olyan egység vagy összetevő jött létre,\n" +#~ " amelyeknek azonosnak kellene lennie.\n" +#~ " Összevon két egységet vagy összetevőt, és frissíti az ezeket " +#~ "használó összes receptet.\n" +#~ " " + +#~ msgid "Are you sure that you want to merge these two units?" +#~ msgstr "Biztos, hogy össze akarja vonni ezt a két egységet?" + +#~ msgid "Merge" +#~ msgstr "Egyesítés" + +#~ msgid "Are you sure that you want to merge these two ingredients?" +#~ msgstr "Biztos vagy benne, hogy ezt a két összetevőt szeretnéd egyesíteni?" + +#~ msgid "Import Recipes" +#~ msgstr "Receptek importálása" + +#~ msgid "Close" +#~ msgstr "Bezár" + +#~ msgid "Open Recipe" +#~ msgstr "Recept megnyitása" + +#~ msgid "Meal Plan View" +#~ msgstr "Étkezési terv nézet" + +#~ msgid "Created by" +#~ msgstr "Létrehozta" + +#~ msgid "Shared with" +#~ msgstr "Megosztva" + +#~ msgid "Last cooked" +#~ msgstr "Utoljára főzve" + +#~ msgid "Never cooked before." +#~ msgstr "Soha nem főzött még." + +#~ msgid "Other meals on this day" +#~ msgstr "Egyéb ételek ezen a napon" + +#~ msgid "Recipe Image" +#~ msgstr "Recept kép" + +#~ msgid "Preparation time ca." +#~ msgstr "Elkészítési idő kb." + +#~ msgid "Waiting time ca." +#~ msgstr "Várakozási idő kb." + +#~ msgid "External" +#~ msgstr "Külső" + +#~ msgid "Log Cooking" +#~ msgstr "Főzés naplózása" + +#~ msgid "Account" +#~ msgstr "Fiók" + +#~ msgid "Preferences" +#~ msgstr "Beállítások" + +#~ msgid "API-Settings" +#~ msgstr "API beállítások" + +#~ msgid "Search-Settings" +#~ msgstr "Keresési beállítások" + +#~ msgid "Shopping-Settings" +#~ msgstr "Bevásárlási beállítások" + +#~ msgid "Name Settings" +#~ msgstr "Név beállításai" + +#~ msgid "Account Settings" +#~ msgstr "Fiók beállítások" + +#~ msgid "Emails" +#~ msgstr "E-mailek" + +#~ msgid "Language" +#~ msgstr "Nyelv" + +#~ msgid "Style" +#~ msgstr "Kinézet" + +#~ msgid "API Token" +#~ msgstr "API Token" + +#~ msgid "" +#~ "You can use both basic authentication and token based authentication to " +#~ "access the REST API." +#~ msgstr "" +#~ "A REST API-hoz való hozzáféréshez alapszintű és tokenalapú hitelesítést " +#~ "is használhat." + +#~ msgid "" +#~ "Use the token as an Authorization header prefixed by the word token as " +#~ "shown in the following examples:" +#~ msgstr "" +#~ "Használja a tokent Engedélyezés fejlécként a token szó előtaggal, ahogy a " +#~ "következő példákban látható:" + +#~ msgid "or" +#~ msgstr "vagy" + +#~ msgid "Shopping Settings" +#~ msgstr "Bevásárlási beállítások" + +#~ msgid "Stats" +#~ msgstr "Statisztikák" + +#~ msgid "Statistics" +#~ msgstr "Statisztikák" + +#~ msgid "Number of objects" +#~ msgstr "Objektumok száma" + +#~ msgid "Recipe Imports" +#~ msgstr "Recept importálás" + +#~ msgid "Objects stats" +#~ msgstr "Objektumok statisztikái" + +#~ msgid "Recipes without Keywords" +#~ msgstr "Receptek kulcsszavak nélkül" + +#~ msgid "Internal Recipes" +#~ msgstr "Belső receptek" + #~ msgid "Show Links" #~ msgstr "Linkek megjelenítése" @@ -3196,9 +3193,6 @@ msgstr "" #~ msgid "Text dragged here will be appended to the name." #~ msgstr "Az ide húzott szöveg a névhez lesz csatolva." -#~ msgid "Description" -#~ msgstr "Leírás" - #~ msgid "Text dragged here will be appended to the description." #~ msgstr "Az ide húzott szöveg hozzá lesz csatolva a leíráshoz." @@ -3219,9 +3213,6 @@ msgstr "" #~ msgstr "" #~ "Az ide húzott összetevők hozzá lesznek csatolva az aktuális listához." -#~ msgid "Instructions" -#~ msgstr "Elkészítés" - #~ msgid "" #~ "Recipe instructions dragged here will be appended to current instructions." #~ msgstr "" diff --git a/cookbook/locale/hy/LC_MESSAGES/django.mo b/cookbook/locale/hy/LC_MESSAGES/django.mo index 30fefc017..0db4aa859 100644 Binary files a/cookbook/locale/hy/LC_MESSAGES/django.mo and b/cookbook/locale/hy/LC_MESSAGES/django.mo differ diff --git a/cookbook/locale/hy/LC_MESSAGES/django.po b/cookbook/locale/hy/LC_MESSAGES/django.po index 968c6aa90..09de4d2a0 100644 --- a/cookbook/locale/hy/LC_MESSAGES/django.po +++ b/cookbook/locale/hy/LC_MESSAGES/django.po @@ -11,8 +11,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-02-09 18:01+0100\n" -"PO-Revision-Date: 2021-10-13 12:50+0000\n" -"Last-Translator: Hrachya Kocharyan \n" +"PO-Revision-Date: 2023-01-08 17:55+0000\n" +"Last-Translator: Joachim Weber \n" "Language-Team: Armenian \n" "Language: hy\n" @@ -20,7 +20,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Weblate 4.8\n" +"X-Generator: Weblate 4.15\n" #: .\cookbook\filters.py:22 .\cookbook\templates\base.html:87 #: .\cookbook\templates\forms\edit_internal_recipe.html:219 @@ -410,7 +410,7 @@ msgstr "Դուրս գալ" #: .\cookbook\templates\account\logout.html:11 msgid "Are you sure you want to sign out?" -msgstr "Համոզվա՞ծ եք, որ ցանկանում եք դուրս գալ:" +msgstr "Համոզվա՞ծ եք, որ ցանկանում եք դուրս գալ՞" #: .\cookbook\templates\account\password_reset.html:5 #: .\cookbook\templates\account\password_reset_done.html:5 diff --git a/cookbook/locale/id/LC_MESSAGES/django.mo b/cookbook/locale/id/LC_MESSAGES/django.mo index 8e0589858..a34a4b024 100644 Binary files a/cookbook/locale/id/LC_MESSAGES/django.mo and b/cookbook/locale/id/LC_MESSAGES/django.mo differ diff --git a/cookbook/locale/it/LC_MESSAGES/django.mo b/cookbook/locale/it/LC_MESSAGES/django.mo index b12ec2689..b9d421921 100644 Binary files a/cookbook/locale/it/LC_MESSAGES/django.mo and b/cookbook/locale/it/LC_MESSAGES/django.mo differ diff --git a/cookbook/locale/it/LC_MESSAGES/django.po b/cookbook/locale/it/LC_MESSAGES/django.po index 523cdccd3..1de1eee82 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-07-12 19:20+0200\n" -"PO-Revision-Date: 2023-01-05 12:55+0000\n" +"POT-Creation-Date: 2023-04-26 07:46+0200\n" +"PO-Revision-Date: 2023-04-29 07:55+0000\n" "Last-Translator: Oliver Cervera \n" "Language-Team: Italian \n" @@ -23,69 +23,55 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.15\n" -#: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 -#: .\cookbook\templates\stats.html:28 -msgid "Ingredients" -msgstr "Ingredienti" - -#: .\cookbook\forms.py:53 +#: .\cookbook\forms.py:52 msgid "Default unit" msgstr "Unità predefinita" -#: .\cookbook\forms.py:54 +#: .\cookbook\forms.py:53 msgid "Use fractions" msgstr "Usa frazioni" -#: .\cookbook\forms.py:55 +#: .\cookbook\forms.py:54 msgid "Use KJ" msgstr "Usa KJ" -#: .\cookbook\forms.py:56 +#: .\cookbook\forms.py:55 msgid "Theme" msgstr "Tema" -#: .\cookbook\forms.py:57 +#: .\cookbook\forms.py:56 msgid "Navbar color" msgstr "Colore barra di navigazione" -#: .\cookbook\forms.py:58 +#: .\cookbook\forms.py:57 msgid "Sticky navbar" msgstr "Barra di navigazione persistente" -#: .\cookbook\forms.py:59 +#: .\cookbook\forms.py:58 msgid "Default page" msgstr "Pagina predefinita" -#: .\cookbook\forms.py:60 -msgid "Show recent recipes" -msgstr "Mostra ricette recenti" - -#: .\cookbook\forms.py:61 -msgid "Search style" -msgstr "Cerca stile" - -#: .\cookbook\forms.py:62 +#: .\cookbook\forms.py:59 msgid "Plan sharing" msgstr "Condivisione piano" -#: .\cookbook\forms.py:63 +#: .\cookbook\forms.py:60 msgid "Ingredient decimal places" msgstr "Posizioni decimali degli ingredienti" -#: .\cookbook\forms.py:64 +#: .\cookbook\forms.py:61 msgid "Shopping list auto sync period" msgstr "Frequenza di sincronizzazione automatica della lista della spesa" -#: .\cookbook\forms.py:65 .\cookbook\templates\recipe_view.html:21 -#: .\cookbook\templates\stats.html:47 +#: .\cookbook\forms.py:62 .\cookbook\templates\recipe_view.html:36 msgid "Comments" msgstr "Commenti" -#: .\cookbook\forms.py:66 +#: .\cookbook\forms.py:63 msgid "Left-handed mode" msgstr "Modalità per mancini" -#: .\cookbook\forms.py:70 +#: .\cookbook\forms.py:67 msgid "" "Color of the top navigation bar. Not all colors work with all themes, just " "try them out!" @@ -93,13 +79,13 @@ msgstr "" "Colore della barra di navigazione in alto. Non tutti i colori funzionano con " "tutti i temi, provali e basta!" -#: .\cookbook\forms.py:72 +#: .\cookbook\forms.py:69 msgid "Default Unit to be used when inserting a new ingredient into a recipe." msgstr "" "Unità di misura predefinita da utilizzare quando si inserisce un nuovo " "ingrediente in una ricetta." -#: .\cookbook\forms.py:74 +#: .\cookbook\forms.py:71 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" @@ -107,38 +93,30 @@ msgstr "" "Abilita il supporto alle frazioni per le quantità degli ingredienti (ad " "esempio converte i decimali in frazioni automaticamente)" -#: .\cookbook\forms.py:76 +#: .\cookbook\forms.py:73 msgid "Display nutritional energy amounts in joules instead of calories" msgstr "Mostra le informazioni nutrizionali in Joule invece che in calorie" -#: .\cookbook\forms.py:77 -#, fuzzy -#| msgid "" -#| "Users with whom newly created meal plan/shopping list entries should be " -#| "shared by default." +#: .\cookbook\forms.py:74 msgid "Users with whom newly created meal plans should be shared by default." msgstr "" -"Gli utenti con i quali le nuove voci del piano alimentare/lista della spesa " -"devono essere condivise per impostazione predefinita." +"Gli utenti con i quali le nuove voci del piano alimentare devono essere " +"condivise per impostazione predefinita." -#: .\cookbook\forms.py:78 +#: .\cookbook\forms.py:75 msgid "Users with whom to share shopping lists." msgstr "Utenti con i quali condividere le liste della spesa." -#: .\cookbook\forms.py:80 -msgid "Show recently viewed recipes on search page." -msgstr "Mostra le ricette visualizzate di recente nella pagina di ricerca." - -#: .\cookbook\forms.py:81 +#: .\cookbook\forms.py:76 msgid "Number of decimals to round ingredients." msgstr "Numero di decimali per approssimare gli ingredienti." -#: .\cookbook\forms.py:82 +#: .\cookbook\forms.py:77 msgid "If you want to be able to create and see comments underneath recipes." msgstr "" "Se vuoi essere in grado di creare e vedere i commenti sotto le ricette." -#: .\cookbook\forms.py:84 .\cookbook\forms.py:496 +#: .\cookbook\forms.py:79 .\cookbook\forms.py:492 msgid "" "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. " @@ -152,25 +130,25 @@ msgstr "" "utilizzare un po' di dati mobili. Se inferiore al limite della istanza, " "viene ripristinato durante il salvataggio." -#: .\cookbook\forms.py:87 +#: .\cookbook\forms.py:82 msgid "Makes the navbar stick to the top of the page." msgstr "Fissa la barra di navigazione nella parte superiore della pagina." -#: .\cookbook\forms.py:88 .\cookbook\forms.py:499 +#: .\cookbook\forms.py:83 .\cookbook\forms.py:495 msgid "Automatically add meal plan ingredients to shopping list." msgstr "" "Aggiungi automaticamente gli ingredienti del piano alimentare alla lista " "della spesa." -#: .\cookbook\forms.py:89 +#: .\cookbook\forms.py:84 msgid "Exclude ingredients that are on hand." msgstr "Escludi gli ingredienti che sono già disponibili." -#: .\cookbook\forms.py:90 +#: .\cookbook\forms.py:85 msgid "Will optimize the UI for use with your left hand." msgstr "L'interfaccia verrà ottimizzata per l'uso con la mano sinistra." -#: .\cookbook\forms.py:107 +#: .\cookbook\forms.py:102 msgid "" "Both fields are optional. If none are given the username will be displayed " "instead" @@ -178,36 +156,35 @@ msgstr "" "Entrambi i campi sono facoltativi. Se non viene fornito, verrà visualizzato " "il nome utente" -#: .\cookbook\forms.py:128 .\cookbook\forms.py:301 +#: .\cookbook\forms.py:123 .\cookbook\forms.py:297 msgid "Name" msgstr "Nome" -#: .\cookbook\forms.py:129 .\cookbook\forms.py:302 -#: .\cookbook\templates\stats.html:24 .\cookbook\views\lists.py:88 +#: .\cookbook\forms.py:124 .\cookbook\forms.py:298 .\cookbook\views\lists.py:88 msgid "Keywords" msgstr "Parole chiave" -#: .\cookbook\forms.py:130 +#: .\cookbook\forms.py:125 msgid "Preparation time in minutes" msgstr "Tempo di preparazione in minuti" -#: .\cookbook\forms.py:131 +#: .\cookbook\forms.py:126 msgid "Waiting time (cooking/baking) in minutes" msgstr "Tempo di attesa (cottura) in minuti" -#: .\cookbook\forms.py:132 .\cookbook\forms.py:270 .\cookbook\forms.py:303 +#: .\cookbook\forms.py:127 .\cookbook\forms.py:266 .\cookbook\forms.py:299 msgid "Path" msgstr "Percorso" -#: .\cookbook\forms.py:133 +#: .\cookbook\forms.py:128 msgid "Storage UID" msgstr "UID di archiviazione" -#: .\cookbook\forms.py:165 +#: .\cookbook\forms.py:161 msgid "Default" msgstr "Predefinito" -#: .\cookbook\forms.py:177 +#: .\cookbook\forms.py:173 msgid "" "To prevent duplicates recipes with the same name as existing ones are " "ignored. Check this box to import everything." @@ -215,20 +192,20 @@ msgstr "" "Per prevenire duplicati, vengono ignorate le ricette che hanno lo stesso " "nome di quelle esistenti. Metti la spunta per importare tutto." -#: .\cookbook\forms.py:200 +#: .\cookbook\forms.py:196 msgid "Add your comment: " msgstr "Aggiungi il tuo commento: " -#: .\cookbook\forms.py:215 +#: .\cookbook\forms.py:211 msgid "Leave empty for dropbox and enter app password for nextcloud." msgstr "" "Lascia vuoto per dropbox e inserisci la password dell'app per nextcloud." -#: .\cookbook\forms.py:222 +#: .\cookbook\forms.py:218 msgid "Leave empty for nextcloud and enter api token for dropbox." msgstr "Lascia vuoto per nextcloud e inserisci l'api token per dropbox." -#: .\cookbook\forms.py:231 +#: .\cookbook\forms.py:227 msgid "" "Leave empty for dropbox and enter only base url for nextcloud (/remote." "php/webdav/ is added automatically)" @@ -236,33 +213,33 @@ msgstr "" "Lascia vuoto per dropbox e inserisci solo l'url base per nextcloud (/" "remote.php/webdav/ è aggiunto automaticamente)" -#: .\cookbook\forms.py:269 .\cookbook\views\edit.py:157 +#: .\cookbook\forms.py:265 .\cookbook\views\edit.py:157 msgid "Storage" msgstr "Archiviazione" -#: .\cookbook\forms.py:271 +#: .\cookbook\forms.py:267 msgid "Active" msgstr "Attivo" -#: .\cookbook\forms.py:277 +#: .\cookbook\forms.py:273 msgid "Search String" msgstr "Stringa di Ricerca" -#: .\cookbook\forms.py:304 +#: .\cookbook\forms.py:300 msgid "File ID" msgstr "ID del File" -#: .\cookbook\forms.py:326 +#: .\cookbook\forms.py:322 msgid "You must provide at least a recipe or a title." msgstr "Devi fornire almeno una ricetta o un titolo." -#: .\cookbook\forms.py:339 +#: .\cookbook\forms.py:335 msgid "You can list default users to share recipes with in the settings." msgstr "" "È possibile visualizzare l'elenco degli utenti predefiniti con cui " "condividere le ricette nelle impostazioni." -#: .\cookbook\forms.py:340 +#: .\cookbook\forms.py:336 msgid "" "You can use markdown to format this field. See the docs here" @@ -270,15 +247,15 @@ msgstr "" "Puoi usare markdown per formattare questo campo. Guarda la documentazione qui" -#: .\cookbook\forms.py:366 +#: .\cookbook\forms.py:362 msgid "Maximum number of users for this space reached." msgstr "È stato raggiunto il numero massimo di utenti per questa istanza." -#: .\cookbook\forms.py:372 +#: .\cookbook\forms.py:368 msgid "Email address already taken!" msgstr "Questo indirizzo email è già in uso!" -#: .\cookbook\forms.py:380 +#: .\cookbook\forms.py:376 msgid "" "An email address is not required but if present the invite link will be sent " "to the user." @@ -286,15 +263,15 @@ msgstr "" "Non è obbligatorio specificare l'indirizzo email, ma se presente verrà " "utilizzato per mandare all'utente un link di invito." -#: .\cookbook\forms.py:395 +#: .\cookbook\forms.py:391 msgid "Name already taken." msgstr "Nome già in uso." -#: .\cookbook\forms.py:406 +#: .\cookbook\forms.py:402 msgid "Accept Terms and Privacy" msgstr "Accetta i Termini d'uso e Privacy" -#: .\cookbook\forms.py:438 +#: .\cookbook\forms.py:434 msgid "" "Determines how fuzzy a search is if it uses trigram similarity matching (e." "g. low values mean more typos are ignored)." @@ -303,11 +280,7 @@ msgstr "" "trigrammi (ad esempio, valori bassi significano che vengono ignorati più " "errori di battitura)." -#: .\cookbook\forms.py:448 -#, fuzzy -#| msgid "" -#| "Select type method of search. Click here " -#| "for full desciption of choices." +#: .\cookbook\forms.py:444 msgid "" "Select type method of search. Click here for " "full description of choices." @@ -315,7 +288,7 @@ msgstr "" "Seleziona il metodo di ricerca. Clicca qui " "per avere maggiori informazioni." -#: .\cookbook\forms.py:449 +#: .\cookbook\forms.py:445 msgid "" "Use fuzzy matching on units, keywords and ingredients when editing and " "importing recipes." @@ -323,7 +296,7 @@ msgstr "" "Usa la corrispondenza vaga per unità, parole chiave e ingredienti durante la " "modifica e l'importazione di ricette." -#: .\cookbook\forms.py:451 +#: .\cookbook\forms.py:447 msgid "" "Fields to search ignoring accents. Selecting this option can improve or " "degrade search quality depending on language" @@ -331,66 +304,68 @@ msgstr "" "Campi da cercare ignorando gli accenti. A seconda alla lingua utilizzata, " "questa opzione può migliorare o peggiorare la ricerca" -#: .\cookbook\forms.py:453 +#: .\cookbook\forms.py:449 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\")" +"Campi da cercare con corrispondenza parziale. (ad esempio, cercando 'Torta' " +"verranno mostrati 'torta', 'tortino' e 'contorta')" -#: .\cookbook\forms.py:455 +#: .\cookbook\forms.py:451 msgid "" "Fields to search for beginning of word matches. (e.g. searching for 'sa' " "will return 'salad' and 'sandwich')" msgstr "" +"Campi da cercare all'inizio di parole corrispondenti (es. cercando per 'ins' " +"mostrerà 'insalata' e 'insaccati')" -#: .\cookbook\forms.py:457 +#: .\cookbook\forms.py:453 msgid "" "Fields to 'fuzzy' search. (e.g. searching for 'recpie' will find 'recipe'.) " "Note: this option will conflict with 'web' and 'raw' methods of search." msgstr "" "Campi in cui usare la ricerca 'vaga'. (ad esempio cercando per 'riceta' " -"verrà mostrato 'ricetta'). Nota: questa opzione non è compatibile con la " +"verrà mostrato 'ricetta'). Nota: questa opzione non è compatibile con la " "ricerca 'web' o 'raw'." -#: .\cookbook\forms.py:459 +#: .\cookbook\forms.py:455 msgid "" "Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " "only function with fulltext fields." msgstr "" +"Campi per la ricerca full-text. Nota: i metodi di ricerca 'web', 'frase' e " +"'raw' funzionano solo con i campi full-text." -#: .\cookbook\forms.py:463 +#: .\cookbook\forms.py:459 msgid "Search Method" msgstr "Metodo di ricerca" -#: .\cookbook\forms.py:464 +#: .\cookbook\forms.py:460 msgid "Fuzzy Lookups" msgstr "Ricerche vaghe" -#: .\cookbook\forms.py:465 +#: .\cookbook\forms.py:461 msgid "Ignore Accent" msgstr "Ignora accento" -#: .\cookbook\forms.py:466 +#: .\cookbook\forms.py:462 msgid "Partial Match" msgstr "Corrispondenza parziale" -#: .\cookbook\forms.py:467 -#, fuzzy -#| msgid "Starts Wtih" +#: .\cookbook\forms.py:463 msgid "Starts With" msgstr "Inizia con" -#: .\cookbook\forms.py:468 +#: .\cookbook\forms.py:464 msgid "Fuzzy Search" msgstr "Ricerca vaga" -#: .\cookbook\forms.py:469 +#: .\cookbook\forms.py:465 msgid "Full Text" msgstr "Full Text" -#: .\cookbook\forms.py:494 +#: .\cookbook\forms.py:490 msgid "" "Users will see all items you add to your shopping list. They must add you " "to see items on their list." @@ -398,7 +373,7 @@ msgstr "" "Gli utenti potranno vedere tutti gli elementi che aggiungi alla tua lista " "della spesa. Devono aggiungerti per vedere gli elementi nella loro lista." -#: .\cookbook\forms.py:500 +#: .\cookbook\forms.py:496 msgid "" "When adding a meal plan to the shopping list (manually or automatically), " "include all related recipes." @@ -406,7 +381,7 @@ msgstr "" "Quando si aggiunge un piano alimentare alla lista della spesa (manualmente o " "automaticamente), includi tutte le ricette correlate." -#: .\cookbook\forms.py:501 +#: .\cookbook\forms.py:497 msgid "" "When adding a meal plan to the shopping list (manually or automatically), " "exclude ingredients that are on hand." @@ -414,99 +389,103 @@ msgstr "" "Quando si aggiunge un piano alimentare alla lista della spesa (manualmente o " "automaticamente), escludi gli ingredienti già disponibili." -#: .\cookbook\forms.py:502 +#: .\cookbook\forms.py:498 msgid "Default number of hours to delay a shopping list entry." msgstr "" +"Il numero predefinito di ore per ritardare l'inserimento di una lista della " +"spesa." -#: .\cookbook\forms.py:503 +#: .\cookbook\forms.py:499 msgid "Filter shopping list to only include supermarket categories." msgstr "" +"Filtra la lista della spesa per includere solo categorie dei supermercati." -#: .\cookbook\forms.py:504 +#: .\cookbook\forms.py:500 msgid "Days of recent shopping list entries to display." -msgstr "" +msgstr "Giorni di visualizzazione di voci recenti della lista della spesa." -#: .\cookbook\forms.py:505 +#: .\cookbook\forms.py:501 msgid "Mark food 'On Hand' when checked off shopping list." msgstr "" "Contrassegna gli alimenti come 'Disponibili' quando spuntati dalla lista " "della spesa." -#: .\cookbook\forms.py:506 +#: .\cookbook\forms.py:502 msgid "Delimiter to use for CSV exports." -msgstr "" +msgstr "Delimitatore usato per le esportazioni CSV." + +#: .\cookbook\forms.py:503 +msgid "Prefix to add when copying list to the clipboard." +msgstr "Prefisso da aggiungere quando si copia una lista negli appunti." #: .\cookbook\forms.py:507 -msgid "Prefix to add when copying list to the clipboard." -msgstr "" - -#: .\cookbook\forms.py:511 -#, fuzzy -#| msgid "New Shopping List" msgid "Share Shopping List" -msgstr "Nuova lista della spesa" +msgstr "Condividi lista della spesa" -#: .\cookbook\forms.py:512 +#: .\cookbook\forms.py:508 msgid "Autosync" -msgstr "" +msgstr "Sincronizzazione automatica" -#: .\cookbook\forms.py:513 +#: .\cookbook\forms.py:509 msgid "Auto Add Meal Plan" -msgstr "" +msgstr "Aggiungi automaticamente al piano alimentare" -#: .\cookbook\forms.py:514 +#: .\cookbook\forms.py:510 msgid "Exclude On Hand" msgstr "Escludi Disponibile" -#: .\cookbook\forms.py:515 +#: .\cookbook\forms.py:511 msgid "Include Related" -msgstr "" +msgstr "Includi correlati" + +#: .\cookbook\forms.py:512 +msgid "Default Delay Hours" +msgstr "Ore di ritardo predefinite" + +#: .\cookbook\forms.py:513 +msgid "Filter to Supermarket" +msgstr "Filtra per supermercato" + +#: .\cookbook\forms.py:514 +msgid "Recent Days" +msgstr "Giorni recenti" + +#: .\cookbook\forms.py:515 +msgid "CSV Delimiter" +msgstr "Delimitatore CSV" #: .\cookbook\forms.py:516 -msgid "Default Delay Hours" -msgstr "" - -#: .\cookbook\forms.py:517 -#, fuzzy -#| msgid "Select Supermarket" -msgid "Filter to Supermarket" -msgstr "Seleziona supermercato" - -#: .\cookbook\forms.py:518 -msgid "Recent Days" -msgstr "" - -#: .\cookbook\forms.py:519 -msgid "CSV Delimiter" -msgstr "" - -#: .\cookbook\forms.py:520 msgid "List Prefix" msgstr "Prefisso lista" -#: .\cookbook\forms.py:521 +#: .\cookbook\forms.py:517 msgid "Auto On Hand" msgstr "Disponibilità automatica" -#: .\cookbook\forms.py:531 +#: .\cookbook\forms.py:527 msgid "Reset Food Inheritance" -msgstr "" +msgstr "Ripristina Eredità Alimenti" -#: .\cookbook\forms.py:532 +#: .\cookbook\forms.py:528 msgid "Reset all food to inherit the fields configured." -msgstr "" +msgstr "Ripristina tutti gli alimenti per ereditare i campi configurati." -#: .\cookbook\forms.py:544 -#, fuzzy -#| msgid "Food that should be replaced." +#: .\cookbook\forms.py:540 msgid "Fields on food that should be inherited by default." -msgstr "Alimento che dovrebbe essere rimpiazzato." +msgstr "" +"Campi su alimenti che devono essere ereditati per impostazione predefinita." -#: .\cookbook\forms.py:545 +#: .\cookbook\forms.py:541 msgid "Show recipe counts on search filters" msgstr "Mostra il conteggio delle ricette nei filtri di ricerca" -#: .\cookbook\helper\AllAuthCustomAdapter.py:36 +#: .\cookbook\forms.py:542 +msgid "Use the plural form for units and food inside this space." +msgstr "" +"Usare la forma plurale per le unità e gli alimenti all'interno di questo " +"spazio." + +#: .\cookbook\helper\AllAuthCustomAdapter.py:39 msgid "" "In order to prevent spam, the requested email was not send. Please wait a " "few minutes and try again." @@ -514,63 +493,90 @@ msgstr "" "Per evitare spam, la mail non è stata inviata. Aspetta qualche minuto e " "riprova." -#: .\cookbook\helper\permission_helper.py:149 -#: .\cookbook\helper\permission_helper.py:172 .\cookbook\views\views.py:152 +#: .\cookbook\helper\permission_helper.py:164 +#: .\cookbook\helper\permission_helper.py:187 .\cookbook\views\views.py:117 msgid "You are not logged in and therefore cannot view this page!" msgstr "Non sei loggato e quindi non puoi visualizzare questa pagina!" -#: .\cookbook\helper\permission_helper.py:153 -#: .\cookbook\helper\permission_helper.py:159 -#: .\cookbook\helper\permission_helper.py:184 -#: .\cookbook\helper\permission_helper.py:254 -#: .\cookbook\helper\permission_helper.py:268 -#: .\cookbook\helper\permission_helper.py:279 -#: .\cookbook\helper\permission_helper.py:290 .\cookbook\views\data.py:33 -#: .\cookbook\views\views.py:163 .\cookbook\views\views.py:170 -#: .\cookbook\views\views.py:249 +#: .\cookbook\helper\permission_helper.py:168 +#: .\cookbook\helper\permission_helper.py:174 +#: .\cookbook\helper\permission_helper.py:199 +#: .\cookbook\helper\permission_helper.py:269 +#: .\cookbook\helper\permission_helper.py:283 +#: .\cookbook\helper\permission_helper.py:294 +#: .\cookbook\helper\permission_helper.py:305 +#: .\cookbook\helper\permission_helper.py:321 +#: .\cookbook\helper\permission_helper.py:342 .\cookbook\views\data.py:36 +#: .\cookbook\views\views.py:128 .\cookbook\views\views.py:135 msgid "You do not have the required permissions to view this page!" msgstr "Non hai i permessi necessari per visualizzare questa pagina!" -#: .\cookbook\helper\permission_helper.py:177 -#: .\cookbook\helper\permission_helper.py:200 -#: .\cookbook\helper\permission_helper.py:222 +#: .\cookbook\helper\permission_helper.py:192 +#: .\cookbook\helper\permission_helper.py:215 #: .\cookbook\helper\permission_helper.py:237 +#: .\cookbook\helper\permission_helper.py:252 msgid "You cannot interact with this object as it is not owned by you!" msgstr "Non puoi interagire con questo oggetto perché non ne hai i diritti!" -#: .\cookbook\helper\permission_helper.py:321 +#: .\cookbook\helper\permission_helper.py:403 msgid "You have reached the maximum number of recipes for your space." msgstr "Hai raggiunto il numero massimo di ricette nella tua istanza." -#: .\cookbook\helper\permission_helper.py:333 +#: .\cookbook\helper\permission_helper.py:415 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:565 +#: .\cookbook\helper\recipe_search.py:630 msgid "One of queryset or hash_key must be provided" +msgstr "Uno tra queryset o has_key deve essere fornito" + +#: .\cookbook\helper\recipe_url_import.py:266 +msgid "reverse rotation" +msgstr "rotazione inversa" + +#: .\cookbook\helper\recipe_url_import.py:267 +msgid "careful rotation" msgstr "" -#: .\cookbook\helper\shopping_helper.py:152 +#: .\cookbook\helper\recipe_url_import.py:268 +msgid "knead" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:269 +msgid "thicken" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:270 +msgid "warm up" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:271 +msgid "ferment" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:272 +msgid "sous-vide" +msgstr "" + +#: .\cookbook\helper\shopping_helper.py:157 msgid "You must supply a servings size" msgstr "Devi fornire le dimensione delle porzioni" -#: .\cookbook\helper\template_helper.py:64 -#: .\cookbook\helper\template_helper.py:66 +#: .\cookbook\helper\template_helper.py:79 +#: .\cookbook\helper\template_helper.py:81 msgid "Could not parse template code." msgstr "Impossibile elaborare il codice del template." -#: .\cookbook\integration\copymethat.py:41 +#: .\cookbook\integration\copymethat.py:44 #: .\cookbook\integration\melarecipes.py:37 msgid "Favorite" -msgstr "" +msgstr "Preferito" -#: .\cookbook\integration\copymethat.py:70 -#: .\cookbook\integration\recettetek.py:54 -#: .\cookbook\integration\recipekeeper.py:63 -msgid "Imported from" -msgstr "Importato da" +#: .\cookbook\integration\copymethat.py:50 +msgid "I made this" +msgstr "L'ho preparato" -#: .\cookbook\integration\integration.py:223 +#: .\cookbook\integration\integration.py:218 msgid "" "Importer expected a .zip file. Did you choose the correct importer type for " "your data ?" @@ -578,7 +584,7 @@ msgstr "" "La procedura di import necessita di un file .zip. Hai scelto il tipo di " "importazione corretta per i tuoi dati?" -#: .\cookbook\integration\integration.py:226 +#: .\cookbook\integration\integration.py:221 msgid "" "An unexpected error occurred during the import. Please make sure you have " "uploaded a valid file." @@ -586,27 +592,36 @@ msgstr "" "Un errore imprevisto si è verificato durante l'importazione. Assicurati di " "aver caricato un file valido." -#: .\cookbook\integration\integration.py:231 +#: .\cookbook\integration\integration.py:226 msgid "The following recipes were ignored because they already existed:" msgstr "Le seguenti ricette sono state ignorate perché già esistenti:" -#: .\cookbook\integration\integration.py:235 +#: .\cookbook\integration\integration.py:230 #, python-format msgid "Imported %s recipes." msgstr "Importate %s ricette." -#: .\cookbook\integration\paprika.py:46 +#: .\cookbook\integration\openeats.py:26 +msgid "Recipe source:" +msgstr "Fonte ricetta:" + +#: .\cookbook\integration\paprika.py:49 msgid "Notes" msgstr "Note" -#: .\cookbook\integration\paprika.py:49 +#: .\cookbook\integration\paprika.py:52 msgid "Nutritional Information" msgstr "Informazioni nutrizionali" -#: .\cookbook\integration\paprika.py:53 +#: .\cookbook\integration\paprika.py:56 msgid "Source" msgstr "Fonte" +#: .\cookbook\integration\recettetek.py:54 +#: .\cookbook\integration\recipekeeper.py:70 +msgid "Imported from" +msgstr "Importato da" + #: .\cookbook\integration\saffron.py:23 msgid "Servings" msgstr "Porzioni" @@ -619,9 +634,7 @@ msgstr "Tempo di cottura" msgid "Preparation Time" msgstr "Tempo di preparazione" -#: .\cookbook\integration\saffron.py:29 -#: .\cookbook\templates\forms\ingredients.html:7 -#: .\cookbook\templates\index.html:7 +#: .\cookbook\integration\saffron.py:29 .\cookbook\templates\index.html:7 msgid "Cookbook" msgstr "Ricette" @@ -634,11 +647,9 @@ msgid "Rebuilds full text search index on Recipe" msgstr "Ricostruisce l'indice di ricerca full text per la ricetta" #: .\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 "" -"Solo i database Postgres usano l'indice di ricerca full text, non ci sono " +"Solo i database Postgresql usano l'indice di ricerca full text, non ci sono " "indici da ricostruire" #: .\cookbook\management\commands\rebuildindex.py:29 @@ -665,7 +676,7 @@ msgstr "Cena" msgid "Other" msgstr "Altro" -#: .\cookbook\models.py:251 +#: .\cookbook\models.py:261 msgid "" "Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " "upload." @@ -673,169 +684,162 @@ msgstr "" "Archiviazione massima in MB. 0 per illimitata, -1 per disabilitare il " "caricamento dei file." -#: .\cookbook\models.py:353 .\cookbook\templates\search.html:7 +#: .\cookbook\models.py:365 .\cookbook\templates\search.html:7 +#: .\cookbook\templates\settings.html:18 #: .\cookbook\templates\space_manage.html:7 msgid "Search" msgstr "Cerca" -#: .\cookbook\models.py:354 .\cookbook\templates\base.html:107 +#: .\cookbook\models.py:366 .\cookbook\templates\base.html:110 #: .\cookbook\templates\meal_plan.html:7 .\cookbook\views\delete.py:178 #: .\cookbook\views\edit.py:211 .\cookbook\views\new.py:179 msgid "Meal-Plan" msgstr "Piano alimentare" -#: .\cookbook\models.py:355 .\cookbook\templates\base.html:115 +#: .\cookbook\models.py:367 .\cookbook\templates\base.html:118 msgid "Books" msgstr "Libri" -#: .\cookbook\models.py:363 -msgid "Small" -msgstr "Piccolo" - -#: .\cookbook\models.py:363 -msgid "Large" -msgstr "Grande" - -#: .\cookbook\models.py:363 .\cookbook\templates\generic\new_template.html:6 -#: .\cookbook\templates\generic\new_template.html:14 -msgid "New" -msgstr "Nuovo" - -#: .\cookbook\models.py:584 +#: .\cookbook\models.py:580 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:1162 .\cookbook\templates\search_info.html:28 +#: .\cookbook\models.py:1181 .\cookbook\templates\search_info.html:28 msgid "Simple" msgstr "Semplice" -#: .\cookbook\models.py:1163 .\cookbook\templates\search_info.html:33 +#: .\cookbook\models.py:1182 .\cookbook\templates\search_info.html:33 msgid "Phrase" msgstr "Frase" -#: .\cookbook\models.py:1164 .\cookbook\templates\search_info.html:38 +#: .\cookbook\models.py:1183 .\cookbook\templates\search_info.html:38 msgid "Web" msgstr "Web" -#: .\cookbook\models.py:1165 .\cookbook\templates\search_info.html:47 +#: .\cookbook\models.py:1184 .\cookbook\templates\search_info.html:47 msgid "Raw" msgstr "Raw" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 msgid "Food Alias" msgstr "Alias Alimento" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 msgid "Unit Alias" msgstr "Alias Unità" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 msgid "Keyword Alias" msgstr "Alias Parola Chiave" -#: .\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 +#: .\cookbook\models.py:1232 +msgid "Description Replace" +msgstr "Sostituisci Descrizione" + +#: .\cookbook\models.py:1232 +msgid "Instruction Replace" +msgstr "Sostituisci Istruzione" + +#: .\cookbook\models.py:1258 .\cookbook\views\delete.py:36 +#: .\cookbook\views\edit.py:251 .\cookbook\views\new.py:48 msgid "Recipe" msgstr "Ricetta" -#: .\cookbook\models.py:1228 +#: .\cookbook\models.py:1259 msgid "Food" msgstr "Alimento" -#: .\cookbook\models.py:1229 .\cookbook\templates\base.html:138 +#: .\cookbook\models.py:1260 .\cookbook\templates\base.html:141 msgid "Keyword" msgstr "Parola chiave" -#: .\cookbook\serializer.py:207 -msgid "Cannot modify Space owner permission." -msgstr "" - -#: .\cookbook\serializer.py:290 +#: .\cookbook\serializer.py:198 msgid "File uploads are not enabled for this Space." msgstr "Il caricamento dei file non è abilitato in questa istanza." -#: .\cookbook\serializer.py:301 +#: .\cookbook\serializer.py:209 msgid "You have reached your file upload limit." msgstr "Hai raggiungo il limite per il caricamento dei file." -#: .\cookbook\serializer.py:1081 +#: .\cookbook\serializer.py:291 +msgid "Cannot modify Space owner permission." +msgstr "Impossibile modificare i permessi del proprietario dell'istanza." + +#: .\cookbook\serializer.py:1093 msgid "Hello" msgstr "Ciao" -#: .\cookbook\serializer.py:1081 +#: .\cookbook\serializer.py:1093 msgid "You have been invited by " msgstr "Sei stato invitato da " -#: .\cookbook\serializer.py:1082 +#: .\cookbook\serializer.py:1094 msgid " to join their Tandoor Recipes space " msgstr " per entrare nella sua istanza di Tandoor Recipes " -#: .\cookbook\serializer.py:1083 +#: .\cookbook\serializer.py:1095 msgid "Click the following link to activate your account: " msgstr "Clicca il link qui di seguito per attivare il tuo account: " -#: .\cookbook\serializer.py:1084 +#: .\cookbook\serializer.py:1096 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:1085 +#: .\cookbook\serializer.py:1097 msgid "The invitation is valid until " msgstr "L'invito è valido fino al " -#: .\cookbook\serializer.py:1086 +#: .\cookbook\serializer.py:1098 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:1089 +#: .\cookbook\serializer.py:1101 msgid "Tandoor Recipes Invite" msgstr "Invito per Tandoor Recipes" -#: .\cookbook\serializer.py:1209 +#: .\cookbook\serializer.py:1242 msgid "Existing shopping list to update" -msgstr "" +msgstr "Lista della spesa esistente da aggiornare" -#: .\cookbook\serializer.py:1211 +#: .\cookbook\serializer.py:1244 msgid "" "List of ingredient IDs from the recipe to add, if not provided all " "ingredients will be added." msgstr "" +"Lista degli ID degli ingredienti dalla ricetta da aggiungere, se non è " +"fornita saranno aggiunti tutti gli ingredienti." -#: .\cookbook\serializer.py:1213 +#: .\cookbook\serializer.py:1246 msgid "" "Providing a list_recipe ID and servings of 0 will delete that shopping list." msgstr "" +"Fornendo un ID list_recipe e impostando le porzioni a 0, la lista della " +"spesa verrà eliminata." -#: .\cookbook\serializer.py:1222 +#: .\cookbook\serializer.py:1255 msgid "Amount of food to add to the shopping list" -msgstr "" +msgstr "Quantità di alimenti da aggiungere alla lista della spesa" -#: .\cookbook\serializer.py:1224 +#: .\cookbook\serializer.py:1257 msgid "ID of unit to use for the shopping list" -msgstr "" +msgstr "ID dell'unità da usare per la lista della spesa" -#: .\cookbook\serializer.py:1226 +#: .\cookbook\serializer.py:1259 msgid "When set to true will delete all food from active shopping lists." msgstr "" +"Quando impostato su vero, eliminerà tutti gli alimenti dalle liste della " +"spesa attive." -#: .\cookbook\tables.py:36 .\cookbook\templates\generic\edit_template.html:6 -#: .\cookbook\templates\generic\edit_template.html:14 -#: .\cookbook\templates\recipes_table.html:82 -msgid "Edit" -msgstr "Modifica" - -#: .\cookbook\tables.py:116 .\cookbook\tables.py:131 +#: .\cookbook\tables.py:61 .\cookbook\tables.py:75 #: .\cookbook\templates\generic\delete_template.html:7 #: .\cookbook\templates\generic\delete_template.html:15 #: .\cookbook\templates\generic\edit_template.html:28 -#: .\cookbook\templates\recipes_table.html:90 msgid "Delete" msgstr "Elimina" @@ -863,9 +867,10 @@ msgstr "Indirizzi email" #: .\cookbook\templates\account\email.html:12 #: .\cookbook\templates\account\password_change.html:11 #: .\cookbook\templates\account\password_set.html:11 -#: .\cookbook\templates\base.html:293 .\cookbook\templates\settings.html:6 +#: .\cookbook\templates\base.html:296 .\cookbook\templates\settings.html:6 #: .\cookbook\templates\settings.html:17 #: .\cookbook\templates\socialaccount\connections.html:10 +#: .\cookbook\templates\user_settings.html:8 msgid "Settings" msgstr "Impostazioni" @@ -961,8 +966,8 @@ msgstr "" " richiedere un nuovo link di conferma." -#: .\cookbook\templates\account\login.html:8 -#: .\cookbook\templates\base.html:340 .\cookbook\templates\openid\login.html:8 +#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:343 +#: .\cookbook\templates\openid\login.html:8 msgid "Login" msgstr "Login" @@ -982,21 +987,20 @@ msgstr "Accedi" msgid "Sign Up" msgstr "Iscriviti" +#: .\cookbook\templates\account\login.html:38 +msgid "Lost your password?" +msgstr "Hai dimenticato la password?" + #: .\cookbook\templates\account\login.html:39 -#: .\cookbook\templates\account\login.html:41 #: .\cookbook\templates\account\password_reset.html:29 msgid "Reset My Password" msgstr "Reimposta password" -#: .\cookbook\templates\account\login.html:40 -msgid "Lost your password?" -msgstr "Hai dimenticato la password?" - -#: .\cookbook\templates\account\login.html:52 +#: .\cookbook\templates\account\login.html:50 msgid "Social Login" msgstr "Login con social network" -#: .\cookbook\templates\account\login.html:53 +#: .\cookbook\templates\account\login.html:51 msgid "You can use any of the following providers to sign in." msgstr "Puoi usare uno dei seguenti provider per accedere." @@ -1022,7 +1026,6 @@ msgstr "Cambia Password" #: .\cookbook\templates\account\password_change.html:12 #: .\cookbook\templates\account\password_set.html:12 -#: .\cookbook\templates\settings.html:76 msgid "Password" msgstr "Password" @@ -1071,7 +1074,7 @@ msgid "" msgstr "" "Il link per il reset della password non è corretto, probabilmente perché è " "stato già utilizzato.\n" -" Puoi richiedere un nuovo reset della password." #: .\cookbook\templates\account\password_reset_from_key.html:33 @@ -1134,133 +1137,126 @@ 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:330 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:333 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "Documentazione API" -#: .\cookbook\templates\base.html:103 .\cookbook\templates\index.html:87 -#: .\cookbook\templates\stats.html:22 +#: .\cookbook\templates\base.html:106 .\cookbook\templates\index.html:87 msgid "Recipes" msgstr "Ricette" -#: .\cookbook\templates\base.html:111 +#: .\cookbook\templates\base.html:114 msgid "Shopping" msgstr "Spesa" -#: .\cookbook\templates\base.html:150 .\cookbook\views\lists.py:105 +#: .\cookbook\templates\base.html:153 .\cookbook\views\lists.py:105 msgid "Foods" msgstr "Alimenti" -#: .\cookbook\templates\base.html:162 -#: .\cookbook\templates\forms\ingredients.html:24 -#: .\cookbook\templates\stats.html:26 .\cookbook\views\lists.py:122 +#: .\cookbook\templates\base.html:165 .\cookbook\views\lists.py:122 msgid "Units" msgstr "Unità di misura" -#: .\cookbook\templates\base.html:176 .\cookbook\templates\supermarket.html:7 +#: .\cookbook\templates\base.html:179 .\cookbook\templates\supermarket.html:7 msgid "Supermarket" msgstr "Supermercato" -#: .\cookbook\templates\base.html:188 +#: .\cookbook\templates\base.html:191 msgid "Supermarket Category" msgstr "Categoria supermercato" -#: .\cookbook\templates\base.html:200 .\cookbook\views\lists.py:171 +#: .\cookbook\templates\base.html:203 .\cookbook\views\lists.py:171 msgid "Automations" msgstr "Automazioni" -#: .\cookbook\templates\base.html:214 .\cookbook\views\lists.py:207 +#: .\cookbook\templates\base.html:217 .\cookbook\views\lists.py:207 msgid "Files" msgstr "File" -#: .\cookbook\templates\base.html:226 +#: .\cookbook\templates\base.html:229 msgid "Batch Edit" msgstr "Modifica in blocco" -#: .\cookbook\templates\base.html:238 .\cookbook\templates\history.html:6 +#: .\cookbook\templates\base.html:241 .\cookbook\templates\history.html:6 #: .\cookbook\templates\history.html:14 msgid "History" msgstr "Cronologia" -#: .\cookbook\templates\base.html:252 +#: .\cookbook\templates\base.html:255 #: .\cookbook\templates\ingredient_editor.html:7 #: .\cookbook\templates\ingredient_editor.html:13 msgid "Ingredient Editor" msgstr "Editor Ingredienti" -#: .\cookbook\templates\base.html:264 +#: .\cookbook\templates\base.html:267 #: .\cookbook\templates\export_response.html:7 #: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 msgid "Export" msgstr "Esporta" -#: .\cookbook\templates\base.html:280 .\cookbook\templates\index.html:47 +#: .\cookbook\templates\base.html:283 .\cookbook\templates\index.html:47 msgid "Import Recipe" msgstr "Importa Ricetta" -#: .\cookbook\templates\base.html:282 +#: .\cookbook\templates\base.html:285 msgid "Create" msgstr "Crea" -#: .\cookbook\templates\base.html:295 +#: .\cookbook\templates\base.html:298 #: .\cookbook\templates\generic\list_template.html:14 -#: .\cookbook\templates\stats.html:43 msgid "External Recipes" msgstr "Ricette esterne" -#: .\cookbook\templates\base.html:298 -#: .\cookbook\templates\space_manage.html:15 +#: .\cookbook\templates\base.html:301 .\cookbook\templates\space_manage.html:15 msgid "Space Settings" msgstr "Impostazioni istanza" -#: .\cookbook\templates\base.html:303 .\cookbook\templates\system.html:13 +#: .\cookbook\templates\base.html:306 .\cookbook\templates\system.html:13 msgid "System" msgstr "Sistema" -#: .\cookbook\templates\base.html:305 +#: .\cookbook\templates\base.html:308 msgid "Admin" msgstr "Amministratore" -#: .\cookbook\templates\base.html:309 +#: .\cookbook\templates\base.html:312 #: .\cookbook\templates\space_overview.html:25 -#, fuzzy -#| msgid "No Space" msgid "Your Spaces" -msgstr "Nessuna istanza" +msgstr "Le tue istanze" -#: .\cookbook\templates\base.html:320 +#: .\cookbook\templates\base.html:323 #: .\cookbook\templates\space_overview.html:6 msgid "Overview" -msgstr "" +msgstr "Panoramica" -#: .\cookbook\templates\base.html:324 +#: .\cookbook\templates\base.html:327 msgid "Markdown Guide" msgstr "Informazioni su Markdown" -#: .\cookbook\templates\base.html:326 +#: .\cookbook\templates\base.html:329 msgid "GitHub" msgstr "GitHub" -#: .\cookbook\templates\base.html:328 +#: .\cookbook\templates\base.html:331 msgid "Translate Tandoor" msgstr "Traduci Tandoor" -#: .\cookbook\templates\base.html:332 +#: .\cookbook\templates\base.html:335 msgid "API Browser" msgstr "Browser API" -#: .\cookbook\templates\base.html:335 +#: .\cookbook\templates\base.html:338 msgid "Log out" msgstr "Esci" -#: .\cookbook\templates\base.html:357 +#: .\cookbook\templates\base.html:360 msgid "You are using the free version of Tandor" -msgstr "" +msgstr "Stai usando la versione gratuita di Tandoor" -#: .\cookbook\templates\base.html:358 +#: .\cookbook\templates\base.html:361 msgid "Upgrade Now" -msgstr "" +msgstr "Aggiorna ora" #: .\cookbook\templates\batch\edit.html:6 msgid "Batch edit Category" @@ -1300,11 +1296,7 @@ msgstr "Il percorso deve essere nel formato seguente" #: .\cookbook\templates\forms\edit_import_recipe.html:14 #: .\cookbook\templates\generic\edit_template.html:23 #: .\cookbook\templates\generic\new_template.html:23 -#: .\cookbook\templates\settings.html:70 -#: .\cookbook\templates\settings.html:112 -#: .\cookbook\templates\settings.html:130 -#: .\cookbook\templates\settings.html:202 -#: .\cookbook\templates\settings.html:213 +#: .\cookbook\templates\settings.html:57 msgid "Save" msgstr "Salva" @@ -1354,41 +1346,6 @@ msgstr "Importa nuova Ricetta" msgid "Edit Recipe" msgstr "Modifica Ricetta" -#: .\cookbook\templates\forms\ingredients.html:15 -msgid "Edit Ingredients" -msgstr "Modifica Ingredienti" - -#: .\cookbook\templates\forms\ingredients.html:16 -msgid "" -"\n" -" The following form can be used if, accidentally, two (or more) units " -"or ingredients where created that should be\n" -" the same.\n" -" It merges two units or ingredients and updates all recipes using " -"them.\n" -" " -msgstr "" -"\n" -" Questo modulo può essere utilizzato se, accidentalmente, sono stati " -"creati due (o più) unità di misura o ingredienti che\n" -" dovrebbero essere lo stesso.\n" -" Unisce due unità di misura o ingredienti e aggiorna tutte le ricette " -"che li utilizzano.\n" -" " - -#: .\cookbook\templates\forms\ingredients.html:26 -msgid "Are you sure that you want to merge these two units?" -msgstr "Sei sicuro di volere unire queste due unità di misura?" - -#: .\cookbook\templates\forms\ingredients.html:31 -#: .\cookbook\templates\forms\ingredients.html:40 -msgid "Merge" -msgstr "Unisci" - -#: .\cookbook\templates\forms\ingredients.html:36 -msgid "Are you sure that you want to merge these two ingredients?" -msgstr "Sei sicuro di volere unire questi due ingredienti?" - #: .\cookbook\templates\generic\delete_template.html:21 #, python-format msgid "Are you sure you want to delete the %(title)s: %(object)s " @@ -1396,7 +1353,7 @@ msgstr "Sei sicuro di volere eliminare %(title)s: %(object)s " #: .\cookbook\templates\generic\delete_template.html:22 msgid "This cannot be undone!" -msgstr "" +msgstr "Questa azione non può essere annullata!" #: .\cookbook\templates\generic\delete_template.html:27 msgid "Protected" @@ -1410,6 +1367,11 @@ msgstr "Cascata" msgid "Cancel" msgstr "Annulla" +#: .\cookbook\templates\generic\edit_template.html:6 +#: .\cookbook\templates\generic\edit_template.html:14 +msgid "Edit" +msgstr "Modifica" + #: .\cookbook\templates\generic\edit_template.html:32 msgid "View" msgstr "Mostra" @@ -1431,13 +1393,16 @@ msgstr "Filtro" msgid "Import all" msgstr "Importa tutto" +#: .\cookbook\templates\generic\new_template.html:6 +#: .\cookbook\templates\generic\new_template.html:14 +msgid "New" +msgstr "Nuovo" + #: .\cookbook\templates\generic\table_template.html:76 -#: .\cookbook\templates\recipes_table.html:121 msgid "previous" msgstr "precedente" #: .\cookbook\templates\generic\table_template.html:98 -#: .\cookbook\templates\recipes_table.html:143 msgid "next" msgstr "prossimo" @@ -1449,24 +1414,11 @@ msgstr "Mostra registro" msgid "Cook Log" msgstr "Registro di cottura" -#: .\cookbook\templates\import.html:6 -msgid "Import Recipes" -msgstr "Importa Ricette" - -#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 #: .\cookbook\templates\import_response.html:7 .\cookbook\views\delete.py:86 #: .\cookbook\views\edit.py:191 msgid "Import" msgstr "Importa" -#: .\cookbook\templates\include\recipe_open_modal.html:18 -msgid "Close" -msgstr "Chiudi" - -#: .\cookbook\templates\include\recipe_open_modal.html:32 -msgid "Open Recipe" -msgstr "Apri Ricetta" - #: .\cookbook\templates\include\storage_backend_warning.html:4 msgid "Security Warning" msgstr "Avviso di Sicurezza" @@ -1567,10 +1519,8 @@ 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 "o lasciando una riga vuota in mezzo." +msgstr "oppure lasciando una riga vuota tra di loro." #: .\cookbook\templates\markdown_info.html:59 #: .\cookbook\templates\markdown_info.html:74 @@ -1592,10 +1542,6 @@ msgid "Lists" msgstr "Liste" #: .\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!" @@ -1680,31 +1626,6 @@ msgstr "Intestazione" msgid "Cell" msgstr "Cella" -#: .\cookbook\templates\meal_plan_entry.html:6 -msgid "Meal Plan View" -msgstr "Mostra il piano alimentare" - -#: .\cookbook\templates\meal_plan_entry.html:18 -msgid "Created by" -msgstr "Creato da" - -#: .\cookbook\templates\meal_plan_entry.html:20 -msgid "Shared with" -msgstr "Condiviso con" - -#: .\cookbook\templates\meal_plan_entry.html:48 -#: .\cookbook\templates\recipes_table.html:64 -msgid "Last cooked" -msgstr "Cucinato di recente" - -#: .\cookbook\templates\meal_plan_entry.html:50 -msgid "Never cooked before." -msgstr "Mai cucinato." - -#: .\cookbook\templates\meal_plan_entry.html:76 -msgid "Other meals on this day" -msgstr "Altri pasti di questo giorno" - #: .\cookbook\templates\no_groups_info.html:5 #: .\cookbook\templates\no_groups_info.html:12 msgid "No Permissions" @@ -1755,43 +1676,26 @@ msgstr "" msgid "Back" msgstr "Indietro" -#: .\cookbook\templates\recipe_view.html:26 +#: .\cookbook\templates\profile.html:7 +msgid "Profile" +msgstr "Profilo" + +#: .\cookbook\templates\recipe_view.html:41 msgid "by" msgstr "di" -#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:144 +#: .\cookbook\templates\recipe_view.html:59 .\cookbook\views\delete.py:144 #: .\cookbook\views\edit.py:171 msgid "Comment" msgstr "Commento" -#: .\cookbook\templates\recipes_table.html:19 -#: .\cookbook\templates\recipes_table.html:23 -msgid "Recipe Image" -msgstr "Immagine ricetta" - -#: .\cookbook\templates\recipes_table.html:51 -msgid "Preparation time ca." -msgstr "Tempo di preparazione circa" - -#: .\cookbook\templates\recipes_table.html:57 -msgid "Waiting time ca." -msgstr "Tempo di cottura circa" - -#: .\cookbook\templates\recipes_table.html:60 -msgid "External" -msgstr "Esterna" - -#: .\cookbook\templates\recipes_table.html:86 -msgid "Log Cooking" -msgstr "Registro ricette cucinate" - #: .\cookbook\templates\rest_framework\api.html:5 msgid "Recipe Home" msgstr "Pagina iniziale ricette" #: .\cookbook\templates\search_info.html:5 #: .\cookbook\templates\search_info.html:9 -#: .\cookbook\templates\settings.html:172 +#: .\cookbook\templates\settings.html:24 msgid "Search Settings" msgstr "Impostazioni di ricerca" @@ -1833,6 +1737,18 @@ msgid "" "html#TEXTSEARCH-PARSING-QUERIES>Postgresql's website.\n" " " msgstr "" +" \n" +" Le ricerche full-text cercano di normalizzare le parole fornite " +"per abbinare varianti comuni. Ad esempio, 'separato', 'separando', 'separa' " +"verranno tutti normalizzati in 'separare'.\n" +" Ci sono diversi metodi disponibili, descritti di seguito, che " +"controlleranno il comportamento della ricerca in caso di ricerca con più " +"parole.\n" +" I dettagli tecnici completi su come questi funzionano possono " +"essere visualizzati sul sito web di Postgresql.\n" +" " #: .\cookbook\templates\search_info.html:29 msgid "" @@ -1954,85 +1870,14 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\settings.html:28 -msgid "Account" -msgstr "Account" - -#: .\cookbook\templates\settings.html:35 -msgid "Preferences" -msgstr "Preferenze" - -#: .\cookbook\templates\settings.html:42 -msgid "API-Settings" -msgstr "Impostazioni API" - -#: .\cookbook\templates\settings.html:49 -msgid "Search-Settings" -msgstr "Cerca-Impostazioni" - -#: .\cookbook\templates\settings.html:56 -#, fuzzy -#| msgid "Search-Settings" -msgid "Shopping-Settings" -msgstr "Cerca-Impostazioni" - -#: .\cookbook\templates\settings.html:65 -msgid "Name Settings" -msgstr "Impostazioni Nome" - -#: .\cookbook\templates\settings.html:73 -msgid "Account Settings" -msgstr "Impostazioni Account" - -#: .\cookbook\templates\settings.html:75 -msgid "Emails" -msgstr "Email" - -#: .\cookbook\templates\settings.html:78 -#: .\cookbook\templates\socialaccount\connections.html:11 -msgid "Social" -msgstr "Social" - -#: .\cookbook\templates\settings.html:91 -msgid "Language" -msgstr "Lingua" - -#: .\cookbook\templates\settings.html:121 -msgid "Style" -msgstr "Stile" - -#: .\cookbook\templates\settings.html:142 -msgid "API Token" -msgstr "Token API" - -#: .\cookbook\templates\settings.html:143 -msgid "" -"You can use both basic authentication and token based authentication to " -"access the REST API." -msgstr "" -"Per accedere alle API REST puoi usare sia l'autenticazione base sia quella " -"tramite token." - -#: .\cookbook\templates\settings.html:160 -msgid "" -"Use the token as an Authorization header prefixed by the word token as shown " -"in the following examples:" -msgstr "" -"Usa il token come header Authorization preceduto dalla parola Token come " -"negli esempi seguenti:" - -#: .\cookbook\templates\settings.html:162 -msgid "or" -msgstr "o" - -#: .\cookbook\templates\settings.html:173 +#: .\cookbook\templates\settings.html:25 msgid "" "There are many options to configure the search depending on your personal " "preferences." msgstr "" "Ci sono molte opzioni per configurare la ricerca in base alle tue preferenze." -#: .\cookbook\templates\settings.html:174 +#: .\cookbook\templates\settings.html:26 msgid "" "Usually you do not need to configure any of them and can just stick " "with either the default or one of the following presets." @@ -2041,7 +1886,7 @@ msgstr "" "continuare a usare le impostazioni predefinite oppure scegliere una delle " "seguenti modalità." -#: .\cookbook\templates\settings.html:175 +#: .\cookbook\templates\settings.html:27 msgid "" "If you do want to configure the search you can read about the different " "options here." @@ -2049,11 +1894,11 @@ msgstr "" "Se vuoi comunque configurare la ricerca, puoi informarti riguardo le opzioni " "disponibili qui." -#: .\cookbook\templates\settings.html:180 +#: .\cookbook\templates\settings.html:32 msgid "Fuzzy" msgstr "Vago" -#: .\cookbook\templates\settings.html:181 +#: .\cookbook\templates\settings.html:33 msgid "" "Find what you need even if your search or the recipe contains typos. Might " "return more results than needed to make sure you find what you are looking " @@ -2063,34 +1908,29 @@ msgstr "" "errori. Potrebbe mostrare più risultati di quelli necessari per mostrarti " "quello che stai cercando." -#: .\cookbook\templates\settings.html:182 +#: .\cookbook\templates\settings.html:34 msgid "This is the default behavior" msgstr "È il comportamento predefinito" -#: .\cookbook\templates\settings.html:183 -#: .\cookbook\templates\settings.html:191 +#: .\cookbook\templates\settings.html:37 .\cookbook\templates\settings.html:46 msgid "Apply" msgstr "Applica" -#: .\cookbook\templates\settings.html:188 +#: .\cookbook\templates\settings.html:42 msgid "Precise" msgstr "Preciso" -#: .\cookbook\templates\settings.html:189 +#: .\cookbook\templates\settings.html:43 msgid "" "Allows fine control over search results but might not return results if too " "many spelling mistakes are made." msgstr "" +"Consente un controllo preciso sui risultati della ricerca, ma potrebbe non " +"mostrare risultati se vengono commessi troppi errori." -#: .\cookbook\templates\settings.html:190 +#: .\cookbook\templates\settings.html:44 msgid "Perfect for large Databases" -msgstr "Perfetto per database grandi" - -#: .\cookbook\templates\settings.html:207 -#, fuzzy -#| msgid "Shopping List" -msgid "Shopping Settings" -msgstr "Lista della spesa" +msgstr "Ideale per database grandi" #: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5 msgid "Cookbook Setup" @@ -2112,10 +1952,8 @@ msgstr "Crea super utente" #: .\cookbook\templates\socialaccount\authentication_error.html:7 #: .\cookbook\templates\socialaccount\authentication_error.html:23 -#, fuzzy -#| msgid "Social Login" msgid "Social Network Login Failure" -msgstr "Login con social network" +msgstr "Errore di login con Social Network" #: .\cookbook\templates\socialaccount\authentication_error.html:25 msgid "" @@ -2129,6 +1967,10 @@ msgstr "" msgid "Account Connections" msgstr "Collegamenti dell'account" +#: .\cookbook\templates\socialaccount\connections.html:11 +msgid "Social" +msgstr "Social" + #: .\cookbook\templates\socialaccount\connections.html:18 msgid "" "You can sign in to your account using any of the following third party\n" @@ -2229,26 +2071,26 @@ msgid "" "You can either be invited into an existing space or create your own one." msgstr "Puoi essere invitato in una istanza già esistente o crearne una nuova." -#: .\cookbook\templates\space_overview.html:45 +#: .\cookbook\templates\space_overview.html:53 msgid "Owner" msgstr "Proprietario" -#: .\cookbook\templates\space_overview.html:49 +#: .\cookbook\templates\space_overview.html:57 #, fuzzy #| msgid "Create Space" msgid "Leave Space" msgstr "Crea Istanza" -#: .\cookbook\templates\space_overview.html:70 -#: .\cookbook\templates\space_overview.html:80 +#: .\cookbook\templates\space_overview.html:78 +#: .\cookbook\templates\space_overview.html:88 msgid "Join Space" msgstr "Partecipa all'istanza" -#: .\cookbook\templates\space_overview.html:73 +#: .\cookbook\templates\space_overview.html:81 msgid "Join an existing space." msgstr "Entra in una istanza già esistente." -#: .\cookbook\templates\space_overview.html:75 +#: .\cookbook\templates\space_overview.html:83 msgid "" "To join an existing space either enter your invite token or click on the " "invite link the space owner send you." @@ -2256,48 +2098,20 @@ msgstr "" "Per entrare in una istanza già esistente, inserisci il token di invito o " "clicca sul link di invito che l'amministratore ti ha mandato." -#: .\cookbook\templates\space_overview.html:88 -#: .\cookbook\templates\space_overview.html:97 +#: .\cookbook\templates\space_overview.html:96 +#: .\cookbook\templates\space_overview.html:105 msgid "Create Space" msgstr "Crea Istanza" -#: .\cookbook\templates\space_overview.html:91 +#: .\cookbook\templates\space_overview.html:99 msgid "Create your own recipe space." msgstr "Crea una istanza per le tue ricette." -#: .\cookbook\templates\space_overview.html:93 +#: .\cookbook\templates\space_overview.html:101 msgid "Start your own recipe space and invite other users to it." msgstr "" "Apri la tua istanza personale di ricette e invita altri utenti a usarlo." -#: .\cookbook\templates\stats.html:4 -msgid "Stats" -msgstr "Statistiche" - -#: .\cookbook\templates\stats.html:10 -msgid "Statistics" -msgstr "Statistiche" - -#: .\cookbook\templates\stats.html:19 -msgid "Number of objects" -msgstr "Numero di oggetti" - -#: .\cookbook\templates\stats.html:30 -msgid "Recipe Imports" -msgstr "Ricette importate" - -#: .\cookbook\templates\stats.html:38 -msgid "Objects stats" -msgstr "Statistiche degli oggetti" - -#: .\cookbook\templates\stats.html:41 -msgid "Recipes without Keywords" -msgstr "Ricette senza parole chiave" - -#: .\cookbook\templates\stats.html:45 -msgid "Internal Recipes" -msgstr "Ricette interne" - #: .\cookbook\templates\system.html:20 msgid "System Information" msgstr "Informazioni di sistema" @@ -2345,8 +2159,8 @@ msgid "" msgstr "" "Non è raccomandato erogare i file multimediali con gunicorn/pyton!\n" " Segui i passi descritti\n" -" qui per aggiornare\n" +" qui per aggiornare\n" " la tua installazione.\n" " " @@ -2398,8 +2212,8 @@ msgstr "" " Questa applicazione è in esecuzione in modalità di debug. " "Probabilmente non è necessario, spegni la modalità di debug\n" " configurando\n" -" DEBUG=0 nel file di configurazione.env." -"\n" +" DEBUG=0 nel file di configurazione.env.\n" " " #: .\cookbook\templates\system.html:81 @@ -2428,257 +2242,270 @@ msgstr "" msgid "URL Import" msgstr "Importa da URL" -#: .\cookbook\views\api.py:105 .\cookbook\views\api.py:197 +#: .\cookbook\views\api.py:110 .\cookbook\views\api.py:202 msgid "Parameter updated_at incorrectly formatted" msgstr "Il parametro updated_at non è formattato correttamente" -#: .\cookbook\views\api.py:217 .\cookbook\views\api.py:320 +#: .\cookbook\views\api.py:222 .\cookbook\views\api.py:325 +#, python-brace-format msgid "No {self.basename} with id {pk} exists" msgstr "Non esiste nessun {self.basename} con id {pk}" -#: .\cookbook\views\api.py:221 +#: .\cookbook\views\api.py:226 msgid "Cannot merge with the same object!" msgstr "Non è possibile unirlo con lo stesso oggetto!" -#: .\cookbook\views\api.py:228 +#: .\cookbook\views\api.py:233 +#, python-brace-format msgid "No {self.basename} with id {target} exists" msgstr "Non esiste nessun {self.basename} con id {target}" -#: .\cookbook\views\api.py:233 +#: .\cookbook\views\api.py:238 msgid "Cannot merge with child object!" msgstr "Non è possibile unirlo con un oggetto secondario!" -#: .\cookbook\views\api.py:266 +#: .\cookbook\views\api.py:271 +#, python-brace-format msgid "{source.name} was merged successfully with {target.name}" msgstr "{source.name} è stato unito con successo a {target.name}" -#: .\cookbook\views\api.py:271 +#: .\cookbook\views\api.py:276 +#, python-brace-format 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:329 +#: .\cookbook\views\api.py:334 +#, python-brace-format msgid "{child.name} was moved successfully to the root." msgstr "{child.name} è stato spostato con successo alla radice." -#: .\cookbook\views\api.py:332 .\cookbook\views\api.py:350 +#: .\cookbook\views\api.py:337 .\cookbook\views\api.py:355 msgid "An error occurred attempting to move " msgstr "Si è verificato un errore durante lo spostamento " -#: .\cookbook\views\api.py:335 +#: .\cookbook\views\api.py:340 msgid "Cannot move an object to itself!" msgstr "Non è possibile muovere un oggetto a sé stesso!" -#: .\cookbook\views\api.py:341 +#: .\cookbook\views\api.py:346 +#, python-brace-format msgid "No {self.basename} with id {parent} exists" msgstr "Non esiste nessun {self.basename} con id {parent}" -#: .\cookbook\views\api.py:347 +#: .\cookbook\views\api.py:352 +#, python-brace-format 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:542 +#: .\cookbook\views\api.py:553 +#, python-brace-format msgid "{obj.name} was removed from the shopping list." msgstr "{obj.name} è stato rimosso dalla lista della spesa." -#: .\cookbook\views\api.py:547 .\cookbook\views\api.py:879 -#: .\cookbook\views\api.py:892 +#: .\cookbook\views\api.py:558 .\cookbook\views\api.py:888 +#: .\cookbook\views\api.py:901 +#, python-brace-format msgid "{obj.name} was added to the shopping list." msgstr "{obj.name} è stato aggiunto alla lista della spesa." -#: .\cookbook\views\api.py:674 +#: .\cookbook\views\api.py:685 msgid "ID of recipe a step is part of. For multiple repeat parameter." msgstr "" "ID di una ricetta di cui uno step ne fa parte. Usato per parametri di " "ripetizione multipla." -#: .\cookbook\views\api.py:676 +#: .\cookbook\views\api.py:687 msgid "Query string matched (fuzzy) against object name." msgstr "Stringa di ricerca abbinata (vaga) al nome dell'oggetto." -#: .\cookbook\views\api.py:720 +#: .\cookbook\views\api.py:731 msgid "" "Query string matched (fuzzy) against recipe name. In the future also " "fulltext search." msgstr "" -#: .\cookbook\views\api.py:722 +#: .\cookbook\views\api.py:733 msgid "" "ID of keyword a recipe should have. For multiple repeat parameter. " "Equivalent to keywords_or" msgstr "" -#: .\cookbook\views\api.py:725 +#: .\cookbook\views\api.py:736 msgid "" "Keyword IDs, repeat for multiple. Return recipes with any of the keywords" msgstr "" -#: .\cookbook\views\api.py:728 +#: .\cookbook\views\api.py:739 msgid "" "Keyword IDs, repeat for multiple. Return recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:742 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords." msgstr "" -#: .\cookbook\views\api.py:734 +#: .\cookbook\views\api.py:745 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:736 +#: .\cookbook\views\api.py:747 msgid "ID of food a recipe should have. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:739 +#: .\cookbook\views\api.py:750 msgid "Food IDs, repeat for multiple. Return recipes with any of the foods" msgstr "" -#: .\cookbook\views\api.py:741 +#: .\cookbook\views\api.py:752 msgid "Food IDs, repeat for multiple. Return recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:743 +#: .\cookbook\views\api.py:754 msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods." msgstr "" -#: .\cookbook\views\api.py:745 +#: .\cookbook\views\api.py:756 msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:746 +#: .\cookbook\views\api.py:757 msgid "ID of unit a recipe should have." msgstr "" -#: .\cookbook\views\api.py:748 +#: .\cookbook\views\api.py:759 msgid "" "Rating a recipe should have or greater. [0 - 5] Negative value filters " "rating less than." msgstr "" -#: .\cookbook\views\api.py:749 +#: .\cookbook\views\api.py:760 msgid "ID of book a recipe should be in. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:751 +#: .\cookbook\views\api.py:762 msgid "Book IDs, repeat for multiple. Return recipes with any of the books" msgstr "" -#: .\cookbook\views\api.py:753 +#: .\cookbook\views\api.py:764 msgid "Book IDs, repeat for multiple. Return recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:755 +#: .\cookbook\views\api.py:766 msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books." msgstr "" -#: .\cookbook\views\api.py:757 +#: .\cookbook\views\api.py:768 msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:759 +#: .\cookbook\views\api.py:770 msgid "If only internal recipes should be returned. [true/false]" msgstr "" -#: .\cookbook\views\api.py:761 +#: .\cookbook\views\api.py:772 msgid "Returns the results in randomized order. [true/false]" msgstr "" -#: .\cookbook\views\api.py:763 +#: .\cookbook\views\api.py:774 msgid "Returns new results first in search results. [true/false]" msgstr "" -#: .\cookbook\views\api.py:765 +#: .\cookbook\views\api.py:776 msgid "" "Filter recipes cooked X times or more. Negative values returns cooked less " "than X times" msgstr "" -#: .\cookbook\views\api.py:767 +#: .\cookbook\views\api.py:778 msgid "" "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:769 +#: .\cookbook\views\api.py:780 msgid "" "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:771 +#: .\cookbook\views\api.py:782 msgid "" "Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:773 +#: .\cookbook\views\api.py:784 msgid "" "Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:775 +#: .\cookbook\views\api.py:786 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:937 +#: .\cookbook\views\api.py:946 msgid "" "Returns the shopping list entry with a primary key of id. Multiple values " "allowed." msgstr "" -#: .\cookbook\views\api.py:942 +#: .\cookbook\views\api.py:951 msgid "" -"Filter shopping list entries on checked. [true, false, both, recent]" -"
    - recent includes unchecked items and recently completed items." +"Filter shopping list entries on checked. [true, false, both, recent]
    - recent includes unchecked items and recently completed items." msgstr "" -#: .\cookbook\views\api.py:945 +#: .\cookbook\views\api.py:954 msgid "Returns the shopping list entries sorted by supermarket category order." msgstr "" +"Restituisce le voci della lista della spesa ordinate per categoria di " +"supermercato." -#: .\cookbook\views\api.py:1140 +#: .\cookbook\views\api.py:1166 msgid "Nothing to do." msgstr "Nulla da fare." -#: .\cookbook\views\api.py:1160 +#: .\cookbook\views\api.py:1198 msgid "Invalid Url" -msgstr "" +msgstr "URL non valido" -#: .\cookbook\views\api.py:1167 +#: .\cookbook\views\api.py:1205 msgid "Connection Refused." -msgstr "" +msgstr "Connessione rifiutata." -#: .\cookbook\views\api.py:1172 +#: .\cookbook\views\api.py:1210 msgid "Bad URL Schema." -msgstr "" +msgstr "Schema URL invalido." -#: .\cookbook\views\api.py:1195 -#, fuzzy -#| msgid "No useable data could be found." +#: .\cookbook\views\api.py:1233 msgid "No usable data could be found." msgstr "Nessuna informazione utilizzabile è stata trovata." -#: .\cookbook\views\api.py:1303 .\cookbook\views\data.py:28 +#: .\cookbook\views\api.py:1326 .\cookbook\views\import_export.py:117 +msgid "Importing is not implemented for this provider" +msgstr "Questo provider non permette l'importazione" + +#: .\cookbook\views\api.py:1372 .\cookbook\views\data.py:31 #: .\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:1325 +#: .\cookbook\views\api.py:1394 msgid "Sync successful!" msgstr "Sincronizzazione completata con successo!" -#: .\cookbook\views\api.py:1330 +#: .\cookbook\views\api.py:1399 msgid "Error synchronizing with Storage" msgstr "Errore di sincronizzazione con questo backend" -#: .\cookbook\views\data.py:97 +#: .\cookbook\views\data.py:100 #, python-format msgid "Batch edit done. %(count)d recipe was updated." msgid_plural "Batch edit done. %(count)d Recipes where updated." @@ -2715,10 +2542,8 @@ msgid "Invite Link" msgstr "Link di invito" #: .\cookbook\views\delete.py:200 -#, fuzzy -#| msgid "Members" msgid "Space Membership" -msgstr "Membri" +msgstr "Spazio Membership" #: .\cookbook\views\edit.py:116 msgid "You cannot edit this storage!" @@ -2742,15 +2567,13 @@ msgstr "Modifiche salvate!" msgid "Error saving changes!" msgstr "Si è verificato un errore durante il salvataggio delle modifiche!" -#: .\cookbook\views\import_export.py:111 .\cookbook\views\import_export.py:150 -msgid "Importing is not implemented for this provider" -msgstr "Questo provider non permette l'importazione" - -#: .\cookbook\views\import_export.py:137 +#: .\cookbook\views\import_export.py:104 msgid "" "The PDF Exporter is not enabled on this instance as it is still in an " "experimental state." msgstr "" +"L'esportatore PDF non è abilitato in questa istanza, perché è ancora in " +"stato sperimentale." #: .\cookbook\views\lists.py:24 msgid "Import Log" @@ -2777,10 +2600,8 @@ msgid "Shopping Categories" msgstr "Categorie della spesa" #: .\cookbook\views\lists.py:187 -#, fuzzy -#| msgid "Filter" msgid "Custom Filters" -msgstr "Filtro" +msgstr "Filtri personalizzati" #: .\cookbook\views\lists.py:224 msgid "Steps" @@ -2794,7 +2615,12 @@ msgstr "La nuova ricetta è stata importata!" msgid "There was an error importing this recipe!" msgstr "Si è verificato un errore durante l'importazione di questa ricetta!" -#: .\cookbook\views\views.py:124 +#: .\cookbook\views\views.py:73 .\cookbook\views\views.py:191 +#: .\cookbook\views\views.py:213 .\cookbook\views\views.py:399 +msgid "This feature is not available in the demo version!" +msgstr "Questa funzione non è disponibile nella versione demo!" + +#: .\cookbook\views\views.py:89 msgid "" "You have successfully created your own recipe space. Start by adding some " "recipes or invite other people to join you." @@ -2802,23 +2628,19 @@ msgstr "" "Hai creato la tua istanza personale per le ricette. Inizia aggiungendo " "qualche ricetta o invita altre persone a unirsi a te." -#: .\cookbook\views\views.py:178 +#: .\cookbook\views\views.py:143 msgid "You do not have the required permissions to perform this action!" msgstr "Non hai i permessi necessari per completare questa operazione!" -#: .\cookbook\views\views.py:189 +#: .\cookbook\views\views.py:154 msgid "Comment saved!" msgstr "Commento salvato!" -#: .\cookbook\views\views.py:264 -msgid "This feature is not available in the demo version!" -msgstr "Questa funzione non è disponibile nella versione demo!" - -#: .\cookbook\views\views.py:324 +#: .\cookbook\views\views.py:253 msgid "You must select at least one field to search!" msgstr "Devi selezionare almeno un campo da cercare!" -#: .\cookbook\views\views.py:329 +#: .\cookbook\views\views.py:258 msgid "" "To use this search method you must select at least one full text search " "field!" @@ -2826,11 +2648,11 @@ msgstr "" "Per utilizzare questo metodo di ricerca devi selezionare almeno un campo di " "ricerca full text!" -#: .\cookbook\views\views.py:333 +#: .\cookbook\views\views.py:262 msgid "Fuzzy search is not compatible with this search method!" msgstr "La ricerca vaga non è compatibile con questo metodo di ricerca!" -#: .\cookbook\views\views.py:463 +#: .\cookbook\views\views.py:338 msgid "" "The setup page can only be used to create the first user! If you have " "forgotten your superuser credentials please consult the django documentation " @@ -2840,27 +2662,27 @@ msgstr "" "utente! Se hai dimenticato le credenziali del tuo super utente controlla la " "documentazione di Django per resettare le password." -#: .\cookbook\views\views.py:470 +#: .\cookbook\views\views.py:345 msgid "Passwords dont match!" msgstr "Le password non combaciano!" -#: .\cookbook\views\views.py:478 +#: .\cookbook\views\views.py:353 msgid "User has been created, please login!" msgstr "L'utente è stato creato e ora può essere usato per il login!" -#: .\cookbook\views\views.py:494 +#: .\cookbook\views\views.py:369 msgid "Malformed Invite Link supplied!" msgstr "È stato fornito un link di invito non valido!" -#: .\cookbook\views\views.py:510 +#: .\cookbook\views\views.py:386 msgid "Successfully joined space." msgstr "Sei entrato a far parte di questa istanza." -#: .\cookbook\views\views.py:516 +#: .\cookbook\views\views.py:392 msgid "Invite Link not valid or already used!" msgstr "Il link di invito non è valido o è stato già usato!" -#: .\cookbook\views\views.py:530 +#: .\cookbook\views\views.py:409 msgid "" "Reporting share links is not enabled for this instance. Please notify the " "page administrator to report problems." @@ -2868,7 +2690,7 @@ msgstr "" "La segnalazione dei link di condivisione non è abilitata per questa istanza. " "Notifica l'amministratore per segnalare i problemi." -#: .\cookbook\views\views.py:536 +#: .\cookbook\views\views.py:415 msgid "" "Recipe sharing link has been disabled! For additional information please " "contact the page administrator." @@ -2876,6 +2698,171 @@ msgstr "" "Il link per la condivisione delle ricette è stato disabilitato! Per maggiori " "informazioni contatta l'amministratore." +#~ msgid "Ingredients" +#~ msgstr "Ingredienti" + +#~ msgid "Show recent recipes" +#~ msgstr "Mostra ricette recenti" + +#~ msgid "Search style" +#~ msgstr "Cerca stile" + +#~ msgid "Show recently viewed recipes on search page." +#~ msgstr "Mostra le ricette visualizzate di recente nella pagina di ricerca." + +#~ msgid "Small" +#~ msgstr "Piccolo" + +#~ msgid "Large" +#~ msgstr "Grande" + +#~ msgid "Edit Ingredients" +#~ msgstr "Modifica Ingredienti" + +#~ msgid "" +#~ "\n" +#~ " The following form can be used if, accidentally, two (or more) " +#~ "units or ingredients where created that should be\n" +#~ " the same.\n" +#~ " It merges two units or ingredients and updates all recipes using " +#~ "them.\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ " Questo modulo può essere utilizzato se, accidentalmente, sono " +#~ "stati creati due (o più) unità di misura o ingredienti che\n" +#~ " dovrebbero essere lo stesso.\n" +#~ " Unisce due unità di misura o ingredienti e aggiorna tutte le " +#~ "ricette che li utilizzano.\n" +#~ " " + +#~ msgid "Are you sure that you want to merge these two units?" +#~ msgstr "Sei sicuro di volere unire queste due unità di misura?" + +#~ msgid "Merge" +#~ msgstr "Unisci" + +#~ msgid "Are you sure that you want to merge these two ingredients?" +#~ msgstr "Sei sicuro di volere unire questi due ingredienti?" + +#~ msgid "Import Recipes" +#~ msgstr "Importa Ricette" + +#~ msgid "Close" +#~ msgstr "Chiudi" + +#~ msgid "Open Recipe" +#~ msgstr "Apri Ricetta" + +#~ msgid "Meal Plan View" +#~ msgstr "Mostra il piano alimentare" + +#~ msgid "Created by" +#~ msgstr "Creato da" + +#~ msgid "Shared with" +#~ msgstr "Condiviso con" + +#~ msgid "Last cooked" +#~ msgstr "Cucinato di recente" + +#~ msgid "Never cooked before." +#~ msgstr "Mai cucinato." + +#~ msgid "Other meals on this day" +#~ msgstr "Altri pasti di questo giorno" + +#~ msgid "Recipe Image" +#~ msgstr "Immagine ricetta" + +#~ msgid "Preparation time ca." +#~ msgstr "Tempo di preparazione circa" + +#~ msgid "Waiting time ca." +#~ msgstr "Tempo di cottura circa" + +#~ msgid "External" +#~ msgstr "Esterna" + +#~ msgid "Log Cooking" +#~ msgstr "Registro ricette cucinate" + +#~ msgid "Account" +#~ msgstr "Account" + +#~ msgid "Preferences" +#~ msgstr "Preferenze" + +#~ msgid "API-Settings" +#~ msgstr "Impostazioni API" + +#~ msgid "Search-Settings" +#~ msgstr "Cerca-Impostazioni" + +#~ msgid "Shopping-Settings" +#~ msgstr "Spesa-Impostazioni" + +#~ msgid "Name Settings" +#~ msgstr "Impostazioni Nome" + +#~ msgid "Account Settings" +#~ msgstr "Impostazioni Account" + +#~ msgid "Emails" +#~ msgstr "Email" + +#~ msgid "Language" +#~ msgstr "Lingua" + +#~ msgid "Style" +#~ msgstr "Stile" + +#~ msgid "API Token" +#~ msgstr "Token API" + +#~ msgid "" +#~ "You can use both basic authentication and token based authentication to " +#~ "access the REST API." +#~ msgstr "" +#~ "Per accedere alle API REST puoi usare sia l'autenticazione base sia " +#~ "quella tramite token." + +#~ msgid "" +#~ "Use the token as an Authorization header prefixed by the word token as " +#~ "shown in the following examples:" +#~ msgstr "" +#~ "Usa il token come header Authorization preceduto dalla parola Token come " +#~ "negli esempi seguenti:" + +#~ msgid "or" +#~ msgstr "o" + +#, fuzzy +#~| msgid "Shopping List" +#~ msgid "Shopping Settings" +#~ msgstr "Lista della spesa" + +#~ msgid "Stats" +#~ msgstr "Statistiche" + +#~ msgid "Statistics" +#~ msgstr "Statistiche" + +#~ msgid "Number of objects" +#~ msgstr "Numero di oggetti" + +#~ msgid "Recipe Imports" +#~ msgstr "Ricette importate" + +#~ msgid "Objects stats" +#~ msgstr "Statistiche degli oggetti" + +#~ msgid "Recipes without Keywords" +#~ msgstr "Ricette senza parole chiave" + +#~ msgid "Internal Recipes" +#~ msgstr "Ricette interne" + #~ msgid "Show Links" #~ msgstr "Mostra link" @@ -3017,9 +3004,6 @@ msgstr "" #~ msgid "Text dragged here will be appended to the name." #~ msgstr "Il testo trascinato qui sarà aggiunto al nome." -#~ msgid "Description" -#~ msgstr "Descrizione" - #~ msgid "Text dragged here will be appended to the description." #~ msgstr "Il testo trascinato qui sarà aggiunto alla descrizione." @@ -3040,9 +3024,6 @@ msgstr "" #~ msgstr "" #~ "Gli ingredienti trascinati qui saranno aggiunti alla lista corrente." -#~ msgid "Instructions" -#~ msgstr "Istruzioni" - #~ msgid "" #~ "Recipe instructions dragged here will be appended to current instructions." #~ msgstr "" diff --git a/cookbook/locale/lv/LC_MESSAGES/django.mo b/cookbook/locale/lv/LC_MESSAGES/django.mo index 15f4ff037..9ff6c99cc 100644 Binary files a/cookbook/locale/lv/LC_MESSAGES/django.mo and b/cookbook/locale/lv/LC_MESSAGES/django.mo differ diff --git a/cookbook/locale/lv/LC_MESSAGES/django.po b/cookbook/locale/lv/LC_MESSAGES/django.po index 330aa4bb1..d96bc724f 100644 --- a/cookbook/locale/lv/LC_MESSAGES/django.po +++ b/cookbook/locale/lv/LC_MESSAGES/django.po @@ -6,96 +6,77 @@ # Translators: # vabene1111 , 2021 # -#, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 19:20+0200\n" -"PO-Revision-Date: 2020-06-02 19:28+0000\n" -"Last-Translator: vabene1111 , 2021\n" -"Language-Team: Latvian (https://www.transifex.com/django-recipes/" -"teams/110507/lv/)\n" +"POT-Creation-Date: 2023-04-26 07:46+0200\n" +"PO-Revision-Date: 2023-01-08 17:55+0000\n" +"Last-Translator: Joachim Weber \n" +"Language-Team: Latvian \n" "Language: lv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " -"2);\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n" +"X-Generator: Weblate 4.15\n" -#: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 -#: .\cookbook\templates\stats.html:28 -msgid "Ingredients" -msgstr "Sastāvdaļas" - -#: .\cookbook\forms.py:53 +#: .\cookbook\forms.py:52 msgid "Default unit" msgstr "" -#: .\cookbook\forms.py:54 +#: .\cookbook\forms.py:53 #, fuzzy #| msgid "System Information" msgid "Use fractions" msgstr "Sistēmas informācija" -#: .\cookbook\forms.py:55 +#: .\cookbook\forms.py:54 msgid "Use KJ" msgstr "" -#: .\cookbook\forms.py:56 +#: .\cookbook\forms.py:55 msgid "Theme" msgstr "" -#: .\cookbook\forms.py:57 +#: .\cookbook\forms.py:56 msgid "Navbar color" msgstr "" -#: .\cookbook\forms.py:58 +#: .\cookbook\forms.py:57 msgid "Sticky navbar" msgstr "" -#: .\cookbook\forms.py:59 +#: .\cookbook\forms.py:58 msgid "Default page" msgstr "" -#: .\cookbook\forms.py:60 -#, fuzzy -#| msgid "Shopping Recipes" -msgid "Show recent recipes" -msgstr "Iepirkšanās receptes" - -#: .\cookbook\forms.py:61 -#, fuzzy -#| msgid "Search" -msgid "Search style" -msgstr "Meklēt" - -#: .\cookbook\forms.py:62 +#: .\cookbook\forms.py:59 msgid "Plan sharing" msgstr "" -#: .\cookbook\forms.py:63 +#: .\cookbook\forms.py:60 #, fuzzy #| msgid "Ingredients" msgid "Ingredient decimal places" msgstr "Sastāvdaļas" -#: .\cookbook\forms.py:64 +#: .\cookbook\forms.py:61 #, fuzzy #| msgid "Shopping list currently empty" msgid "Shopping list auto sync period" msgstr "Iepirkumu saraksts pašlaik ir tukšs" -#: .\cookbook\forms.py:65 .\cookbook\templates\recipe_view.html:21 -#: .\cookbook\templates\stats.html:47 +#: .\cookbook\forms.py:62 .\cookbook\templates\recipe_view.html:36 msgid "Comments" msgstr "Komentāri" -#: .\cookbook\forms.py:66 +#: .\cookbook\forms.py:63 msgid "Left-handed mode" msgstr "" -#: .\cookbook\forms.py:70 +#: .\cookbook\forms.py:67 msgid "" "Color of the top navigation bar. Not all colors work with all themes, just " "try them out!" @@ -103,11 +84,11 @@ msgstr "" "Augšējās navigācijas joslas krāsa. Ne visas krāsas darbojas ar visām tēmām, " "vienkārši izmēģiniet tās!" -#: .\cookbook\forms.py:72 +#: .\cookbook\forms.py:69 msgid "Default Unit to be used when inserting a new ingredient into a recipe." msgstr "Noklusējuma vienība, ko izmantot, ievietojot receptē jaunu sastāvdaļu." -#: .\cookbook\forms.py:74 +#: .\cookbook\forms.py:71 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" @@ -115,11 +96,11 @@ msgstr "" "Iespējot daļskaitļus sastāvdaļu daudzumos (piemēram, decimāldaļas " "automātiski pārveidot par daļskaitļiem)" -#: .\cookbook\forms.py:76 +#: .\cookbook\forms.py:73 msgid "Display nutritional energy amounts in joules instead of calories" msgstr "" -#: .\cookbook\forms.py:77 +#: .\cookbook\forms.py:74 #, fuzzy #| msgid "" #| "Users with whom newly created meal plan/shopping list entries should be " @@ -129,26 +110,22 @@ msgstr "" "Lietotāji, ar kuriem jaunizveidotie maltīšu saraksti/iepirkumu saraksti tiks " "kopīgoti pēc noklusējuma." -#: .\cookbook\forms.py:78 +#: .\cookbook\forms.py:75 #, fuzzy #| msgid "Open Shopping List" msgid "Users with whom to share shopping lists." msgstr "Atvērt iepirkumu sarakstu" -#: .\cookbook\forms.py:80 -msgid "Show recently viewed recipes on search page." -msgstr "Parādīt nesen skatītās receptes meklēšanas lapā." - -#: .\cookbook\forms.py:81 +#: .\cookbook\forms.py:76 msgid "Number of decimals to round ingredients." msgstr "Ciparu skaits pēc komata decimāldaļām sastāvdaļās." -#: .\cookbook\forms.py:82 +#: .\cookbook\forms.py:77 msgid "If you want to be able to create and see comments underneath recipes." msgstr "" "Ja vēlaties, lai jūs varētu izveidot un redzēt komentārus zem receptēm." -#: .\cookbook\forms.py:84 .\cookbook\forms.py:496 +#: .\cookbook\forms.py:79 .\cookbook\forms.py:492 msgid "" "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. " @@ -162,23 +139,23 @@ msgstr "" "Ja tas ir zemāks par instances ierobežojumu, tas tiek atiestatīts, " "saglabājot." -#: .\cookbook\forms.py:87 +#: .\cookbook\forms.py:82 msgid "Makes the navbar stick to the top of the page." msgstr "" -#: .\cookbook\forms.py:88 .\cookbook\forms.py:499 +#: .\cookbook\forms.py:83 .\cookbook\forms.py:495 msgid "Automatically add meal plan ingredients to shopping list." msgstr "" -#: .\cookbook\forms.py:89 +#: .\cookbook\forms.py:84 msgid "Exclude ingredients that are on hand." msgstr "" -#: .\cookbook\forms.py:90 +#: .\cookbook\forms.py:85 msgid "Will optimize the UI for use with your left hand." msgstr "" -#: .\cookbook\forms.py:107 +#: .\cookbook\forms.py:102 msgid "" "Both fields are optional. If none are given the username will be displayed " "instead" @@ -186,54 +163,53 @@ msgstr "" "Abi lauki nav obligāti. Ja neviens nav norādīts, tā vietā tiks parādīts " "lietotājvārds" -#: .\cookbook\forms.py:128 .\cookbook\forms.py:301 +#: .\cookbook\forms.py:123 .\cookbook\forms.py:297 msgid "Name" msgstr "Vārds" -#: .\cookbook\forms.py:129 .\cookbook\forms.py:302 -#: .\cookbook\templates\stats.html:24 .\cookbook\views\lists.py:88 +#: .\cookbook\forms.py:124 .\cookbook\forms.py:298 .\cookbook\views\lists.py:88 msgid "Keywords" msgstr "Atslēgvārdi" -#: .\cookbook\forms.py:130 +#: .\cookbook\forms.py:125 msgid "Preparation time in minutes" msgstr "Pagatavošanas laiks minūtēs" -#: .\cookbook\forms.py:131 +#: .\cookbook\forms.py:126 msgid "Waiting time (cooking/baking) in minutes" msgstr "Gaidīšanas laiks (vārīšana / cepšana) minūtēs" -#: .\cookbook\forms.py:132 .\cookbook\forms.py:270 .\cookbook\forms.py:303 +#: .\cookbook\forms.py:127 .\cookbook\forms.py:266 .\cookbook\forms.py:299 msgid "Path" msgstr "Ceļš" -#: .\cookbook\forms.py:133 +#: .\cookbook\forms.py:128 msgid "Storage UID" msgstr "Krātuves UID" -#: .\cookbook\forms.py:165 +#: .\cookbook\forms.py:161 msgid "Default" msgstr "" -#: .\cookbook\forms.py:177 +#: .\cookbook\forms.py:173 msgid "" "To prevent duplicates recipes with the same name as existing ones are " "ignored. Check this box to import everything." msgstr "" -#: .\cookbook\forms.py:200 +#: .\cookbook\forms.py:196 msgid "Add your comment: " msgstr "Pievienot komentāru: " -#: .\cookbook\forms.py:215 +#: .\cookbook\forms.py:211 msgid "Leave empty for dropbox and enter app password for nextcloud." msgstr "Atstājiet tukšu Dropbox un ievadiet lietotnes paroli Nextcloud." -#: .\cookbook\forms.py:222 +#: .\cookbook\forms.py:218 msgid "Leave empty for nextcloud and enter api token for dropbox." msgstr "Atstājiet tukšu Nextcloud un ievadiet API tokenu Dropbox." -#: .\cookbook\forms.py:231 +#: .\cookbook\forms.py:227 msgid "" "Leave empty for dropbox and enter only base url for nextcloud (/remote." "php/webdav/ is added automatically)" @@ -241,33 +217,33 @@ msgstr "" "Atstājiet tukšu Dropbox un ievadiet tikai Nextcloud bāzes URL ( /" "remote.php/webdav/
    tiek pievienots automātiski)" -#: .\cookbook\forms.py:269 .\cookbook\views\edit.py:157 +#: .\cookbook\forms.py:265 .\cookbook\views\edit.py:157 msgid "Storage" msgstr "Krātuve" -#: .\cookbook\forms.py:271 +#: .\cookbook\forms.py:267 msgid "Active" msgstr "" -#: .\cookbook\forms.py:277 +#: .\cookbook\forms.py:273 msgid "Search String" msgstr "Meklēšanas virkne" -#: .\cookbook\forms.py:304 +#: .\cookbook\forms.py:300 msgid "File ID" msgstr "Faila ID" -#: .\cookbook\forms.py:326 +#: .\cookbook\forms.py:322 msgid "You must provide at least a recipe or a title." msgstr "Jums jānorāda vismaz recepte vai nosaukums." -#: .\cookbook\forms.py:339 +#: .\cookbook\forms.py:335 msgid "You can list default users to share recipes with in the settings." msgstr "" "Iestatījumos varat uzskaitīt noklusējuma lietotājus, ar kuriem koplietot " "receptes." -#: .\cookbook\forms.py:340 +#: .\cookbook\forms.py:336 msgid "" "You can use markdown to format this field. See the docs here" @@ -275,320 +251,363 @@ msgstr "" "Lai formatētu šo lauku, varat izmantot Markdown. Skatiet dokumentus šeit " -#: .\cookbook\forms.py:366 +#: .\cookbook\forms.py:362 msgid "Maximum number of users for this space reached." msgstr "" -#: .\cookbook\forms.py:372 +#: .\cookbook\forms.py:368 msgid "Email address already taken!" msgstr "" -#: .\cookbook\forms.py:380 +#: .\cookbook\forms.py:376 msgid "" "An email address is not required but if present the invite link will be sent " "to the user." msgstr "" -#: .\cookbook\forms.py:395 +#: .\cookbook\forms.py:391 msgid "Name already taken." msgstr "" -#: .\cookbook\forms.py:406 +#: .\cookbook\forms.py:402 msgid "Accept Terms and Privacy" msgstr "" -#: .\cookbook\forms.py:438 +#: .\cookbook\forms.py:434 msgid "" "Determines how fuzzy a search is if it uses trigram similarity matching (e." "g. low values mean more typos are ignored)." msgstr "" -#: .\cookbook\forms.py:448 +#: .\cookbook\forms.py:444 msgid "" "Select type method of search. Click here for " "full description of choices." msgstr "" -#: .\cookbook\forms.py:449 +#: .\cookbook\forms.py:445 msgid "" "Use fuzzy matching on units, keywords and ingredients when editing and " "importing recipes." msgstr "" -#: .\cookbook\forms.py:451 +#: .\cookbook\forms.py:447 msgid "" "Fields to search ignoring accents. Selecting this option can improve or " "degrade search quality depending on language" msgstr "" -#: .\cookbook\forms.py:453 +#: .\cookbook\forms.py:449 msgid "" "Fields to search for partial matches. (e.g. searching for 'Pie' will return " "'pie' and 'piece' and 'soapie')" msgstr "" -#: .\cookbook\forms.py:455 +#: .\cookbook\forms.py:451 msgid "" "Fields to search for beginning of word matches. (e.g. searching for 'sa' " "will return 'salad' and 'sandwich')" msgstr "" -#: .\cookbook\forms.py:457 +#: .\cookbook\forms.py:453 msgid "" "Fields to 'fuzzy' search. (e.g. searching for 'recpie' will find 'recipe'.) " "Note: this option will conflict with 'web' and 'raw' methods of search." msgstr "" -#: .\cookbook\forms.py:459 +#: .\cookbook\forms.py:455 msgid "" "Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " "only function with fulltext fields." msgstr "" -#: .\cookbook\forms.py:463 +#: .\cookbook\forms.py:459 #, fuzzy #| msgid "Search" msgid "Search Method" msgstr "Meklēt" -#: .\cookbook\forms.py:464 +#: .\cookbook\forms.py:460 msgid "Fuzzy Lookups" msgstr "" -#: .\cookbook\forms.py:465 +#: .\cookbook\forms.py:461 msgid "Ignore Accent" msgstr "" -#: .\cookbook\forms.py:466 +#: .\cookbook\forms.py:462 msgid "Partial Match" msgstr "" -#: .\cookbook\forms.py:467 +#: .\cookbook\forms.py:463 msgid "Starts With" msgstr "" -#: .\cookbook\forms.py:468 +#: .\cookbook\forms.py:464 #, fuzzy #| msgid "Search" msgid "Fuzzy Search" msgstr "Meklēt" -#: .\cookbook\forms.py:469 +#: .\cookbook\forms.py:465 #, fuzzy #| msgid "Text" msgid "Full Text" msgstr "Teskts" -#: .\cookbook\forms.py:494 +#: .\cookbook\forms.py:490 msgid "" "Users will see all items you add to your shopping list. They must add you " "to see items on their list." msgstr "" -#: .\cookbook\forms.py:500 +#: .\cookbook\forms.py:496 msgid "" "When adding a meal plan to the shopping list (manually or automatically), " "include all related recipes." msgstr "" -#: .\cookbook\forms.py:501 +#: .\cookbook\forms.py:497 msgid "" "When adding a meal plan to the shopping list (manually or automatically), " "exclude ingredients that are on hand." msgstr "" -#: .\cookbook\forms.py:502 +#: .\cookbook\forms.py:498 msgid "Default number of hours to delay a shopping list entry." msgstr "" -#: .\cookbook\forms.py:503 +#: .\cookbook\forms.py:499 msgid "Filter shopping list to only include supermarket categories." msgstr "" -#: .\cookbook\forms.py:504 +#: .\cookbook\forms.py:500 msgid "Days of recent shopping list entries to display." msgstr "" -#: .\cookbook\forms.py:505 +#: .\cookbook\forms.py:501 msgid "Mark food 'On Hand' when checked off shopping list." msgstr "" -#: .\cookbook\forms.py:506 +#: .\cookbook\forms.py:502 msgid "Delimiter to use for CSV exports." msgstr "" -#: .\cookbook\forms.py:507 +#: .\cookbook\forms.py:503 msgid "Prefix to add when copying list to the clipboard." msgstr "" -#: .\cookbook\forms.py:511 +#: .\cookbook\forms.py:507 #, fuzzy #| msgid "Shopping List" msgid "Share Shopping List" msgstr "Iepirkumu saraksts" -#: .\cookbook\forms.py:512 +#: .\cookbook\forms.py:508 msgid "Autosync" msgstr "" -#: .\cookbook\forms.py:513 +#: .\cookbook\forms.py:509 msgid "Auto Add Meal Plan" msgstr "" -#: .\cookbook\forms.py:514 +#: .\cookbook\forms.py:510 msgid "Exclude On Hand" msgstr "" -#: .\cookbook\forms.py:515 +#: .\cookbook\forms.py:511 msgid "Include Related" msgstr "" -#: .\cookbook\forms.py:516 +#: .\cookbook\forms.py:512 msgid "Default Delay Hours" msgstr "" -#: .\cookbook\forms.py:517 +#: .\cookbook\forms.py:513 msgid "Filter to Supermarket" msgstr "" -#: .\cookbook\forms.py:518 +#: .\cookbook\forms.py:514 msgid "Recent Days" msgstr "" -#: .\cookbook\forms.py:519 +#: .\cookbook\forms.py:515 msgid "CSV Delimiter" msgstr "" -#: .\cookbook\forms.py:520 +#: .\cookbook\forms.py:516 msgid "List Prefix" msgstr "Saraksta prefikss" -#: .\cookbook\forms.py:521 +#: .\cookbook\forms.py:517 msgid "Auto On Hand" msgstr "" -#: .\cookbook\forms.py:531 +#: .\cookbook\forms.py:527 msgid "Reset Food Inheritance" msgstr "" -#: .\cookbook\forms.py:532 +#: .\cookbook\forms.py:528 msgid "Reset all food to inherit the fields configured." msgstr "" -#: .\cookbook\forms.py:544 +#: .\cookbook\forms.py:540 #, fuzzy #| msgid "Food that should be replaced." msgid "Fields on food that should be inherited by default." msgstr "Ēdiens, kas būtu jāaizstāj." -#: .\cookbook\forms.py:545 +#: .\cookbook\forms.py:541 #, fuzzy #| msgid "Show recently viewed recipes on search page." msgid "Show recipe counts on search filters" msgstr "Parādīt nesen skatītās receptes meklēšanas lapā." -#: .\cookbook\helper\AllAuthCustomAdapter.py:36 +#: .\cookbook\forms.py:542 +msgid "Use the plural form for units and food inside this space." +msgstr "" + +#: .\cookbook\helper\AllAuthCustomAdapter.py:39 msgid "" "In order to prevent spam, the requested email was not send. Please wait a " "few minutes and try again." msgstr "" -#: .\cookbook\helper\permission_helper.py:149 -#: .\cookbook\helper\permission_helper.py:172 .\cookbook\views\views.py:152 +#: .\cookbook\helper\permission_helper.py:164 +#: .\cookbook\helper\permission_helper.py:187 .\cookbook\views\views.py:117 msgid "You are not logged in and therefore cannot view this page!" msgstr "Jūs neesat pieteicies un tāpēc nevarat skatīt šo lapu!" -#: .\cookbook\helper\permission_helper.py:153 -#: .\cookbook\helper\permission_helper.py:159 -#: .\cookbook\helper\permission_helper.py:184 -#: .\cookbook\helper\permission_helper.py:254 -#: .\cookbook\helper\permission_helper.py:268 -#: .\cookbook\helper\permission_helper.py:279 -#: .\cookbook\helper\permission_helper.py:290 .\cookbook\views\data.py:33 -#: .\cookbook\views\views.py:163 .\cookbook\views\views.py:170 -#: .\cookbook\views\views.py:249 +#: .\cookbook\helper\permission_helper.py:168 +#: .\cookbook\helper\permission_helper.py:174 +#: .\cookbook\helper\permission_helper.py:199 +#: .\cookbook\helper\permission_helper.py:269 +#: .\cookbook\helper\permission_helper.py:283 +#: .\cookbook\helper\permission_helper.py:294 +#: .\cookbook\helper\permission_helper.py:305 +#: .\cookbook\helper\permission_helper.py:321 +#: .\cookbook\helper\permission_helper.py:342 .\cookbook\views\data.py:36 +#: .\cookbook\views\views.py:128 .\cookbook\views\views.py:135 msgid "You do not have the required permissions to view this page!" msgstr "Jums nav nepieciešamo atļauju, lai apskatītu šo lapu!" -#: .\cookbook\helper\permission_helper.py:177 -#: .\cookbook\helper\permission_helper.py:200 -#: .\cookbook\helper\permission_helper.py:222 +#: .\cookbook\helper\permission_helper.py:192 +#: .\cookbook\helper\permission_helper.py:215 #: .\cookbook\helper\permission_helper.py:237 +#: .\cookbook\helper\permission_helper.py:252 msgid "You cannot interact with this object as it is not owned by you!" msgstr "Jūs nevarat mainīt šo objektu, jo tas nepieder jums!" -#: .\cookbook\helper\permission_helper.py:321 +#: .\cookbook\helper\permission_helper.py:403 msgid "You have reached the maximum number of recipes for your space." msgstr "" -#: .\cookbook\helper\permission_helper.py:333 +#: .\cookbook\helper\permission_helper.py:415 msgid "You have more users than allowed in your space." msgstr "" -#: .\cookbook\helper\recipe_search.py:565 +#: .\cookbook\helper\recipe_search.py:630 msgid "One of queryset or hash_key must be provided" msgstr "" -#: .\cookbook\helper\shopping_helper.py:152 +#: .\cookbook\helper\recipe_url_import.py:266 +#, fuzzy +#| msgid "System Information" +msgid "reverse rotation" +msgstr "Sistēmas informācija" + +#: .\cookbook\helper\recipe_url_import.py:267 +msgid "careful rotation" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:268 +msgid "knead" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:269 +msgid "thicken" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:270 +msgid "warm up" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:271 +msgid "ferment" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:272 +msgid "sous-vide" +msgstr "" + +#: .\cookbook\helper\shopping_helper.py:157 #, fuzzy #| msgid "You must provide at least a recipe or a title." msgid "You must supply a servings size" msgstr "Jums jānorāda vismaz recepte vai nosaukums." -#: .\cookbook\helper\template_helper.py:64 -#: .\cookbook\helper\template_helper.py:66 +#: .\cookbook\helper\template_helper.py:79 +#: .\cookbook\helper\template_helper.py:81 msgid "Could not parse template code." msgstr "" -#: .\cookbook\integration\copymethat.py:41 +#: .\cookbook\integration\copymethat.py:44 #: .\cookbook\integration\melarecipes.py:37 msgid "Favorite" msgstr "" -#: .\cookbook\integration\copymethat.py:70 -#: .\cookbook\integration\recettetek.py:54 -#: .\cookbook\integration\recipekeeper.py:63 -msgid "Imported from" -msgstr "Importēts no" +#: .\cookbook\integration\copymethat.py:50 +msgid "I made this" +msgstr "" -#: .\cookbook\integration\integration.py:223 +#: .\cookbook\integration\integration.py:218 msgid "" "Importer expected a .zip file. Did you choose the correct importer type for " "your data ?" msgstr "" -#: .\cookbook\integration\integration.py:226 +#: .\cookbook\integration\integration.py:221 msgid "" "An unexpected error occurred during the import. Please make sure you have " "uploaded a valid file." msgstr "" -#: .\cookbook\integration\integration.py:231 +#: .\cookbook\integration\integration.py:226 msgid "The following recipes were ignored because they already existed:" msgstr "" -#: .\cookbook\integration\integration.py:235 -#, fuzzy, python-format -#| msgid "Imported new recipe!" +#: .\cookbook\integration\integration.py:230 +#, python-format msgid "Imported %s recipes." -msgstr "Importēta jauna recepte!" +msgstr "Importētas %s receptes." -#: .\cookbook\integration\paprika.py:46 +#: .\cookbook\integration\openeats.py:26 +#, fuzzy +#| msgid "Recipe Home" +msgid "Recipe source:" +msgstr "Recepšu Sākums" + +#: .\cookbook\integration\paprika.py:49 #, fuzzy #| msgid "Note" msgid "Notes" msgstr "Piezīme" -#: .\cookbook\integration\paprika.py:49 +#: .\cookbook\integration\paprika.py:52 #, fuzzy #| msgid "Information" msgid "Nutritional Information" msgstr "Informācija" -#: .\cookbook\integration\paprika.py:53 +#: .\cookbook\integration\paprika.py:56 msgid "Source" msgstr "" +#: .\cookbook\integration\recettetek.py:54 +#: .\cookbook\integration\recipekeeper.py:70 +msgid "Imported from" +msgstr "Importēts no" + #: .\cookbook\integration\saffron.py:23 msgid "Servings" msgstr "Porciju skaits" @@ -601,9 +620,7 @@ msgstr "" msgid "Preparation Time" msgstr "Pagatavošanas laiks" -#: .\cookbook\integration\saffron.py:29 -#: .\cookbook\templates\forms\ingredients.html:7 -#: .\cookbook\templates\index.html:7 +#: .\cookbook\integration\saffron.py:29 .\cookbook\templates\index.html:7 msgid "Cookbook" msgstr "Pavārgrāmata" @@ -643,179 +660,168 @@ msgstr "Vakariņas" msgid "Other" msgstr "Cits" -#: .\cookbook\models.py:251 +#: .\cookbook\models.py:261 msgid "" "Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " "upload." msgstr "" -#: .\cookbook\models.py:353 .\cookbook\templates\search.html:7 +#: .\cookbook\models.py:365 .\cookbook\templates\search.html:7 +#: .\cookbook\templates\settings.html:18 #: .\cookbook\templates\space_manage.html:7 msgid "Search" msgstr "Meklēt" -#: .\cookbook\models.py:354 .\cookbook\templates\base.html:107 +#: .\cookbook\models.py:366 .\cookbook\templates\base.html:110 #: .\cookbook\templates\meal_plan.html:7 .\cookbook\views\delete.py:178 #: .\cookbook\views\edit.py:211 .\cookbook\views\new.py:179 msgid "Meal-Plan" msgstr "Maltīšu plāns" -#: .\cookbook\models.py:355 .\cookbook\templates\base.html:115 +#: .\cookbook\models.py:367 .\cookbook\templates\base.html:118 msgid "Books" msgstr "Grāmatas" -#: .\cookbook\models.py:363 -msgid "Small" -msgstr "Mazs" - -#: .\cookbook\models.py:363 -msgid "Large" -msgstr "Liels" - -#: .\cookbook\models.py:363 .\cookbook\templates\generic\new_template.html:6 -#: .\cookbook\templates\generic\new_template.html:14 -msgid "New" -msgstr "Jauns" - -#: .\cookbook\models.py:584 +#: .\cookbook\models.py:580 msgid " is part of a recipe step and cannot be deleted" msgstr "" -#: .\cookbook\models.py:1162 .\cookbook\templates\search_info.html:28 +#: .\cookbook\models.py:1181 .\cookbook\templates\search_info.html:28 msgid "Simple" msgstr "" -#: .\cookbook\models.py:1163 .\cookbook\templates\search_info.html:33 +#: .\cookbook\models.py:1182 .\cookbook\templates\search_info.html:33 msgid "Phrase" msgstr "" -#: .\cookbook\models.py:1164 .\cookbook\templates\search_info.html:38 +#: .\cookbook\models.py:1183 .\cookbook\templates\search_info.html:38 msgid "Web" msgstr "" -#: .\cookbook\models.py:1165 .\cookbook\templates\search_info.html:47 +#: .\cookbook\models.py:1184 .\cookbook\templates\search_info.html:47 msgid "Raw" msgstr "" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 #, fuzzy #| msgid "Food" msgid "Food Alias" msgstr "Ēdiens" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 #, fuzzy #| msgid "Units" msgid "Unit Alias" msgstr "Vienības" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 #, fuzzy #| msgid "Keywords" msgid "Keyword Alias" msgstr "Atslēgvārdi" -#: .\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 +#: .\cookbook\models.py:1232 +msgid "Description Replace" +msgstr "" + +#: .\cookbook\models.py:1232 +#, fuzzy +#| msgid "Instructions" +msgid "Instruction Replace" +msgstr "Instrukcijas" + +#: .\cookbook\models.py:1258 .\cookbook\views\delete.py:36 +#: .\cookbook\views\edit.py:251 .\cookbook\views\new.py:48 msgid "Recipe" msgstr "Recepte" -#: .\cookbook\models.py:1228 +#: .\cookbook\models.py:1259 #, fuzzy #| msgid "Food" msgid "Food" msgstr "Ēdiens" -#: .\cookbook\models.py:1229 .\cookbook\templates\base.html:138 +#: .\cookbook\models.py:1260 .\cookbook\templates\base.html:141 msgid "Keyword" msgstr "Atslēgvārds" -#: .\cookbook\serializer.py:207 -msgid "Cannot modify Space owner permission." -msgstr "" - -#: .\cookbook\serializer.py:290 +#: .\cookbook\serializer.py:198 msgid "File uploads are not enabled for this Space." msgstr "" -#: .\cookbook\serializer.py:301 +#: .\cookbook\serializer.py:209 msgid "You have reached your file upload limit." msgstr "" -#: .\cookbook\serializer.py:1081 +#: .\cookbook\serializer.py:291 +msgid "Cannot modify Space owner permission." +msgstr "" + +#: .\cookbook\serializer.py:1093 msgid "Hello" msgstr "" -#: .\cookbook\serializer.py:1081 +#: .\cookbook\serializer.py:1093 msgid "You have been invited by " msgstr "" -#: .\cookbook\serializer.py:1082 +#: .\cookbook\serializer.py:1094 msgid " to join their Tandoor Recipes space " msgstr "" -#: .\cookbook\serializer.py:1083 +#: .\cookbook\serializer.py:1095 msgid "Click the following link to activate your account: " msgstr "" -#: .\cookbook\serializer.py:1084 +#: .\cookbook\serializer.py:1096 msgid "" "If the link does not work use the following code to manually join the space: " msgstr "" -#: .\cookbook\serializer.py:1085 +#: .\cookbook\serializer.py:1097 msgid "The invitation is valid until " msgstr "" -#: .\cookbook\serializer.py:1086 +#: .\cookbook\serializer.py:1098 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " msgstr "" -#: .\cookbook\serializer.py:1089 +#: .\cookbook\serializer.py:1101 msgid "Tandoor Recipes Invite" msgstr "" -#: .\cookbook\serializer.py:1209 +#: .\cookbook\serializer.py:1242 msgid "Existing shopping list to update" msgstr "" -#: .\cookbook\serializer.py:1211 +#: .\cookbook\serializer.py:1244 msgid "" "List of ingredient IDs from the recipe to add, if not provided all " "ingredients will be added." msgstr "" -#: .\cookbook\serializer.py:1213 +#: .\cookbook\serializer.py:1246 msgid "" "Providing a list_recipe ID and servings of 0 will delete that shopping list." msgstr "" -#: .\cookbook\serializer.py:1222 +#: .\cookbook\serializer.py:1255 msgid "Amount of food to add to the shopping list" msgstr "" -#: .\cookbook\serializer.py:1224 +#: .\cookbook\serializer.py:1257 msgid "ID of unit to use for the shopping list" msgstr "" -#: .\cookbook\serializer.py:1226 +#: .\cookbook\serializer.py:1259 msgid "When set to true will delete all food from active shopping lists." msgstr "" -#: .\cookbook\tables.py:36 .\cookbook\templates\generic\edit_template.html:6 -#: .\cookbook\templates\generic\edit_template.html:14 -#: .\cookbook\templates\recipes_table.html:82 -msgid "Edit" -msgstr "Rediģēt" - -#: .\cookbook\tables.py:116 .\cookbook\tables.py:131 +#: .\cookbook\tables.py:61 .\cookbook\tables.py:75 #: .\cookbook\templates\generic\delete_template.html:7 #: .\cookbook\templates\generic\delete_template.html:15 #: .\cookbook\templates\generic\edit_template.html:28 -#: .\cookbook\templates\recipes_table.html:90 msgid "Delete" msgstr "Izdzēst" @@ -843,9 +849,10 @@ msgstr "" #: .\cookbook\templates\account\email.html:12 #: .\cookbook\templates\account\password_change.html:11 #: .\cookbook\templates\account\password_set.html:11 -#: .\cookbook\templates\base.html:293 .\cookbook\templates\settings.html:6 +#: .\cookbook\templates\base.html:296 .\cookbook\templates\settings.html:6 #: .\cookbook\templates\settings.html:17 #: .\cookbook\templates\socialaccount\connections.html:10 +#: .\cookbook\templates\user_settings.html:8 msgid "Settings" msgstr "Iestatījumi" @@ -936,8 +943,8 @@ msgid "" "request." msgstr "" -#: .\cookbook\templates\account\login.html:8 -#: .\cookbook\templates\base.html:340 .\cookbook\templates\openid\login.html:8 +#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:343 +#: .\cookbook\templates\openid\login.html:8 msgid "Login" msgstr "Pieslēgties" @@ -957,21 +964,20 @@ msgstr "" msgid "Sign Up" msgstr "" +#: .\cookbook\templates\account\login.html:38 +msgid "Lost your password?" +msgstr "" + #: .\cookbook\templates\account\login.html:39 -#: .\cookbook\templates\account\login.html:41 #: .\cookbook\templates\account\password_reset.html:29 msgid "Reset My Password" msgstr "" -#: .\cookbook\templates\account\login.html:40 -msgid "Lost your password?" -msgstr "" - -#: .\cookbook\templates\account\login.html:52 +#: .\cookbook\templates\account\login.html:50 msgid "Social Login" msgstr "" -#: .\cookbook\templates\account\login.html:53 +#: .\cookbook\templates\account\login.html:51 msgid "You can use any of the following providers to sign in." msgstr "" @@ -999,7 +1005,6 @@ msgstr "Izmaiņas saglabātas!" #: .\cookbook\templates\account\password_change.html:12 #: .\cookbook\templates\account\password_set.html:12 -#: .\cookbook\templates\settings.html:76 #, fuzzy #| msgid "Settings" msgid "Password" @@ -1111,64 +1116,61 @@ msgstr "" msgid "We are sorry, but the sign up is currently closed." msgstr "" -#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:330 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:333 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "API dokumentācija" -#: .\cookbook\templates\base.html:103 .\cookbook\templates\index.html:87 -#: .\cookbook\templates\stats.html:22 +#: .\cookbook\templates\base.html:106 .\cookbook\templates\index.html:87 msgid "Recipes" msgstr "Receptes" -#: .\cookbook\templates\base.html:111 +#: .\cookbook\templates\base.html:114 msgid "Shopping" msgstr "Iepirkšanās" -#: .\cookbook\templates\base.html:150 .\cookbook\views\lists.py:105 +#: .\cookbook\templates\base.html:153 .\cookbook\views\lists.py:105 #, fuzzy #| msgid "Food" msgid "Foods" msgstr "Ēdiens" -#: .\cookbook\templates\base.html:162 -#: .\cookbook\templates\forms\ingredients.html:24 -#: .\cookbook\templates\stats.html:26 .\cookbook\views\lists.py:122 +#: .\cookbook\templates\base.html:165 .\cookbook\views\lists.py:122 msgid "Units" msgstr "Vienības" -#: .\cookbook\templates\base.html:176 .\cookbook\templates\supermarket.html:7 +#: .\cookbook\templates\base.html:179 .\cookbook\templates\supermarket.html:7 msgid "Supermarket" msgstr "" -#: .\cookbook\templates\base.html:188 +#: .\cookbook\templates\base.html:191 #, fuzzy #| msgid "Batch edit Category" msgid "Supermarket Category" msgstr "Rediģēt vairākas kategorijas uzreiz" -#: .\cookbook\templates\base.html:200 .\cookbook\views\lists.py:171 +#: .\cookbook\templates\base.html:203 .\cookbook\views\lists.py:171 #, fuzzy #| msgid "Information" msgid "Automations" msgstr "Informācija" -#: .\cookbook\templates\base.html:214 .\cookbook\views\lists.py:207 +#: .\cookbook\templates\base.html:217 .\cookbook\views\lists.py:207 #, fuzzy #| msgid "File ID" msgid "Files" msgstr "Faila ID" -#: .\cookbook\templates\base.html:226 +#: .\cookbook\templates\base.html:229 msgid "Batch Edit" msgstr "Rediģēt vairākus" -#: .\cookbook\templates\base.html:238 .\cookbook\templates\history.html:6 +#: .\cookbook\templates\base.html:241 .\cookbook\templates\history.html:6 #: .\cookbook\templates\history.html:14 msgid "History" msgstr "Vēsture" -#: .\cookbook\templates\base.html:252 +#: .\cookbook\templates\base.html:255 #: .\cookbook\templates\ingredient_editor.html:7 #: .\cookbook\templates\ingredient_editor.html:13 #, fuzzy @@ -1176,78 +1178,76 @@ msgstr "Vēsture" msgid "Ingredient Editor" msgstr "Sastāvdaļas" -#: .\cookbook\templates\base.html:264 +#: .\cookbook\templates\base.html:267 #: .\cookbook\templates\export_response.html:7 #: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 msgid "Export" msgstr "Eksportēt" -#: .\cookbook\templates\base.html:280 .\cookbook\templates\index.html:47 +#: .\cookbook\templates\base.html:283 .\cookbook\templates\index.html:47 msgid "Import Recipe" msgstr "Importēt recepti" -#: .\cookbook\templates\base.html:282 +#: .\cookbook\templates\base.html:285 msgid "Create" msgstr "Izveidot" -#: .\cookbook\templates\base.html:295 +#: .\cookbook\templates\base.html:298 #: .\cookbook\templates\generic\list_template.html:14 -#: .\cookbook\templates\stats.html:43 msgid "External Recipes" msgstr "Ārējās receptes" -#: .\cookbook\templates\base.html:298 -#: .\cookbook\templates\space_manage.html:15 +#: .\cookbook\templates\base.html:301 .\cookbook\templates\space_manage.html:15 #, fuzzy #| msgid "Settings" msgid "Space Settings" msgstr "Iestatījumi" -#: .\cookbook\templates\base.html:303 .\cookbook\templates\system.html:13 +#: .\cookbook\templates\base.html:306 .\cookbook\templates\system.html:13 msgid "System" msgstr "Sistēma" -#: .\cookbook\templates\base.html:305 +#: .\cookbook\templates\base.html:308 msgid "Admin" msgstr "Administrators" -#: .\cookbook\templates\base.html:309 +#: .\cookbook\templates\base.html:312 #: .\cookbook\templates\space_overview.html:25 #, fuzzy #| msgid "Create User" msgid "Your Spaces" msgstr "Izveidot lietotāju" -#: .\cookbook\templates\base.html:320 +#: .\cookbook\templates\base.html:323 #: .\cookbook\templates\space_overview.html:6 msgid "Overview" msgstr "" -#: .\cookbook\templates\base.html:324 +#: .\cookbook\templates\base.html:327 msgid "Markdown Guide" msgstr "Markdown rokasgrāmata" -#: .\cookbook\templates\base.html:326 +#: .\cookbook\templates\base.html:329 msgid "GitHub" msgstr "Github" -#: .\cookbook\templates\base.html:328 +#: .\cookbook\templates\base.html:331 msgid "Translate Tandoor" msgstr "" -#: .\cookbook\templates\base.html:332 +#: .\cookbook\templates\base.html:335 msgid "API Browser" msgstr "API pārlūks" -#: .\cookbook\templates\base.html:335 +#: .\cookbook\templates\base.html:338 msgid "Log out" msgstr "" -#: .\cookbook\templates\base.html:357 +#: .\cookbook\templates\base.html:360 msgid "You are using the free version of Tandor" msgstr "" -#: .\cookbook\templates\base.html:358 +#: .\cookbook\templates\base.html:361 msgid "Upgrade Now" msgstr "" @@ -1288,11 +1288,7 @@ msgstr "Ceļam jābūt šādā formātā" #: .\cookbook\templates\forms\edit_import_recipe.html:14 #: .\cookbook\templates\generic\edit_template.html:23 #: .\cookbook\templates\generic\new_template.html:23 -#: .\cookbook\templates\settings.html:70 -#: .\cookbook\templates\settings.html:112 -#: .\cookbook\templates\settings.html:130 -#: .\cookbook\templates\settings.html:202 -#: .\cookbook\templates\settings.html:213 +#: .\cookbook\templates\settings.html:57 msgid "Save" msgstr "Saglabāt" @@ -1346,41 +1342,6 @@ msgstr "Importēt jaunu recepti" msgid "Edit Recipe" msgstr "Rediģēt recepti" -#: .\cookbook\templates\forms\ingredients.html:15 -msgid "Edit Ingredients" -msgstr "Rediģēt sastāvdaļas" - -#: .\cookbook\templates\forms\ingredients.html:16 -msgid "" -"\n" -" The following form can be used if, accidentally, two (or more) units " -"or ingredients where created that should be\n" -" the same.\n" -" It merges two units or ingredients and updates all recipes using " -"them.\n" -" " -msgstr "" -"\n" -" Šādu veidlapu var izmantot, ja nejauši izveidotas divas (vai " -"vairāk) vienības vai sastāvdaļas, kam vajadzētu būt\n" -" vienādām.\n" -" Tas apvieno divas vienības vai sastāvdaļas un atjaunina visas " -"receptes, kas izmanto tās.\n" -" " - -#: .\cookbook\templates\forms\ingredients.html:26 -msgid "Are you sure that you want to merge these two units?" -msgstr "Vai tiešām vēlaties apvienot šīs divas vienības?" - -#: .\cookbook\templates\forms\ingredients.html:31 -#: .\cookbook\templates\forms\ingredients.html:40 -msgid "Merge" -msgstr "Apvienot" - -#: .\cookbook\templates\forms\ingredients.html:36 -msgid "Are you sure that you want to merge these two ingredients?" -msgstr "Vai tiešām vēlaties apvienot šīs divas sastāvdaļas?" - #: .\cookbook\templates\generic\delete_template.html:21 #, python-format msgid "Are you sure you want to delete the %(title)s: %(object)s " @@ -1402,6 +1363,11 @@ msgstr "" msgid "Cancel" msgstr "" +#: .\cookbook\templates\generic\edit_template.html:6 +#: .\cookbook\templates\generic\edit_template.html:14 +msgid "Edit" +msgstr "Rediģēt" + #: .\cookbook\templates\generic\edit_template.html:32 msgid "View" msgstr "Skatīt" @@ -1423,13 +1389,16 @@ msgstr "Filtrs" msgid "Import all" msgstr "Importēt visu" +#: .\cookbook\templates\generic\new_template.html:6 +#: .\cookbook\templates\generic\new_template.html:14 +msgid "New" +msgstr "Jauns" + #: .\cookbook\templates\generic\table_template.html:76 -#: .\cookbook\templates\recipes_table.html:121 msgid "previous" msgstr "iepriekšējais" #: .\cookbook\templates\generic\table_template.html:98 -#: .\cookbook\templates\recipes_table.html:143 msgid "next" msgstr "nākamais" @@ -1441,24 +1410,11 @@ msgstr "Skatīt žurnālu" msgid "Cook Log" msgstr "Pagatavošanas žurnāls" -#: .\cookbook\templates\import.html:6 -msgid "Import Recipes" -msgstr "Importēt receptes" - -#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 #: .\cookbook\templates\import_response.html:7 .\cookbook\views\delete.py:86 #: .\cookbook\views\edit.py:191 msgid "Import" msgstr "Importēt" -#: .\cookbook\templates\include\recipe_open_modal.html:18 -msgid "Close" -msgstr "Aizvērt" - -#: .\cookbook\templates\include\recipe_open_modal.html:32 -msgid "Open Recipe" -msgstr "Atvērt recepti" - #: .\cookbook\templates\include\storage_backend_warning.html:4 msgid "Security Warning" msgstr "Drošības brīdinājums" @@ -1668,31 +1624,6 @@ msgstr "Galvene" msgid "Cell" msgstr "Šūna" -#: .\cookbook\templates\meal_plan_entry.html:6 -msgid "Meal Plan View" -msgstr "Maltītes plāna skats" - -#: .\cookbook\templates\meal_plan_entry.html:18 -msgid "Created by" -msgstr "Izveidojis" - -#: .\cookbook\templates\meal_plan_entry.html:20 -msgid "Shared with" -msgstr "Kopīgots ar" - -#: .\cookbook\templates\meal_plan_entry.html:48 -#: .\cookbook\templates\recipes_table.html:64 -msgid "Last cooked" -msgstr "Pēdējoreiz gatavots" - -#: .\cookbook\templates\meal_plan_entry.html:50 -msgid "Never cooked before." -msgstr "Nekad nav gatavojis." - -#: .\cookbook\templates\meal_plan_entry.html:76 -msgid "Other meals on this day" -msgstr "Citas maltītes šajā dienā" - #: .\cookbook\templates\no_groups_info.html:5 #: .\cookbook\templates\no_groups_info.html:12 msgid "No Permissions" @@ -1741,43 +1672,26 @@ msgstr "" msgid "Back" msgstr "" -#: .\cookbook\templates\recipe_view.html:26 +#: .\cookbook\templates\profile.html:7 +msgid "Profile" +msgstr "" + +#: .\cookbook\templates\recipe_view.html:41 msgid "by" msgstr "pēc" -#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:144 +#: .\cookbook\templates\recipe_view.html:59 .\cookbook\views\delete.py:144 #: .\cookbook\views\edit.py:171 msgid "Comment" msgstr "Komentēt" -#: .\cookbook\templates\recipes_table.html:19 -#: .\cookbook\templates\recipes_table.html:23 -msgid "Recipe Image" -msgstr "Receptes attēls" - -#: .\cookbook\templates\recipes_table.html:51 -msgid "Preparation time ca." -msgstr "Pagatavošanas laiks apm." - -#: .\cookbook\templates\recipes_table.html:57 -msgid "Waiting time ca." -msgstr "Gaidīšanas laiks apm." - -#: .\cookbook\templates\recipes_table.html:60 -msgid "External" -msgstr "Ārējs" - -#: .\cookbook\templates\recipes_table.html:86 -msgid "Log Cooking" -msgstr "Veikt ierakstus pagatavošanas žurnālā" - #: .\cookbook\templates\rest_framework\api.html:5 msgid "Recipe Home" msgstr "Recepšu Sākums" #: .\cookbook\templates\search_info.html:5 #: .\cookbook\templates\search_info.html:9 -#: .\cookbook\templates\settings.html:172 +#: .\cookbook\templates\settings.html:24 #, fuzzy #| msgid "Search String" msgid "Search Settings" @@ -1940,145 +1854,57 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\settings.html:28 -msgid "Account" -msgstr "Konts" - -#: .\cookbook\templates\settings.html:35 -msgid "Preferences" -msgstr "" - -#: .\cookbook\templates\settings.html:42 -#, fuzzy -#| msgid "Settings" -msgid "API-Settings" -msgstr "Iestatījumi" - -#: .\cookbook\templates\settings.html:49 -#, fuzzy -#| msgid "Search String" -msgid "Search-Settings" -msgstr "Meklēšanas virkne" - -#: .\cookbook\templates\settings.html:56 -#, fuzzy -#| msgid "Search String" -msgid "Shopping-Settings" -msgstr "Meklēšanas virkne" - -#: .\cookbook\templates\settings.html:65 -#, fuzzy -#| msgid "Settings" -msgid "Name Settings" -msgstr "Iestatījumi" - -#: .\cookbook\templates\settings.html:73 -#, fuzzy -#| msgid "Settings" -msgid "Account Settings" -msgstr "Iestatījumi" - -#: .\cookbook\templates\settings.html:75 -#, fuzzy -#| msgid "Settings" -msgid "Emails" -msgstr "Iestatījumi" - -#: .\cookbook\templates\settings.html:78 -#: .\cookbook\templates\socialaccount\connections.html:11 -msgid "Social" -msgstr "" - -#: .\cookbook\templates\settings.html:91 -msgid "Language" -msgstr "Valoda" - -#: .\cookbook\templates\settings.html:121 -msgid "Style" -msgstr "Stils" - -#: .\cookbook\templates\settings.html:142 -msgid "API Token" -msgstr "API Tokens" - -#: .\cookbook\templates\settings.html:143 -msgid "" -"You can use both basic authentication and token based authentication to " -"access the REST API." -msgstr "" -"Lai piekļūtu REST API, varat izmantot gan pamata autentifikāciju, gan tokena " -"autentifikāciju." - -#: .\cookbook\templates\settings.html:160 -msgid "" -"Use the token as an Authorization header prefixed by the word token as shown " -"in the following examples:" -msgstr "" -"Izmantojiet token, kā Authorization header, kas pievienota vārdam token, kā " -"parādīts šajos piemēros:" - -#: .\cookbook\templates\settings.html:162 -msgid "or" -msgstr "vai" - -#: .\cookbook\templates\settings.html:173 +#: .\cookbook\templates\settings.html:25 msgid "" "There are many options to configure the search depending on your personal " "preferences." msgstr "" -#: .\cookbook\templates\settings.html:174 +#: .\cookbook\templates\settings.html:26 msgid "" "Usually you do not need to configure any of them and can just stick " "with either the default or one of the following presets." msgstr "" -#: .\cookbook\templates\settings.html:175 +#: .\cookbook\templates\settings.html:27 msgid "" "If you do want to configure the search you can read about the different " "options here." msgstr "" -#: .\cookbook\templates\settings.html:180 +#: .\cookbook\templates\settings.html:32 msgid "Fuzzy" msgstr "" -#: .\cookbook\templates\settings.html:181 +#: .\cookbook\templates\settings.html:33 msgid "" "Find what you need even if your search or the recipe contains typos. Might " "return more results than needed to make sure you find what you are looking " "for." msgstr "" -#: .\cookbook\templates\settings.html:182 +#: .\cookbook\templates\settings.html:34 msgid "This is the default behavior" msgstr "" -#: .\cookbook\templates\settings.html:183 -#: .\cookbook\templates\settings.html:191 +#: .\cookbook\templates\settings.html:37 .\cookbook\templates\settings.html:46 msgid "Apply" msgstr "" -#: .\cookbook\templates\settings.html:188 +#: .\cookbook\templates\settings.html:42 msgid "Precise" msgstr "" -#: .\cookbook\templates\settings.html:189 +#: .\cookbook\templates\settings.html:43 msgid "" "Allows fine control over search results but might not return results if too " "many spelling mistakes are made." msgstr "" -#: .\cookbook\templates\settings.html:190 +#: .\cookbook\templates\settings.html:44 msgid "Perfect for large Databases" msgstr "" -#: .\cookbook\templates\settings.html:207 -#, fuzzy -#| msgid "Shopping List" -msgid "Shopping Settings" -msgstr "Iepirkumu saraksts" - #: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5 msgid "Cookbook Setup" msgstr "Pavārgrāmatu iestatīšana" @@ -2113,6 +1939,10 @@ msgstr "" msgid "Account Connections" msgstr "" +#: .\cookbook\templates\socialaccount\connections.html:11 +msgid "Social" +msgstr "" + #: .\cookbook\templates\socialaccount\connections.html:18 msgid "" "You can sign in to your account using any of the following third party\n" @@ -2205,74 +2035,46 @@ msgid "" "You can either be invited into an existing space or create your own one." msgstr "" -#: .\cookbook\templates\space_overview.html:45 +#: .\cookbook\templates\space_overview.html:53 msgid "Owner" msgstr "" -#: .\cookbook\templates\space_overview.html:49 +#: .\cookbook\templates\space_overview.html:57 #, fuzzy #| msgid "Create User" msgid "Leave Space" msgstr "Izveidot lietotāju" -#: .\cookbook\templates\space_overview.html:70 -#: .\cookbook\templates\space_overview.html:80 +#: .\cookbook\templates\space_overview.html:78 +#: .\cookbook\templates\space_overview.html:88 msgid "Join Space" msgstr "" -#: .\cookbook\templates\space_overview.html:73 +#: .\cookbook\templates\space_overview.html:81 msgid "Join an existing space." msgstr "" -#: .\cookbook\templates\space_overview.html:75 +#: .\cookbook\templates\space_overview.html:83 msgid "" "To join an existing space either enter your invite token or click on the " "invite link the space owner send you." msgstr "" -#: .\cookbook\templates\space_overview.html:88 -#: .\cookbook\templates\space_overview.html:97 +#: .\cookbook\templates\space_overview.html:96 +#: .\cookbook\templates\space_overview.html:105 #, fuzzy #| msgid "Create User" msgid "Create Space" msgstr "Izveidot lietotāju" -#: .\cookbook\templates\space_overview.html:91 +#: .\cookbook\templates\space_overview.html:99 msgid "Create your own recipe space." msgstr "" -#: .\cookbook\templates\space_overview.html:93 +#: .\cookbook\templates\space_overview.html:101 msgid "Start your own recipe space and invite other users to it." msgstr "" -#: .\cookbook\templates\stats.html:4 -msgid "Stats" -msgstr "Statistika" - -#: .\cookbook\templates\stats.html:10 -msgid "Statistics" -msgstr "Statistika" - -#: .\cookbook\templates\stats.html:19 -msgid "Number of objects" -msgstr "Objektu skaits" - -#: .\cookbook\templates\stats.html:30 -msgid "Recipe Imports" -msgstr "Recepšu imports" - -#: .\cookbook\templates\stats.html:38 -msgid "Objects stats" -msgstr "Objektu statistika" - -#: .\cookbook\templates\stats.html:41 -msgid "Recipes without Keywords" -msgstr "Receptes bez atslēgas vārdiem" - -#: .\cookbook\templates\stats.html:45 -msgid "Internal Recipes" -msgstr "Iekšējās receptes" - #: .\cookbook\templates\system.html:20 msgid "System Information" msgstr "Sistēmas informācija" @@ -2404,253 +2206,266 @@ msgstr "" msgid "URL Import" msgstr "URL importēšana" -#: .\cookbook\views\api.py:105 .\cookbook\views\api.py:197 +#: .\cookbook\views\api.py:110 .\cookbook\views\api.py:202 #, 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:217 .\cookbook\views\api.py:320 +#: .\cookbook\views\api.py:222 .\cookbook\views\api.py:325 +#, python-brace-format msgid "No {self.basename} with id {pk} exists" msgstr "" -#: .\cookbook\views\api.py:221 +#: .\cookbook\views\api.py:226 msgid "Cannot merge with the same object!" msgstr "" -#: .\cookbook\views\api.py:228 +#: .\cookbook\views\api.py:233 +#, python-brace-format msgid "No {self.basename} with id {target} exists" msgstr "" -#: .\cookbook\views\api.py:233 +#: .\cookbook\views\api.py:238 msgid "Cannot merge with child object!" msgstr "" -#: .\cookbook\views\api.py:266 +#: .\cookbook\views\api.py:271 +#, python-brace-format msgid "{source.name} was merged successfully with {target.name}" msgstr "" -#: .\cookbook\views\api.py:271 +#: .\cookbook\views\api.py:276 +#, python-brace-format msgid "An error occurred attempting to merge {source.name} with {target.name}" msgstr "" -#: .\cookbook\views\api.py:329 +#: .\cookbook\views\api.py:334 +#, python-brace-format msgid "{child.name} was moved successfully to the root." msgstr "" -#: .\cookbook\views\api.py:332 .\cookbook\views\api.py:350 +#: .\cookbook\views\api.py:337 .\cookbook\views\api.py:355 msgid "An error occurred attempting to move " msgstr "" -#: .\cookbook\views\api.py:335 +#: .\cookbook\views\api.py:340 msgid "Cannot move an object to itself!" msgstr "" -#: .\cookbook\views\api.py:341 +#: .\cookbook\views\api.py:346 +#, python-brace-format msgid "No {self.basename} with id {parent} exists" msgstr "" -#: .\cookbook\views\api.py:347 +#: .\cookbook\views\api.py:352 +#, python-brace-format msgid "{child.name} was moved successfully to parent {parent.name}" msgstr "" -#: .\cookbook\views\api.py:542 +#: .\cookbook\views\api.py:553 +#, python-brace-format msgid "{obj.name} was removed from the shopping list." msgstr "" -#: .\cookbook\views\api.py:547 .\cookbook\views\api.py:879 -#: .\cookbook\views\api.py:892 +#: .\cookbook\views\api.py:558 .\cookbook\views\api.py:888 +#: .\cookbook\views\api.py:901 +#, python-brace-format msgid "{obj.name} was added to the shopping list." msgstr "" -#: .\cookbook\views\api.py:674 +#: .\cookbook\views\api.py:685 msgid "ID of recipe a step is part of. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:676 +#: .\cookbook\views\api.py:687 msgid "Query string matched (fuzzy) against object name." msgstr "" -#: .\cookbook\views\api.py:720 +#: .\cookbook\views\api.py:731 msgid "" "Query string matched (fuzzy) against recipe name. In the future also " "fulltext search." msgstr "" -#: .\cookbook\views\api.py:722 +#: .\cookbook\views\api.py:733 msgid "" "ID of keyword a recipe should have. For multiple repeat parameter. " "Equivalent to keywords_or" msgstr "" -#: .\cookbook\views\api.py:725 +#: .\cookbook\views\api.py:736 msgid "" "Keyword IDs, repeat for multiple. Return recipes with any of the keywords" msgstr "" -#: .\cookbook\views\api.py:728 +#: .\cookbook\views\api.py:739 msgid "" "Keyword IDs, repeat for multiple. Return recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:742 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords." msgstr "" -#: .\cookbook\views\api.py:734 +#: .\cookbook\views\api.py:745 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:736 +#: .\cookbook\views\api.py:747 msgid "ID of food a recipe should have. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:739 +#: .\cookbook\views\api.py:750 msgid "Food IDs, repeat for multiple. Return recipes with any of the foods" msgstr "" -#: .\cookbook\views\api.py:741 +#: .\cookbook\views\api.py:752 msgid "Food IDs, repeat for multiple. Return recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:743 +#: .\cookbook\views\api.py:754 msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods." msgstr "" -#: .\cookbook\views\api.py:745 +#: .\cookbook\views\api.py:756 msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:746 +#: .\cookbook\views\api.py:757 msgid "ID of unit a recipe should have." msgstr "" -#: .\cookbook\views\api.py:748 +#: .\cookbook\views\api.py:759 msgid "" "Rating a recipe should have or greater. [0 - 5] Negative value filters " "rating less than." msgstr "" -#: .\cookbook\views\api.py:749 +#: .\cookbook\views\api.py:760 msgid "ID of book a recipe should be in. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:751 +#: .\cookbook\views\api.py:762 msgid "Book IDs, repeat for multiple. Return recipes with any of the books" msgstr "" -#: .\cookbook\views\api.py:753 +#: .\cookbook\views\api.py:764 msgid "Book IDs, repeat for multiple. Return recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:755 +#: .\cookbook\views\api.py:766 msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books." msgstr "" -#: .\cookbook\views\api.py:757 +#: .\cookbook\views\api.py:768 msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:759 +#: .\cookbook\views\api.py:770 msgid "If only internal recipes should be returned. [true/false]" msgstr "" -#: .\cookbook\views\api.py:761 +#: .\cookbook\views\api.py:772 msgid "Returns the results in randomized order. [true/false]" msgstr "" -#: .\cookbook\views\api.py:763 +#: .\cookbook\views\api.py:774 msgid "Returns new results first in search results. [true/false]" msgstr "" -#: .\cookbook\views\api.py:765 +#: .\cookbook\views\api.py:776 msgid "" "Filter recipes cooked X times or more. Negative values returns cooked less " "than X times" msgstr "" -#: .\cookbook\views\api.py:767 +#: .\cookbook\views\api.py:778 msgid "" "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:769 +#: .\cookbook\views\api.py:780 msgid "" "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:771 +#: .\cookbook\views\api.py:782 msgid "" "Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:773 +#: .\cookbook\views\api.py:784 msgid "" "Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:775 +#: .\cookbook\views\api.py:786 msgid "Filter recipes that can be made with OnHand food. [true/false]" msgstr "" -#: .\cookbook\views\api.py:937 +#: .\cookbook\views\api.py:946 msgid "" "Returns the shopping list entry with a primary key of id. Multiple values " "allowed." msgstr "" -#: .\cookbook\views\api.py:942 +#: .\cookbook\views\api.py:951 msgid "" -"Filter shopping list entries on checked. [true, false, both, recent]" -"
    - recent includes unchecked items and recently completed items." +"Filter shopping list entries on checked. [true, false, both, recent]
    - recent includes unchecked items and recently completed items." msgstr "" -#: .\cookbook\views\api.py:945 +#: .\cookbook\views\api.py:954 msgid "Returns the shopping list entries sorted by supermarket category order." msgstr "" -#: .\cookbook\views\api.py:1140 +#: .\cookbook\views\api.py:1166 msgid "Nothing to do." msgstr "" -#: .\cookbook\views\api.py:1160 +#: .\cookbook\views\api.py:1198 msgid "Invalid Url" msgstr "" -#: .\cookbook\views\api.py:1167 +#: .\cookbook\views\api.py:1205 msgid "Connection Refused." msgstr "" -#: .\cookbook\views\api.py:1172 +#: .\cookbook\views\api.py:1210 msgid "Bad URL Schema." msgstr "" -#: .\cookbook\views\api.py:1195 +#: .\cookbook\views\api.py:1233 #, 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:1303 .\cookbook\views\data.py:28 +#: .\cookbook\views\api.py:1326 .\cookbook\views\import_export.py:117 +msgid "Importing is not implemented for this provider" +msgstr "" + +#: .\cookbook\views\api.py:1372 .\cookbook\views\data.py:31 #: .\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:1325 +#: .\cookbook\views\api.py:1394 msgid "Sync successful!" msgstr "Sinhronizācija ir veiksmīga!" -#: .\cookbook\views\api.py:1330 +#: .\cookbook\views\api.py:1399 msgid "Error synchronizing with Storage" msgstr "Sinhronizējot ar krātuvi, radās kļūda" -#: .\cookbook\views\data.py:97 +#: .\cookbook\views\data.py:100 #, python-format msgid "Batch edit done. %(count)d recipe was updated." msgid_plural "Batch edit done. %(count)d Recipes where updated." @@ -2710,11 +2525,7 @@ msgstr "Izmaiņas saglabātas!" msgid "Error saving changes!" msgstr "Saglabājot izmaiņas, radās kļūda!" -#: .\cookbook\views\import_export.py:111 .\cookbook\views\import_export.py:150 -msgid "Importing is not implemented for this provider" -msgstr "" - -#: .\cookbook\views\import_export.py:137 +#: .\cookbook\views\import_export.py:104 msgid "" "The PDF Exporter is not enabled on this instance as it is still in an " "experimental state." @@ -2764,39 +2575,40 @@ msgstr "Importēta jauna recepte!" msgid "There was an error importing this recipe!" msgstr "Importējot šo recepti, radās kļūda!" -#: .\cookbook\views\views.py:124 +#: .\cookbook\views\views.py:73 .\cookbook\views\views.py:191 +#: .\cookbook\views\views.py:213 .\cookbook\views\views.py:399 +msgid "This feature is not available in the demo version!" +msgstr "" + +#: .\cookbook\views\views.py:89 msgid "" "You have successfully created your own recipe space. Start by adding some " "recipes or invite other people to join you." msgstr "" -#: .\cookbook\views\views.py:178 +#: .\cookbook\views\views.py:143 msgid "You do not have the required permissions to perform this action!" msgstr "Jums nav nepieciešamo atļauju, lai veiktu šo darbību!" -#: .\cookbook\views\views.py:189 +#: .\cookbook\views\views.py:154 msgid "Comment saved!" msgstr "Komentārs saglabāts!" -#: .\cookbook\views\views.py:264 -msgid "This feature is not available in the demo version!" -msgstr "" - -#: .\cookbook\views\views.py:324 +#: .\cookbook\views\views.py:253 msgid "You must select at least one field to search!" msgstr "" -#: .\cookbook\views\views.py:329 +#: .\cookbook\views\views.py:258 msgid "" "To use this search method you must select at least one full text search " "field!" msgstr "" -#: .\cookbook\views\views.py:333 +#: .\cookbook\views\views.py:262 msgid "Fuzzy search is not compatible with this search method!" msgstr "" -#: .\cookbook\views\views.py:463 +#: .\cookbook\views\views.py:338 msgid "" "The setup page can only be used to create the first user! If you have " "forgotten your superuser credentials please consult the django documentation " @@ -2806,38 +2618,216 @@ msgstr "" "aizmirsis sava superlietotāja informāciju, lūdzu, skatiet Django " "dokumentāciju par paroļu atiestatīšanu." -#: .\cookbook\views\views.py:470 +#: .\cookbook\views\views.py:345 msgid "Passwords dont match!" msgstr "Paroles nesakrīt!" -#: .\cookbook\views\views.py:478 +#: .\cookbook\views\views.py:353 msgid "User has been created, please login!" msgstr "Lietotājs ir izveidots, lūdzu, piesakieties!" -#: .\cookbook\views\views.py:494 +#: .\cookbook\views\views.py:369 msgid "Malformed Invite Link supplied!" msgstr "Nepareiza uzaicinājuma saite!" -#: .\cookbook\views\views.py:510 +#: .\cookbook\views\views.py:386 msgid "Successfully joined space." msgstr "" -#: .\cookbook\views\views.py:516 +#: .\cookbook\views\views.py:392 msgid "Invite Link not valid or already used!" msgstr "Uzaicinājuma saite nav derīga vai jau izmantota!" -#: .\cookbook\views\views.py:530 +#: .\cookbook\views\views.py:409 msgid "" "Reporting share links is not enabled for this instance. Please notify the " "page administrator to report problems." msgstr "" -#: .\cookbook\views\views.py:536 +#: .\cookbook\views\views.py:415 msgid "" "Recipe sharing link has been disabled! For additional information please " "contact the page administrator." msgstr "" +#~ msgid "Ingredients" +#~ msgstr "Sastāvdaļas" + +#, fuzzy +#~| msgid "Shopping Recipes" +#~ msgid "Show recent recipes" +#~ msgstr "Iepirkšanās receptes" + +#, fuzzy +#~| msgid "Search" +#~ msgid "Search style" +#~ msgstr "Meklēt" + +#~ msgid "Show recently viewed recipes on search page." +#~ msgstr "Parādīt nesen skatītās receptes meklēšanas lapā." + +#~ msgid "Small" +#~ msgstr "Mazs" + +#~ msgid "Large" +#~ msgstr "Liels" + +#~ msgid "Edit Ingredients" +#~ msgstr "Rediģēt sastāvdaļas" + +#~ msgid "" +#~ "\n" +#~ " The following form can be used if, accidentally, two (or more) " +#~ "units or ingredients where created that should be\n" +#~ " the same.\n" +#~ " It merges two units or ingredients and updates all recipes using " +#~ "them.\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ " Šādu veidlapu var izmantot, ja nejauši izveidotas divas (vai " +#~ "vairāk) vienības vai sastāvdaļas, kam vajadzētu būt\n" +#~ " vienādām.\n" +#~ " Tas apvieno divas vienības vai sastāvdaļas un atjaunina visas " +#~ "receptes, kas izmanto tās.\n" +#~ " " + +#~ msgid "Are you sure that you want to merge these two units?" +#~ msgstr "Vai tiešām vēlaties apvienot šīs divas vienības?" + +#~ msgid "Merge" +#~ msgstr "Apvienot" + +#~ msgid "Are you sure that you want to merge these two ingredients?" +#~ msgstr "Vai tiešām vēlaties apvienot šīs divas sastāvdaļas?" + +#~ msgid "Import Recipes" +#~ msgstr "Importēt receptes" + +#~ msgid "Close" +#~ msgstr "Aizvērt" + +#~ msgid "Open Recipe" +#~ msgstr "Atvērt recepti" + +#~ msgid "Meal Plan View" +#~ msgstr "Maltītes plāna skats" + +#~ msgid "Created by" +#~ msgstr "Izveidojis" + +#~ msgid "Shared with" +#~ msgstr "Kopīgots ar" + +#~ msgid "Last cooked" +#~ msgstr "Pēdējoreiz gatavots" + +#~ msgid "Never cooked before." +#~ msgstr "Nekad nav gatavojis." + +#~ msgid "Other meals on this day" +#~ msgstr "Citas maltītes šajā dienā" + +#~ msgid "Recipe Image" +#~ msgstr "Receptes attēls" + +#~ msgid "Preparation time ca." +#~ msgstr "Pagatavošanas laiks apm." + +#~ msgid "Waiting time ca." +#~ msgstr "Gaidīšanas laiks apm." + +#~ msgid "External" +#~ msgstr "Ārējs" + +#~ msgid "Log Cooking" +#~ msgstr "Veikt ierakstus pagatavošanas žurnālā" + +#~ msgid "Account" +#~ msgstr "Konts" + +#, fuzzy +#~| msgid "Settings" +#~ msgid "API-Settings" +#~ msgstr "Iestatījumi" + +#, fuzzy +#~| msgid "Search String" +#~ msgid "Search-Settings" +#~ msgstr "Meklēšanas virkne" + +#, fuzzy +#~| msgid "Search String" +#~ msgid "Shopping-Settings" +#~ msgstr "Meklēšanas virkne" + +#, fuzzy +#~| msgid "Settings" +#~ msgid "Name Settings" +#~ msgstr "Iestatījumi" + +#, fuzzy +#~| msgid "Settings" +#~ msgid "Account Settings" +#~ msgstr "Iestatījumi" + +#, fuzzy +#~| msgid "Settings" +#~ msgid "Emails" +#~ msgstr "Iestatījumi" + +#~ msgid "Language" +#~ msgstr "Valoda" + +#~ msgid "Style" +#~ msgstr "Stils" + +#~ msgid "API Token" +#~ msgstr "API Tokens" + +#~ msgid "" +#~ "You can use both basic authentication and token based authentication to " +#~ "access the REST API." +#~ msgstr "" +#~ "Lai piekļūtu REST API, varat izmantot gan pamata autentifikāciju, gan " +#~ "tokena autentifikāciju." + +#~ msgid "" +#~ "Use the token as an Authorization header prefixed by the word token as " +#~ "shown in the following examples:" +#~ msgstr "" +#~ "Izmantojiet token, kā Authorization header, kas pievienota vārdam token, " +#~ "kā parādīts šajos piemēros:" + +#~ msgid "or" +#~ msgstr "vai" + +#, fuzzy +#~| msgid "Shopping List" +#~ msgid "Shopping Settings" +#~ msgstr "Iepirkumu saraksts" + +#~ msgid "Stats" +#~ msgstr "Statistika" + +#~ msgid "Statistics" +#~ msgstr "Statistika" + +#~ msgid "Number of objects" +#~ msgstr "Objektu skaits" + +#~ msgid "Recipe Imports" +#~ msgstr "Recepšu imports" + +#~ msgid "Objects stats" +#~ msgstr "Objektu statistika" + +#~ msgid "Recipes without Keywords" +#~ msgstr "Receptes bez atslēgas vārdiem" + +#~ msgid "Internal Recipes" +#~ msgstr "Iekšējās receptes" + #~ msgid "Show Links" #~ msgstr "Rādīt saites" @@ -2938,9 +2928,6 @@ msgstr "" #~ msgid "Cook Time" #~ msgstr "Laiks" -#~ msgid "Instructions" -#~ msgstr "Instrukcijas" - #, fuzzy #~| msgid "Discovered Recipes" #~ msgid "Discovered Attributes" diff --git a/cookbook/locale/nb_NO/LC_MESSAGES/django.mo b/cookbook/locale/nb_NO/LC_MESSAGES/django.mo index 599d45ea3..14d53c8f3 100644 Binary files a/cookbook/locale/nb_NO/LC_MESSAGES/django.mo and b/cookbook/locale/nb_NO/LC_MESSAGES/django.mo differ diff --git a/cookbook/locale/nb_NO/LC_MESSAGES/django.po b/cookbook/locale/nb_NO/LC_MESSAGES/django.po index 07179da11..af5ff9807 100644 --- a/cookbook/locale/nb_NO/LC_MESSAGES/django.po +++ b/cookbook/locale/nb_NO/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-04-11 15:09+0200\n" -"PO-Revision-Date: 2021-04-11 15:23+0000\n" -"Last-Translator: Allan Nordhøy \n" +"PO-Revision-Date: 2023-04-17 20:55+0000\n" +"Last-Translator: Espen Sellevåg \n" "Language-Team: Norwegian Bokmål \n" "Language: nb_NO\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.5.3\n" +"X-Generator: Weblate 4.15\n" #: .\cookbook\filters.py:23 .\cookbook\templates\base.html:91 #: .\cookbook\templates\forms\edit_internal_recipe.html:219 @@ -34,19 +34,23 @@ msgstr "" #: .\cookbook\forms.py:46 msgid "Default Unit to be used when inserting a new ingredient into a recipe." -msgstr "" +msgstr "Standard enhet når ny ingrediens legges til en oppskrift." #: .\cookbook\forms.py:47 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" msgstr "" +"Aktiverer støtte for deler av ingrediensmengde (konverterer feks. desimaler " +"til deler automatisk)" #: .\cookbook\forms.py:48 msgid "" "Users with whom newly created meal plan/shopping list entries should be " "shared by default." msgstr "" +"Brukere som oppretter nye måltidsplaner/handlelister, deler disse " +"oppføringene som standard." #: .\cookbook\forms.py:49 msgid "Show recently viewed recipes on search page." @@ -58,7 +62,7 @@ msgstr "Antall desimaler ingredienser skal avrundes til." #: .\cookbook\forms.py:51 msgid "If you want to be able to create and see comments underneath recipes." -msgstr "" +msgstr "Hvis du ønsker å opprette og se kommentarer under oppskrifter." #: .\cookbook\forms.py:53 msgid "" @@ -67,6 +71,11 @@ msgid "" "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." msgstr "" +"0 vil deaktivere automatisk synkronisering. Når en handleliste vises, " +"oppdateres listen med oppgitt antall sekunders mellomrom for å synkronisere " +"endringer fra andre brukere. Nyttig dersom flere brukere handler samtidig. " +"Datatrafikk oppstår når aktiv. Hvis verdien er lavere enn grensen, " +"tilbakestilles den ved lagring." #: .\cookbook\forms.py:56 msgid "Makes the navbar stick to the top of the page." @@ -100,11 +109,11 @@ msgstr "" #: .\cookbook\forms.py:97 .\cookbook\forms.py:317 msgid "Path" -msgstr "" +msgstr "Sti" #: .\cookbook\forms.py:98 msgid "Storage UID" -msgstr "" +msgstr "Lagring UID" #: .\cookbook\forms.py:121 msgid "Default" @@ -129,7 +138,6 @@ msgid "Old Unit" msgstr "Gammel enhet" #: .\cookbook\forms.py:156 -#, fuzzy msgid "Unit that should be replaced." msgstr "Enhet som skal erstattes." @@ -204,12 +212,11 @@ msgstr "" #: .\cookbook\views\views.py:112 .\cookbook\views\views.py:116 #: .\cookbook\views\views.py:184 msgid "You do not have the required permissions to view this page!" -msgstr "Du har ikke påkrevd tilgang for å vise denne siden." +msgstr "Du har ikke påkrevd tilgang for å vise denne siden!" #: .\cookbook\helper\permission_helper.py:141 -#, fuzzy msgid "You are not logged in and therefore cannot view this page!" -msgstr "Du er ikke innlogget og kan derfor ikke vise siden." +msgstr "Du er ikke innlogget og kan derfor ikke vise siden!" #: .\cookbook\helper\permission_helper.py:145 #: .\cookbook\helper\permission_helper.py:167 @@ -379,7 +386,7 @@ msgstr "Finner ikke siden du leter etter." #: .\cookbook\templates\404.html:33 msgid "Take me Home" -msgstr "" +msgstr "Tilbake til Startsiden" #: .\cookbook\templates\404.html:35 msgid "Report a Bug" @@ -388,12 +395,12 @@ msgstr "Rapporter en feil" #: .\cookbook\templates\account\login.html:7 #: .\cookbook\templates\base.html:170 msgid "Login" -msgstr "" +msgstr "Logg inn" #: .\cookbook\templates\account\login.html:13 #: .\cookbook\templates\account\login.html:28 msgid "Sign In" -msgstr "" +msgstr "Opprett bruker" #: .\cookbook\templates\account\login.html:38 msgid "Social Login" @@ -401,7 +408,7 @@ msgstr "Sosial innlogging" #: .\cookbook\templates\account\login.html:39 msgid "You can use any of the following providers to sign in." -msgstr "" +msgstr "Velg en av følgende leverandører for å logge på." #: .\cookbook\templates\account\logout.html:5 #: .\cookbook\templates\account\logout.html:9 @@ -416,20 +423,20 @@ msgstr "Er du sikker på at du vil logge ut?" #: .\cookbook\templates\account\password_reset.html:5 #: .\cookbook\templates\account\password_reset_done.html:5 msgid "Password Reset" -msgstr "" +msgstr "Nullstill passord" #: .\cookbook\templates\account\password_reset.html:9 #: .\cookbook\templates\account\password_reset_done.html:9 msgid "Password reset is not implemented for the time being!" -msgstr "" +msgstr "Det er foreløpig ikke implementert funksjon for å nullstille passord!" #: .\cookbook\templates\account\signup.html:5 msgid "Register" -msgstr "" +msgstr "Registrer" #: .\cookbook\templates\account\signup.html:9 msgid "Create your Account" -msgstr "Opprett din konto" +msgstr "Opprett konto" #: .\cookbook\templates\account\signup.html:14 msgid "Create User" @@ -442,11 +449,11 @@ msgstr "API-dokumentasjon" #: .\cookbook\templates\base.html:78 msgid "Utensils" -msgstr "" +msgstr "Redskaper" #: .\cookbook\templates\base.html:88 msgid "Shopping" -msgstr "" +msgstr "Handle" #: .\cookbook\templates\base.html:102 .\cookbook\views\delete.py:84 #: .\cookbook\views\edit.py:93 .\cookbook\views\lists.py:26 @@ -456,27 +463,27 @@ msgstr "Nøkkelord" #: .\cookbook\templates\base.html:104 msgid "Batch Edit" -msgstr "" +msgstr "Oppdatere flere" #: .\cookbook\templates\base.html:109 msgid "Storage Data" -msgstr "" +msgstr "Datalagring" #: .\cookbook\templates\base.html:113 msgid "Storage Backends" -msgstr "" +msgstr "Lagringsplasser" #: .\cookbook\templates\base.html:115 msgid "Configure Sync" -msgstr "" +msgstr "Konfigurer synkronisering" #: .\cookbook\templates\base.html:117 msgid "Discovered Recipes" -msgstr "" +msgstr "Oppdagede oppskrifter" #: .\cookbook\templates\base.html:119 msgid "Discovery Log" -msgstr "" +msgstr "Logg Oppdagelser" #: .\cookbook\templates\base.html:121 .\cookbook\templates\stats.html:10 msgid "Statistics" @@ -484,7 +491,7 @@ msgstr "Statistikk" #: .\cookbook\templates\base.html:123 msgid "Units & Ingredients" -msgstr "" +msgstr "Enheter & Ingredienser" #: .\cookbook\templates\base.html:125 msgid "Import Recipe" @@ -521,58 +528,61 @@ msgid "API Browser" msgstr "API-utforsker" #: .\cookbook\templates\base.html:165 -#, fuzzy msgid "Logout" msgstr "Logg ut" #: .\cookbook\templates\batch\edit.html:6 msgid "Batch edit Category" -msgstr "" +msgstr "Oppdater flere kategorier" #: .\cookbook\templates\batch\edit.html:15 msgid "Batch edit Recipes" -msgstr "" +msgstr "Oppdater flere oppskrifter" #: .\cookbook\templates\batch\edit.html:20 msgid "Add the specified keywords to all recipes containing a word" -msgstr "" +msgstr "Legg til spesifikt nøkkelord til alle oppskrifter som inneholder et ord" #: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:76 msgid "Sync" -msgstr "" +msgstr "Synkronisering" #: .\cookbook\templates\batch\monitor.html:10 msgid "Manage watched Folders" -msgstr "" +msgstr "Behandle overvåkede mapper" #: .\cookbook\templates\batch\monitor.html:14 msgid "" "On this Page you can manage all storage folder locations that should be " "monitored and synced." msgstr "" +"Her kan du behandle alle lagringsmapper og plasseringer for monitorering og " +"synkronisering." #: .\cookbook\templates\batch\monitor.html:16 msgid "The path must be in the following format" -msgstr "" +msgstr "Stien må være i følgende format" #: .\cookbook\templates\batch\monitor.html:27 msgid "Sync Now!" -msgstr "" +msgstr "Synkroniser nå!" #: .\cookbook\templates\batch\waiting.html:4 #: .\cookbook\templates\batch\waiting.html:10 msgid "Importing Recipes" -msgstr "" +msgstr "Importerer oppskrifter" #: .\cookbook\templates\batch\waiting.html:23 msgid "" "This can take a few minutes, depending on the number of recipes in sync, " "please wait." msgstr "" +"Dette kan ta noen minutter, avhenging av antall oppskrifter som skal " +"synkroniseres. Vennligst vent." #: .\cookbook\templates\books.html:5 .\cookbook\templates\books.html:11 msgid "Recipe Books" -msgstr "" +msgstr "Oppskriftsbøker" #: .\cookbook\templates\books.html:15 msgid "New Book" @@ -584,32 +594,32 @@ msgstr "av" #: .\cookbook\templates\books.html:34 msgid "Toggle Recipes" -msgstr "" +msgstr "Veksle oppskrifter" #: .\cookbook\templates\books.html:54 #: .\cookbook\templates\meal_plan_entry.html:48 #: .\cookbook\templates\recipes_table.html:64 msgid "Last cooked" -msgstr "" +msgstr "Forrige tilbereding" #: .\cookbook\templates\books.html:71 msgid "There are no recipes in this book yet." -msgstr "" +msgstr "Det er foreløpig ingen oppskrifter i denne boken." #: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6 msgid "Export Recipes" -msgstr "" +msgstr "Eksporter oppskrifter" #: .\cookbook\templates\export.html:14 .\cookbook\templates\export.html:20 #: .\cookbook\templates\shopping_list.html:347 #: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 msgid "Export" -msgstr "" +msgstr "Eksporter" #: .\cookbook\templates\forms\edit_import_recipe.html:5 #: .\cookbook\templates\forms\edit_import_recipe.html:9 msgid "Import new Recipe" -msgstr "" +msgstr "Importer ny oppskrift" #: .\cookbook\templates\forms\edit_import_recipe.html:14 #: .\cookbook\templates\forms\edit_internal_recipe.html:389 @@ -635,29 +645,29 @@ msgstr "Beskrivelse" #: .\cookbook\templates\forms\edit_internal_recipe.html:72 msgid "Waiting Time" -msgstr "" +msgstr "Ventetid" #: .\cookbook\templates\forms\edit_internal_recipe.html:78 msgid "Servings Text" -msgstr "" +msgstr "Porsjon beskrivelse" #: .\cookbook\templates\forms\edit_internal_recipe.html:89 msgid "Select Keywords" -msgstr "" +msgstr "Velg nøkkelord" #: .\cookbook\templates\forms\edit_internal_recipe.html:90 #: .\cookbook\templates\url_import.html:212 msgid "Add Keyword" -msgstr "" +msgstr "Legg til nøkkelord" #: .\cookbook\templates\forms\edit_internal_recipe.html:108 msgid "Nutrition" -msgstr "" +msgstr "Næringsinnhold" #: .\cookbook\templates\forms\edit_internal_recipe.html:112 #: .\cookbook\templates\forms\edit_internal_recipe.html:162 msgid "Delete Step" -msgstr "" +msgstr "Fjern trinn" #: .\cookbook\templates\forms\edit_internal_recipe.html:116 msgid "Calories" @@ -678,15 +688,15 @@ msgstr "Proteiner" #: .\cookbook\templates\forms\edit_internal_recipe.html:146 #: .\cookbook\templates\forms\edit_internal_recipe.html:454 msgid "Step" -msgstr "" +msgstr "Trinn" #: .\cookbook\templates\forms\edit_internal_recipe.html:167 msgid "Show as header" -msgstr "" +msgstr "Vis som overskrift" #: .\cookbook\templates\forms\edit_internal_recipe.html:173 msgid "Hide as header" -msgstr "" +msgstr "Skjul overskrift" #: .\cookbook\templates\forms\edit_internal_recipe.html:178 msgid "Move Up" @@ -698,15 +708,15 @@ msgstr "Flytt nedover" #: .\cookbook\templates\forms\edit_internal_recipe.html:192 msgid "Step Name" -msgstr "" +msgstr "Trinn navn" #: .\cookbook\templates\forms\edit_internal_recipe.html:196 msgid "Step Type" -msgstr "" +msgstr "Trinn type" #: .\cookbook\templates\forms\edit_internal_recipe.html:207 msgid "Step time in Minutes" -msgstr "" +msgstr "Trinn tid i minutter" #: .\cookbook\templates\forms\edit_internal_recipe.html:261 #: .\cookbook\templates\shopping_list.html:183 @@ -740,7 +750,7 @@ msgstr "Velg mat" #: .\cookbook\templates\meal_plan.html:256 #: .\cookbook\templates\url_import.html:171 msgid "Note" -msgstr "" +msgstr "Notis" #: .\cookbook\templates\forms\edit_internal_recipe.html:319 msgid "Delete Ingredient" @@ -748,7 +758,7 @@ msgstr "Slett ingrediens" #: .\cookbook\templates\forms\edit_internal_recipe.html:325 msgid "Make Header" -msgstr "" +msgstr "Bruk som overskrift" #: .\cookbook\templates\forms\edit_internal_recipe.html:331 msgid "Make Ingredient" @@ -756,15 +766,15 @@ msgstr "Opprett ingrediens" #: .\cookbook\templates\forms\edit_internal_recipe.html:337 msgid "Disable Amount" -msgstr "" +msgstr "Deaktiver mengde" #: .\cookbook\templates\forms\edit_internal_recipe.html:343 msgid "Enable Amount" -msgstr "" +msgstr "Aktiver mengde" #: .\cookbook\templates\forms\edit_internal_recipe.html:348 msgid "Copy Template Reference" -msgstr "" +msgstr "Kopier mal-referanse" #: .\cookbook\templates\forms\edit_internal_recipe.html:374 #: .\cookbook\templates\url_import.html:196 @@ -773,29 +783,28 @@ msgstr "Instruksjoner" #: .\cookbook\templates\forms\edit_internal_recipe.html:387 #: .\cookbook\templates\forms\edit_internal_recipe.html:418 -#, fuzzy msgid "Save & View" msgstr "Lagre og vis" #: .\cookbook\templates\forms\edit_internal_recipe.html:391 #: .\cookbook\templates\forms\edit_internal_recipe.html:424 msgid "Add Step" -msgstr "" +msgstr "Legg til trinn" #: .\cookbook\templates\forms\edit_internal_recipe.html:394 #: .\cookbook\templates\forms\edit_internal_recipe.html:428 msgid "Add Nutrition" -msgstr "" +msgstr "Legg til næringsinnhold" #: .\cookbook\templates\forms\edit_internal_recipe.html:396 #: .\cookbook\templates\forms\edit_internal_recipe.html:430 msgid "Remove Nutrition" -msgstr "" +msgstr "Fjern næringsinnhold" #: .\cookbook\templates\forms\edit_internal_recipe.html:398 #: .\cookbook\templates\forms\edit_internal_recipe.html:433 msgid "View Recipe" -msgstr "" +msgstr "Vis oppskrift" #: .\cookbook\templates\forms\edit_internal_recipe.html:400 #: .\cookbook\templates\forms\edit_internal_recipe.html:435 @@ -804,11 +813,11 @@ msgstr "Slett oppskrift" #: .\cookbook\templates\forms\edit_internal_recipe.html:441 msgid "Steps" -msgstr "" +msgstr "Trinn" #: .\cookbook\templates\forms\ingredients.html:15 msgid "Edit Ingredients" -msgstr "" +msgstr "Rediger ingrediens" #: .\cookbook\templates\forms\ingredients.html:16 msgid "" @@ -820,54 +829,61 @@ msgid "" "them.\n" " " msgstr "" +"\n" +" Følgende skjema kan brukes dersom, tilfeldigvis, to eller flere " +"enheter eller ingredienser er opprettet,\n" +" og burde være identiske.\n" +" Det slår sammen to enheter eller ingredienser og oppdaterer alle " +"oppskrifter som inneholder disse.\n" +" " #: .\cookbook\templates\forms\ingredients.html:24 #: .\cookbook\templates\stats.html:26 msgid "Units" -msgstr "" +msgstr "Enheter" #: .\cookbook\templates\forms\ingredients.html:26 msgid "Are you sure that you want to merge these two units?" -msgstr "" +msgstr "Er du sikker på at du vil slå sammen disse enhetene?" #: .\cookbook\templates\forms\ingredients.html:31 #: .\cookbook\templates\forms\ingredients.html:40 msgid "Merge" -msgstr "Flett" +msgstr "Slå sammen" #: .\cookbook\templates\forms\ingredients.html:36 msgid "Are you sure that you want to merge these two ingredients?" -msgstr "" +msgstr "Er du sikker på at du vil slå sammen disse ingrediensene?" #: .\cookbook\templates\generic\delete_template.html:18 #, python-format msgid "Are you sure you want to delete the %(title)s: %(object)s " -msgstr "" +msgstr "Er du sikker på at du vil slette %(title)s: %(object)s " #: .\cookbook\templates\generic\delete_template.html:21 msgid "Confirm" -msgstr "" +msgstr "Bekreft" #: .\cookbook\templates\generic\edit_template.html:30 msgid "View" -msgstr "" +msgstr "Vis" #: .\cookbook\templates\generic\edit_template.html:34 msgid "Delete original file" -msgstr "" +msgstr "Slett opprinnelig fil" #: .\cookbook\templates\generic\list_template.html:6 #: .\cookbook\templates\generic\list_template.html:12 msgid "List" -msgstr "" +msgstr "Liste" #: .\cookbook\templates\generic\list_template.html:25 msgid "Filter" -msgstr "" +msgstr "Filtrer" #: .\cookbook\templates\generic\list_template.html:30 msgid "Import all" -msgstr "" +msgstr "Importer alle" #: .\cookbook\templates\generic\new_template.html:6 #: .\cookbook\templates\generic\new_template.html:14 @@ -891,19 +907,19 @@ msgstr "Vis logg" #: .\cookbook\templates\history.html:24 msgid "Cook Log" -msgstr "" +msgstr "Tilberedingslogg" #: .\cookbook\templates\import.html:6 .\cookbook\templates\test.html:6 msgid "Import Recipes" -msgstr "" +msgstr "Importer oppskrifter" #: .\cookbook\templates\include\log_cooking.html:7 msgid "Log Recipe Cooking" -msgstr "" +msgstr "Loggfør tilberedt oppskrift" #: .\cookbook\templates\include\log_cooking.html:13 msgid "All fields are optional and can be left empty." -msgstr "" +msgstr "Alle felt er valgfri og kan stå tomme." #: .\cookbook\templates\include\log_cooking.html:19 msgid "Rating" @@ -943,44 +959,53 @@ msgid "" "can be used.\n" " " msgstr "" +"\n" +" Passord og nøkkelfeltene er lagret som ren tekst i " +"databasen.\n" +" Dette er nødvendig for å kunne utføre API-forespørsler, men det øker " +"samtidig risiko for\n" +" uønsket tilgang til dem.
    \n" +" For å begrense kosekvensene av uønsket tilgang, kan nøkler eller " +"kontoer med begrenset tilgang benyttes.\n" +" " #: .\cookbook\templates\index.html:29 msgid "Search recipe ..." -msgstr "" +msgstr "Søk etter oppskrift..." #: .\cookbook\templates\index.html:44 msgid "New Recipe" -msgstr "" +msgstr "Ny oppskrift" #: .\cookbook\templates\index.html:47 msgid "Website Import" -msgstr "" +msgstr "Importer fra nettside" #: .\cookbook\templates\index.html:53 msgid "Advanced Search" -msgstr "" +msgstr "Avansert søk" #: .\cookbook\templates\index.html:57 msgid "Reset Search" -msgstr "" +msgstr "Nullstill søk" #: .\cookbook\templates\index.html:85 msgid "Last viewed" -msgstr "" +msgstr "Sist sett" #: .\cookbook\templates\index.html:87 .\cookbook\templates\meal_plan.html:178 #: .\cookbook\templates\stats.html:22 msgid "Recipes" -msgstr "" +msgstr "Oppskrifter" #: .\cookbook\templates\index.html:94 msgid "Log in to view recipes" -msgstr "" +msgstr "Logg inn for å se oppskrifter" #: .\cookbook\templates\markdown_info.html:5 #: .\cookbook\templates\markdown_info.html:13 msgid "Markdown Info" -msgstr "" +msgstr "Markdown informasjon" #: .\cookbook\templates\markdown_info.html:14 msgid "" @@ -997,43 +1022,56 @@ msgid "" "below.\n" " " msgstr "" +"\n" +" Markdown er et lettvekts markup språk som benyttes for å formatere " +"ren tekst.\n" +" Denne siden bruker biblioteket Python Markdown for\n" +" å konvertere teksten din til velformatert HTML. Fullstendig " +"dokumentasjon for markdown finner du\n" +" her.\n" +" En ufullstendig, men sannsynligvis tilstrekkelig dokumentasjon " +"finner du under her.\n" +" " #: .\cookbook\templates\markdown_info.html:25 msgid "Headers" -msgstr "" +msgstr "Overskrifter" #: .\cookbook\templates\markdown_info.html:54 msgid "Formatting" -msgstr "" +msgstr "Formatering" #: .\cookbook\templates\markdown_info.html:56 #: .\cookbook\templates\markdown_info.html:72 msgid "Line breaks are inserted by adding two spaces after the end of a line" msgstr "" +"Linjeskift er satt inn ved å sette inn to mellomrom på slutten av en linje" #: .\cookbook\templates\markdown_info.html:57 #: .\cookbook\templates\markdown_info.html:73 msgid "or by leaving a blank line inbetween." -msgstr "" +msgstr "eller ved å sette inn en tom linje mellom." #: .\cookbook\templates\markdown_info.html:59 #: .\cookbook\templates\markdown_info.html:74 msgid "This text is bold" -msgstr "" +msgstr "Denne teksten er Fet" #: .\cookbook\templates\markdown_info.html:60 #: .\cookbook\templates\markdown_info.html:75 msgid "This text is italic" -msgstr "" +msgstr "Denne teksten er Kursiv" #: .\cookbook\templates\markdown_info.html:61 #: .\cookbook\templates\markdown_info.html:77 msgid "Blockquotes are also possible" -msgstr "" +msgstr "Det er også mulig å sitere avsnitt" #: .\cookbook\templates\markdown_info.html:84 msgid "Lists" -msgstr "" +msgstr "Lister" #: .\cookbook\templates\markdown_info.html:85 msgid "" @@ -1264,7 +1302,7 @@ msgstr "" #: .\cookbook\templates\no_groups_info.html:5 #: .\cookbook\templates\no_groups_info.html:12 msgid "No Permissions" -msgstr "Ingen tilganger." +msgstr "Ingen tilgang" #: .\cookbook\templates\no_groups_info.html:17 msgid "You do not have any groups and therefor cannot use this application." @@ -1298,12 +1336,11 @@ msgstr "" #: .\cookbook\templates\offline.html:6 msgid "Offline" -msgstr "Frakoblet." +msgstr "Frakoblet" #: .\cookbook\templates\offline.html:19 -#, fuzzy msgid "You are currently offline!" -msgstr "Du er ikke tilkoblet Internett." +msgstr "Du er ikke tilkoblet!" #: .\cookbook\templates\offline.html:20 msgid "" @@ -1366,7 +1403,7 @@ msgstr "Stil" #: .\cookbook\templates\settings.html:79 msgid "API Token" -msgstr "API-symbol" +msgstr "API nøkkel" #: .\cookbook\templates\settings.html:80 msgid "" @@ -1389,9 +1426,8 @@ msgid "Cookbook Setup" msgstr "Kokeboksoppsett" #: .\cookbook\templates\setup.html:14 -#, fuzzy msgid "Setup" -msgstr "Sett opp" +msgstr "Installering" #: .\cookbook\templates\setup.html:15 msgid "" @@ -1424,11 +1460,11 @@ msgstr "Mengde" #: .\cookbook\templates\shopping_list.html:226 msgid "Supermarket" -msgstr "Matbutikk" +msgstr "Butikk" #: .\cookbook\templates\shopping_list.html:236 msgid "Select Supermarket" -msgstr "Velg matbutikk" +msgstr "Velg butikk" #: .\cookbook\templates\shopping_list.html:260 msgid "Select User" @@ -1540,7 +1576,6 @@ msgstr "" #: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 #: .\cookbook\templates\system.html:80 .\cookbook\templates\system.html:95 -#, fuzzy msgid "Ok" msgstr "OK" diff --git a/cookbook/locale/nl/LC_MESSAGES/django.mo b/cookbook/locale/nl/LC_MESSAGES/django.mo index 26ad66f84..e9bf3ea42 100644 Binary files a/cookbook/locale/nl/LC_MESSAGES/django.mo and b/cookbook/locale/nl/LC_MESSAGES/django.mo differ diff --git a/cookbook/locale/nl/LC_MESSAGES/django.po b/cookbook/locale/nl/LC_MESSAGES/django.po index 2d4821144..bfb500fbb 100644 --- a/cookbook/locale/nl/LC_MESSAGES/django.po +++ b/cookbook/locale/nl/LC_MESSAGES/django.po @@ -12,81 +12,67 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 19:20+0200\n" -"PO-Revision-Date: 2022-09-01 20:32+0000\n" -"Last-Translator: 1k2 \n" -"Language-Team: Dutch \n" +"POT-Creation-Date: 2023-04-26 07:46+0200\n" +"PO-Revision-Date: 2023-02-27 13:55+0000\n" +"Last-Translator: Jesse \n" +"Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.10.1\n" +"X-Generator: Weblate 4.15\n" -#: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 -#: .\cookbook\templates\stats.html:28 -msgid "Ingredients" -msgstr "Ingrediënten" - -#: .\cookbook\forms.py:53 +#: .\cookbook\forms.py:52 msgid "Default unit" msgstr "Standaard eenheid" -#: .\cookbook\forms.py:54 +#: .\cookbook\forms.py:53 msgid "Use fractions" msgstr "Gebruik fracties" -#: .\cookbook\forms.py:55 +#: .\cookbook\forms.py:54 msgid "Use KJ" msgstr "Gebruik KJ" -#: .\cookbook\forms.py:56 +#: .\cookbook\forms.py:55 msgid "Theme" msgstr "Thema" -#: .\cookbook\forms.py:57 +#: .\cookbook\forms.py:56 msgid "Navbar color" msgstr "Navbar kleur" -#: .\cookbook\forms.py:58 +#: .\cookbook\forms.py:57 msgid "Sticky navbar" msgstr "Plak navbar" -#: .\cookbook\forms.py:59 +#: .\cookbook\forms.py:58 msgid "Default page" msgstr "Standaard pagina" -#: .\cookbook\forms.py:60 -msgid "Show recent recipes" -msgstr "Toon recente recepten" - -#: .\cookbook\forms.py:61 -msgid "Search style" -msgstr "Zoekstijl" - -#: .\cookbook\forms.py:62 +#: .\cookbook\forms.py:59 msgid "Plan sharing" msgstr "Plan delen" -#: .\cookbook\forms.py:63 +#: .\cookbook\forms.py:60 msgid "Ingredient decimal places" msgstr "Ingrediënt decimalen" -#: .\cookbook\forms.py:64 +#: .\cookbook\forms.py:61 msgid "Shopping list auto sync period" msgstr "Boodschappenlijst auto sync periode" -#: .\cookbook\forms.py:65 .\cookbook\templates\recipe_view.html:21 -#: .\cookbook\templates\stats.html:47 +#: .\cookbook\forms.py:62 .\cookbook\templates\recipe_view.html:36 msgid "Comments" msgstr "Opmerkingen" -#: .\cookbook\forms.py:66 +#: .\cookbook\forms.py:63 msgid "Left-handed mode" msgstr "Linkshandigen modus" -#: .\cookbook\forms.py:70 +#: .\cookbook\forms.py:67 msgid "" "Color of the top navigation bar. Not all colors work with all themes, just " "try them out!" @@ -94,13 +80,13 @@ msgstr "" "De kleur van de bovenste navigatie balk. Niet alle kleuren werken met alle " "thema's, je dient ze dus simpelweg uit te proberen!" -#: .\cookbook\forms.py:72 +#: .\cookbook\forms.py:69 msgid "Default Unit to be used when inserting a new ingredient into a recipe." msgstr "" "Standaard eenheid die gebruikt wordt wanneer een nieuw ingrediënt aan een " "recept wordt toegevoegd." -#: .\cookbook\forms.py:74 +#: .\cookbook\forms.py:71 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" @@ -108,33 +94,29 @@ msgstr "" "Mogelijk maken van breuken bij ingrediënt aantallen (het automatisch " "converteren van decimalen naar breuken)" -#: .\cookbook\forms.py:76 +#: .\cookbook\forms.py:73 msgid "Display nutritional energy amounts in joules instead of calories" msgstr "Geef energiewaardes weer in joules in plaats van calorieën" -#: .\cookbook\forms.py:77 +#: .\cookbook\forms.py:74 msgid "Users with whom newly created meal plans should be shared by default." msgstr "" "Gebruikers waarmee een nieuwe maaltijdplannen standaard gedeeld moeten " "worden." -#: .\cookbook\forms.py:78 +#: .\cookbook\forms.py:75 msgid "Users with whom to share shopping lists." msgstr "Gebruikers waarmee boodschappenlijsten gedeeld moeten worden." -#: .\cookbook\forms.py:80 -msgid "Show recently viewed recipes on search page." -msgstr "Geef recent bekeken recepten op de zoekpagina weer." - -#: .\cookbook\forms.py:81 +#: .\cookbook\forms.py:76 msgid "Number of decimals to round ingredients." msgstr "Aantal decimalen om ingrediënten op af te ronden." -#: .\cookbook\forms.py:82 +#: .\cookbook\forms.py:77 msgid "If you want to be able to create and see comments underneath recipes." msgstr "Als je opmerkingen onder recepten wil kunnen maken en zien." -#: .\cookbook\forms.py:84 .\cookbook\forms.py:496 +#: .\cookbook\forms.py:79 .\cookbook\forms.py:492 msgid "" "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. " @@ -147,23 +129,23 @@ msgstr "" "gelijktijdig boodschappen doen maar verbruikt mogelijk extra mobiele data. " "Wordt gereset bij opslaan wanneer de limiet niet bereikt is." -#: .\cookbook\forms.py:87 +#: .\cookbook\forms.py:82 msgid "Makes the navbar stick to the top of the page." msgstr "Zet de navbar vast aan de bovenkant van de pagina." -#: .\cookbook\forms.py:88 .\cookbook\forms.py:499 +#: .\cookbook\forms.py:83 .\cookbook\forms.py:495 msgid "Automatically add meal plan ingredients to shopping list." msgstr "Zet maaltijdplan ingrediënten automatisch op boodschappenlijst." -#: .\cookbook\forms.py:89 +#: .\cookbook\forms.py:84 msgid "Exclude ingredients that are on hand." msgstr "Sluit ingrediënten die op voorraad zijn uit." -#: .\cookbook\forms.py:90 +#: .\cookbook\forms.py:85 msgid "Will optimize the UI for use with your left hand." msgstr "Optimaliseert de gebruikersinterface voor gebruik met je linkerhand." -#: .\cookbook\forms.py:107 +#: .\cookbook\forms.py:102 msgid "" "Both fields are optional. If none are given the username will be displayed " "instead" @@ -171,36 +153,35 @@ msgstr "" "Beide velden zijn optioneel. Indien niks is opgegeven wordt de " "gebruikersnaam weergegeven" -#: .\cookbook\forms.py:128 .\cookbook\forms.py:301 +#: .\cookbook\forms.py:123 .\cookbook\forms.py:297 msgid "Name" msgstr "Naam" -#: .\cookbook\forms.py:129 .\cookbook\forms.py:302 -#: .\cookbook\templates\stats.html:24 .\cookbook\views\lists.py:88 +#: .\cookbook\forms.py:124 .\cookbook\forms.py:298 .\cookbook\views\lists.py:88 msgid "Keywords" msgstr "Etiketten" -#: .\cookbook\forms.py:130 +#: .\cookbook\forms.py:125 msgid "Preparation time in minutes" msgstr "Voorbereidingstijd in minuten" -#: .\cookbook\forms.py:131 +#: .\cookbook\forms.py:126 msgid "Waiting time (cooking/baking) in minutes" msgstr "Wacht tijd in minuten (koken en bakken)" -#: .\cookbook\forms.py:132 .\cookbook\forms.py:270 .\cookbook\forms.py:303 +#: .\cookbook\forms.py:127 .\cookbook\forms.py:266 .\cookbook\forms.py:299 msgid "Path" msgstr "Pad" -#: .\cookbook\forms.py:133 +#: .\cookbook\forms.py:128 msgid "Storage UID" msgstr "Opslag UID" -#: .\cookbook\forms.py:165 +#: .\cookbook\forms.py:161 msgid "Default" msgstr "Standaard waarde" -#: .\cookbook\forms.py:177 +#: .\cookbook\forms.py:173 msgid "" "To prevent duplicates recipes with the same name as existing ones are " "ignored. Check this box to import everything." @@ -208,19 +189,19 @@ msgstr "" "Om dubbelingen te voorkomen worden recepten met dezelfde naam als een " "bestaand recept genegeerd. Vink aan om alles te importeren." -#: .\cookbook\forms.py:200 +#: .\cookbook\forms.py:196 msgid "Add your comment: " msgstr "Voeg een opmerking toe: " -#: .\cookbook\forms.py:215 +#: .\cookbook\forms.py:211 msgid "Leave empty for dropbox and enter app password for nextcloud." msgstr "Laat leeg voor dropbox en vul het app wachtwoord in voor nextcloud." -#: .\cookbook\forms.py:222 +#: .\cookbook\forms.py:218 msgid "Leave empty for nextcloud and enter api token for dropbox." msgstr "Laat leeg voor nextcloud en vul de api token in voor dropbox." -#: .\cookbook\forms.py:231 +#: .\cookbook\forms.py:227 msgid "" "Leave empty for dropbox and enter only base url for nextcloud (/remote." "php/webdav/ is added automatically)" @@ -228,33 +209,33 @@ msgstr "" "Laat leeg voor dropbox en vul enkel de base url voor nextcloud in. (/" "remote.php/webdav/ wordt automatisch toegevoegd.)" -#: .\cookbook\forms.py:269 .\cookbook\views\edit.py:157 +#: .\cookbook\forms.py:265 .\cookbook\views\edit.py:157 msgid "Storage" msgstr "Opslag" -#: .\cookbook\forms.py:271 +#: .\cookbook\forms.py:267 msgid "Active" msgstr "Actief" -#: .\cookbook\forms.py:277 +#: .\cookbook\forms.py:273 msgid "Search String" msgstr "Zoekopdracht" -#: .\cookbook\forms.py:304 +#: .\cookbook\forms.py:300 msgid "File ID" msgstr "Bestands ID" -#: .\cookbook\forms.py:326 +#: .\cookbook\forms.py:322 msgid "You must provide at least a recipe or a title." msgstr "Je moet minimaal één recept of titel te specificeren." -#: .\cookbook\forms.py:339 +#: .\cookbook\forms.py:335 msgid "You can list default users to share recipes with in the settings." msgstr "" "Je kan in de instellingen standaard gebruikers in stellen om de recepten met " "te delen." -#: .\cookbook\forms.py:340 +#: .\cookbook\forms.py:336 msgid "" "You can use markdown to format this field. See the docs here" @@ -262,15 +243,15 @@ msgstr "" "Je kunt markdown gebruiken om dit veld te op te maken. Bekijk de documentatie hier" -#: .\cookbook\forms.py:366 +#: .\cookbook\forms.py:362 msgid "Maximum number of users for this space reached." msgstr "Maximum aantal gebruikers voor deze ruimte bereikt." -#: .\cookbook\forms.py:372 +#: .\cookbook\forms.py:368 msgid "Email address already taken!" msgstr "E-mailadres reeds in gebruik!" -#: .\cookbook\forms.py:380 +#: .\cookbook\forms.py:376 msgid "" "An email address is not required but if present the invite link will be sent " "to the user." @@ -278,15 +259,15 @@ msgstr "" "Een e-mailadres is niet vereist, maar indien aanwezig zal de " "uitnodigingslink naar de gebruiker worden gestuurd." -#: .\cookbook\forms.py:395 +#: .\cookbook\forms.py:391 msgid "Name already taken." msgstr "Naam reeds in gebruik." -#: .\cookbook\forms.py:406 +#: .\cookbook\forms.py:402 msgid "Accept Terms and Privacy" msgstr "Accepteer voorwaarden" -#: .\cookbook\forms.py:438 +#: .\cookbook\forms.py:434 msgid "" "Determines how fuzzy a search is if it uses trigram similarity matching (e." "g. low values mean more typos are ignored)." @@ -294,7 +275,7 @@ msgstr "" "Bepaalt hoe 'fuzzy' een zoekopdracht is als het trigram vergelijken gebruikt " "(lage waarden betekenen bijvoorbeeld dat meer typefouten genegeerd worden)." -#: .\cookbook\forms.py:448 +#: .\cookbook\forms.py:444 msgid "" "Select type method of search. Click here for " "full description of choices." @@ -302,7 +283,7 @@ msgstr "" "Selecteer zoekmethode. Klik hier voor een " "beschrijving van de keuzes." -#: .\cookbook\forms.py:449 +#: .\cookbook\forms.py:445 msgid "" "Use fuzzy matching on units, keywords and ingredients when editing and " "importing recipes." @@ -310,7 +291,7 @@ msgstr "" "Gebruik 'fuzzy' koppelen bij eenheden, etiketten en ingrediënten bij " "bewerken en importeren van recepten." -#: .\cookbook\forms.py:451 +#: .\cookbook\forms.py:447 msgid "" "Fields to search ignoring accents. Selecting this option can improve or " "degrade search quality depending on language" @@ -319,7 +300,7 @@ msgstr "" "deze optie kan de zoekkwaliteit afhankelijk van de taal, zowel verbeteren " "als verslechteren" -#: .\cookbook\forms.py:453 +#: .\cookbook\forms.py:449 msgid "" "Fields to search for partial matches. (e.g. searching for 'Pie' will return " "'pie' and 'piece' and 'soapie')" @@ -327,7 +308,7 @@ msgstr "" "Velden doorzoeken op gedeelde overeenkomsten. (zoeken op 'Appel' vindt " "'appel', 'aardappel' en 'appelsap')" -#: .\cookbook\forms.py:455 +#: .\cookbook\forms.py:451 msgid "" "Fields to search for beginning of word matches. (e.g. searching for 'sa' " "will return 'salad' and 'sandwich')" @@ -335,7 +316,7 @@ msgstr "" "Velden doorzoeken op overeenkomsten aan het begin van het woord. (zoeken op " "'sa' vindt 'salade' en 'sandwich')" -#: .\cookbook\forms.py:457 +#: .\cookbook\forms.py:453 msgid "" "Fields to 'fuzzy' search. (e.g. searching for 'recpie' will find 'recipe'.) " "Note: this option will conflict with 'web' and 'raw' methods of search." @@ -343,7 +324,7 @@ msgstr "" "Velden 'fuzzy' doorzoeken. (zoeken op 'recetp' vindt ook 'recept') Noot: " "deze optie conflicteert met de zoekmethoden 'web' en 'raw'." -#: .\cookbook\forms.py:459 +#: .\cookbook\forms.py:455 msgid "" "Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " "only function with fulltext fields." @@ -351,35 +332,35 @@ msgstr "" "Velden doorzoeken op volledige tekst. Noot: Web, Zin en Raw zoekmethoden " "werken alleen met volledige tekstvelden." -#: .\cookbook\forms.py:463 +#: .\cookbook\forms.py:459 msgid "Search Method" msgstr "Zoekmethode" -#: .\cookbook\forms.py:464 +#: .\cookbook\forms.py:460 msgid "Fuzzy Lookups" msgstr "'Fuzzy' zoekopdrachten" -#: .\cookbook\forms.py:465 +#: .\cookbook\forms.py:461 msgid "Ignore Accent" msgstr "Negeer accent" -#: .\cookbook\forms.py:466 +#: .\cookbook\forms.py:462 msgid "Partial Match" msgstr "Gedeeltelijke overeenkomst" -#: .\cookbook\forms.py:467 +#: .\cookbook\forms.py:463 msgid "Starts With" msgstr "Begint met" -#: .\cookbook\forms.py:468 +#: .\cookbook\forms.py:464 msgid "Fuzzy Search" msgstr "'Fuzzy' zoeken" -#: .\cookbook\forms.py:469 +#: .\cookbook\forms.py:465 msgid "Full Text" msgstr "Volledige tekst" -#: .\cookbook\forms.py:494 +#: .\cookbook\forms.py:490 msgid "" "Users will see all items you add to your shopping list. They must add you " "to see items on their list." @@ -387,7 +368,7 @@ msgstr "" "Gebruikers zien alle items die je op je boodschappenlijst zet. Ze moeten " "jou toevoegen om items op hun lijst te zien." -#: .\cookbook\forms.py:500 +#: .\cookbook\forms.py:496 msgid "" "When adding a meal plan to the shopping list (manually or automatically), " "include all related recipes." @@ -395,7 +376,7 @@ msgstr "" "Als een maaltijdplan aan de boodschappenlijst toegevoegd wordt (handmatig of " "automatisch), neem dan alle recepten op." -#: .\cookbook\forms.py:501 +#: .\cookbook\forms.py:497 msgid "" "When adding a meal plan to the shopping list (manually or automatically), " "exclude ingredients that are on hand." @@ -403,94 +384,98 @@ msgstr "" "Als een maaltijdplan aan de boodschappenlijst toegevoegd wordt (handmatig of " "automatisch), sluit ingrediënten die op voorraad zijn dan uit." -#: .\cookbook\forms.py:502 +#: .\cookbook\forms.py:498 msgid "Default number of hours to delay a shopping list entry." msgstr "Standaard aantal uren om een boodschappenlijst item te vertragen." -#: .\cookbook\forms.py:503 +#: .\cookbook\forms.py:499 msgid "Filter shopping list to only include supermarket categories." msgstr "Filter boodschappenlijst om alleen supermarktcategorieën te bevatten." -#: .\cookbook\forms.py:504 +#: .\cookbook\forms.py:500 msgid "Days of recent shopping list entries to display." msgstr "Dagen van recente boodschappenlijst items weer te geven." -#: .\cookbook\forms.py:505 +#: .\cookbook\forms.py:501 msgid "Mark food 'On Hand' when checked off shopping list." msgstr "" "Markeer eten 'Op voorraad' wanneer het van het boodschappenlijstje is " "afgevinkt." -#: .\cookbook\forms.py:506 +#: .\cookbook\forms.py:502 msgid "Delimiter to use for CSV exports." msgstr "Scheidingsteken te gebruiken voor CSV exports." -#: .\cookbook\forms.py:507 +#: .\cookbook\forms.py:503 msgid "Prefix to add when copying list to the clipboard." msgstr "" "Toe te voegen Voorvoegsel bij het kopiëren van een lijst naar het klembord." -#: .\cookbook\forms.py:511 +#: .\cookbook\forms.py:507 msgid "Share Shopping List" msgstr "Deel boodschappenlijst" -#: .\cookbook\forms.py:512 +#: .\cookbook\forms.py:508 msgid "Autosync" msgstr "Autosync" -#: .\cookbook\forms.py:513 +#: .\cookbook\forms.py:509 msgid "Auto Add Meal Plan" msgstr "Voeg maaltijdplan automatisch toe" -#: .\cookbook\forms.py:514 +#: .\cookbook\forms.py:510 msgid "Exclude On Hand" msgstr "Sluit op voorraad uit" -#: .\cookbook\forms.py:515 +#: .\cookbook\forms.py:511 msgid "Include Related" msgstr "Neem gerelateerde op" -#: .\cookbook\forms.py:516 +#: .\cookbook\forms.py:512 msgid "Default Delay Hours" msgstr "Standaard vertraging in uren" -#: .\cookbook\forms.py:517 +#: .\cookbook\forms.py:513 msgid "Filter to Supermarket" msgstr "Filter op supermarkt" -#: .\cookbook\forms.py:518 +#: .\cookbook\forms.py:514 msgid "Recent Days" msgstr "Afgelopen dagen" -#: .\cookbook\forms.py:519 +#: .\cookbook\forms.py:515 msgid "CSV Delimiter" msgstr "CSV scheidingsteken" -#: .\cookbook\forms.py:520 +#: .\cookbook\forms.py:516 msgid "List Prefix" msgstr "Lijst voorvoegsel" -#: .\cookbook\forms.py:521 +#: .\cookbook\forms.py:517 msgid "Auto On Hand" msgstr "Auto op voorraad" -#: .\cookbook\forms.py:531 +#: .\cookbook\forms.py:527 msgid "Reset Food Inheritance" msgstr "Herstel Ingrediënt overname" -#: .\cookbook\forms.py:532 +#: .\cookbook\forms.py:528 msgid "Reset all food to inherit the fields configured." msgstr "Herstel alle ingrediënten om de geconfigureerde velden over te nemen." -#: .\cookbook\forms.py:544 +#: .\cookbook\forms.py:540 msgid "Fields on food that should be inherited by default." msgstr "Velden van ingrediënten die standaard overgenomen moeten worden." -#: .\cookbook\forms.py:545 +#: .\cookbook\forms.py:541 msgid "Show recipe counts on search filters" msgstr "Toon recepten teller bij zoekfilters" -#: .\cookbook\helper\AllAuthCustomAdapter.py:36 +#: .\cookbook\forms.py:542 +msgid "Use the plural form for units and food inside this space." +msgstr "Gebruik de meervoudsvorm voor eenheden en voedsel in deze ruimte." + +#: .\cookbook\helper\AllAuthCustomAdapter.py:39 msgid "" "In order to prevent spam, the requested email was not send. Please wait a " "few minutes and try again." @@ -498,71 +483,100 @@ msgstr "" "Om spam te voorkomen werd de gevraagde e-mail niet verzonden. Wacht een paar " "minuten en probeer het opnieuw." -#: .\cookbook\helper\permission_helper.py:149 -#: .\cookbook\helper\permission_helper.py:172 .\cookbook\views\views.py:152 +#: .\cookbook\helper\permission_helper.py:164 +#: .\cookbook\helper\permission_helper.py:187 .\cookbook\views\views.py:117 msgid "You are not logged in and therefore cannot view this page!" msgstr "Je bent niet ingelogd en kan deze pagina daarom niet bekijken!" -#: .\cookbook\helper\permission_helper.py:153 -#: .\cookbook\helper\permission_helper.py:159 -#: .\cookbook\helper\permission_helper.py:184 -#: .\cookbook\helper\permission_helper.py:254 -#: .\cookbook\helper\permission_helper.py:268 -#: .\cookbook\helper\permission_helper.py:279 -#: .\cookbook\helper\permission_helper.py:290 .\cookbook\views\data.py:33 -#: .\cookbook\views\views.py:163 .\cookbook\views\views.py:170 -#: .\cookbook\views\views.py:249 +#: .\cookbook\helper\permission_helper.py:168 +#: .\cookbook\helper\permission_helper.py:174 +#: .\cookbook\helper\permission_helper.py:199 +#: .\cookbook\helper\permission_helper.py:269 +#: .\cookbook\helper\permission_helper.py:283 +#: .\cookbook\helper\permission_helper.py:294 +#: .\cookbook\helper\permission_helper.py:305 +#: .\cookbook\helper\permission_helper.py:321 +#: .\cookbook\helper\permission_helper.py:342 .\cookbook\views\data.py:36 +#: .\cookbook\views\views.py:128 .\cookbook\views\views.py:135 msgid "You do not have the required permissions to view this page!" msgstr "Je hebt niet de benodigde machtigingen om deze pagina te bekijken!" -#: .\cookbook\helper\permission_helper.py:177 -#: .\cookbook\helper\permission_helper.py:200 -#: .\cookbook\helper\permission_helper.py:222 +#: .\cookbook\helper\permission_helper.py:192 +#: .\cookbook\helper\permission_helper.py:215 #: .\cookbook\helper\permission_helper.py:237 +#: .\cookbook\helper\permission_helper.py:252 msgid "You cannot interact with this object as it is not owned by you!" msgstr "" "Interactie met dit object is niet mogelijk omdat je niet de eigenaar bent!" -#: .\cookbook\helper\permission_helper.py:321 +#: .\cookbook\helper\permission_helper.py:403 msgid "You have reached the maximum number of recipes for your space." msgstr "Je hebt het maximaal aantal recepten voor jouw ruimte bereikt." -#: .\cookbook\helper\permission_helper.py:333 +#: .\cookbook\helper\permission_helper.py:415 msgid "You have more users than allowed in your space." msgstr "Je hebt meer gebruikers dan toegestaan in jouw ruimte." -#: .\cookbook\helper\recipe_search.py:565 +#: .\cookbook\helper\recipe_search.py:630 msgid "One of queryset or hash_key must be provided" msgstr "Er moet een queryset of hash_key opgegeven worden" -#: .\cookbook\helper\shopping_helper.py:152 +#: .\cookbook\helper\recipe_url_import.py:266 +#, fuzzy +#| msgid "Use fractions" +msgid "reverse rotation" +msgstr "Gebruik fracties" + +#: .\cookbook\helper\recipe_url_import.py:267 +msgid "careful rotation" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:268 +msgid "knead" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:269 +msgid "thicken" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:270 +msgid "warm up" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:271 +msgid "ferment" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:272 +msgid "sous-vide" +msgstr "" + +#: .\cookbook\helper\shopping_helper.py:157 msgid "You must supply a servings size" msgstr "Je moet een portiegrootte aanleveren" -#: .\cookbook\helper\template_helper.py:64 -#: .\cookbook\helper\template_helper.py:66 +#: .\cookbook\helper\template_helper.py:79 +#: .\cookbook\helper\template_helper.py:81 msgid "Could not parse template code." msgstr "Sjablooncode kon niet verwerkt worden." -#: .\cookbook\integration\copymethat.py:41 +#: .\cookbook\integration\copymethat.py:44 #: .\cookbook\integration\melarecipes.py:37 msgid "Favorite" msgstr "Favoriet" -#: .\cookbook\integration\copymethat.py:70 -#: .\cookbook\integration\recettetek.py:54 -#: .\cookbook\integration\recipekeeper.py:63 -msgid "Imported from" -msgstr "Geïmporteerd van" +#: .\cookbook\integration\copymethat.py:50 +msgid "I made this" +msgstr "Ik heb dit gemaakt" -#: .\cookbook\integration\integration.py:223 +#: .\cookbook\integration\integration.py:218 msgid "" "Importer expected a .zip file. Did you choose the correct importer type for " "your data ?" msgstr "" "De importtool verwachtte een .zip bestand. Heb je het juiste type gekozen?" -#: .\cookbook\integration\integration.py:226 +#: .\cookbook\integration\integration.py:221 msgid "" "An unexpected error occurred during the import. Please make sure you have " "uploaded a valid file." @@ -570,27 +584,38 @@ msgstr "" "Er is een onverwachte fout opgetreden tijdens het importeren. Controleer of " "u een geldig bestand hebt geüpload." -#: .\cookbook\integration\integration.py:231 +#: .\cookbook\integration\integration.py:226 msgid "The following recipes were ignored because they already existed:" msgstr "De volgende recepten zijn genegeerd omdat ze al bestonden:" -#: .\cookbook\integration\integration.py:235 +#: .\cookbook\integration\integration.py:230 #, python-format msgid "Imported %s recipes." msgstr "%s recepten geïmporteerd." -#: .\cookbook\integration\paprika.py:46 +#: .\cookbook\integration\openeats.py:26 +#, fuzzy +#| msgid "Recipe Home" +msgid "Recipe source:" +msgstr "Recept thuis" + +#: .\cookbook\integration\paprika.py:49 msgid "Notes" msgstr "Notities" -#: .\cookbook\integration\paprika.py:49 +#: .\cookbook\integration\paprika.py:52 msgid "Nutritional Information" msgstr "Voedingswaarde" -#: .\cookbook\integration\paprika.py:53 +#: .\cookbook\integration\paprika.py:56 msgid "Source" msgstr "Bron" +#: .\cookbook\integration\recettetek.py:54 +#: .\cookbook\integration\recipekeeper.py:70 +msgid "Imported from" +msgstr "Geïmporteerd van" + #: .\cookbook\integration\saffron.py:23 msgid "Servings" msgstr "Porties" @@ -603,9 +628,7 @@ msgstr "Wachttijd" msgid "Preparation Time" msgstr "Bereidingstijd" -#: .\cookbook\integration\saffron.py:29 -#: .\cookbook\templates\forms\ingredients.html:7 -#: .\cookbook\templates\index.html:7 +#: .\cookbook\integration\saffron.py:29 .\cookbook\templates\index.html:7 msgid "Cookbook" msgstr "Kookboek" @@ -647,7 +670,7 @@ msgstr "Avondeten" msgid "Other" msgstr "Overige" -#: .\cookbook\models.py:251 +#: .\cookbook\models.py:261 msgid "" "Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " "upload." @@ -655,135 +678,129 @@ msgstr "" "Maximale bestandsopslag voor ruimte in MB. 0 voor onbeperkt, -1 om uploaden " "van bestanden uit te schakelen." -#: .\cookbook\models.py:353 .\cookbook\templates\search.html:7 +#: .\cookbook\models.py:365 .\cookbook\templates\search.html:7 +#: .\cookbook\templates\settings.html:18 #: .\cookbook\templates\space_manage.html:7 msgid "Search" msgstr "Zoeken" -#: .\cookbook\models.py:354 .\cookbook\templates\base.html:107 +#: .\cookbook\models.py:366 .\cookbook\templates\base.html:110 #: .\cookbook\templates\meal_plan.html:7 .\cookbook\views\delete.py:178 #: .\cookbook\views\edit.py:211 .\cookbook\views\new.py:179 msgid "Meal-Plan" msgstr "Maaltijdplan" -#: .\cookbook\models.py:355 .\cookbook\templates\base.html:115 +#: .\cookbook\models.py:367 .\cookbook\templates\base.html:118 msgid "Books" msgstr "Boeken" -#: .\cookbook\models.py:363 -msgid "Small" -msgstr "Klein" - -#: .\cookbook\models.py:363 -msgid "Large" -msgstr "Groot" - -#: .\cookbook\models.py:363 .\cookbook\templates\generic\new_template.html:6 -#: .\cookbook\templates\generic\new_template.html:14 -msgid "New" -msgstr "Nieuw" - -#: .\cookbook\models.py:584 +#: .\cookbook\models.py:580 msgid " is part of a recipe step and cannot be deleted" msgstr " is deel van een receptstap en kan niet verwijderd worden" -#: .\cookbook\models.py:1162 .\cookbook\templates\search_info.html:28 +#: .\cookbook\models.py:1181 .\cookbook\templates\search_info.html:28 msgid "Simple" msgstr "Simpel" -#: .\cookbook\models.py:1163 .\cookbook\templates\search_info.html:33 +#: .\cookbook\models.py:1182 .\cookbook\templates\search_info.html:33 msgid "Phrase" msgstr "Zin" -#: .\cookbook\models.py:1164 .\cookbook\templates\search_info.html:38 +#: .\cookbook\models.py:1183 .\cookbook\templates\search_info.html:38 msgid "Web" msgstr "Web" -#: .\cookbook\models.py:1165 .\cookbook\templates\search_info.html:47 +#: .\cookbook\models.py:1184 .\cookbook\templates\search_info.html:47 msgid "Raw" msgstr "Rauw" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 msgid "Food Alias" msgstr "Ingrediënt alias" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 msgid "Unit Alias" msgstr "Eenheid alias" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 msgid "Keyword Alias" msgstr "Etiket alias" -#: .\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 +#: .\cookbook\models.py:1232 +msgid "Description Replace" +msgstr "Verrvang beschrijving" + +#: .\cookbook\models.py:1232 +msgid "Instruction Replace" +msgstr "Vervang instructies" + +#: .\cookbook\models.py:1258 .\cookbook\views\delete.py:36 +#: .\cookbook\views\edit.py:251 .\cookbook\views\new.py:48 msgid "Recipe" msgstr "Recept" -#: .\cookbook\models.py:1228 +#: .\cookbook\models.py:1259 msgid "Food" msgstr "Ingrediënt" -#: .\cookbook\models.py:1229 .\cookbook\templates\base.html:138 +#: .\cookbook\models.py:1260 .\cookbook\templates\base.html:141 msgid "Keyword" msgstr "Etiket" -#: .\cookbook\serializer.py:207 -msgid "Cannot modify Space owner permission." -msgstr "" - -#: .\cookbook\serializer.py:290 +#: .\cookbook\serializer.py:198 msgid "File uploads are not enabled for this Space." msgstr "Bestandsuploads zijn niet ingeschakeld voor deze Ruimte." -#: .\cookbook\serializer.py:301 +#: .\cookbook\serializer.py:209 msgid "You have reached your file upload limit." msgstr "U heeft de uploadlimiet bereikt." -#: .\cookbook\serializer.py:1081 +#: .\cookbook\serializer.py:291 +msgid "Cannot modify Space owner permission." +msgstr "Kan de rechten van de ruimte-eigenaar niet wijzigen." + +#: .\cookbook\serializer.py:1093 msgid "Hello" msgstr "Hallo" -#: .\cookbook\serializer.py:1081 +#: .\cookbook\serializer.py:1093 msgid "You have been invited by " msgstr "Je bent uitgenodigd door " -#: .\cookbook\serializer.py:1082 +#: .\cookbook\serializer.py:1094 msgid " to join their Tandoor Recipes space " msgstr " om zijn/haar Tandoor Recepten ruimte " -#: .\cookbook\serializer.py:1083 +#: .\cookbook\serializer.py:1095 msgid "Click the following link to activate your account: " msgstr "Klik om de volgende link om je account te activeren: " -#: .\cookbook\serializer.py:1084 +#: .\cookbook\serializer.py:1096 msgid "" "If the link does not work use the following code to manually join the space: " msgstr "" "Als de linkt niet werkt, gebruik dan de volgende code om handmatig tot de " "ruimte toe te treden: " -#: .\cookbook\serializer.py:1085 +#: .\cookbook\serializer.py:1097 msgid "The invitation is valid until " msgstr "De uitnodiging is geldig tot " -#: .\cookbook\serializer.py:1086 +#: .\cookbook\serializer.py:1098 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " msgstr "" "Tandoor Recepten is een Open Source recepten manager. Bekijk het op GitHub " -#: .\cookbook\serializer.py:1089 +#: .\cookbook\serializer.py:1101 msgid "Tandoor Recipes Invite" msgstr "Tandoor Recepten uitnodiging" -#: .\cookbook\serializer.py:1209 +#: .\cookbook\serializer.py:1242 msgid "Existing shopping list to update" msgstr "Bestaande boodschappenlijst is bijgewerkt" -#: .\cookbook\serializer.py:1211 +#: .\cookbook\serializer.py:1244 msgid "" "List of ingredient IDs from the recipe to add, if not provided all " "ingredients will be added." @@ -791,38 +808,31 @@ msgstr "" "Lijst van ingrediënten ID's van het toe te voegen recept, als deze niet " "opgegeven worden worden alle ingrediënten toegevoegd." -#: .\cookbook\serializer.py:1213 +#: .\cookbook\serializer.py:1246 msgid "" "Providing a list_recipe ID and servings of 0 will delete that shopping list." msgstr "" "Als je een list_recipe ID en portiegrootte van 0 opgeeft wordt dat " "boodschappenlijstje verwijderd." -#: .\cookbook\serializer.py:1222 +#: .\cookbook\serializer.py:1255 msgid "Amount of food to add to the shopping list" msgstr "Hoeveelheid eten om aan het boodschappenlijstje toe te voegen" -#: .\cookbook\serializer.py:1224 +#: .\cookbook\serializer.py:1257 msgid "ID of unit to use for the shopping list" msgstr "ID of eenheid om te gebruik voor het boodschappenlijstje" -#: .\cookbook\serializer.py:1226 +#: .\cookbook\serializer.py:1259 msgid "When set to true will delete all food from active shopping lists." msgstr "" "Wanneer ingesteld op waar, wordt al het voedsel van actieve " "boodschappenlijstjes verwijderd." -#: .\cookbook\tables.py:36 .\cookbook\templates\generic\edit_template.html:6 -#: .\cookbook\templates\generic\edit_template.html:14 -#: .\cookbook\templates\recipes_table.html:82 -msgid "Edit" -msgstr "Bewerken" - -#: .\cookbook\tables.py:116 .\cookbook\tables.py:131 +#: .\cookbook\tables.py:61 .\cookbook\tables.py:75 #: .\cookbook\templates\generic\delete_template.html:7 #: .\cookbook\templates\generic\delete_template.html:15 #: .\cookbook\templates\generic\edit_template.html:28 -#: .\cookbook\templates\recipes_table.html:90 msgid "Delete" msgstr "Verwijder" @@ -850,9 +860,10 @@ msgstr "E-mailadressen" #: .\cookbook\templates\account\email.html:12 #: .\cookbook\templates\account\password_change.html:11 #: .\cookbook\templates\account\password_set.html:11 -#: .\cookbook\templates\base.html:293 .\cookbook\templates\settings.html:6 +#: .\cookbook\templates\base.html:296 .\cookbook\templates\settings.html:6 #: .\cookbook\templates\settings.html:17 #: .\cookbook\templates\socialaccount\connections.html:10 +#: .\cookbook\templates\user_settings.html:8 msgid "Settings" msgstr "Instellingen" @@ -947,8 +958,8 @@ msgstr "" "Deze e-mail bevestigingslink is verlopen of ongeldig.\n" "Vraag een nieuwe bevestigingslink aan." -#: .\cookbook\templates\account\login.html:8 -#: .\cookbook\templates\base.html:340 .\cookbook\templates\openid\login.html:8 +#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:343 +#: .\cookbook\templates\openid\login.html:8 msgid "Login" msgstr "Inloggen" @@ -968,21 +979,20 @@ msgstr "Log in" msgid "Sign Up" msgstr "Registreer" +#: .\cookbook\templates\account\login.html:38 +msgid "Lost your password?" +msgstr "Wachtwoord vergeten?" + #: .\cookbook\templates\account\login.html:39 -#: .\cookbook\templates\account\login.html:41 #: .\cookbook\templates\account\password_reset.html:29 msgid "Reset My Password" msgstr "Reset wachtwoord" -#: .\cookbook\templates\account\login.html:40 -msgid "Lost your password?" -msgstr "Wachtwoord vergeten?" - -#: .\cookbook\templates\account\login.html:52 +#: .\cookbook\templates\account\login.html:50 msgid "Social Login" msgstr "Socials login" -#: .\cookbook\templates\account\login.html:53 +#: .\cookbook\templates\account\login.html:51 msgid "You can use any of the following providers to sign in." msgstr "Je kan een van de volgende providers gebruiken om in te loggen." @@ -1008,7 +1018,6 @@ msgstr "Wijzig wachtwoord" #: .\cookbook\templates\account\password_change.html:12 #: .\cookbook\templates\account\password_set.html:12 -#: .\cookbook\templates\settings.html:76 msgid "Password" msgstr "Wachtwoord" @@ -1120,129 +1129,124 @@ 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:330 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:333 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "API documentatie" -#: .\cookbook\templates\base.html:103 .\cookbook\templates\index.html:87 -#: .\cookbook\templates\stats.html:22 +#: .\cookbook\templates\base.html:106 .\cookbook\templates\index.html:87 msgid "Recipes" msgstr "Recepten" -#: .\cookbook\templates\base.html:111 +#: .\cookbook\templates\base.html:114 msgid "Shopping" msgstr "Winkelen" -#: .\cookbook\templates\base.html:150 .\cookbook\views\lists.py:105 +#: .\cookbook\templates\base.html:153 .\cookbook\views\lists.py:105 msgid "Foods" msgstr "Ingrediënten" -#: .\cookbook\templates\base.html:162 -#: .\cookbook\templates\forms\ingredients.html:24 -#: .\cookbook\templates\stats.html:26 .\cookbook\views\lists.py:122 +#: .\cookbook\templates\base.html:165 .\cookbook\views\lists.py:122 msgid "Units" msgstr "Eenheden" -#: .\cookbook\templates\base.html:176 .\cookbook\templates\supermarket.html:7 +#: .\cookbook\templates\base.html:179 .\cookbook\templates\supermarket.html:7 msgid "Supermarket" msgstr "Supermarkt" -#: .\cookbook\templates\base.html:188 +#: .\cookbook\templates\base.html:191 msgid "Supermarket Category" msgstr "Supermarktcategorie" -#: .\cookbook\templates\base.html:200 .\cookbook\views\lists.py:171 +#: .\cookbook\templates\base.html:203 .\cookbook\views\lists.py:171 msgid "Automations" msgstr "Automatiseringen" -#: .\cookbook\templates\base.html:214 .\cookbook\views\lists.py:207 +#: .\cookbook\templates\base.html:217 .\cookbook\views\lists.py:207 msgid "Files" msgstr "Bestanden" -#: .\cookbook\templates\base.html:226 +#: .\cookbook\templates\base.html:229 msgid "Batch Edit" msgstr "Batchbewerking" -#: .\cookbook\templates\base.html:238 .\cookbook\templates\history.html:6 +#: .\cookbook\templates\base.html:241 .\cookbook\templates\history.html:6 #: .\cookbook\templates\history.html:14 msgid "History" msgstr "Geschiedenis" -#: .\cookbook\templates\base.html:252 +#: .\cookbook\templates\base.html:255 #: .\cookbook\templates\ingredient_editor.html:7 #: .\cookbook\templates\ingredient_editor.html:13 msgid "Ingredient Editor" msgstr "Ingrediënten editor" -#: .\cookbook\templates\base.html:264 +#: .\cookbook\templates\base.html:267 #: .\cookbook\templates\export_response.html:7 #: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 msgid "Export" msgstr "Exporteren" -#: .\cookbook\templates\base.html:280 .\cookbook\templates\index.html:47 +#: .\cookbook\templates\base.html:283 .\cookbook\templates\index.html:47 msgid "Import Recipe" msgstr "Recept importeren" -#: .\cookbook\templates\base.html:282 +#: .\cookbook\templates\base.html:285 msgid "Create" msgstr "Aanmaken" -#: .\cookbook\templates\base.html:295 +#: .\cookbook\templates\base.html:298 #: .\cookbook\templates\generic\list_template.html:14 -#: .\cookbook\templates\stats.html:43 msgid "External Recipes" msgstr "Externe recepten" -#: .\cookbook\templates\base.html:298 -#: .\cookbook\templates\space_manage.html:15 +#: .\cookbook\templates\base.html:301 .\cookbook\templates\space_manage.html:15 msgid "Space Settings" msgstr "Ruimte Instellingen" -#: .\cookbook\templates\base.html:303 .\cookbook\templates\system.html:13 +#: .\cookbook\templates\base.html:306 .\cookbook\templates\system.html:13 msgid "System" msgstr "Systeem" -#: .\cookbook\templates\base.html:305 +#: .\cookbook\templates\base.html:308 msgid "Admin" msgstr "Beheer" -#: .\cookbook\templates\base.html:309 +#: .\cookbook\templates\base.html:312 #: .\cookbook\templates\space_overview.html:25 msgid "Your Spaces" msgstr "Jouw Spaces" -#: .\cookbook\templates\base.html:320 +#: .\cookbook\templates\base.html:323 #: .\cookbook\templates\space_overview.html:6 msgid "Overview" msgstr "Overzicht" -#: .\cookbook\templates\base.html:324 +#: .\cookbook\templates\base.html:327 msgid "Markdown Guide" msgstr "Markdown gids" -#: .\cookbook\templates\base.html:326 +#: .\cookbook\templates\base.html:329 msgid "GitHub" msgstr "GitHub" -#: .\cookbook\templates\base.html:328 +#: .\cookbook\templates\base.html:331 msgid "Translate Tandoor" msgstr "Vertaal Tandoor" -#: .\cookbook\templates\base.html:332 +#: .\cookbook\templates\base.html:335 msgid "API Browser" msgstr "API Browser" -#: .\cookbook\templates\base.html:335 +#: .\cookbook\templates\base.html:338 msgid "Log out" msgstr "Uitloggen" -#: .\cookbook\templates\base.html:357 +#: .\cookbook\templates\base.html:360 msgid "You are using the free version of Tandor" msgstr "Je gebruikt de gratis versie van Tandoor" -#: .\cookbook\templates\base.html:358 +#: .\cookbook\templates\base.html:361 msgid "Upgrade Now" msgstr "Upgrade nu" @@ -1284,11 +1288,7 @@ msgstr "Het pad dient het volgende format te hebben" #: .\cookbook\templates\forms\edit_import_recipe.html:14 #: .\cookbook\templates\generic\edit_template.html:23 #: .\cookbook\templates\generic\new_template.html:23 -#: .\cookbook\templates\settings.html:70 -#: .\cookbook\templates\settings.html:112 -#: .\cookbook\templates\settings.html:130 -#: .\cookbook\templates\settings.html:202 -#: .\cookbook\templates\settings.html:213 +#: .\cookbook\templates\settings.html:57 msgid "Save" msgstr "Opslaan" @@ -1338,41 +1338,6 @@ msgstr "Nieuw recept importeren" msgid "Edit Recipe" msgstr "Recept bewerken" -#: .\cookbook\templates\forms\ingredients.html:15 -msgid "Edit Ingredients" -msgstr "Ingrediënten bewerken" - -#: .\cookbook\templates\forms\ingredients.html:16 -msgid "" -"\n" -" The following form can be used if, accidentally, two (or more) units " -"or ingredients where created that should be\n" -" the same.\n" -" It merges two units or ingredients and updates all recipes using " -"them.\n" -" " -msgstr "" -"\n" -" Het volgende formulier kan worden gebruikt wanneer per ongeluk twee " -"(of meer) eenheden of ingrediënten zijn gemaakt die eigenlijk\n" -" hetzelfde zijn\n" -" Het voegt de twee eenheden of ingrediënten samen en past alle " -"bijbehorende recepten aan.\n" -" " - -#: .\cookbook\templates\forms\ingredients.html:26 -msgid "Are you sure that you want to merge these two units?" -msgstr "Weet je zeker dat je deze twee eenheden wil samenvoegen?" - -#: .\cookbook\templates\forms\ingredients.html:31 -#: .\cookbook\templates\forms\ingredients.html:40 -msgid "Merge" -msgstr "Samenvoegen" - -#: .\cookbook\templates\forms\ingredients.html:36 -msgid "Are you sure that you want to merge these two ingredients?" -msgstr "Weet je zeker dat je deze ingrediënten wil samenvoegen?" - #: .\cookbook\templates\generic\delete_template.html:21 #, python-format msgid "Are you sure you want to delete the %(title)s: %(object)s " @@ -1394,6 +1359,11 @@ msgstr "Cascade" msgid "Cancel" msgstr "Annuleer" +#: .\cookbook\templates\generic\edit_template.html:6 +#: .\cookbook\templates\generic\edit_template.html:14 +msgid "Edit" +msgstr "Bewerken" + #: .\cookbook\templates\generic\edit_template.html:32 msgid "View" msgstr "Bekijk" @@ -1415,13 +1385,16 @@ msgstr "Filtreren" msgid "Import all" msgstr "Alles importeren" +#: .\cookbook\templates\generic\new_template.html:6 +#: .\cookbook\templates\generic\new_template.html:14 +msgid "New" +msgstr "Nieuw" + #: .\cookbook\templates\generic\table_template.html:76 -#: .\cookbook\templates\recipes_table.html:121 msgid "previous" msgstr "vorige" #: .\cookbook\templates\generic\table_template.html:98 -#: .\cookbook\templates\recipes_table.html:143 msgid "next" msgstr "volgende" @@ -1433,24 +1406,11 @@ msgstr "Logboek bekijken" msgid "Cook Log" msgstr "Kook logboek" -#: .\cookbook\templates\import.html:6 -msgid "Import Recipes" -msgstr "Recepten importeren" - -#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 #: .\cookbook\templates\import_response.html:7 .\cookbook\views\delete.py:86 #: .\cookbook\views\edit.py:191 msgid "Import" msgstr "Importeer" -#: .\cookbook\templates\include\recipe_open_modal.html:18 -msgid "Close" -msgstr "Sluiten" - -#: .\cookbook\templates\include\recipe_open_modal.html:32 -msgid "Open Recipe" -msgstr "Open recept" - #: .\cookbook\templates\include\storage_backend_warning.html:4 msgid "Security Warning" msgstr "Veiligheidswaarschuwing" @@ -1656,31 +1616,6 @@ msgstr "Kop" msgid "Cell" msgstr "Cel" -#: .\cookbook\templates\meal_plan_entry.html:6 -msgid "Meal Plan View" -msgstr "Maaltijdenplan bekijken" - -#: .\cookbook\templates\meal_plan_entry.html:18 -msgid "Created by" -msgstr "Gemaakt door" - -#: .\cookbook\templates\meal_plan_entry.html:20 -msgid "Shared with" -msgstr "Gedeeld met" - -#: .\cookbook\templates\meal_plan_entry.html:48 -#: .\cookbook\templates\recipes_table.html:64 -msgid "Last cooked" -msgstr "Laatst bereid" - -#: .\cookbook\templates\meal_plan_entry.html:50 -msgid "Never cooked before." -msgstr "Nog nooit bereid." - -#: .\cookbook\templates\meal_plan_entry.html:76 -msgid "Other meals on this day" -msgstr "Andere maaltijden op deze dag" - #: .\cookbook\templates\no_groups_info.html:5 #: .\cookbook\templates\no_groups_info.html:12 msgid "No Permissions" @@ -1729,43 +1664,26 @@ msgstr "" msgid "Back" msgstr "Terug" -#: .\cookbook\templates\recipe_view.html:26 +#: .\cookbook\templates\profile.html:7 +msgid "Profile" +msgstr "Profiel" + +#: .\cookbook\templates\recipe_view.html:41 msgid "by" msgstr "door" -#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:144 +#: .\cookbook\templates\recipe_view.html:59 .\cookbook\views\delete.py:144 #: .\cookbook\views\edit.py:171 msgid "Comment" msgstr "Opmerking" -#: .\cookbook\templates\recipes_table.html:19 -#: .\cookbook\templates\recipes_table.html:23 -msgid "Recipe Image" -msgstr "Recept afbeelding" - -#: .\cookbook\templates\recipes_table.html:51 -msgid "Preparation time ca." -msgstr "Geschatte voorbereidingstijd" - -#: .\cookbook\templates\recipes_table.html:57 -msgid "Waiting time ca." -msgstr "Geschatte wachttijd" - -#: .\cookbook\templates\recipes_table.html:60 -msgid "External" -msgstr "Externe" - -#: .\cookbook\templates\recipes_table.html:86 -msgid "Log Cooking" -msgstr "Bereiding loggen" - #: .\cookbook\templates\rest_framework\api.html:5 msgid "Recipe Home" msgstr "Recept thuis" #: .\cookbook\templates\search_info.html:5 #: .\cookbook\templates\search_info.html:9 -#: .\cookbook\templates\settings.html:172 +#: .\cookbook\templates\settings.html:24 msgid "Search Settings" msgstr "Zoekinstellingen" @@ -2019,76 +1937,7 @@ msgstr "" "managementcommando 'python manage.py rebuildindex'\n" " " -#: .\cookbook\templates\settings.html:28 -msgid "Account" -msgstr "Account" - -#: .\cookbook\templates\settings.html:35 -msgid "Preferences" -msgstr "Voorkeuren" - -#: .\cookbook\templates\settings.html:42 -msgid "API-Settings" -msgstr "API-instellingen" - -#: .\cookbook\templates\settings.html:49 -msgid "Search-Settings" -msgstr "Zoek instellingen" - -#: .\cookbook\templates\settings.html:56 -msgid "Shopping-Settings" -msgstr "Boodschappen instellingen" - -#: .\cookbook\templates\settings.html:65 -msgid "Name Settings" -msgstr "Naam instellingen" - -#: .\cookbook\templates\settings.html:73 -msgid "Account Settings" -msgstr "Account instellingen" - -#: .\cookbook\templates\settings.html:75 -msgid "Emails" -msgstr "E-mails" - -#: .\cookbook\templates\settings.html:78 -#: .\cookbook\templates\socialaccount\connections.html:11 -msgid "Social" -msgstr "Socials" - -#: .\cookbook\templates\settings.html:91 -msgid "Language" -msgstr "Taal" - -#: .\cookbook\templates\settings.html:121 -msgid "Style" -msgstr "Stijl" - -#: .\cookbook\templates\settings.html:142 -msgid "API Token" -msgstr "API Token" - -#: .\cookbook\templates\settings.html:143 -msgid "" -"You can use both basic authentication and token based authentication to " -"access the REST API." -msgstr "" -"Je kan zowel basale verificatie als verificatie op basis van tokens " -"gebruiken om toegang tot de REST API te krijgen." - -#: .\cookbook\templates\settings.html:160 -msgid "" -"Use the token as an Authorization header prefixed by the word token as shown " -"in the following examples:" -msgstr "" -"Gebruik de token als een 'Authorization header'voorafgegaan door het woord " -"token zoals in de volgende voorbeelden:" - -#: .\cookbook\templates\settings.html:162 -msgid "or" -msgstr "of" - -#: .\cookbook\templates\settings.html:173 +#: .\cookbook\templates\settings.html:25 msgid "" "There are many options to configure the search depending on your personal " "preferences." @@ -2096,7 +1945,7 @@ msgstr "" "Er zijn vele mogelijkheden om het zoeken te configureren die afhangen van je " "persoonlijke voorkeur." -#: .\cookbook\templates\settings.html:174 +#: .\cookbook\templates\settings.html:26 msgid "" "Usually you do not need to configure any of them and can just stick " "with either the default or one of the following presets." @@ -2105,7 +1954,7 @@ msgstr "" "gebruikmaken van het standaard profiel of de volgende vooraf ingestelde " "profielen." -#: .\cookbook\templates\settings.html:175 +#: .\cookbook\templates\settings.html:27 msgid "" "If you do want to configure the search you can read about the different " "options here." @@ -2113,11 +1962,11 @@ msgstr "" "Als je het zoeken wil configureren kan je hier " "over de verschillende opties lezen." -#: .\cookbook\templates\settings.html:180 +#: .\cookbook\templates\settings.html:32 msgid "Fuzzy" msgstr "Fuzzy" -#: .\cookbook\templates\settings.html:181 +#: .\cookbook\templates\settings.html:33 msgid "" "Find what you need even if your search or the recipe contains typos. Might " "return more results than needed to make sure you find what you are looking " @@ -2127,20 +1976,19 @@ msgstr "" "bevat. Mogelijk krijg je meer resultaten dan je nodig hebt, om zeker te " "weten dat je vindt wat je nodig hebt." -#: .\cookbook\templates\settings.html:182 +#: .\cookbook\templates\settings.html:34 msgid "This is the default behavior" msgstr "Dit is het standaard gedrag" -#: .\cookbook\templates\settings.html:183 -#: .\cookbook\templates\settings.html:191 +#: .\cookbook\templates\settings.html:37 .\cookbook\templates\settings.html:46 msgid "Apply" msgstr "Pas toe" -#: .\cookbook\templates\settings.html:188 +#: .\cookbook\templates\settings.html:42 msgid "Precise" msgstr "Nauwkeurig" -#: .\cookbook\templates\settings.html:189 +#: .\cookbook\templates\settings.html:43 msgid "" "Allows fine control over search results but might not return results if too " "many spelling mistakes are made." @@ -2148,14 +1996,10 @@ msgstr "" "Staat fijnmazige controle over zoekresultaten toe, maar toont mogelijk geen " "resultaten als er te veel spelfouten gemaakt zijn." -#: .\cookbook\templates\settings.html:190 +#: .\cookbook\templates\settings.html:44 msgid "Perfect for large Databases" msgstr "Perfect voor grote databases" -#: .\cookbook\templates\settings.html:207 -msgid "Shopping Settings" -msgstr "Boodschappen instellingen" - #: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5 msgid "Cookbook Setup" msgstr "Kookboek Setup" @@ -2191,6 +2035,10 @@ msgstr "" msgid "Account Connections" msgstr "Account verbindingen" +#: .\cookbook\templates\socialaccount\connections.html:11 +msgid "Social" +msgstr "Socials" + #: .\cookbook\templates\socialaccount\connections.html:18 msgid "" "You can sign in to your account using any of the following third party\n" @@ -2223,6 +2071,8 @@ msgstr "Verbind %(provider)s" #, python-format msgid "You are about to connect a new third party account from %(provider)s." msgstr "" +"Je staat op het punt een nieuw derde partij account van %(provider)s te " +"verbinden." #: .\cookbook\templates\socialaccount\login.html:13 #, python-format @@ -2233,6 +2083,8 @@ msgstr "Log in via %(provider)s" #, python-format msgid "You are about to sign in using a third party account from %(provider)s." msgstr "" +"Je staat op het punt met een derde partij account van %(provider)s in te " +"loggen." #: .\cookbook\templates\socialaccount\login.html:20 msgid "Continue" @@ -2276,7 +2128,7 @@ msgstr "Beheer abonnementen" #: .\cookbook\templates\space_overview.html:13 .\cookbook\views\delete.py:216 msgid "Space" -msgstr "Space" +msgstr "Ruimte" #: .\cookbook\templates\space_overview.html:17 msgid "" @@ -2293,24 +2145,24 @@ msgstr "" "Je kan uitgenodigd worden in een bestaande ruimte of je eigen ruimte " "aanmaken." -#: .\cookbook\templates\space_overview.html:45 +#: .\cookbook\templates\space_overview.html:53 msgid "Owner" msgstr "Eigenaar" -#: .\cookbook\templates\space_overview.html:49 +#: .\cookbook\templates\space_overview.html:57 msgid "Leave Space" msgstr "Verlaat Space" -#: .\cookbook\templates\space_overview.html:70 -#: .\cookbook\templates\space_overview.html:80 +#: .\cookbook\templates\space_overview.html:78 +#: .\cookbook\templates\space_overview.html:88 msgid "Join Space" msgstr "Sluit aan bij ruimte" -#: .\cookbook\templates\space_overview.html:73 +#: .\cookbook\templates\space_overview.html:81 msgid "Join an existing space." msgstr "Sluit aan bij bestaande ruimte." -#: .\cookbook\templates\space_overview.html:75 +#: .\cookbook\templates\space_overview.html:83 msgid "" "To join an existing space either enter your invite token or click on the " "invite link the space owner send you." @@ -2318,47 +2170,19 @@ msgstr "" "Om je aan te sluiten bij een bestaande ruimte moet je jouw uitnodigingstoken " "invoeren of op de uitnodingslink klikken die je ontvangen hebt." -#: .\cookbook\templates\space_overview.html:88 -#: .\cookbook\templates\space_overview.html:97 +#: .\cookbook\templates\space_overview.html:96 +#: .\cookbook\templates\space_overview.html:105 msgid "Create Space" msgstr "Maak ruimte aan" -#: .\cookbook\templates\space_overview.html:91 +#: .\cookbook\templates\space_overview.html:99 msgid "Create your own recipe space." msgstr "Maak je eigen recepten ruimte." -#: .\cookbook\templates\space_overview.html:93 +#: .\cookbook\templates\space_overview.html:101 msgid "Start your own recipe space and invite other users to it." msgstr "Start je eigen recepten ruimte en nodig andere gebruikers uit." -#: .\cookbook\templates\stats.html:4 -msgid "Stats" -msgstr "Statistieken" - -#: .\cookbook\templates\stats.html:10 -msgid "Statistics" -msgstr "Statistieken" - -#: .\cookbook\templates\stats.html:19 -msgid "Number of objects" -msgstr "Aantal objecten" - -#: .\cookbook\templates\stats.html:30 -msgid "Recipe Imports" -msgstr "Geïmporteerde recepten" - -#: .\cookbook\templates\stats.html:38 -msgid "Objects stats" -msgstr "Object statistieken" - -#: .\cookbook\templates\stats.html:41 -msgid "Recipes without Keywords" -msgstr "Recepten zonder etiketten" - -#: .\cookbook\templates\stats.html:45 -msgid "Internal Recipes" -msgstr "Interne recepten" - #: .\cookbook\templates\system.html:20 msgid "System Information" msgstr "Systeeminformatie" @@ -2487,76 +2311,85 @@ msgstr "" msgid "URL Import" msgstr "Importeer URL" -#: .\cookbook\views\api.py:105 .\cookbook\views\api.py:197 +#: .\cookbook\views\api.py:110 .\cookbook\views\api.py:202 msgid "Parameter updated_at incorrectly formatted" msgstr "Parameter updatet_at is onjuist geformateerd" -#: .\cookbook\views\api.py:217 .\cookbook\views\api.py:320 +#: .\cookbook\views\api.py:222 .\cookbook\views\api.py:325 +#, python-brace-format msgid "No {self.basename} with id {pk} exists" msgstr "Er bestaat geen {self.basename} met id {pk}" -#: .\cookbook\views\api.py:221 +#: .\cookbook\views\api.py:226 msgid "Cannot merge with the same object!" msgstr "Kan niet met hetzelfde object samenvoegen!" -#: .\cookbook\views\api.py:228 +#: .\cookbook\views\api.py:233 +#, python-brace-format msgid "No {self.basename} with id {target} exists" msgstr "Er bestaat geen {self.basename} met id {target}" -#: .\cookbook\views\api.py:233 +#: .\cookbook\views\api.py:238 msgid "Cannot merge with child object!" msgstr "Kan niet met kindobject samenvoegen!" -#: .\cookbook\views\api.py:266 +#: .\cookbook\views\api.py:271 +#, python-brace-format msgid "{source.name} was merged successfully with {target.name}" msgstr "{source.name} is succesvol samengevoegd met {target.name}" -#: .\cookbook\views\api.py:271 +#: .\cookbook\views\api.py:276 +#, python-brace-format 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:329 +#: .\cookbook\views\api.py:334 +#, python-brace-format msgid "{child.name} was moved successfully to the root." msgstr "{child.name} is succesvol verplaatst naar het hoogste niveau." -#: .\cookbook\views\api.py:332 .\cookbook\views\api.py:350 +#: .\cookbook\views\api.py:337 .\cookbook\views\api.py:355 msgid "An error occurred attempting to move " msgstr "Er is een error opgetreden bij het verplaatsen " -#: .\cookbook\views\api.py:335 +#: .\cookbook\views\api.py:340 msgid "Cannot move an object to itself!" msgstr "Kan object niet verplaatsen naar zichzelf!" -#: .\cookbook\views\api.py:341 +#: .\cookbook\views\api.py:346 +#, python-brace-format msgid "No {self.basename} with id {parent} exists" msgstr "Er bestaat geen {self.basename} met id {parent}" -#: .\cookbook\views\api.py:347 +#: .\cookbook\views\api.py:352 +#, python-brace-format msgid "{child.name} was moved successfully to parent {parent.name}" msgstr "{child.name} is succesvol verplaatst naar {parent.name}" -#: .\cookbook\views\api.py:542 +#: .\cookbook\views\api.py:553 +#, python-brace-format msgid "{obj.name} was removed from the shopping list." msgstr "{obj.name} is verwijderd van het boodschappenlijstje." -#: .\cookbook\views\api.py:547 .\cookbook\views\api.py:879 -#: .\cookbook\views\api.py:892 +#: .\cookbook\views\api.py:558 .\cookbook\views\api.py:888 +#: .\cookbook\views\api.py:901 +#, python-brace-format msgid "{obj.name} was added to the shopping list." msgstr "{obj.name} is toegevoegd aan het boodschappenlijstje." -#: .\cookbook\views\api.py:674 +#: .\cookbook\views\api.py:685 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:676 +#: .\cookbook\views\api.py:687 msgid "Query string matched (fuzzy) against object name." msgstr "Zoekterm komt overeen (fuzzy) met object naam." -#: .\cookbook\views\api.py:720 +#: .\cookbook\views\api.py:731 msgid "" "Query string matched (fuzzy) against recipe name. In the future also " "fulltext search." @@ -2564,7 +2397,7 @@ msgstr "" "Zoekterm komt overeen (fuzzy) met recept naam. In de toekomst wordt zoeken " "op volledige tekst ondersteund." -#: .\cookbook\views\api.py:722 +#: .\cookbook\views\api.py:733 msgid "" "ID of keyword a recipe should have. For multiple repeat parameter. " "Equivalent to keywords_or" @@ -2572,109 +2405,109 @@ msgstr "" "ID van etiket dat een recept moet hebben. Herhaal parameter voor meerdere. " "Gelijkwaardig aan keywords_or" -#: .\cookbook\views\api.py:725 +#: .\cookbook\views\api.py:736 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:728 +#: .\cookbook\views\api.py:739 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:731 +#: .\cookbook\views\api.py:742 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:734 +#: .\cookbook\views\api.py:745 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:736 +#: .\cookbook\views\api.py:747 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:739 +#: .\cookbook\views\api.py:750 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:741 +#: .\cookbook\views\api.py:752 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:743 +#: .\cookbook\views\api.py:754 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:745 +#: .\cookbook\views\api.py:756 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:746 +#: .\cookbook\views\api.py:757 msgid "ID of unit a recipe should have." msgstr "ID van eenheid dat een recept moet hebben." -#: .\cookbook\views\api.py:748 +#: .\cookbook\views\api.py:759 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:749 +#: .\cookbook\views\api.py:760 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:751 +#: .\cookbook\views\api.py:762 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:753 +#: .\cookbook\views\api.py:764 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:755 +#: .\cookbook\views\api.py:766 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:757 +#: .\cookbook\views\api.py:768 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:759 +#: .\cookbook\views\api.py:770 msgid "If only internal recipes should be returned. [true/false]" msgstr "" "Wanneer alleen interne recepten gevonden moeten worden. [waar/onwaar]" -#: .\cookbook\views\api.py:761 +#: .\cookbook\views\api.py:772 msgid "Returns the results in randomized order. [true/false]" msgstr "" "Geeft de resultaten in willekeurige volgorde weer. [waar/onwaar]" -#: .\cookbook\views\api.py:763 +#: .\cookbook\views\api.py:774 msgid "Returns new results first in search results. [true/false]" msgstr "Geeft nieuwe resultaten eerst weer. [waar/onwaar]" -#: .\cookbook\views\api.py:765 +#: .\cookbook\views\api.py:776 msgid "" "Filter recipes cooked X times or more. Negative values returns cooked less " "than X times" @@ -2682,7 +2515,7 @@ msgstr "" "Filter recepten X maal of meer bereid. Negatieve waarden geven minder dan X " "keer bereide recepten weer" -#: .\cookbook\views\api.py:767 +#: .\cookbook\views\api.py:778 msgid "" "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on " "or before date." @@ -2690,7 +2523,7 @@ msgstr "" "Filter recepten op laatst bereid op of na JJJJ-MM-DD. Voorafgaand - filters " "op of voor datum." -#: .\cookbook\views\api.py:769 +#: .\cookbook\views\api.py:780 msgid "" "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or " "before date." @@ -2698,7 +2531,7 @@ msgstr "" "Filter recepten aangemaakt op of na JJJJ-MM-DD. Voorafgaand - filters op of " "voor datum." -#: .\cookbook\views\api.py:771 +#: .\cookbook\views\api.py:782 msgid "" "Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or " "before date." @@ -2706,7 +2539,7 @@ msgstr "" "Filter recepten op geüpdatet op of na JJJJ-MM-DD. Voorafgaand - filters op " "of voor datum." -#: .\cookbook\views\api.py:773 +#: .\cookbook\views\api.py:784 msgid "" "Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on " "or before date." @@ -2714,13 +2547,13 @@ msgstr "" "Filter recepten op laatst bekeken op of na JJJJ-MM-DD. Voorafgaand - filters " "op of voor datum." -#: .\cookbook\views\api.py:775 +#: .\cookbook\views\api.py:786 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:937 +#: .\cookbook\views\api.py:946 msgid "" "Returns the shopping list entry with a primary key of id. Multiple values " "allowed." @@ -2728,53 +2561,57 @@ msgstr "" "Geeft het boodschappenlijstje item met een primaire sleutel van id. " "Meerdere waarden toegestaan." -#: .\cookbook\views\api.py:942 +#: .\cookbook\views\api.py:951 msgid "" -"Filter shopping list entries on checked. [true, false, both, recent]" -"
    - recent includes unchecked items and recently completed items." +"Filter shopping list entries on checked. [true, false, both, recent]
    - recent includes unchecked items and recently completed items." msgstr "" -"Filter boodschappenlijstjes op aangevinkt. [waar,onwaar,beide,recent]" -"
    - recent bevat niet aangevinkte en recent voltooide items." +"Filter boodschappenlijstjes op aangevinkt. [waar,onwaar,beide,recent]
    - recent bevat niet aangevinkte en recent voltooide items." -#: .\cookbook\views\api.py:945 +#: .\cookbook\views\api.py:954 msgid "Returns the shopping list entries sorted by supermarket category order." msgstr "" "Geeft items op boodschappenlijstjes gesorteerd per supermarktcategorie weer." -#: .\cookbook\views\api.py:1140 +#: .\cookbook\views\api.py:1166 msgid "Nothing to do." msgstr "Niks te doen." -#: .\cookbook\views\api.py:1160 +#: .\cookbook\views\api.py:1198 msgid "Invalid Url" msgstr "Ongeldige URL" -#: .\cookbook\views\api.py:1167 +#: .\cookbook\views\api.py:1205 msgid "Connection Refused." msgstr "Verbinding geweigerd." -#: .\cookbook\views\api.py:1172 +#: .\cookbook\views\api.py:1210 msgid "Bad URL Schema." msgstr "Verkeerd URL schema." -#: .\cookbook\views\api.py:1195 +#: .\cookbook\views\api.py:1233 msgid "No usable data could be found." msgstr "Er is geen bruikbare data gevonden." -#: .\cookbook\views\api.py:1303 .\cookbook\views\data.py:28 +#: .\cookbook\views\api.py:1326 .\cookbook\views\import_export.py:117 +msgid "Importing is not implemented for this provider" +msgstr "Importeren is voor deze provider niet geïmplementeerd" + +#: .\cookbook\views\api.py:1372 .\cookbook\views\data.py:31 #: .\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:1325 +#: .\cookbook\views\api.py:1394 msgid "Sync successful!" msgstr "Synchronisatie succesvol!" -#: .\cookbook\views\api.py:1330 +#: .\cookbook\views\api.py:1399 msgid "Error synchronizing with Storage" msgstr "Er is een fout opgetreden bij het synchroniseren met Opslag" -#: .\cookbook\views\data.py:97 +#: .\cookbook\views\data.py:100 #, python-format msgid "Batch edit done. %(count)d recipe was updated." msgid_plural "Batch edit done. %(count)d Recipes where updated." @@ -2833,11 +2670,7 @@ msgstr "Wijzigingen opgeslagen!" msgid "Error saving changes!" msgstr "Fout bij het opslaan van de wijzigingen!" -#: .\cookbook\views\import_export.py:111 .\cookbook\views\import_export.py:150 -msgid "Importing is not implemented for this provider" -msgstr "Importeren is voor deze provider niet geïmplementeerd" - -#: .\cookbook\views\import_export.py:137 +#: .\cookbook\views\import_export.py:104 msgid "" "The PDF Exporter is not enabled on this instance as it is still in an " "experimental state." @@ -2885,7 +2718,12 @@ msgstr "Nieuw recept geïmporteerd!" msgid "There was an error importing this recipe!" msgstr "Er is een fout opgetreden bij het importeren van dit recept!" -#: .\cookbook\views\views.py:124 +#: .\cookbook\views\views.py:73 .\cookbook\views\views.py:191 +#: .\cookbook\views\views.py:213 .\cookbook\views\views.py:399 +msgid "This feature is not available in the demo version!" +msgstr "Deze optie is niet beschikbaar in de demo versie!" + +#: .\cookbook\views\views.py:89 msgid "" "You have successfully created your own recipe space. Start by adding some " "recipes or invite other people to join you." @@ -2893,23 +2731,19 @@ msgstr "" "Je hebt je eigen recepten ruimte succesvol aangemaakt. Start met het " "toevoegen van recepten of nodig anderen uit om je te vergezellen." -#: .\cookbook\views\views.py:178 +#: .\cookbook\views\views.py:143 msgid "You do not have the required permissions to perform this action!" msgstr "Je beschikt niet over de juiste rechten om deze actie uit te voeren!" -#: .\cookbook\views\views.py:189 +#: .\cookbook\views\views.py:154 msgid "Comment saved!" msgstr "Opmerking opgeslagen!" -#: .\cookbook\views\views.py:264 -msgid "This feature is not available in the demo version!" -msgstr "Deze optie is niet beschikbaar in de demo versie!" - -#: .\cookbook\views\views.py:324 +#: .\cookbook\views\views.py:253 msgid "You must select at least one field to search!" msgstr "Je moet tenminste één veld om te doorzoeken selecteren!" -#: .\cookbook\views\views.py:329 +#: .\cookbook\views\views.py:258 msgid "" "To use this search method you must select at least one full text search " "field!" @@ -2917,11 +2751,11 @@ msgstr "" "Om deze zoekmethode te gebruiken moet je tenminste één volledig tekstveld " "selecteren!" -#: .\cookbook\views\views.py:333 +#: .\cookbook\views\views.py:262 msgid "Fuzzy search is not compatible with this search method!" msgstr "'Fuzzy' zoeken is niet te gebruiken met deze zoekmethode!" -#: .\cookbook\views\views.py:463 +#: .\cookbook\views\views.py:338 msgid "" "The setup page can only be used to create the first user! If you have " "forgotten your superuser credentials please consult the django documentation " @@ -2932,27 +2766,27 @@ msgstr "" "documentatie raad moeten plegen voor een methode om je wachtwoord te " "resetten." -#: .\cookbook\views\views.py:470 +#: .\cookbook\views\views.py:345 msgid "Passwords dont match!" msgstr "Wachtwoorden komen niet overeen!" -#: .\cookbook\views\views.py:478 +#: .\cookbook\views\views.py:353 msgid "User has been created, please login!" msgstr "Gebruiker is gecreëerd, Log in alstublieft!" -#: .\cookbook\views\views.py:494 +#: .\cookbook\views\views.py:369 msgid "Malformed Invite Link supplied!" msgstr "Onjuiste uitnodigingslink opgegeven!" -#: .\cookbook\views\views.py:510 +#: .\cookbook\views\views.py:386 msgid "Successfully joined space." msgstr "Succesvol toegetreden tot ruimte." -#: .\cookbook\views\views.py:516 +#: .\cookbook\views\views.py:392 msgid "Invite Link not valid or already used!" msgstr "De uitnodigingslink is niet valide of al gebruikt!" -#: .\cookbook\views\views.py:530 +#: .\cookbook\views\views.py:409 msgid "" "Reporting share links is not enabled for this instance. Please notify the " "page administrator to report problems." @@ -2960,7 +2794,7 @@ msgstr "" "Het rapporteren van gedeelde links is niet geactiveerd voor deze instantie. " "Rapporteer problemen bij de beheerder van de pagina." -#: .\cookbook\views\views.py:536 +#: .\cookbook\views\views.py:415 msgid "" "Recipe sharing link has been disabled! For additional information please " "contact the page administrator." @@ -2968,6 +2802,169 @@ msgstr "" "Links voor het delen van recepten zijn gedeactiveerd. Neem contact op met de " "paginabeheerder voor aanvullende informatie." +#~ msgid "Ingredients" +#~ msgstr "Ingrediënten" + +#~ msgid "Show recent recipes" +#~ msgstr "Toon recente recepten" + +#~ msgid "Search style" +#~ msgstr "Zoekstijl" + +#~ msgid "Show recently viewed recipes on search page." +#~ msgstr "Geef recent bekeken recepten op de zoekpagina weer." + +#~ msgid "Small" +#~ msgstr "Klein" + +#~ msgid "Large" +#~ msgstr "Groot" + +#~ msgid "Edit Ingredients" +#~ msgstr "Ingrediënten bewerken" + +#~ msgid "" +#~ "\n" +#~ " The following form can be used if, accidentally, two (or more) " +#~ "units or ingredients where created that should be\n" +#~ " the same.\n" +#~ " It merges two units or ingredients and updates all recipes using " +#~ "them.\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ " Het volgende formulier kan worden gebruikt wanneer per ongeluk " +#~ "twee (of meer) eenheden of ingrediënten zijn gemaakt die eigenlijk\n" +#~ " hetzelfde zijn\n" +#~ " Het voegt de twee eenheden of ingrediënten samen en past alle " +#~ "bijbehorende recepten aan.\n" +#~ " " + +#~ msgid "Are you sure that you want to merge these two units?" +#~ msgstr "Weet je zeker dat je deze twee eenheden wil samenvoegen?" + +#~ msgid "Merge" +#~ msgstr "Samenvoegen" + +#~ msgid "Are you sure that you want to merge these two ingredients?" +#~ msgstr "Weet je zeker dat je deze ingrediënten wil samenvoegen?" + +#~ msgid "Import Recipes" +#~ msgstr "Recepten importeren" + +#~ msgid "Close" +#~ msgstr "Sluiten" + +#~ msgid "Open Recipe" +#~ msgstr "Open recept" + +#~ msgid "Meal Plan View" +#~ msgstr "Maaltijdenplan bekijken" + +#~ msgid "Created by" +#~ msgstr "Gemaakt door" + +#~ msgid "Shared with" +#~ msgstr "Gedeeld met" + +#~ msgid "Last cooked" +#~ msgstr "Laatst bereid" + +#~ msgid "Never cooked before." +#~ msgstr "Nog nooit bereid." + +#~ msgid "Other meals on this day" +#~ msgstr "Andere maaltijden op deze dag" + +#~ msgid "Recipe Image" +#~ msgstr "Recept afbeelding" + +#~ msgid "Preparation time ca." +#~ msgstr "Geschatte voorbereidingstijd" + +#~ msgid "Waiting time ca." +#~ msgstr "Geschatte wachttijd" + +#~ msgid "External" +#~ msgstr "Externe" + +#~ msgid "Log Cooking" +#~ msgstr "Bereiding loggen" + +#~ msgid "Account" +#~ msgstr "Account" + +#~ msgid "Preferences" +#~ msgstr "Voorkeuren" + +#~ msgid "API-Settings" +#~ msgstr "API-instellingen" + +#~ msgid "Search-Settings" +#~ msgstr "Zoek instellingen" + +#~ msgid "Shopping-Settings" +#~ msgstr "Boodschappen instellingen" + +#~ msgid "Name Settings" +#~ msgstr "Naam instellingen" + +#~ msgid "Account Settings" +#~ msgstr "Account instellingen" + +#~ msgid "Emails" +#~ msgstr "E-mails" + +#~ msgid "Language" +#~ msgstr "Taal" + +#~ msgid "Style" +#~ msgstr "Stijl" + +#~ msgid "API Token" +#~ msgstr "API Token" + +#~ msgid "" +#~ "You can use both basic authentication and token based authentication to " +#~ "access the REST API." +#~ msgstr "" +#~ "Je kan zowel basale verificatie als verificatie op basis van tokens " +#~ "gebruiken om toegang tot de REST API te krijgen." + +#~ msgid "" +#~ "Use the token as an Authorization header prefixed by the word token as " +#~ "shown in the following examples:" +#~ msgstr "" +#~ "Gebruik de token als een 'Authorization header'voorafgegaan door het " +#~ "woord token zoals in de volgende voorbeelden:" + +#~ msgid "or" +#~ msgstr "of" + +#~ msgid "Shopping Settings" +#~ msgstr "Boodschappen instellingen" + +#~ msgid "Stats" +#~ msgstr "Statistieken" + +#~ msgid "Statistics" +#~ msgstr "Statistieken" + +#~ msgid "Number of objects" +#~ msgstr "Aantal objecten" + +#~ msgid "Recipe Imports" +#~ msgstr "Geïmporteerde recepten" + +#~ msgid "Objects stats" +#~ msgstr "Object statistieken" + +#~ msgid "Recipes without Keywords" +#~ msgstr "Recepten zonder etiketten" + +#~ msgid "Internal Recipes" +#~ msgstr "Interne recepten" + #~ msgid "Show Links" #~ msgstr "Toon links" @@ -3113,9 +3110,6 @@ msgstr "" #~ msgid "Text dragged here will be appended to the name." #~ msgstr "Hierheen gesleepte tekst wordt aan de naam toegevoegd." -#~ msgid "Description" -#~ msgstr "Beschrijving" - #~ msgid "Text dragged here will be appended to the description." #~ msgstr "Hierheen gesleepte tekst wordt aan de beschrijving toegevoegd." @@ -3135,9 +3129,6 @@ msgstr "" #~ msgstr "" #~ "Hierheen gesleepte Ingrediënten worden aan de huidige lijst toegevoegd." -#~ msgid "Instructions" -#~ msgstr "Instructies" - #~ msgid "" #~ "Recipe instructions dragged here will be appended to current instructions." #~ msgstr "" diff --git a/cookbook/locale/pl/LC_MESSAGES/django.mo b/cookbook/locale/pl/LC_MESSAGES/django.mo index 3bf93d542..a9e19da95 100644 Binary files a/cookbook/locale/pl/LC_MESSAGES/django.mo and b/cookbook/locale/pl/LC_MESSAGES/django.mo differ diff --git a/cookbook/locale/pt/LC_MESSAGES/django.mo b/cookbook/locale/pt/LC_MESSAGES/django.mo index 4a9ae440c..adefc9fda 100644 Binary files a/cookbook/locale/pt/LC_MESSAGES/django.mo and b/cookbook/locale/pt/LC_MESSAGES/django.mo differ diff --git a/cookbook/locale/pt/LC_MESSAGES/django.po b/cookbook/locale/pt/LC_MESSAGES/django.po index 8e6152b28..b4108bbaa 100644 --- a/cookbook/locale/pt/LC_MESSAGES/django.po +++ b/cookbook/locale/pt/LC_MESSAGES/django.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 19:20+0200\n" -"PO-Revision-Date: 2022-10-14 17:19+0000\n" -"Last-Translator: Shaxine \n" +"POT-Creation-Date: 2023-04-26 07:46+0200\n" +"PO-Revision-Date: 2023-01-08 17:55+0000\n" +"Last-Translator: Joachim Weber \n" "Language-Team: Portuguese \n" "Language: pt\n" @@ -21,81 +21,69 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Weblate 4.10.1\n" +"X-Generator: Weblate 4.15\n" -#: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 -#: .\cookbook\templates\stats.html:28 -msgid "Ingredients" -msgstr "Ingredientes" - -#: .\cookbook\forms.py:53 +#: .\cookbook\forms.py:52 msgid "Default unit" msgstr "Unidade predefinida" -#: .\cookbook\forms.py:54 +#: .\cookbook\forms.py:53 msgid "Use fractions" msgstr "Usar frações" -#: .\cookbook\forms.py:55 +#: .\cookbook\forms.py:54 msgid "Use KJ" msgstr "Usar KJ" -#: .\cookbook\forms.py:56 +#: .\cookbook\forms.py:55 msgid "Theme" msgstr "Tema" -#: .\cookbook\forms.py:57 +#: .\cookbook\forms.py:56 msgid "Navbar color" msgstr "Cor de barra de navegação" -#: .\cookbook\forms.py:58 +#: .\cookbook\forms.py:57 msgid "Sticky navbar" msgstr "Prender barra de navegação" -#: .\cookbook\forms.py:59 +#: .\cookbook\forms.py:58 msgid "Default page" msgstr "Página predefinida" -#: .\cookbook\forms.py:60 -msgid "Show recent recipes" -msgstr "Mostrar receitas recentes" - -#: .\cookbook\forms.py:61 -msgid "Search style" -msgstr "Estilo de pesquisa" - -#: .\cookbook\forms.py:62 +#: .\cookbook\forms.py:59 msgid "Plan sharing" msgstr "Partilha de planos" -#: .\cookbook\forms.py:63 +#: .\cookbook\forms.py:60 msgid "Ingredient decimal places" msgstr "Casas decimais de ingredientes" -#: .\cookbook\forms.py:64 +#: .\cookbook\forms.py:61 msgid "Shopping list auto sync period" msgstr "Período de sincronização automática" -#: .\cookbook\forms.py:65 .\cookbook\templates\recipe_view.html:21 -#: .\cookbook\templates\stats.html:47 +#: .\cookbook\forms.py:62 .\cookbook\templates\recipe_view.html:36 msgid "Comments" msgstr "Comentários" -#: .\cookbook\forms.py:66 +#: .\cookbook\forms.py:63 msgid "Left-handed mode" msgstr "Modo canhoto" -#: .\cookbook\forms.py:70 +#: .\cookbook\forms.py:67 msgid "" "Color of the top navigation bar. Not all colors work with all themes, just " "try them out!" -msgstr "Cor da barra de navegação." +msgstr "" +"Cor da barra de navegação superior. Nem todas as cores funcionam com todos " +"os temas, apenas experimente!" -#: .\cookbook\forms.py:72 +#: .\cookbook\forms.py:69 msgid "Default Unit to be used when inserting a new ingredient into a recipe." msgstr "Unidade defeito a ser usada quando um novo ingrediente for inserido." -#: .\cookbook\forms.py:74 +#: .\cookbook\forms.py:71 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" @@ -103,34 +91,30 @@ msgstr "" "Utilizar frações para apresentar quantidades de ingredientes decimais " "(converter quantidades decimais para frações automáticamente)" -#: .\cookbook\forms.py:76 +#: .\cookbook\forms.py:73 msgid "Display nutritional energy amounts in joules instead of calories" msgstr "" "Mostrar quantidades de energia nutricional em joules em vez de calorias" -#: .\cookbook\forms.py:77 +#: .\cookbook\forms.py:74 msgid "Users with whom newly created meal plans should be shared by default." msgstr "" "Utilizadores com os quais novos planos de refeições devem ser partilhados " "por defeito." -#: .\cookbook\forms.py:78 +#: .\cookbook\forms.py:75 msgid "Users with whom to share shopping lists." msgstr "Utilizadores com os quais novas listas de compras serão partilhadas." -#: .\cookbook\forms.py:80 -msgid "Show recently viewed recipes on search page." -msgstr "Mostrar receitas recentes na página de pesquisa." - -#: .\cookbook\forms.py:81 +#: .\cookbook\forms.py:76 msgid "Number of decimals to round ingredients." msgstr "Número de casas decimais para arredondamentos." -#: .\cookbook\forms.py:82 +#: .\cookbook\forms.py:77 msgid "If you want to be able to create and see comments underneath recipes." msgstr "Ativar a funcionalidade comentar receitas." -#: .\cookbook\forms.py:84 .\cookbook\forms.py:496 +#: .\cookbook\forms.py:79 .\cookbook\forms.py:492 msgid "" "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. " @@ -143,23 +127,23 @@ msgstr "" "feito. Útil ao fazer compras com vários utilizadores, mas pode aumentar o " "uso de dados móveis." -#: .\cookbook\forms.py:87 +#: .\cookbook\forms.py:82 msgid "Makes the navbar stick to the top of the page." msgstr "Mantém a barra de navegação no topo da página." -#: .\cookbook\forms.py:88 .\cookbook\forms.py:499 +#: .\cookbook\forms.py:83 .\cookbook\forms.py:495 msgid "Automatically add meal plan ingredients to shopping list." msgstr "" -#: .\cookbook\forms.py:89 +#: .\cookbook\forms.py:84 msgid "Exclude ingredients that are on hand." msgstr "" -#: .\cookbook\forms.py:90 +#: .\cookbook\forms.py:85 msgid "Will optimize the UI for use with your left hand." msgstr "" -#: .\cookbook\forms.py:107 +#: .\cookbook\forms.py:102 msgid "" "Both fields are optional. If none are given the username will be displayed " "instead" @@ -167,36 +151,35 @@ msgstr "" "Ambos os campos são opcionais. Se nenhum for preenchido o nome de utilizador " "será apresentado" -#: .\cookbook\forms.py:128 .\cookbook\forms.py:301 +#: .\cookbook\forms.py:123 .\cookbook\forms.py:297 msgid "Name" msgstr "Nome" -#: .\cookbook\forms.py:129 .\cookbook\forms.py:302 -#: .\cookbook\templates\stats.html:24 .\cookbook\views\lists.py:88 +#: .\cookbook\forms.py:124 .\cookbook\forms.py:298 .\cookbook\views\lists.py:88 msgid "Keywords" msgstr "Palavras-chave" -#: .\cookbook\forms.py:130 +#: .\cookbook\forms.py:125 msgid "Preparation time in minutes" msgstr "Tempo de preparação em minutos" -#: .\cookbook\forms.py:131 +#: .\cookbook\forms.py:126 msgid "Waiting time (cooking/baking) in minutes" msgstr "Tempo de espera (cozedura) em minutos" -#: .\cookbook\forms.py:132 .\cookbook\forms.py:270 .\cookbook\forms.py:303 +#: .\cookbook\forms.py:127 .\cookbook\forms.py:266 .\cookbook\forms.py:299 msgid "Path" msgstr "Caminho" -#: .\cookbook\forms.py:133 +#: .\cookbook\forms.py:128 msgid "Storage UID" msgstr "UID de armazenamento" -#: .\cookbook\forms.py:165 +#: .\cookbook\forms.py:161 msgid "Default" msgstr "Predefinição" -#: .\cookbook\forms.py:177 +#: .\cookbook\forms.py:173 msgid "" "To prevent duplicates recipes with the same name as existing ones are " "ignored. Check this box to import everything." @@ -204,21 +187,21 @@ msgstr "" "Para evitar repetições, receitas com o mesmo nome de receitas já existentes " "são ignoradas. Marque esta caixa para importar tudo." -#: .\cookbook\forms.py:200 +#: .\cookbook\forms.py:196 msgid "Add your comment: " -msgstr "Adicionar comentário:" +msgstr "Adicionar comentário: " -#: .\cookbook\forms.py:215 +#: .\cookbook\forms.py:211 msgid "Leave empty for dropbox and enter app password for nextcloud." msgstr "" "Deixar vazio para Dropbox e inserir palavra-passe de aplicação para " "Nextcloud." -#: .\cookbook\forms.py:222 +#: .\cookbook\forms.py:218 msgid "Leave empty for nextcloud and enter api token for dropbox." msgstr "Deixar vazio para Nextcloud e inserir token api para Dropbox." -#: .\cookbook\forms.py:231 +#: .\cookbook\forms.py:227 msgid "" "Leave empty for dropbox and enter only base url for nextcloud (/remote." "php/webdav/ is added automatically)" @@ -226,33 +209,33 @@ msgstr "" "Deixar vazio para Dropbox e inserir apenas url base para Nextcloud (/" "remote.php/webdav/é adicionado automaticamente). " -#: .\cookbook\forms.py:269 .\cookbook\views\edit.py:157 +#: .\cookbook\forms.py:265 .\cookbook\views\edit.py:157 msgid "Storage" msgstr "Armazenamento" -#: .\cookbook\forms.py:271 +#: .\cookbook\forms.py:267 msgid "Active" msgstr "Ativo" -#: .\cookbook\forms.py:277 +#: .\cookbook\forms.py:273 msgid "Search String" msgstr "Procurar" -#: .\cookbook\forms.py:304 +#: .\cookbook\forms.py:300 msgid "File ID" msgstr "ID the ficheiro" -#: .\cookbook\forms.py:326 +#: .\cookbook\forms.py:322 msgid "You must provide at least a recipe or a title." msgstr "É necessário inserir uma receita ou um título." -#: .\cookbook\forms.py:339 +#: .\cookbook\forms.py:335 msgid "You can list default users to share recipes with in the settings." msgstr "" "É possível escolher os utilizadores com quem partilhar receitas por defeitos " "nas definições." -#: .\cookbook\forms.py:340 +#: .\cookbook\forms.py:336 msgid "" "You can use markdown to format this field. See the docs here" @@ -260,15 +243,15 @@ msgstr "" "É possível utilizar markdown para editar este campo. Documentação disponível aqui" -#: .\cookbook\forms.py:366 +#: .\cookbook\forms.py:362 msgid "Maximum number of users for this space reached." msgstr "Número máximo de utilizadores alcançado." -#: .\cookbook\forms.py:372 +#: .\cookbook\forms.py:368 msgid "Email address already taken!" msgstr "Endereço email já utilizado!" -#: .\cookbook\forms.py:380 +#: .\cookbook\forms.py:376 msgid "" "An email address is not required but if present the invite link will be sent " "to the user." @@ -276,15 +259,15 @@ msgstr "" "Um endereço de email não é obrigatório mas se fornecido será enviada uma " "mensagem ao utilizador." -#: .\cookbook\forms.py:395 +#: .\cookbook\forms.py:391 msgid "Name already taken." msgstr "Nome já existente." -#: .\cookbook\forms.py:406 +#: .\cookbook\forms.py:402 msgid "Accept Terms and Privacy" msgstr "Aceitar Termos e Condições" -#: .\cookbook\forms.py:438 +#: .\cookbook\forms.py:434 msgid "" "Determines how fuzzy a search is if it uses trigram similarity matching (e." "g. low values mean more typos are ignored)." @@ -293,7 +276,7 @@ msgstr "" "de semelhança de trigrama (valores mais baixos significam que mais erros são " "ignorados)." -#: .\cookbook\forms.py:448 +#: .\cookbook\forms.py:444 #, fuzzy #| msgid "" #| "Select type method of search. Click here " @@ -305,7 +288,7 @@ msgstr "" "Selecionar o método de pesquisa. Uma descrição completa das opções pode ser " "encontrada aqui." -#: .\cookbook\forms.py:449 +#: .\cookbook\forms.py:445 msgid "" "Use fuzzy matching on units, keywords and ingredients when editing and " "importing recipes." @@ -313,7 +296,7 @@ msgstr "" "Utilizar correspondência difusa em unidades, palavras-chave e ingredientes " "ao editar e importar receitas." -#: .\cookbook\forms.py:451 +#: .\cookbook\forms.py:447 msgid "" "Fields to search ignoring accents. Selecting this option can improve or " "degrade search quality depending on language" @@ -321,274 +304,313 @@ msgstr "" "Campos de pesquisa que ignoram pontuação. Esta opção pode aumentar ou " "diminuir a qualidade de pesquisa dependendo da língua em uso" -#: .\cookbook\forms.py:453 +#: .\cookbook\forms.py:449 msgid "" "Fields to search for partial matches. (e.g. searching for 'Pie' will return " "'pie' and 'piece' and 'soapie')" msgstr "" -#: .\cookbook\forms.py:455 +#: .\cookbook\forms.py:451 msgid "" "Fields to search for beginning of word matches. (e.g. searching for 'sa' " "will return 'salad' and 'sandwich')" msgstr "" -#: .\cookbook\forms.py:457 +#: .\cookbook\forms.py:453 msgid "" "Fields to 'fuzzy' search. (e.g. searching for 'recpie' will find 'recipe'.) " "Note: this option will conflict with 'web' and 'raw' methods of search." msgstr "" -#: .\cookbook\forms.py:459 +#: .\cookbook\forms.py:455 msgid "" "Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " "only function with fulltext fields." msgstr "" -#: .\cookbook\forms.py:463 +#: .\cookbook\forms.py:459 #, fuzzy #| msgid "Search" msgid "Search Method" msgstr "Procurar" -#: .\cookbook\forms.py:464 +#: .\cookbook\forms.py:460 msgid "Fuzzy Lookups" msgstr "" -#: .\cookbook\forms.py:465 +#: .\cookbook\forms.py:461 msgid "Ignore Accent" msgstr "" -#: .\cookbook\forms.py:466 +#: .\cookbook\forms.py:462 msgid "Partial Match" msgstr "" -#: .\cookbook\forms.py:467 +#: .\cookbook\forms.py:463 msgid "Starts With" msgstr "" -#: .\cookbook\forms.py:468 +#: .\cookbook\forms.py:464 #, fuzzy #| msgid "Search" msgid "Fuzzy Search" msgstr "Procurar" -#: .\cookbook\forms.py:469 +#: .\cookbook\forms.py:465 #, fuzzy #| msgid "Text" msgid "Full Text" msgstr "Texto" -#: .\cookbook\forms.py:494 +#: .\cookbook\forms.py:490 msgid "" "Users will see all items you add to your shopping list. They must add you " "to see items on their list." msgstr "" -#: .\cookbook\forms.py:500 +#: .\cookbook\forms.py:496 msgid "" "When adding a meal plan to the shopping list (manually or automatically), " "include all related recipes." msgstr "" -#: .\cookbook\forms.py:501 +#: .\cookbook\forms.py:497 msgid "" "When adding a meal plan to the shopping list (manually or automatically), " "exclude ingredients that are on hand." msgstr "" -#: .\cookbook\forms.py:502 +#: .\cookbook\forms.py:498 msgid "Default number of hours to delay a shopping list entry." msgstr "" -#: .\cookbook\forms.py:503 +#: .\cookbook\forms.py:499 msgid "Filter shopping list to only include supermarket categories." msgstr "" -#: .\cookbook\forms.py:504 +#: .\cookbook\forms.py:500 msgid "Days of recent shopping list entries to display." msgstr "" -#: .\cookbook\forms.py:505 +#: .\cookbook\forms.py:501 msgid "Mark food 'On Hand' when checked off shopping list." msgstr "" -#: .\cookbook\forms.py:506 +#: .\cookbook\forms.py:502 msgid "Delimiter to use for CSV exports." msgstr "" -#: .\cookbook\forms.py:507 +#: .\cookbook\forms.py:503 msgid "Prefix to add when copying list to the clipboard." msgstr "" -#: .\cookbook\forms.py:511 +#: .\cookbook\forms.py:507 #, fuzzy #| msgid "Shopping" msgid "Share Shopping List" msgstr "Compras" -#: .\cookbook\forms.py:512 +#: .\cookbook\forms.py:508 msgid "Autosync" msgstr "" -#: .\cookbook\forms.py:513 +#: .\cookbook\forms.py:509 msgid "Auto Add Meal Plan" msgstr "" -#: .\cookbook\forms.py:514 +#: .\cookbook\forms.py:510 msgid "Exclude On Hand" msgstr "" -#: .\cookbook\forms.py:515 +#: .\cookbook\forms.py:511 msgid "Include Related" msgstr "" -#: .\cookbook\forms.py:516 +#: .\cookbook\forms.py:512 msgid "Default Delay Hours" msgstr "" -#: .\cookbook\forms.py:517 +#: .\cookbook\forms.py:513 msgid "Filter to Supermarket" msgstr "" -#: .\cookbook\forms.py:518 +#: .\cookbook\forms.py:514 msgid "Recent Days" msgstr "" -#: .\cookbook\forms.py:519 +#: .\cookbook\forms.py:515 msgid "CSV Delimiter" msgstr "" -#: .\cookbook\forms.py:520 +#: .\cookbook\forms.py:516 msgid "List Prefix" msgstr "" -#: .\cookbook\forms.py:521 +#: .\cookbook\forms.py:517 msgid "Auto On Hand" msgstr "" -#: .\cookbook\forms.py:531 +#: .\cookbook\forms.py:527 msgid "Reset Food Inheritance" msgstr "" -#: .\cookbook\forms.py:532 +#: .\cookbook\forms.py:528 msgid "Reset all food to inherit the fields configured." msgstr "" -#: .\cookbook\forms.py:544 +#: .\cookbook\forms.py:540 #, fuzzy #| msgid "Food that should be replaced." msgid "Fields on food that should be inherited by default." msgstr "Prato a ser alterado." -#: .\cookbook\forms.py:545 -#, fuzzy -#| msgid "Show recently viewed recipes on search page." +#: .\cookbook\forms.py:541 msgid "Show recipe counts on search filters" -msgstr "Mostrar receitas recentes na página de pesquisa." +msgstr "Mostrar receitas recentes na página de pesquisa" -#: .\cookbook\helper\AllAuthCustomAdapter.py:36 +#: .\cookbook\forms.py:542 +msgid "Use the plural form for units and food inside this space." +msgstr "" + +#: .\cookbook\helper\AllAuthCustomAdapter.py:39 msgid "" "In order to prevent spam, the requested email was not send. Please wait a " "few minutes and try again." msgstr "" -#: .\cookbook\helper\permission_helper.py:149 -#: .\cookbook\helper\permission_helper.py:172 .\cookbook\views\views.py:152 +#: .\cookbook\helper\permission_helper.py:164 +#: .\cookbook\helper\permission_helper.py:187 .\cookbook\views\views.py:117 msgid "You are not logged in and therefore cannot view this page!" msgstr "Autenticação necessária para aceder a esta página!" -#: .\cookbook\helper\permission_helper.py:153 -#: .\cookbook\helper\permission_helper.py:159 -#: .\cookbook\helper\permission_helper.py:184 -#: .\cookbook\helper\permission_helper.py:254 -#: .\cookbook\helper\permission_helper.py:268 -#: .\cookbook\helper\permission_helper.py:279 -#: .\cookbook\helper\permission_helper.py:290 .\cookbook\views\data.py:33 -#: .\cookbook\views\views.py:163 .\cookbook\views\views.py:170 -#: .\cookbook\views\views.py:249 +#: .\cookbook\helper\permission_helper.py:168 +#: .\cookbook\helper\permission_helper.py:174 +#: .\cookbook\helper\permission_helper.py:199 +#: .\cookbook\helper\permission_helper.py:269 +#: .\cookbook\helper\permission_helper.py:283 +#: .\cookbook\helper\permission_helper.py:294 +#: .\cookbook\helper\permission_helper.py:305 +#: .\cookbook\helper\permission_helper.py:321 +#: .\cookbook\helper\permission_helper.py:342 .\cookbook\views\data.py:36 +#: .\cookbook\views\views.py:128 .\cookbook\views\views.py:135 msgid "You do not have the required permissions to view this page!" msgstr "Sem permissões para aceder a esta página!" -#: .\cookbook\helper\permission_helper.py:177 -#: .\cookbook\helper\permission_helper.py:200 -#: .\cookbook\helper\permission_helper.py:222 +#: .\cookbook\helper\permission_helper.py:192 +#: .\cookbook\helper\permission_helper.py:215 #: .\cookbook\helper\permission_helper.py:237 +#: .\cookbook\helper\permission_helper.py:252 msgid "You cannot interact with this object as it is not owned by you!" msgstr "" -#: .\cookbook\helper\permission_helper.py:321 +#: .\cookbook\helper\permission_helper.py:403 msgid "You have reached the maximum number of recipes for your space." msgstr "" -#: .\cookbook\helper\permission_helper.py:333 +#: .\cookbook\helper\permission_helper.py:415 msgid "You have more users than allowed in your space." msgstr "" -#: .\cookbook\helper\recipe_search.py:565 +#: .\cookbook\helper\recipe_search.py:630 msgid "One of queryset or hash_key must be provided" msgstr "" -#: .\cookbook\helper\shopping_helper.py:152 +#: .\cookbook\helper\recipe_url_import.py:266 #, fuzzy -#| msgid "You must provide at least a recipe or a title." -msgid "You must supply a servings size" -msgstr "É necessário inserir uma receita ou um título." +#| msgid "Use fractions" +msgid "reverse rotation" +msgstr "Usar frações" -#: .\cookbook\helper\template_helper.py:64 -#: .\cookbook\helper\template_helper.py:66 +#: .\cookbook\helper\recipe_url_import.py:267 +msgid "careful rotation" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:268 +msgid "knead" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:269 +msgid "thicken" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:270 +msgid "warm up" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:271 +msgid "ferment" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:272 +msgid "sous-vide" +msgstr "" + +#: .\cookbook\helper\shopping_helper.py:157 +msgid "You must supply a servings size" +msgstr "É necessário inserir uma receita ou um título" + +#: .\cookbook\helper\template_helper.py:79 +#: .\cookbook\helper\template_helper.py:81 msgid "Could not parse template code." msgstr "" -#: .\cookbook\integration\copymethat.py:41 +#: .\cookbook\integration\copymethat.py:44 #: .\cookbook\integration\melarecipes.py:37 msgid "Favorite" msgstr "" -#: .\cookbook\integration\copymethat.py:70 -#: .\cookbook\integration\recettetek.py:54 -#: .\cookbook\integration\recipekeeper.py:63 -#, fuzzy -#| msgid "Import" -msgid "Imported from" -msgstr "Importar" +#: .\cookbook\integration\copymethat.py:50 +msgid "I made this" +msgstr "" -#: .\cookbook\integration\integration.py:223 +#: .\cookbook\integration\integration.py:218 msgid "" "Importer expected a .zip file. Did you choose the correct importer type for " "your data ?" msgstr "" -#: .\cookbook\integration\integration.py:226 +#: .\cookbook\integration\integration.py:221 msgid "" "An unexpected error occurred during the import. Please make sure you have " "uploaded a valid file." msgstr "" -#: .\cookbook\integration\integration.py:231 +#: .\cookbook\integration\integration.py:226 msgid "The following recipes were ignored because they already existed:" msgstr "" -#: .\cookbook\integration\integration.py:235 -#, fuzzy, python-format -#| msgid "Import Recipes" +#: .\cookbook\integration\integration.py:230 +#, python-format msgid "Imported %s recipes." -msgstr "Importar Receitas" +msgstr "%s receitas importadas." -#: .\cookbook\integration\paprika.py:46 +#: .\cookbook\integration\openeats.py:26 +#, fuzzy +#| msgid "Recipes" +msgid "Recipe source:" +msgstr "Receitas" + +#: .\cookbook\integration\paprika.py:49 #, fuzzy #| msgid "Note" msgid "Notes" msgstr "Nota" -#: .\cookbook\integration\paprika.py:49 +#: .\cookbook\integration\paprika.py:52 msgid "Nutritional Information" msgstr "" -#: .\cookbook\integration\paprika.py:53 +#: .\cookbook\integration\paprika.py:56 msgid "Source" msgstr "" +#: .\cookbook\integration\recettetek.py:54 +#: .\cookbook\integration\recipekeeper.py:70 +#, fuzzy +#| msgid "Import" +msgid "Imported from" +msgstr "Importar" + #: .\cookbook\integration\saffron.py:23 msgid "Servings" msgstr "Porções" @@ -601,9 +623,7 @@ msgstr "" msgid "Preparation Time" msgstr "" -#: .\cookbook\integration\saffron.py:29 -#: .\cookbook\templates\forms\ingredients.html:7 -#: .\cookbook\templates\index.html:7 +#: .\cookbook\integration\saffron.py:29 .\cookbook\templates\index.html:7 msgid "Cookbook" msgstr "Livro de refeições" @@ -643,179 +663,168 @@ msgstr "Jantar" msgid "Other" msgstr "Outro" -#: .\cookbook\models.py:251 +#: .\cookbook\models.py:261 msgid "" "Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " "upload." msgstr "" -#: .\cookbook\models.py:353 .\cookbook\templates\search.html:7 +#: .\cookbook\models.py:365 .\cookbook\templates\search.html:7 +#: .\cookbook\templates\settings.html:18 #: .\cookbook\templates\space_manage.html:7 msgid "Search" msgstr "Procurar" -#: .\cookbook\models.py:354 .\cookbook\templates\base.html:107 +#: .\cookbook\models.py:366 .\cookbook\templates\base.html:110 #: .\cookbook\templates\meal_plan.html:7 .\cookbook\views\delete.py:178 #: .\cookbook\views\edit.py:211 .\cookbook\views\new.py:179 msgid "Meal-Plan" msgstr "Plano de refeição" -#: .\cookbook\models.py:355 .\cookbook\templates\base.html:115 +#: .\cookbook\models.py:367 .\cookbook\templates\base.html:118 msgid "Books" msgstr "Livros" -#: .\cookbook\models.py:363 -msgid "Small" -msgstr "Pequeno" - -#: .\cookbook\models.py:363 -msgid "Large" -msgstr "Grande" - -#: .\cookbook\models.py:363 .\cookbook\templates\generic\new_template.html:6 -#: .\cookbook\templates\generic\new_template.html:14 -msgid "New" -msgstr "Novo" - -#: .\cookbook\models.py:584 +#: .\cookbook\models.py:580 msgid " is part of a recipe step and cannot be deleted" msgstr "" -#: .\cookbook\models.py:1162 .\cookbook\templates\search_info.html:28 +#: .\cookbook\models.py:1181 .\cookbook\templates\search_info.html:28 msgid "Simple" msgstr "" -#: .\cookbook\models.py:1163 .\cookbook\templates\search_info.html:33 +#: .\cookbook\models.py:1182 .\cookbook\templates\search_info.html:33 msgid "Phrase" msgstr "" -#: .\cookbook\models.py:1164 .\cookbook\templates\search_info.html:38 +#: .\cookbook\models.py:1183 .\cookbook\templates\search_info.html:38 msgid "Web" msgstr "" -#: .\cookbook\models.py:1165 .\cookbook\templates\search_info.html:47 +#: .\cookbook\models.py:1184 .\cookbook\templates\search_info.html:47 msgid "Raw" msgstr "" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 #, fuzzy #| msgid "New Food" msgid "Food Alias" msgstr "Novo Prato" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 #, fuzzy #| msgid "Units" msgid "Unit Alias" msgstr "Unidades" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 #, fuzzy #| msgid "Keywords" msgid "Keyword Alias" msgstr "Palavras-chave" -#: .\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 +#: .\cookbook\models.py:1232 +msgid "Description Replace" +msgstr "" + +#: .\cookbook\models.py:1232 +#, fuzzy +#| msgid "Instructions" +msgid "Instruction Replace" +msgstr "Instruções" + +#: .\cookbook\models.py:1258 .\cookbook\views\delete.py:36 +#: .\cookbook\views\edit.py:251 .\cookbook\views\new.py:48 msgid "Recipe" msgstr "Receita" -#: .\cookbook\models.py:1228 +#: .\cookbook\models.py:1259 #, fuzzy #| msgid "New Food" msgid "Food" msgstr "Novo Prato" -#: .\cookbook\models.py:1229 .\cookbook\templates\base.html:138 +#: .\cookbook\models.py:1260 .\cookbook\templates\base.html:141 msgid "Keyword" msgstr "Palavra-chave" -#: .\cookbook\serializer.py:207 -msgid "Cannot modify Space owner permission." -msgstr "" - -#: .\cookbook\serializer.py:290 +#: .\cookbook\serializer.py:198 msgid "File uploads are not enabled for this Space." msgstr "" -#: .\cookbook\serializer.py:301 +#: .\cookbook\serializer.py:209 msgid "You have reached your file upload limit." msgstr "" -#: .\cookbook\serializer.py:1081 +#: .\cookbook\serializer.py:291 +msgid "Cannot modify Space owner permission." +msgstr "" + +#: .\cookbook\serializer.py:1093 msgid "Hello" msgstr "" -#: .\cookbook\serializer.py:1081 +#: .\cookbook\serializer.py:1093 msgid "You have been invited by " msgstr "" -#: .\cookbook\serializer.py:1082 +#: .\cookbook\serializer.py:1094 msgid " to join their Tandoor Recipes space " msgstr "" -#: .\cookbook\serializer.py:1083 +#: .\cookbook\serializer.py:1095 msgid "Click the following link to activate your account: " msgstr "" -#: .\cookbook\serializer.py:1084 +#: .\cookbook\serializer.py:1096 msgid "" "If the link does not work use the following code to manually join the space: " msgstr "" -#: .\cookbook\serializer.py:1085 +#: .\cookbook\serializer.py:1097 msgid "The invitation is valid until " msgstr "" -#: .\cookbook\serializer.py:1086 +#: .\cookbook\serializer.py:1098 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " msgstr "" -#: .\cookbook\serializer.py:1089 +#: .\cookbook\serializer.py:1101 msgid "Tandoor Recipes Invite" msgstr "" -#: .\cookbook\serializer.py:1209 +#: .\cookbook\serializer.py:1242 msgid "Existing shopping list to update" msgstr "" -#: .\cookbook\serializer.py:1211 +#: .\cookbook\serializer.py:1244 msgid "" "List of ingredient IDs from the recipe to add, if not provided all " "ingredients will be added." msgstr "" -#: .\cookbook\serializer.py:1213 +#: .\cookbook\serializer.py:1246 msgid "" "Providing a list_recipe ID and servings of 0 will delete that shopping list." msgstr "" -#: .\cookbook\serializer.py:1222 +#: .\cookbook\serializer.py:1255 msgid "Amount of food to add to the shopping list" msgstr "" -#: .\cookbook\serializer.py:1224 +#: .\cookbook\serializer.py:1257 msgid "ID of unit to use for the shopping list" msgstr "" -#: .\cookbook\serializer.py:1226 +#: .\cookbook\serializer.py:1259 msgid "When set to true will delete all food from active shopping lists." msgstr "" -#: .\cookbook\tables.py:36 .\cookbook\templates\generic\edit_template.html:6 -#: .\cookbook\templates\generic\edit_template.html:14 -#: .\cookbook\templates\recipes_table.html:82 -msgid "Edit" -msgstr "Editar" - -#: .\cookbook\tables.py:116 .\cookbook\tables.py:131 +#: .\cookbook\tables.py:61 .\cookbook\tables.py:75 #: .\cookbook\templates\generic\delete_template.html:7 #: .\cookbook\templates\generic\delete_template.html:15 #: .\cookbook\templates\generic\edit_template.html:28 -#: .\cookbook\templates\recipes_table.html:90 msgid "Delete" msgstr "Apagar" @@ -843,9 +852,10 @@ msgstr "" #: .\cookbook\templates\account\email.html:12 #: .\cookbook\templates\account\password_change.html:11 #: .\cookbook\templates\account\password_set.html:11 -#: .\cookbook\templates\base.html:293 .\cookbook\templates\settings.html:6 +#: .\cookbook\templates\base.html:296 .\cookbook\templates\settings.html:6 #: .\cookbook\templates\settings.html:17 #: .\cookbook\templates\socialaccount\connections.html:10 +#: .\cookbook\templates\user_settings.html:8 msgid "Settings" msgstr "Definições" @@ -934,8 +944,8 @@ msgid "" "request." msgstr "" -#: .\cookbook\templates\account\login.html:8 -#: .\cookbook\templates\base.html:340 .\cookbook\templates\openid\login.html:8 +#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:343 +#: .\cookbook\templates\openid\login.html:8 msgid "Login" msgstr "Iniciar sessão" @@ -955,21 +965,20 @@ msgstr "" msgid "Sign Up" msgstr "" +#: .\cookbook\templates\account\login.html:38 +msgid "Lost your password?" +msgstr "" + #: .\cookbook\templates\account\login.html:39 -#: .\cookbook\templates\account\login.html:41 #: .\cookbook\templates\account\password_reset.html:29 msgid "Reset My Password" msgstr "" -#: .\cookbook\templates\account\login.html:40 -msgid "Lost your password?" -msgstr "" - -#: .\cookbook\templates\account\login.html:52 +#: .\cookbook\templates\account\login.html:50 msgid "Social Login" msgstr "" -#: .\cookbook\templates\account\login.html:53 +#: .\cookbook\templates\account\login.html:51 msgid "You can use any of the following providers to sign in." msgstr "" @@ -995,7 +1004,6 @@ msgstr "" #: .\cookbook\templates\account\password_change.html:12 #: .\cookbook\templates\account\password_set.html:12 -#: .\cookbook\templates\settings.html:76 #, fuzzy #| msgid "Settings" msgid "Password" @@ -1103,62 +1111,59 @@ msgstr "" msgid "We are sorry, but the sign up is currently closed." msgstr "" -#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:330 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:333 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "Documentação API" -#: .\cookbook\templates\base.html:103 .\cookbook\templates\index.html:87 -#: .\cookbook\templates\stats.html:22 +#: .\cookbook\templates\base.html:106 .\cookbook\templates\index.html:87 msgid "Recipes" msgstr "Receitas" -#: .\cookbook\templates\base.html:111 +#: .\cookbook\templates\base.html:114 msgid "Shopping" msgstr "Compras" -#: .\cookbook\templates\base.html:150 .\cookbook\views\lists.py:105 +#: .\cookbook\templates\base.html:153 .\cookbook\views\lists.py:105 #, fuzzy #| msgid "New Food" msgid "Foods" msgstr "Novo Prato" -#: .\cookbook\templates\base.html:162 -#: .\cookbook\templates\forms\ingredients.html:24 -#: .\cookbook\templates\stats.html:26 .\cookbook\views\lists.py:122 +#: .\cookbook\templates\base.html:165 .\cookbook\views\lists.py:122 msgid "Units" msgstr "Unidades" -#: .\cookbook\templates\base.html:176 .\cookbook\templates\supermarket.html:7 +#: .\cookbook\templates\base.html:179 .\cookbook\templates\supermarket.html:7 msgid "Supermarket" msgstr "" -#: .\cookbook\templates\base.html:188 +#: .\cookbook\templates\base.html:191 #, fuzzy #| msgid "Batch edit Category" msgid "Supermarket Category" msgstr "Editar Categorias em massa" -#: .\cookbook\templates\base.html:200 .\cookbook\views\lists.py:171 +#: .\cookbook\templates\base.html:203 .\cookbook\views\lists.py:171 msgid "Automations" msgstr "" -#: .\cookbook\templates\base.html:214 .\cookbook\views\lists.py:207 +#: .\cookbook\templates\base.html:217 .\cookbook\views\lists.py:207 #, fuzzy #| msgid "File ID" msgid "Files" msgstr "ID the ficheiro" -#: .\cookbook\templates\base.html:226 +#: .\cookbook\templates\base.html:229 msgid "Batch Edit" msgstr "Editor em massa" -#: .\cookbook\templates\base.html:238 .\cookbook\templates\history.html:6 +#: .\cookbook\templates\base.html:241 .\cookbook\templates\history.html:6 #: .\cookbook\templates\history.html:14 msgid "History" msgstr "Histórico" -#: .\cookbook\templates\base.html:252 +#: .\cookbook\templates\base.html:255 #: .\cookbook\templates\ingredient_editor.html:7 #: .\cookbook\templates\ingredient_editor.html:13 #, fuzzy @@ -1166,78 +1171,76 @@ msgstr "Histórico" msgid "Ingredient Editor" msgstr "Ingredientes" -#: .\cookbook\templates\base.html:264 +#: .\cookbook\templates\base.html:267 #: .\cookbook\templates\export_response.html:7 #: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 msgid "Export" msgstr "Exportar" -#: .\cookbook\templates\base.html:280 .\cookbook\templates\index.html:47 +#: .\cookbook\templates\base.html:283 .\cookbook\templates\index.html:47 msgid "Import Recipe" msgstr "Importar Receita" -#: .\cookbook\templates\base.html:282 +#: .\cookbook\templates\base.html:285 msgid "Create" msgstr "Criar" -#: .\cookbook\templates\base.html:295 +#: .\cookbook\templates\base.html:298 #: .\cookbook\templates\generic\list_template.html:14 -#: .\cookbook\templates\stats.html:43 msgid "External Recipes" msgstr "" -#: .\cookbook\templates\base.html:298 -#: .\cookbook\templates\space_manage.html:15 +#: .\cookbook\templates\base.html:301 .\cookbook\templates\space_manage.html:15 #, fuzzy #| msgid "Settings" msgid "Space Settings" msgstr "Definições" -#: .\cookbook\templates\base.html:303 .\cookbook\templates\system.html:13 +#: .\cookbook\templates\base.html:306 .\cookbook\templates\system.html:13 msgid "System" msgstr "Sistema" -#: .\cookbook\templates\base.html:305 +#: .\cookbook\templates\base.html:308 msgid "Admin" msgstr "Administração" -#: .\cookbook\templates\base.html:309 +#: .\cookbook\templates\base.html:312 #: .\cookbook\templates\space_overview.html:25 #, fuzzy #| msgid "Create" msgid "Your Spaces" msgstr "Criar" -#: .\cookbook\templates\base.html:320 +#: .\cookbook\templates\base.html:323 #: .\cookbook\templates\space_overview.html:6 msgid "Overview" msgstr "" -#: .\cookbook\templates\base.html:324 +#: .\cookbook\templates\base.html:327 msgid "Markdown Guide" msgstr "" -#: .\cookbook\templates\base.html:326 +#: .\cookbook\templates\base.html:329 msgid "GitHub" msgstr "GitHub" -#: .\cookbook\templates\base.html:328 +#: .\cookbook\templates\base.html:331 msgid "Translate Tandoor" msgstr "" -#: .\cookbook\templates\base.html:332 +#: .\cookbook\templates\base.html:335 msgid "API Browser" msgstr "Navegador de API" -#: .\cookbook\templates\base.html:335 +#: .\cookbook\templates\base.html:338 msgid "Log out" msgstr "" -#: .\cookbook\templates\base.html:357 +#: .\cookbook\templates\base.html:360 msgid "You are using the free version of Tandor" msgstr "" -#: .\cookbook\templates\base.html:358 +#: .\cookbook\templates\base.html:361 msgid "Upgrade Now" msgstr "" @@ -1275,11 +1278,7 @@ msgstr "O caminho deve estar no seguinte formato" #: .\cookbook\templates\forms\edit_import_recipe.html:14 #: .\cookbook\templates\generic\edit_template.html:23 #: .\cookbook\templates\generic\new_template.html:23 -#: .\cookbook\templates\settings.html:70 -#: .\cookbook\templates\settings.html:112 -#: .\cookbook\templates\settings.html:130 -#: .\cookbook\templates\settings.html:202 -#: .\cookbook\templates\settings.html:213 +#: .\cookbook\templates\settings.html:57 msgid "Save" msgstr "Gravar" @@ -1333,39 +1332,6 @@ msgstr "Importar nova Receita" msgid "Edit Recipe" msgstr "Editar Receita" -#: .\cookbook\templates\forms\ingredients.html:15 -msgid "Edit Ingredients" -msgstr "Editar ingredientes" - -#: .\cookbook\templates\forms\ingredients.html:16 -msgid "" -"\n" -" The following form can be used if, accidentally, two (or more) units " -"or ingredients where created that should be\n" -" the same.\n" -" It merges two units or ingredients and updates all recipes using " -"them.\n" -" " -msgstr "" -"\n" -"A seguinte formula pode ser usada quando duas (ou mais) unidades ou " -"ingredientes foram criadas, mas deveriam ser iguais.\n" -"Junta duas unidades ou ingredientes e atualiza todas as receitas que as " -"estejam a usar. " - -#: .\cookbook\templates\forms\ingredients.html:26 -msgid "Are you sure that you want to merge these two units?" -msgstr "" - -#: .\cookbook\templates\forms\ingredients.html:31 -#: .\cookbook\templates\forms\ingredients.html:40 -msgid "Merge" -msgstr "Juntar" - -#: .\cookbook\templates\forms\ingredients.html:36 -msgid "Are you sure that you want to merge these two ingredients?" -msgstr "" - #: .\cookbook\templates\generic\delete_template.html:21 #, python-format msgid "Are you sure you want to delete the %(title)s: %(object)s " @@ -1387,6 +1353,11 @@ msgstr "" msgid "Cancel" msgstr "" +#: .\cookbook\templates\generic\edit_template.html:6 +#: .\cookbook\templates\generic\edit_template.html:14 +msgid "Edit" +msgstr "Editar" + #: .\cookbook\templates\generic\edit_template.html:32 msgid "View" msgstr "Ver" @@ -1408,13 +1379,16 @@ msgstr "Filtrar" msgid "Import all" msgstr "Importar tudo" +#: .\cookbook\templates\generic\new_template.html:6 +#: .\cookbook\templates\generic\new_template.html:14 +msgid "New" +msgstr "Novo" + #: .\cookbook\templates\generic\table_template.html:76 -#: .\cookbook\templates\recipes_table.html:121 msgid "previous" msgstr "Anterior" #: .\cookbook\templates\generic\table_template.html:98 -#: .\cookbook\templates\recipes_table.html:143 msgid "next" msgstr "Seguinte" @@ -1426,24 +1400,11 @@ msgstr "Ver Registro" msgid "Cook Log" msgstr "Registro Cook" -#: .\cookbook\templates\import.html:6 -msgid "Import Recipes" -msgstr "Importar Receitas" - -#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 #: .\cookbook\templates\import_response.html:7 .\cookbook\views\delete.py:86 #: .\cookbook\views\edit.py:191 msgid "Import" msgstr "Importar" -#: .\cookbook\templates\include\recipe_open_modal.html:18 -msgid "Close" -msgstr "Fechar" - -#: .\cookbook\templates\include\recipe_open_modal.html:32 -msgid "Open Recipe" -msgstr "Abrir Receita" - #: .\cookbook\templates\include\storage_backend_warning.html:4 msgid "Security Warning" msgstr "Alerta de Segurança" @@ -1461,13 +1422,14 @@ msgid "" " " msgstr "" "\n" -"Os
    campos da Password e Token
    são guardados dentro da base de dados " -"como texto simples.\n" +" Os campos da senha e Token são guardados dentro da base de " +"dados como texto simples.\n" "Isto é necessário porque eles são usados para fazer pedidos á API, mas " "também aumenta o risco de\n" "de alguém os roubar.
    \n" "Para limitar os possíveis danos, tokens e contas com acesso limitado podem " -"ser usadas." +"ser usadas.\n" +" " #: .\cookbook\templates\index.html:29 msgid "Search recipe ..." @@ -1638,41 +1600,14 @@ msgstr "Cabeçalho" msgid "Cell" msgstr "Célula " -#: .\cookbook\templates\meal_plan_entry.html:6 -msgid "Meal Plan View" -msgstr "" - -#: .\cookbook\templates\meal_plan_entry.html:18 -msgid "Created by" -msgstr "" - -#: .\cookbook\templates\meal_plan_entry.html:20 -msgid "Shared with" -msgstr "" - -#: .\cookbook\templates\meal_plan_entry.html:48 -#: .\cookbook\templates\recipes_table.html:64 -msgid "Last cooked" -msgstr "Última cozinhada" - -#: .\cookbook\templates\meal_plan_entry.html:50 -msgid "Never cooked before." -msgstr "" - -#: .\cookbook\templates\meal_plan_entry.html:76 -msgid "Other meals on this day" -msgstr "" - #: .\cookbook\templates\no_groups_info.html:5 #: .\cookbook\templates\no_groups_info.html:12 msgid "No Permissions" msgstr "" #: .\cookbook\templates\no_groups_info.html:17 -#, fuzzy -#| msgid "You are not logged in and therefore cannot view this page!" msgid "You do not have any groups and therefor cannot use this application." -msgstr "Autenticação necessária para aceder a esta página!" +msgstr "Você não tem nenhum grupo e, portanto, não pode usar este aplicativo." #: .\cookbook\templates\no_groups_info.html:18 #: .\cookbook\templates\no_perm_info.html:15 @@ -1685,12 +1620,12 @@ msgid "No Permission" msgstr "" #: .\cookbook\templates\no_perm_info.html:15 -#, fuzzy -#| msgid "You do not have the required permissions to view this page!" msgid "" "You do not have the required permissions to view this page or perform this " "action." -msgstr "Sem permissões para aceder a esta página!" +msgstr "" +"Você não tem as permissões necessárias para visualizar esta página ou " +"executar esta ação." #: .\cookbook\templates\offline.html:6 msgid "Offline" @@ -1711,43 +1646,26 @@ msgstr "" msgid "Back" msgstr "" -#: .\cookbook\templates\recipe_view.html:26 +#: .\cookbook\templates\profile.html:7 +msgid "Profile" +msgstr "" + +#: .\cookbook\templates\recipe_view.html:41 msgid "by" msgstr "por" -#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:144 +#: .\cookbook\templates\recipe_view.html:59 .\cookbook\views\delete.py:144 #: .\cookbook\views\edit.py:171 msgid "Comment" msgstr "" -#: .\cookbook\templates\recipes_table.html:19 -#: .\cookbook\templates\recipes_table.html:23 -msgid "Recipe Image" -msgstr "" - -#: .\cookbook\templates\recipes_table.html:51 -msgid "Preparation time ca." -msgstr "" - -#: .\cookbook\templates\recipes_table.html:57 -msgid "Waiting time ca." -msgstr "" - -#: .\cookbook\templates\recipes_table.html:60 -msgid "External" -msgstr "" - -#: .\cookbook\templates\recipes_table.html:86 -msgid "Log Cooking" -msgstr "" - #: .\cookbook\templates\rest_framework\api.html:5 msgid "Recipe Home" msgstr "" #: .\cookbook\templates\search_info.html:5 #: .\cookbook\templates\search_info.html:9 -#: .\cookbook\templates\settings.html:172 +#: .\cookbook\templates\settings.html:24 #, fuzzy #| msgid "Search String" msgid "Search Settings" @@ -1910,141 +1828,57 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\settings.html:28 -msgid "Account" -msgstr "" - -#: .\cookbook\templates\settings.html:35 -msgid "Preferences" -msgstr "" - -#: .\cookbook\templates\settings.html:42 -#, fuzzy -#| msgid "Settings" -msgid "API-Settings" -msgstr "Definições" - -#: .\cookbook\templates\settings.html:49 -#, fuzzy -#| msgid "Search String" -msgid "Search-Settings" -msgstr "Procurar" - -#: .\cookbook\templates\settings.html:56 -#, fuzzy -#| msgid "Search String" -msgid "Shopping-Settings" -msgstr "Procurar" - -#: .\cookbook\templates\settings.html:65 -#, fuzzy -#| msgid "Settings" -msgid "Name Settings" -msgstr "Definições" - -#: .\cookbook\templates\settings.html:73 -#, fuzzy -#| msgid "Settings" -msgid "Account Settings" -msgstr "Definições" - -#: .\cookbook\templates\settings.html:75 -#, fuzzy -#| msgid "Settings" -msgid "Emails" -msgstr "Definições" - -#: .\cookbook\templates\settings.html:78 -#: .\cookbook\templates\socialaccount\connections.html:11 -msgid "Social" -msgstr "" - -#: .\cookbook\templates\settings.html:91 -msgid "Language" -msgstr "" - -#: .\cookbook\templates\settings.html:121 -msgid "Style" -msgstr "" - -#: .\cookbook\templates\settings.html:142 -msgid "API Token" -msgstr "" - -#: .\cookbook\templates\settings.html:143 -msgid "" -"You can use both basic authentication and token based authentication to " -"access the REST API." -msgstr "" - -#: .\cookbook\templates\settings.html:160 -msgid "" -"Use the token as an Authorization header prefixed by the word token as shown " -"in the following examples:" -msgstr "" - -#: .\cookbook\templates\settings.html:162 -msgid "or" -msgstr "" - -#: .\cookbook\templates\settings.html:173 +#: .\cookbook\templates\settings.html:25 msgid "" "There are many options to configure the search depending on your personal " "preferences." msgstr "" -#: .\cookbook\templates\settings.html:174 +#: .\cookbook\templates\settings.html:26 msgid "" "Usually you do not need to configure any of them and can just stick " "with either the default or one of the following presets." msgstr "" -#: .\cookbook\templates\settings.html:175 +#: .\cookbook\templates\settings.html:27 msgid "" "If you do want to configure the search you can read about the different " "options here." msgstr "" -#: .\cookbook\templates\settings.html:180 +#: .\cookbook\templates\settings.html:32 msgid "Fuzzy" msgstr "" -#: .\cookbook\templates\settings.html:181 +#: .\cookbook\templates\settings.html:33 msgid "" "Find what you need even if your search or the recipe contains typos. Might " "return more results than needed to make sure you find what you are looking " "for." msgstr "" -#: .\cookbook\templates\settings.html:182 +#: .\cookbook\templates\settings.html:34 msgid "This is the default behavior" msgstr "" -#: .\cookbook\templates\settings.html:183 -#: .\cookbook\templates\settings.html:191 +#: .\cookbook\templates\settings.html:37 .\cookbook\templates\settings.html:46 msgid "Apply" msgstr "" -#: .\cookbook\templates\settings.html:188 +#: .\cookbook\templates\settings.html:42 msgid "Precise" msgstr "" -#: .\cookbook\templates\settings.html:189 +#: .\cookbook\templates\settings.html:43 msgid "" "Allows fine control over search results but might not return results if too " "many spelling mistakes are made." msgstr "" -#: .\cookbook\templates\settings.html:190 +#: .\cookbook\templates\settings.html:44 msgid "Perfect for large Databases" msgstr "" -#: .\cookbook\templates\settings.html:207 -#, fuzzy -#| msgid "Settings" -msgid "Shopping Settings" -msgstr "Definições" - #: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5 msgid "Cookbook Setup" msgstr "" @@ -2077,6 +1911,10 @@ msgstr "" msgid "Account Connections" msgstr "" +#: .\cookbook\templates\socialaccount\connections.html:11 +msgid "Social" +msgstr "" + #: .\cookbook\templates\socialaccount\connections.html:18 msgid "" "You can sign in to your account using any of the following third party\n" @@ -2169,74 +2007,46 @@ msgid "" "You can either be invited into an existing space or create your own one." msgstr "" -#: .\cookbook\templates\space_overview.html:45 +#: .\cookbook\templates\space_overview.html:53 msgid "Owner" msgstr "" -#: .\cookbook\templates\space_overview.html:49 +#: .\cookbook\templates\space_overview.html:57 #, fuzzy #| msgid "Create" msgid "Leave Space" msgstr "Criar" -#: .\cookbook\templates\space_overview.html:70 -#: .\cookbook\templates\space_overview.html:80 +#: .\cookbook\templates\space_overview.html:78 +#: .\cookbook\templates\space_overview.html:88 msgid "Join Space" msgstr "" -#: .\cookbook\templates\space_overview.html:73 +#: .\cookbook\templates\space_overview.html:81 msgid "Join an existing space." msgstr "" -#: .\cookbook\templates\space_overview.html:75 +#: .\cookbook\templates\space_overview.html:83 msgid "" "To join an existing space either enter your invite token or click on the " "invite link the space owner send you." msgstr "" -#: .\cookbook\templates\space_overview.html:88 -#: .\cookbook\templates\space_overview.html:97 +#: .\cookbook\templates\space_overview.html:96 +#: .\cookbook\templates\space_overview.html:105 #, fuzzy #| msgid "Create" msgid "Create Space" msgstr "Criar" -#: .\cookbook\templates\space_overview.html:91 +#: .\cookbook\templates\space_overview.html:99 msgid "Create your own recipe space." msgstr "" -#: .\cookbook\templates\space_overview.html:93 +#: .\cookbook\templates\space_overview.html:101 msgid "Start your own recipe space and invite other users to it." msgstr "" -#: .\cookbook\templates\stats.html:4 -msgid "Stats" -msgstr "" - -#: .\cookbook\templates\stats.html:10 -msgid "Statistics" -msgstr "Estatísticas" - -#: .\cookbook\templates\stats.html:19 -msgid "Number of objects" -msgstr "" - -#: .\cookbook\templates\stats.html:30 -msgid "Recipe Imports" -msgstr "" - -#: .\cookbook\templates\stats.html:38 -msgid "Objects stats" -msgstr "" - -#: .\cookbook\templates\stats.html:41 -msgid "Recipes without Keywords" -msgstr "" - -#: .\cookbook\templates\stats.html:45 -msgid "Internal Recipes" -msgstr "" - #: .\cookbook\templates\system.html:20 msgid "System Information" msgstr "" @@ -2334,249 +2144,262 @@ msgstr "" msgid "URL Import" msgstr "" -#: .\cookbook\views\api.py:105 .\cookbook\views\api.py:197 +#: .\cookbook\views\api.py:110 .\cookbook\views\api.py:202 msgid "Parameter updated_at incorrectly formatted" msgstr "" -#: .\cookbook\views\api.py:217 .\cookbook\views\api.py:320 +#: .\cookbook\views\api.py:222 .\cookbook\views\api.py:325 +#, python-brace-format msgid "No {self.basename} with id {pk} exists" msgstr "" -#: .\cookbook\views\api.py:221 +#: .\cookbook\views\api.py:226 msgid "Cannot merge with the same object!" msgstr "" -#: .\cookbook\views\api.py:228 +#: .\cookbook\views\api.py:233 +#, python-brace-format msgid "No {self.basename} with id {target} exists" msgstr "" -#: .\cookbook\views\api.py:233 +#: .\cookbook\views\api.py:238 msgid "Cannot merge with child object!" msgstr "" -#: .\cookbook\views\api.py:266 +#: .\cookbook\views\api.py:271 +#, python-brace-format msgid "{source.name} was merged successfully with {target.name}" msgstr "" -#: .\cookbook\views\api.py:271 +#: .\cookbook\views\api.py:276 +#, python-brace-format msgid "An error occurred attempting to merge {source.name} with {target.name}" msgstr "" -#: .\cookbook\views\api.py:329 +#: .\cookbook\views\api.py:334 +#, python-brace-format msgid "{child.name} was moved successfully to the root." msgstr "" -#: .\cookbook\views\api.py:332 .\cookbook\views\api.py:350 +#: .\cookbook\views\api.py:337 .\cookbook\views\api.py:355 msgid "An error occurred attempting to move " msgstr "" -#: .\cookbook\views\api.py:335 +#: .\cookbook\views\api.py:340 msgid "Cannot move an object to itself!" msgstr "" -#: .\cookbook\views\api.py:341 +#: .\cookbook\views\api.py:346 +#, python-brace-format msgid "No {self.basename} with id {parent} exists" msgstr "" -#: .\cookbook\views\api.py:347 +#: .\cookbook\views\api.py:352 +#, python-brace-format msgid "{child.name} was moved successfully to parent {parent.name}" msgstr "" -#: .\cookbook\views\api.py:542 +#: .\cookbook\views\api.py:553 +#, python-brace-format msgid "{obj.name} was removed from the shopping list." msgstr "" -#: .\cookbook\views\api.py:547 .\cookbook\views\api.py:879 -#: .\cookbook\views\api.py:892 +#: .\cookbook\views\api.py:558 .\cookbook\views\api.py:888 +#: .\cookbook\views\api.py:901 +#, python-brace-format msgid "{obj.name} was added to the shopping list." msgstr "" -#: .\cookbook\views\api.py:674 +#: .\cookbook\views\api.py:685 msgid "ID of recipe a step is part of. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:676 +#: .\cookbook\views\api.py:687 msgid "Query string matched (fuzzy) against object name." msgstr "" -#: .\cookbook\views\api.py:720 +#: .\cookbook\views\api.py:731 msgid "" "Query string matched (fuzzy) against recipe name. In the future also " "fulltext search." msgstr "" -#: .\cookbook\views\api.py:722 +#: .\cookbook\views\api.py:733 msgid "" "ID of keyword a recipe should have. For multiple repeat parameter. " "Equivalent to keywords_or" msgstr "" -#: .\cookbook\views\api.py:725 +#: .\cookbook\views\api.py:736 msgid "" "Keyword IDs, repeat for multiple. Return recipes with any of the keywords" msgstr "" -#: .\cookbook\views\api.py:728 +#: .\cookbook\views\api.py:739 msgid "" "Keyword IDs, repeat for multiple. Return recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:742 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords." msgstr "" -#: .\cookbook\views\api.py:734 +#: .\cookbook\views\api.py:745 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:736 +#: .\cookbook\views\api.py:747 msgid "ID of food a recipe should have. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:739 +#: .\cookbook\views\api.py:750 msgid "Food IDs, repeat for multiple. Return recipes with any of the foods" msgstr "" -#: .\cookbook\views\api.py:741 +#: .\cookbook\views\api.py:752 msgid "Food IDs, repeat for multiple. Return recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:743 +#: .\cookbook\views\api.py:754 msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods." msgstr "" -#: .\cookbook\views\api.py:745 +#: .\cookbook\views\api.py:756 msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:746 +#: .\cookbook\views\api.py:757 msgid "ID of unit a recipe should have." msgstr "" -#: .\cookbook\views\api.py:748 +#: .\cookbook\views\api.py:759 msgid "" "Rating a recipe should have or greater. [0 - 5] Negative value filters " "rating less than." msgstr "" -#: .\cookbook\views\api.py:749 +#: .\cookbook\views\api.py:760 msgid "ID of book a recipe should be in. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:751 +#: .\cookbook\views\api.py:762 msgid "Book IDs, repeat for multiple. Return recipes with any of the books" msgstr "" -#: .\cookbook\views\api.py:753 +#: .\cookbook\views\api.py:764 msgid "Book IDs, repeat for multiple. Return recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:755 +#: .\cookbook\views\api.py:766 msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books." msgstr "" -#: .\cookbook\views\api.py:757 +#: .\cookbook\views\api.py:768 msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:759 +#: .\cookbook\views\api.py:770 msgid "If only internal recipes should be returned. [true/false]" msgstr "" -#: .\cookbook\views\api.py:761 +#: .\cookbook\views\api.py:772 msgid "Returns the results in randomized order. [true/false]" msgstr "" -#: .\cookbook\views\api.py:763 +#: .\cookbook\views\api.py:774 msgid "Returns new results first in search results. [true/false]" msgstr "" -#: .\cookbook\views\api.py:765 +#: .\cookbook\views\api.py:776 msgid "" "Filter recipes cooked X times or more. Negative values returns cooked less " "than X times" msgstr "" -#: .\cookbook\views\api.py:767 +#: .\cookbook\views\api.py:778 msgid "" "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:769 +#: .\cookbook\views\api.py:780 msgid "" "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:771 +#: .\cookbook\views\api.py:782 msgid "" "Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:773 +#: .\cookbook\views\api.py:784 msgid "" "Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:775 +#: .\cookbook\views\api.py:786 msgid "Filter recipes that can be made with OnHand food. [true/false]" msgstr "" -#: .\cookbook\views\api.py:937 +#: .\cookbook\views\api.py:946 msgid "" "Returns the shopping list entry with a primary key of id. Multiple values " "allowed." msgstr "" -#: .\cookbook\views\api.py:942 +#: .\cookbook\views\api.py:951 msgid "" -"Filter shopping list entries on checked. [true, false, both, recent]" -"
    - recent includes unchecked items and recently completed items." +"Filter shopping list entries on checked. [true, false, both, recent]
    - recent includes unchecked items and recently completed items." msgstr "" -#: .\cookbook\views\api.py:945 +#: .\cookbook\views\api.py:954 msgid "Returns the shopping list entries sorted by supermarket category order." msgstr "" -#: .\cookbook\views\api.py:1140 +#: .\cookbook\views\api.py:1166 msgid "Nothing to do." msgstr "" -#: .\cookbook\views\api.py:1160 +#: .\cookbook\views\api.py:1198 msgid "Invalid Url" msgstr "" -#: .\cookbook\views\api.py:1167 +#: .\cookbook\views\api.py:1205 msgid "Connection Refused." msgstr "" -#: .\cookbook\views\api.py:1172 +#: .\cookbook\views\api.py:1210 msgid "Bad URL Schema." msgstr "" -#: .\cookbook\views\api.py:1195 +#: .\cookbook\views\api.py:1233 msgid "No usable data could be found." msgstr "" -#: .\cookbook\views\api.py:1303 .\cookbook\views\data.py:28 +#: .\cookbook\views\api.py:1326 .\cookbook\views\import_export.py:117 +msgid "Importing is not implemented for this provider" +msgstr "" + +#: .\cookbook\views\api.py:1372 .\cookbook\views\data.py:31 #: .\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:1325 +#: .\cookbook\views\api.py:1394 msgid "Sync successful!" msgstr "" -#: .\cookbook\views\api.py:1330 +#: .\cookbook\views\api.py:1399 msgid "Error synchronizing with Storage" msgstr "" -#: .\cookbook\views\data.py:97 +#: .\cookbook\views\data.py:100 #, python-format msgid "Batch edit done. %(count)d recipe was updated." msgid_plural "Batch edit done. %(count)d Recipes where updated." @@ -2633,11 +2456,7 @@ msgstr "" msgid "Error saving changes!" msgstr "" -#: .\cookbook\views\import_export.py:111 .\cookbook\views\import_export.py:150 -msgid "Importing is not implemented for this provider" -msgstr "" - -#: .\cookbook\views\import_export.py:137 +#: .\cookbook\views\import_export.py:104 msgid "" "The PDF Exporter is not enabled on this instance as it is still in an " "experimental state." @@ -2685,77 +2504,167 @@ msgstr "" msgid "There was an error importing this recipe!" msgstr "" -#: .\cookbook\views\views.py:124 +#: .\cookbook\views\views.py:73 .\cookbook\views\views.py:191 +#: .\cookbook\views\views.py:213 .\cookbook\views\views.py:399 +msgid "This feature is not available in the demo version!" +msgstr "" + +#: .\cookbook\views\views.py:89 msgid "" "You have successfully created your own recipe space. Start by adding some " "recipes or invite other people to join you." msgstr "" -#: .\cookbook\views\views.py:178 +#: .\cookbook\views\views.py:143 msgid "You do not have the required permissions to perform this action!" msgstr "" -#: .\cookbook\views\views.py:189 +#: .\cookbook\views\views.py:154 msgid "Comment saved!" msgstr "" -#: .\cookbook\views\views.py:264 -msgid "This feature is not available in the demo version!" -msgstr "" - -#: .\cookbook\views\views.py:324 +#: .\cookbook\views\views.py:253 msgid "You must select at least one field to search!" msgstr "" -#: .\cookbook\views\views.py:329 +#: .\cookbook\views\views.py:258 msgid "" "To use this search method you must select at least one full text search " "field!" msgstr "" -#: .\cookbook\views\views.py:333 +#: .\cookbook\views\views.py:262 msgid "Fuzzy search is not compatible with this search method!" msgstr "" -#: .\cookbook\views\views.py:463 +#: .\cookbook\views\views.py:338 msgid "" "The setup page can only be used to create the first user! If you have " "forgotten your superuser credentials please consult the django documentation " "on how to reset passwords." msgstr "" -#: .\cookbook\views\views.py:470 +#: .\cookbook\views\views.py:345 msgid "Passwords dont match!" msgstr "" -#: .\cookbook\views\views.py:478 +#: .\cookbook\views\views.py:353 msgid "User has been created, please login!" msgstr "" -#: .\cookbook\views\views.py:494 +#: .\cookbook\views\views.py:369 msgid "Malformed Invite Link supplied!" msgstr "" -#: .\cookbook\views\views.py:510 +#: .\cookbook\views\views.py:386 msgid "Successfully joined space." msgstr "" -#: .\cookbook\views\views.py:516 +#: .\cookbook\views\views.py:392 msgid "Invite Link not valid or already used!" msgstr "" -#: .\cookbook\views\views.py:530 +#: .\cookbook\views\views.py:409 msgid "" "Reporting share links is not enabled for this instance. Please notify the " "page administrator to report problems." msgstr "" -#: .\cookbook\views\views.py:536 +#: .\cookbook\views\views.py:415 msgid "" "Recipe sharing link has been disabled! For additional information please " "contact the page administrator." msgstr "" +#~ msgid "Ingredients" +#~ msgstr "Ingredientes" + +#~ msgid "Show recent recipes" +#~ msgstr "Mostrar receitas recentes" + +#~ msgid "Search style" +#~ msgstr "Estilo de pesquisa" + +#~ msgid "Show recently viewed recipes on search page." +#~ msgstr "Mostrar receitas recentes na página de pesquisa." + +#~ msgid "Small" +#~ msgstr "Pequeno" + +#~ msgid "Large" +#~ msgstr "Grande" + +#~ msgid "Edit Ingredients" +#~ msgstr "Editar ingredientes" + +#~ msgid "" +#~ "\n" +#~ " The following form can be used if, accidentally, two (or more) " +#~ "units or ingredients where created that should be\n" +#~ " the same.\n" +#~ " It merges two units or ingredients and updates all recipes using " +#~ "them.\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ "A seguinte formula pode ser usada quando duas (ou mais) unidades ou " +#~ "ingredientes foram criadas, mas deveriam ser iguais.\n" +#~ "Junta duas unidades ou ingredientes e atualiza todas as receitas que as " +#~ "estejam a usar. " + +#~ msgid "Merge" +#~ msgstr "Juntar" + +#~ msgid "Import Recipes" +#~ msgstr "Importar Receitas" + +#~ msgid "Close" +#~ msgstr "Fechar" + +#~ msgid "Open Recipe" +#~ msgstr "Abrir Receita" + +#~ msgid "Last cooked" +#~ msgstr "Última cozinhada" + +#, fuzzy +#~| msgid "Settings" +#~ msgid "API-Settings" +#~ msgstr "Definições" + +#, fuzzy +#~| msgid "Search String" +#~ msgid "Search-Settings" +#~ msgstr "Procurar" + +#, fuzzy +#~| msgid "Search String" +#~ msgid "Shopping-Settings" +#~ msgstr "Procurar" + +#, fuzzy +#~| msgid "Settings" +#~ msgid "Name Settings" +#~ msgstr "Definições" + +#, fuzzy +#~| msgid "Settings" +#~ msgid "Account Settings" +#~ msgstr "Definições" + +#, fuzzy +#~| msgid "Settings" +#~ msgid "Emails" +#~ msgstr "Definições" + +#, fuzzy +#~| msgid "Settings" +#~ msgid "Shopping Settings" +#~ msgstr "Definições" + +#~ msgid "Statistics" +#~ msgstr "Estatísticas" + #, fuzzy #~| msgid "Admin" #~ msgid "admin" @@ -2804,9 +2713,6 @@ msgstr "" #~ msgid "Cook Time" #~ msgstr "Tempo" -#~ msgid "Instructions" -#~ msgstr "Instruções" - #, fuzzy #~| msgid "Discovered Recipes" #~ msgid "Discovered Attributes" diff --git a/cookbook/locale/pt_BR/LC_MESSAGES/django.mo b/cookbook/locale/pt_BR/LC_MESSAGES/django.mo index 24e6bca88..181b78e72 100644 Binary files a/cookbook/locale/pt_BR/LC_MESSAGES/django.mo and b/cookbook/locale/pt_BR/LC_MESSAGES/django.mo differ diff --git a/cookbook/locale/pt_BR/LC_MESSAGES/django.po b/cookbook/locale/pt_BR/LC_MESSAGES/django.po index ceaf3f067..c3eff99e4 100644 --- a/cookbook/locale/pt_BR/LC_MESSAGES/django.po +++ b/cookbook/locale/pt_BR/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-02-11 08:52+0100\n" -"PO-Revision-Date: 2022-03-08 01:31+0000\n" -"Last-Translator: Felipe Castro \n" +"PO-Revision-Date: 2023-04-12 11:55+0000\n" +"Last-Translator: noxonad \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.10.1\n" +"X-Generator: Weblate 4.15\n" #: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 #: .\cookbook\templates\space.html:50 .\cookbook\templates\stats.html:28 @@ -158,7 +158,7 @@ msgstr "" #: .\cookbook\templates\url_import.html:195 #: .\cookbook\templates\url_import.html:585 .\cookbook\views\lists.py:97 msgid "Keywords" -msgstr "" +msgstr "Palavras-chave" #: .\cookbook\forms.py:131 msgid "Preparation time in minutes" @@ -513,7 +513,7 @@ msgstr "" #: .\cookbook\templates\url_import.html:231 #: .\cookbook\templates\url_import.html:462 msgid "Servings" -msgstr "" +msgstr "Porções" #: .\cookbook\integration\saffron.py:25 msgid "Waiting time" @@ -585,7 +585,7 @@ msgstr "" #: .\cookbook\models.py:302 .\cookbook\templates\base.html:90 msgid "Books" -msgstr "" +msgstr "Livros" #: .\cookbook\models.py:310 msgid "Small" @@ -598,7 +598,7 @@ msgstr "" #: .\cookbook\models.py:310 .\cookbook\templates\generic\new_template.html:6 #: .\cookbook\templates\generic\new_template.html:14 msgid "New" -msgstr "" +msgstr "Novo" #: .\cookbook\models.py:513 msgid " is part of a recipe step and cannot be deleted" @@ -677,7 +677,7 @@ msgstr "" #: .\cookbook\templates\shopping_list.html:37 #: .\cookbook\templates\space.html:109 msgid "Edit" -msgstr "" +msgstr "Editar" #: .\cookbook\tables.py:115 .\cookbook\tables.py:138 #: .\cookbook\templates\generic\delete_template.html:7 @@ -715,7 +715,7 @@ msgstr "" #: .\cookbook\templates\settings.html:17 #: .\cookbook\templates\socialaccount\connections.html:10 msgid "Settings" -msgstr "" +msgstr "Configurações" #: .\cookbook\templates\account\email.html:13 msgid "Email" @@ -937,7 +937,7 @@ msgstr "" #: .\cookbook\templates\account\signup.html:48 #: .\cookbook\templates\socialaccount\signup.html:39 msgid "and" -msgstr "" +msgstr "e" #: .\cookbook\templates\account\signup.html:52 #: .\cookbook\templates\socialaccount\signup.html:43 @@ -989,7 +989,7 @@ msgstr "" #: .\cookbook\templates\shopping_list.html:208 #: .\cookbook\templates\supermarket.html:7 msgid "Supermarket" -msgstr "" +msgstr "Supermercado" #: .\cookbook\templates\base.html:163 msgid "Supermarket Category" @@ -1027,7 +1027,7 @@ msgstr "" #: .\cookbook\templates\shopping_list.html:165 #: .\cookbook\templates\shopping_list.html:188 msgid "Create" -msgstr "" +msgstr "Criar" #: .\cookbook\templates\base.html:259 #: .\cookbook\templates\generic\list_template.html:14 @@ -1190,7 +1190,7 @@ msgstr "" #: .\cookbook\templates\generic\delete_template.html:26 msgid "Protected" -msgstr "" +msgstr "Protegido" #: .\cookbook\templates\generic\delete_template.html:41 msgid "Cascade" @@ -1268,7 +1268,7 @@ msgstr "" #: .\cookbook\templates\include\recipe_open_modal.html:18 msgid "Close" -msgstr "" +msgstr "Fechar" #: .\cookbook\templates\include\recipe_open_modal.html:32 msgid "Open Recipe" @@ -1821,7 +1821,7 @@ msgstr "" #: .\cookbook\templates\settings.html:162 msgid "or" -msgstr "" +msgstr "ou" #: .\cookbook\templates\settings.html:173 msgid "" @@ -2062,7 +2062,7 @@ msgstr "" #: .\cookbook\templates\space.html:120 msgid "user" -msgstr "" +msgstr "usuário" #: .\cookbook\templates\space.html:121 msgid "guest" @@ -2208,7 +2208,7 @@ msgstr "" #: .\cookbook\templates\url_import.html:38 msgid "URL" -msgstr "" +msgstr "URL" #: .\cookbook\templates\url_import.html:40 msgid "App" @@ -2273,7 +2273,7 @@ msgstr "" #: .\cookbook\templates\url_import.html:214 msgid "Image" -msgstr "" +msgstr "Imagem" #: .\cookbook\templates\url_import.html:246 msgid "Prep Time" @@ -2359,7 +2359,7 @@ msgstr "" #: .\cookbook\templates\url_import.html:640 msgid "Information" -msgstr "" +msgstr "Informação" #: .\cookbook\templates\url_import.html:642 msgid "" diff --git a/cookbook/locale/rn/LC_MESSAGES/django.po b/cookbook/locale/rn/LC_MESSAGES/django.po index 4fd4253aa..3ddfac8a0 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-07-12 19:20+0200\n" +"POT-Creation-Date: 2023-04-26 07:46+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,109 +18,91 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 -#: .\cookbook\templates\stats.html:28 -msgid "Ingredients" -msgstr "" - -#: .\cookbook\forms.py:53 +#: .\cookbook\forms.py:52 msgid "Default unit" msgstr "" -#: .\cookbook\forms.py:54 +#: .\cookbook\forms.py:53 msgid "Use fractions" msgstr "" -#: .\cookbook\forms.py:55 +#: .\cookbook\forms.py:54 msgid "Use KJ" msgstr "" -#: .\cookbook\forms.py:56 +#: .\cookbook\forms.py:55 msgid "Theme" msgstr "" -#: .\cookbook\forms.py:57 +#: .\cookbook\forms.py:56 msgid "Navbar color" msgstr "" -#: .\cookbook\forms.py:58 +#: .\cookbook\forms.py:57 msgid "Sticky navbar" msgstr "" -#: .\cookbook\forms.py:59 +#: .\cookbook\forms.py:58 msgid "Default page" msgstr "" -#: .\cookbook\forms.py:60 -msgid "Show recent recipes" -msgstr "" - -#: .\cookbook\forms.py:61 -msgid "Search style" -msgstr "" - -#: .\cookbook\forms.py:62 +#: .\cookbook\forms.py:59 msgid "Plan sharing" msgstr "" -#: .\cookbook\forms.py:63 +#: .\cookbook\forms.py:60 msgid "Ingredient decimal places" msgstr "" -#: .\cookbook\forms.py:64 +#: .\cookbook\forms.py:61 msgid "Shopping list auto sync period" msgstr "" -#: .\cookbook\forms.py:65 .\cookbook\templates\recipe_view.html:21 -#: .\cookbook\templates\stats.html:47 +#: .\cookbook\forms.py:62 .\cookbook\templates\recipe_view.html:36 msgid "Comments" msgstr "" -#: .\cookbook\forms.py:66 +#: .\cookbook\forms.py:63 msgid "Left-handed mode" msgstr "" -#: .\cookbook\forms.py:70 +#: .\cookbook\forms.py:67 msgid "" "Color of the top navigation bar. Not all colors work with all themes, just " "try them out!" msgstr "" -#: .\cookbook\forms.py:72 +#: .\cookbook\forms.py:69 msgid "Default Unit to be used when inserting a new ingredient into a recipe." msgstr "" -#: .\cookbook\forms.py:74 +#: .\cookbook\forms.py:71 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" msgstr "" -#: .\cookbook\forms.py:76 +#: .\cookbook\forms.py:73 msgid "Display nutritional energy amounts in joules instead of calories" msgstr "" -#: .\cookbook\forms.py:77 +#: .\cookbook\forms.py:74 msgid "Users with whom newly created meal plans should be shared by default." msgstr "" -#: .\cookbook\forms.py:78 +#: .\cookbook\forms.py:75 msgid "Users with whom to share shopping lists." msgstr "" -#: .\cookbook\forms.py:80 -msgid "Show recently viewed recipes on search page." -msgstr "" - -#: .\cookbook\forms.py:81 +#: .\cookbook\forms.py:76 msgid "Number of decimals to round ingredients." msgstr "" -#: .\cookbook\forms.py:82 +#: .\cookbook\forms.py:77 msgid "If you want to be able to create and see comments underneath recipes." msgstr "" -#: .\cookbook\forms.py:84 .\cookbook\forms.py:496 +#: .\cookbook\forms.py:79 .\cookbook\forms.py:492 msgid "" "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. " @@ -128,406 +110,445 @@ msgid "" "mobile data. If lower than instance limit it is reset when saving." msgstr "" -#: .\cookbook\forms.py:87 +#: .\cookbook\forms.py:82 msgid "Makes the navbar stick to the top of the page." msgstr "" -#: .\cookbook\forms.py:88 .\cookbook\forms.py:499 +#: .\cookbook\forms.py:83 .\cookbook\forms.py:495 msgid "Automatically add meal plan ingredients to shopping list." msgstr "" -#: .\cookbook\forms.py:89 +#: .\cookbook\forms.py:84 msgid "Exclude ingredients that are on hand." msgstr "" -#: .\cookbook\forms.py:90 +#: .\cookbook\forms.py:85 msgid "Will optimize the UI for use with your left hand." msgstr "" -#: .\cookbook\forms.py:107 +#: .\cookbook\forms.py:102 msgid "" "Both fields are optional. If none are given the username will be displayed " "instead" msgstr "" -#: .\cookbook\forms.py:128 .\cookbook\forms.py:301 +#: .\cookbook\forms.py:123 .\cookbook\forms.py:297 msgid "Name" msgstr "" -#: .\cookbook\forms.py:129 .\cookbook\forms.py:302 -#: .\cookbook\templates\stats.html:24 .\cookbook\views\lists.py:88 +#: .\cookbook\forms.py:124 .\cookbook\forms.py:298 .\cookbook\views\lists.py:88 msgid "Keywords" msgstr "" -#: .\cookbook\forms.py:130 +#: .\cookbook\forms.py:125 msgid "Preparation time in minutes" msgstr "" -#: .\cookbook\forms.py:131 +#: .\cookbook\forms.py:126 msgid "Waiting time (cooking/baking) in minutes" msgstr "" -#: .\cookbook\forms.py:132 .\cookbook\forms.py:270 .\cookbook\forms.py:303 +#: .\cookbook\forms.py:127 .\cookbook\forms.py:266 .\cookbook\forms.py:299 msgid "Path" msgstr "" -#: .\cookbook\forms.py:133 +#: .\cookbook\forms.py:128 msgid "Storage UID" msgstr "" -#: .\cookbook\forms.py:165 +#: .\cookbook\forms.py:161 msgid "Default" msgstr "" -#: .\cookbook\forms.py:177 +#: .\cookbook\forms.py:173 msgid "" "To prevent duplicates recipes with the same name as existing ones are " "ignored. Check this box to import everything." msgstr "" -#: .\cookbook\forms.py:200 +#: .\cookbook\forms.py:196 msgid "Add your comment: " msgstr "" -#: .\cookbook\forms.py:215 +#: .\cookbook\forms.py:211 msgid "Leave empty for dropbox and enter app password for nextcloud." msgstr "" -#: .\cookbook\forms.py:222 +#: .\cookbook\forms.py:218 msgid "Leave empty for nextcloud and enter api token for dropbox." msgstr "" -#: .\cookbook\forms.py:231 +#: .\cookbook\forms.py:227 msgid "" "Leave empty for dropbox and enter only base url for nextcloud (/remote." "php/webdav/ is added automatically)" msgstr "" -#: .\cookbook\forms.py:269 .\cookbook\views\edit.py:157 +#: .\cookbook\forms.py:265 .\cookbook\views\edit.py:157 msgid "Storage" msgstr "" -#: .\cookbook\forms.py:271 +#: .\cookbook\forms.py:267 msgid "Active" msgstr "" -#: .\cookbook\forms.py:277 +#: .\cookbook\forms.py:273 msgid "Search String" msgstr "" -#: .\cookbook\forms.py:304 +#: .\cookbook\forms.py:300 msgid "File ID" msgstr "" -#: .\cookbook\forms.py:326 +#: .\cookbook\forms.py:322 msgid "You must provide at least a recipe or a title." msgstr "" -#: .\cookbook\forms.py:339 +#: .\cookbook\forms.py:335 msgid "You can list default users to share recipes with in the settings." msgstr "" -#: .\cookbook\forms.py:340 +#: .\cookbook\forms.py:336 msgid "" "You can use markdown to format this field. See the docs here" msgstr "" -#: .\cookbook\forms.py:366 +#: .\cookbook\forms.py:362 msgid "Maximum number of users for this space reached." msgstr "" -#: .\cookbook\forms.py:372 +#: .\cookbook\forms.py:368 msgid "Email address already taken!" msgstr "" -#: .\cookbook\forms.py:380 +#: .\cookbook\forms.py:376 msgid "" "An email address is not required but if present the invite link will be sent " "to the user." msgstr "" -#: .\cookbook\forms.py:395 +#: .\cookbook\forms.py:391 msgid "Name already taken." msgstr "" -#: .\cookbook\forms.py:406 +#: .\cookbook\forms.py:402 msgid "Accept Terms and Privacy" msgstr "" -#: .\cookbook\forms.py:438 +#: .\cookbook\forms.py:434 msgid "" "Determines how fuzzy a search is if it uses trigram similarity matching (e." "g. low values mean more typos are ignored)." msgstr "" -#: .\cookbook\forms.py:448 +#: .\cookbook\forms.py:444 msgid "" "Select type method of search. Click here for " "full description of choices." msgstr "" -#: .\cookbook\forms.py:449 +#: .\cookbook\forms.py:445 msgid "" "Use fuzzy matching on units, keywords and ingredients when editing and " "importing recipes." msgstr "" -#: .\cookbook\forms.py:451 +#: .\cookbook\forms.py:447 msgid "" "Fields to search ignoring accents. Selecting this option can improve or " "degrade search quality depending on language" msgstr "" -#: .\cookbook\forms.py:453 +#: .\cookbook\forms.py:449 msgid "" "Fields to search for partial matches. (e.g. searching for 'Pie' will return " "'pie' and 'piece' and 'soapie')" msgstr "" -#: .\cookbook\forms.py:455 +#: .\cookbook\forms.py:451 msgid "" "Fields to search for beginning of word matches. (e.g. searching for 'sa' " "will return 'salad' and 'sandwich')" msgstr "" -#: .\cookbook\forms.py:457 +#: .\cookbook\forms.py:453 msgid "" "Fields to 'fuzzy' search. (e.g. searching for 'recpie' will find 'recipe'.) " "Note: this option will conflict with 'web' and 'raw' methods of search." msgstr "" -#: .\cookbook\forms.py:459 +#: .\cookbook\forms.py:455 msgid "" "Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " "only function with fulltext fields." msgstr "" -#: .\cookbook\forms.py:463 +#: .\cookbook\forms.py:459 msgid "Search Method" msgstr "" -#: .\cookbook\forms.py:464 +#: .\cookbook\forms.py:460 msgid "Fuzzy Lookups" msgstr "" -#: .\cookbook\forms.py:465 +#: .\cookbook\forms.py:461 msgid "Ignore Accent" msgstr "" -#: .\cookbook\forms.py:466 +#: .\cookbook\forms.py:462 msgid "Partial Match" msgstr "" -#: .\cookbook\forms.py:467 +#: .\cookbook\forms.py:463 msgid "Starts With" msgstr "" -#: .\cookbook\forms.py:468 +#: .\cookbook\forms.py:464 msgid "Fuzzy Search" msgstr "" -#: .\cookbook\forms.py:469 +#: .\cookbook\forms.py:465 msgid "Full Text" msgstr "" -#: .\cookbook\forms.py:494 +#: .\cookbook\forms.py:490 msgid "" "Users will see all items you add to your shopping list. They must add you " "to see items on their list." msgstr "" -#: .\cookbook\forms.py:500 +#: .\cookbook\forms.py:496 msgid "" "When adding a meal plan to the shopping list (manually or automatically), " "include all related recipes." msgstr "" -#: .\cookbook\forms.py:501 +#: .\cookbook\forms.py:497 msgid "" "When adding a meal plan to the shopping list (manually or automatically), " "exclude ingredients that are on hand." msgstr "" -#: .\cookbook\forms.py:502 +#: .\cookbook\forms.py:498 msgid "Default number of hours to delay a shopping list entry." msgstr "" -#: .\cookbook\forms.py:503 +#: .\cookbook\forms.py:499 msgid "Filter shopping list to only include supermarket categories." msgstr "" -#: .\cookbook\forms.py:504 +#: .\cookbook\forms.py:500 msgid "Days of recent shopping list entries to display." msgstr "" -#: .\cookbook\forms.py:505 +#: .\cookbook\forms.py:501 msgid "Mark food 'On Hand' when checked off shopping list." msgstr "" -#: .\cookbook\forms.py:506 +#: .\cookbook\forms.py:502 msgid "Delimiter to use for CSV exports." msgstr "" -#: .\cookbook\forms.py:507 +#: .\cookbook\forms.py:503 msgid "Prefix to add when copying list to the clipboard." msgstr "" -#: .\cookbook\forms.py:511 +#: .\cookbook\forms.py:507 msgid "Share Shopping List" msgstr "" -#: .\cookbook\forms.py:512 +#: .\cookbook\forms.py:508 msgid "Autosync" msgstr "" -#: .\cookbook\forms.py:513 +#: .\cookbook\forms.py:509 msgid "Auto Add Meal Plan" msgstr "" -#: .\cookbook\forms.py:514 +#: .\cookbook\forms.py:510 msgid "Exclude On Hand" msgstr "" -#: .\cookbook\forms.py:515 +#: .\cookbook\forms.py:511 msgid "Include Related" msgstr "" -#: .\cookbook\forms.py:516 +#: .\cookbook\forms.py:512 msgid "Default Delay Hours" msgstr "" -#: .\cookbook\forms.py:517 +#: .\cookbook\forms.py:513 msgid "Filter to Supermarket" msgstr "" -#: .\cookbook\forms.py:518 +#: .\cookbook\forms.py:514 msgid "Recent Days" msgstr "" -#: .\cookbook\forms.py:519 +#: .\cookbook\forms.py:515 msgid "CSV Delimiter" msgstr "" -#: .\cookbook\forms.py:520 +#: .\cookbook\forms.py:516 msgid "List Prefix" msgstr "" -#: .\cookbook\forms.py:521 +#: .\cookbook\forms.py:517 msgid "Auto On Hand" msgstr "" -#: .\cookbook\forms.py:531 +#: .\cookbook\forms.py:527 msgid "Reset Food Inheritance" msgstr "" -#: .\cookbook\forms.py:532 +#: .\cookbook\forms.py:528 msgid "Reset all food to inherit the fields configured." msgstr "" -#: .\cookbook\forms.py:544 +#: .\cookbook\forms.py:540 msgid "Fields on food that should be inherited by default." msgstr "" -#: .\cookbook\forms.py:545 +#: .\cookbook\forms.py:541 msgid "Show recipe counts on search filters" msgstr "" -#: .\cookbook\helper\AllAuthCustomAdapter.py:36 +#: .\cookbook\forms.py:542 +msgid "Use the plural form for units and food inside this space." +msgstr "" + +#: .\cookbook\helper\AllAuthCustomAdapter.py:39 msgid "" "In order to prevent spam, the requested email was not send. Please wait a " "few minutes and try again." msgstr "" -#: .\cookbook\helper\permission_helper.py:149 -#: .\cookbook\helper\permission_helper.py:172 .\cookbook\views\views.py:152 +#: .\cookbook\helper\permission_helper.py:164 +#: .\cookbook\helper\permission_helper.py:187 .\cookbook\views\views.py:117 msgid "You are not logged in and therefore cannot view this page!" msgstr "" -#: .\cookbook\helper\permission_helper.py:153 -#: .\cookbook\helper\permission_helper.py:159 -#: .\cookbook\helper\permission_helper.py:184 -#: .\cookbook\helper\permission_helper.py:254 -#: .\cookbook\helper\permission_helper.py:268 -#: .\cookbook\helper\permission_helper.py:279 -#: .\cookbook\helper\permission_helper.py:290 .\cookbook\views\data.py:33 -#: .\cookbook\views\views.py:163 .\cookbook\views\views.py:170 -#: .\cookbook\views\views.py:249 +#: .\cookbook\helper\permission_helper.py:168 +#: .\cookbook\helper\permission_helper.py:174 +#: .\cookbook\helper\permission_helper.py:199 +#: .\cookbook\helper\permission_helper.py:269 +#: .\cookbook\helper\permission_helper.py:283 +#: .\cookbook\helper\permission_helper.py:294 +#: .\cookbook\helper\permission_helper.py:305 +#: .\cookbook\helper\permission_helper.py:321 +#: .\cookbook\helper\permission_helper.py:342 .\cookbook\views\data.py:36 +#: .\cookbook\views\views.py:128 .\cookbook\views\views.py:135 msgid "You do not have the required permissions to view this page!" msgstr "" -#: .\cookbook\helper\permission_helper.py:177 -#: .\cookbook\helper\permission_helper.py:200 -#: .\cookbook\helper\permission_helper.py:222 +#: .\cookbook\helper\permission_helper.py:192 +#: .\cookbook\helper\permission_helper.py:215 #: .\cookbook\helper\permission_helper.py:237 +#: .\cookbook\helper\permission_helper.py:252 msgid "You cannot interact with this object as it is not owned by you!" msgstr "" -#: .\cookbook\helper\permission_helper.py:321 +#: .\cookbook\helper\permission_helper.py:403 msgid "You have reached the maximum number of recipes for your space." msgstr "" -#: .\cookbook\helper\permission_helper.py:333 +#: .\cookbook\helper\permission_helper.py:415 msgid "You have more users than allowed in your space." msgstr "" -#: .\cookbook\helper\recipe_search.py:565 +#: .\cookbook\helper\recipe_search.py:630 msgid "One of queryset or hash_key must be provided" msgstr "" -#: .\cookbook\helper\shopping_helper.py:152 +#: .\cookbook\helper\recipe_url_import.py:266 +msgid "reverse rotation" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:267 +msgid "careful rotation" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:268 +msgid "knead" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:269 +msgid "thicken" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:270 +msgid "warm up" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:271 +msgid "ferment" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:272 +msgid "sous-vide" +msgstr "" + +#: .\cookbook\helper\shopping_helper.py:157 msgid "You must supply a servings size" msgstr "" -#: .\cookbook\helper\template_helper.py:64 -#: .\cookbook\helper\template_helper.py:66 +#: .\cookbook\helper\template_helper.py:79 +#: .\cookbook\helper\template_helper.py:81 msgid "Could not parse template code." msgstr "" -#: .\cookbook\integration\copymethat.py:41 +#: .\cookbook\integration\copymethat.py:44 #: .\cookbook\integration\melarecipes.py:37 msgid "Favorite" msgstr "" -#: .\cookbook\integration\copymethat.py:70 -#: .\cookbook\integration\recettetek.py:54 -#: .\cookbook\integration\recipekeeper.py:63 -msgid "Imported from" +#: .\cookbook\integration\copymethat.py:50 +msgid "I made this" msgstr "" -#: .\cookbook\integration\integration.py:223 +#: .\cookbook\integration\integration.py:218 msgid "" "Importer expected a .zip file. Did you choose the correct importer type for " "your data ?" msgstr "" -#: .\cookbook\integration\integration.py:226 +#: .\cookbook\integration\integration.py:221 msgid "" "An unexpected error occurred during the import. Please make sure you have " "uploaded a valid file." msgstr "" -#: .\cookbook\integration\integration.py:231 +#: .\cookbook\integration\integration.py:226 msgid "The following recipes were ignored because they already existed:" msgstr "" -#: .\cookbook\integration\integration.py:235 +#: .\cookbook\integration\integration.py:230 #, python-format msgid "Imported %s recipes." msgstr "" -#: .\cookbook\integration\paprika.py:46 -msgid "Notes" +#: .\cookbook\integration\openeats.py:26 +msgid "Recipe source:" msgstr "" #: .\cookbook\integration\paprika.py:49 +msgid "Notes" +msgstr "" + +#: .\cookbook\integration\paprika.py:52 msgid "Nutritional Information" msgstr "" -#: .\cookbook\integration\paprika.py:53 +#: .\cookbook\integration\paprika.py:56 msgid "Source" msgstr "" +#: .\cookbook\integration\recettetek.py:54 +#: .\cookbook\integration\recipekeeper.py:70 +msgid "Imported from" +msgstr "" + #: .\cookbook\integration\saffron.py:23 msgid "Servings" msgstr "" @@ -540,9 +561,7 @@ msgstr "" msgid "Preparation Time" msgstr "" -#: .\cookbook\integration\saffron.py:29 -#: .\cookbook\templates\forms\ingredients.html:7 -#: .\cookbook\templates\index.html:7 +#: .\cookbook\integration\saffron.py:29 .\cookbook\templates\index.html:7 msgid "Cookbook" msgstr "" @@ -582,171 +601,158 @@ msgstr "" msgid "Other" msgstr "" -#: .\cookbook\models.py:251 +#: .\cookbook\models.py:261 msgid "" "Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " "upload." msgstr "" -#: .\cookbook\models.py:353 .\cookbook\templates\search.html:7 +#: .\cookbook\models.py:365 .\cookbook\templates\search.html:7 +#: .\cookbook\templates\settings.html:18 #: .\cookbook\templates\space_manage.html:7 msgid "Search" msgstr "" -#: .\cookbook\models.py:354 .\cookbook\templates\base.html:107 +#: .\cookbook\models.py:366 .\cookbook\templates\base.html:110 #: .\cookbook\templates\meal_plan.html:7 .\cookbook\views\delete.py:178 #: .\cookbook\views\edit.py:211 .\cookbook\views\new.py:179 msgid "Meal-Plan" msgstr "" -#: .\cookbook\models.py:355 .\cookbook\templates\base.html:115 +#: .\cookbook\models.py:367 .\cookbook\templates\base.html:118 msgid "Books" msgstr "" -#: .\cookbook\models.py:363 -msgid "Small" -msgstr "" - -#: .\cookbook\models.py:363 -msgid "Large" -msgstr "" - -#: .\cookbook\models.py:363 .\cookbook\templates\generic\new_template.html:6 -#: .\cookbook\templates\generic\new_template.html:14 -msgid "New" -msgstr "" - -#: .\cookbook\models.py:584 +#: .\cookbook\models.py:580 msgid " is part of a recipe step and cannot be deleted" msgstr "" -#: .\cookbook\models.py:1162 .\cookbook\templates\search_info.html:28 +#: .\cookbook\models.py:1181 .\cookbook\templates\search_info.html:28 msgid "Simple" msgstr "" -#: .\cookbook\models.py:1163 .\cookbook\templates\search_info.html:33 +#: .\cookbook\models.py:1182 .\cookbook\templates\search_info.html:33 msgid "Phrase" msgstr "" -#: .\cookbook\models.py:1164 .\cookbook\templates\search_info.html:38 +#: .\cookbook\models.py:1183 .\cookbook\templates\search_info.html:38 msgid "Web" msgstr "" -#: .\cookbook\models.py:1165 .\cookbook\templates\search_info.html:47 +#: .\cookbook\models.py:1184 .\cookbook\templates\search_info.html:47 msgid "Raw" msgstr "" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 msgid "Food Alias" msgstr "" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 msgid "Unit Alias" msgstr "" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 msgid "Keyword Alias" msgstr "" -#: .\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 +#: .\cookbook\models.py:1232 +msgid "Description Replace" +msgstr "" + +#: .\cookbook\models.py:1232 +msgid "Instruction Replace" +msgstr "" + +#: .\cookbook\models.py:1258 .\cookbook\views\delete.py:36 +#: .\cookbook\views\edit.py:251 .\cookbook\views\new.py:48 msgid "Recipe" msgstr "" -#: .\cookbook\models.py:1228 +#: .\cookbook\models.py:1259 msgid "Food" msgstr "" -#: .\cookbook\models.py:1229 .\cookbook\templates\base.html:138 +#: .\cookbook\models.py:1260 .\cookbook\templates\base.html:141 msgid "Keyword" msgstr "" -#: .\cookbook\serializer.py:207 -msgid "Cannot modify Space owner permission." -msgstr "" - -#: .\cookbook\serializer.py:290 +#: .\cookbook\serializer.py:198 msgid "File uploads are not enabled for this Space." msgstr "" -#: .\cookbook\serializer.py:301 +#: .\cookbook\serializer.py:209 msgid "You have reached your file upload limit." msgstr "" -#: .\cookbook\serializer.py:1081 +#: .\cookbook\serializer.py:291 +msgid "Cannot modify Space owner permission." +msgstr "" + +#: .\cookbook\serializer.py:1093 msgid "Hello" msgstr "" -#: .\cookbook\serializer.py:1081 +#: .\cookbook\serializer.py:1093 msgid "You have been invited by " msgstr "" -#: .\cookbook\serializer.py:1082 +#: .\cookbook\serializer.py:1094 msgid " to join their Tandoor Recipes space " msgstr "" -#: .\cookbook\serializer.py:1083 +#: .\cookbook\serializer.py:1095 msgid "Click the following link to activate your account: " msgstr "" -#: .\cookbook\serializer.py:1084 +#: .\cookbook\serializer.py:1096 msgid "" "If the link does not work use the following code to manually join the space: " msgstr "" -#: .\cookbook\serializer.py:1085 +#: .\cookbook\serializer.py:1097 msgid "The invitation is valid until " msgstr "" -#: .\cookbook\serializer.py:1086 +#: .\cookbook\serializer.py:1098 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " msgstr "" -#: .\cookbook\serializer.py:1089 +#: .\cookbook\serializer.py:1101 msgid "Tandoor Recipes Invite" msgstr "" -#: .\cookbook\serializer.py:1209 +#: .\cookbook\serializer.py:1242 msgid "Existing shopping list to update" msgstr "" -#: .\cookbook\serializer.py:1211 +#: .\cookbook\serializer.py:1244 msgid "" "List of ingredient IDs from the recipe to add, if not provided all " "ingredients will be added." msgstr "" -#: .\cookbook\serializer.py:1213 +#: .\cookbook\serializer.py:1246 msgid "" "Providing a list_recipe ID and servings of 0 will delete that shopping list." msgstr "" -#: .\cookbook\serializer.py:1222 +#: .\cookbook\serializer.py:1255 msgid "Amount of food to add to the shopping list" msgstr "" -#: .\cookbook\serializer.py:1224 +#: .\cookbook\serializer.py:1257 msgid "ID of unit to use for the shopping list" msgstr "" -#: .\cookbook\serializer.py:1226 +#: .\cookbook\serializer.py:1259 msgid "When set to true will delete all food from active shopping lists." msgstr "" -#: .\cookbook\tables.py:36 .\cookbook\templates\generic\edit_template.html:6 -#: .\cookbook\templates\generic\edit_template.html:14 -#: .\cookbook\templates\recipes_table.html:82 -msgid "Edit" -msgstr "" - -#: .\cookbook\tables.py:116 .\cookbook\tables.py:131 +#: .\cookbook\tables.py:61 .\cookbook\tables.py:75 #: .\cookbook\templates\generic\delete_template.html:7 #: .\cookbook\templates\generic\delete_template.html:15 #: .\cookbook\templates\generic\edit_template.html:28 -#: .\cookbook\templates\recipes_table.html:90 msgid "Delete" msgstr "" @@ -774,9 +780,10 @@ msgstr "" #: .\cookbook\templates\account\email.html:12 #: .\cookbook\templates\account\password_change.html:11 #: .\cookbook\templates\account\password_set.html:11 -#: .\cookbook\templates\base.html:293 .\cookbook\templates\settings.html:6 +#: .\cookbook\templates\base.html:296 .\cookbook\templates\settings.html:6 #: .\cookbook\templates\settings.html:17 #: .\cookbook\templates\socialaccount\connections.html:10 +#: .\cookbook\templates\user_settings.html:8 msgid "Settings" msgstr "" @@ -863,8 +870,8 @@ msgid "" "request." msgstr "" -#: .\cookbook\templates\account\login.html:8 -#: .\cookbook\templates\base.html:340 .\cookbook\templates\openid\login.html:8 +#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:343 +#: .\cookbook\templates\openid\login.html:8 msgid "Login" msgstr "" @@ -884,21 +891,20 @@ msgstr "" msgid "Sign Up" msgstr "" +#: .\cookbook\templates\account\login.html:38 +msgid "Lost your password?" +msgstr "" + #: .\cookbook\templates\account\login.html:39 -#: .\cookbook\templates\account\login.html:41 #: .\cookbook\templates\account\password_reset.html:29 msgid "Reset My Password" msgstr "" -#: .\cookbook\templates\account\login.html:40 -msgid "Lost your password?" -msgstr "" - -#: .\cookbook\templates\account\login.html:52 +#: .\cookbook\templates\account\login.html:50 msgid "Social Login" msgstr "" -#: .\cookbook\templates\account\login.html:53 +#: .\cookbook\templates\account\login.html:51 msgid "You can use any of the following providers to sign in." msgstr "" @@ -924,7 +930,6 @@ msgstr "" #: .\cookbook\templates\account\password_change.html:12 #: .\cookbook\templates\account\password_set.html:12 -#: .\cookbook\templates\settings.html:76 msgid "Password" msgstr "" @@ -1028,129 +1033,124 @@ msgstr "" msgid "We are sorry, but the sign up is currently closed." msgstr "" -#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:330 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:333 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "" -#: .\cookbook\templates\base.html:103 .\cookbook\templates\index.html:87 -#: .\cookbook\templates\stats.html:22 +#: .\cookbook\templates\base.html:106 .\cookbook\templates\index.html:87 msgid "Recipes" msgstr "" -#: .\cookbook\templates\base.html:111 +#: .\cookbook\templates\base.html:114 msgid "Shopping" msgstr "" -#: .\cookbook\templates\base.html:150 .\cookbook\views\lists.py:105 +#: .\cookbook\templates\base.html:153 .\cookbook\views\lists.py:105 msgid "Foods" msgstr "" -#: .\cookbook\templates\base.html:162 -#: .\cookbook\templates\forms\ingredients.html:24 -#: .\cookbook\templates\stats.html:26 .\cookbook\views\lists.py:122 +#: .\cookbook\templates\base.html:165 .\cookbook\views\lists.py:122 msgid "Units" msgstr "" -#: .\cookbook\templates\base.html:176 .\cookbook\templates\supermarket.html:7 +#: .\cookbook\templates\base.html:179 .\cookbook\templates\supermarket.html:7 msgid "Supermarket" msgstr "" -#: .\cookbook\templates\base.html:188 +#: .\cookbook\templates\base.html:191 msgid "Supermarket Category" msgstr "" -#: .\cookbook\templates\base.html:200 .\cookbook\views\lists.py:171 +#: .\cookbook\templates\base.html:203 .\cookbook\views\lists.py:171 msgid "Automations" msgstr "" -#: .\cookbook\templates\base.html:214 .\cookbook\views\lists.py:207 +#: .\cookbook\templates\base.html:217 .\cookbook\views\lists.py:207 msgid "Files" msgstr "" -#: .\cookbook\templates\base.html:226 +#: .\cookbook\templates\base.html:229 msgid "Batch Edit" msgstr "" -#: .\cookbook\templates\base.html:238 .\cookbook\templates\history.html:6 +#: .\cookbook\templates\base.html:241 .\cookbook\templates\history.html:6 #: .\cookbook\templates\history.html:14 msgid "History" msgstr "" -#: .\cookbook\templates\base.html:252 +#: .\cookbook\templates\base.html:255 #: .\cookbook\templates\ingredient_editor.html:7 #: .\cookbook\templates\ingredient_editor.html:13 msgid "Ingredient Editor" msgstr "" -#: .\cookbook\templates\base.html:264 +#: .\cookbook\templates\base.html:267 #: .\cookbook\templates\export_response.html:7 #: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 msgid "Export" msgstr "" -#: .\cookbook\templates\base.html:280 .\cookbook\templates\index.html:47 +#: .\cookbook\templates\base.html:283 .\cookbook\templates\index.html:47 msgid "Import Recipe" msgstr "" -#: .\cookbook\templates\base.html:282 +#: .\cookbook\templates\base.html:285 msgid "Create" msgstr "" -#: .\cookbook\templates\base.html:295 +#: .\cookbook\templates\base.html:298 #: .\cookbook\templates\generic\list_template.html:14 -#: .\cookbook\templates\stats.html:43 msgid "External Recipes" msgstr "" -#: .\cookbook\templates\base.html:298 -#: .\cookbook\templates\space_manage.html:15 +#: .\cookbook\templates\base.html:301 .\cookbook\templates\space_manage.html:15 msgid "Space Settings" msgstr "" -#: .\cookbook\templates\base.html:303 .\cookbook\templates\system.html:13 +#: .\cookbook\templates\base.html:306 .\cookbook\templates\system.html:13 msgid "System" msgstr "" -#: .\cookbook\templates\base.html:305 +#: .\cookbook\templates\base.html:308 msgid "Admin" msgstr "" -#: .\cookbook\templates\base.html:309 +#: .\cookbook\templates\base.html:312 #: .\cookbook\templates\space_overview.html:25 msgid "Your Spaces" msgstr "" -#: .\cookbook\templates\base.html:320 +#: .\cookbook\templates\base.html:323 #: .\cookbook\templates\space_overview.html:6 msgid "Overview" msgstr "" -#: .\cookbook\templates\base.html:324 +#: .\cookbook\templates\base.html:327 msgid "Markdown Guide" msgstr "" -#: .\cookbook\templates\base.html:326 +#: .\cookbook\templates\base.html:329 msgid "GitHub" msgstr "" -#: .\cookbook\templates\base.html:328 +#: .\cookbook\templates\base.html:331 msgid "Translate Tandoor" msgstr "" -#: .\cookbook\templates\base.html:332 +#: .\cookbook\templates\base.html:335 msgid "API Browser" msgstr "" -#: .\cookbook\templates\base.html:335 +#: .\cookbook\templates\base.html:338 msgid "Log out" msgstr "" -#: .\cookbook\templates\base.html:357 +#: .\cookbook\templates\base.html:360 msgid "You are using the free version of Tandor" msgstr "" -#: .\cookbook\templates\base.html:358 +#: .\cookbook\templates\base.html:361 msgid "Upgrade Now" msgstr "" @@ -1188,11 +1188,7 @@ msgstr "" #: .\cookbook\templates\forms\edit_import_recipe.html:14 #: .\cookbook\templates\generic\edit_template.html:23 #: .\cookbook\templates\generic\new_template.html:23 -#: .\cookbook\templates\settings.html:70 -#: .\cookbook\templates\settings.html:112 -#: .\cookbook\templates\settings.html:130 -#: .\cookbook\templates\settings.html:202 -#: .\cookbook\templates\settings.html:213 +#: .\cookbook\templates\settings.html:57 msgid "Save" msgstr "" @@ -1240,34 +1236,6 @@ msgstr "" msgid "Edit Recipe" msgstr "" -#: .\cookbook\templates\forms\ingredients.html:15 -msgid "Edit Ingredients" -msgstr "" - -#: .\cookbook\templates\forms\ingredients.html:16 -msgid "" -"\n" -" The following form can be used if, accidentally, two (or more) units " -"or ingredients where created that should be\n" -" the same.\n" -" It merges two units or ingredients and updates all recipes using " -"them.\n" -" " -msgstr "" - -#: .\cookbook\templates\forms\ingredients.html:26 -msgid "Are you sure that you want to merge these two units?" -msgstr "" - -#: .\cookbook\templates\forms\ingredients.html:31 -#: .\cookbook\templates\forms\ingredients.html:40 -msgid "Merge" -msgstr "" - -#: .\cookbook\templates\forms\ingredients.html:36 -msgid "Are you sure that you want to merge these two ingredients?" -msgstr "" - #: .\cookbook\templates\generic\delete_template.html:21 #, python-format msgid "Are you sure you want to delete the %(title)s: %(object)s " @@ -1289,6 +1257,11 @@ msgstr "" msgid "Cancel" msgstr "" +#: .\cookbook\templates\generic\edit_template.html:6 +#: .\cookbook\templates\generic\edit_template.html:14 +msgid "Edit" +msgstr "" + #: .\cookbook\templates\generic\edit_template.html:32 msgid "View" msgstr "" @@ -1310,13 +1283,16 @@ msgstr "" msgid "Import all" msgstr "" +#: .\cookbook\templates\generic\new_template.html:6 +#: .\cookbook\templates\generic\new_template.html:14 +msgid "New" +msgstr "" + #: .\cookbook\templates\generic\table_template.html:76 -#: .\cookbook\templates\recipes_table.html:121 msgid "previous" msgstr "" #: .\cookbook\templates\generic\table_template.html:98 -#: .\cookbook\templates\recipes_table.html:143 msgid "next" msgstr "" @@ -1328,24 +1304,11 @@ msgstr "" msgid "Cook Log" msgstr "" -#: .\cookbook\templates\import.html:6 -msgid "Import Recipes" -msgstr "" - -#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 #: .\cookbook\templates\import_response.html:7 .\cookbook\views\delete.py:86 #: .\cookbook\views\edit.py:191 msgid "Import" msgstr "" -#: .\cookbook\templates\include\recipe_open_modal.html:18 -msgid "Close" -msgstr "" - -#: .\cookbook\templates\include\recipe_open_modal.html:32 -msgid "Open Recipe" -msgstr "" - #: .\cookbook\templates\include\storage_backend_warning.html:4 msgid "Security Warning" msgstr "" @@ -1522,31 +1485,6 @@ msgstr "" msgid "Cell" msgstr "" -#: .\cookbook\templates\meal_plan_entry.html:6 -msgid "Meal Plan View" -msgstr "" - -#: .\cookbook\templates\meal_plan_entry.html:18 -msgid "Created by" -msgstr "" - -#: .\cookbook\templates\meal_plan_entry.html:20 -msgid "Shared with" -msgstr "" - -#: .\cookbook\templates\meal_plan_entry.html:48 -#: .\cookbook\templates\recipes_table.html:64 -msgid "Last cooked" -msgstr "" - -#: .\cookbook\templates\meal_plan_entry.html:50 -msgid "Never cooked before." -msgstr "" - -#: .\cookbook\templates\meal_plan_entry.html:76 -msgid "Other meals on this day" -msgstr "" - #: .\cookbook\templates\no_groups_info.html:5 #: .\cookbook\templates\no_groups_info.html:12 msgid "No Permissions" @@ -1591,43 +1529,26 @@ msgstr "" msgid "Back" msgstr "" -#: .\cookbook\templates\recipe_view.html:26 +#: .\cookbook\templates\profile.html:7 +msgid "Profile" +msgstr "" + +#: .\cookbook\templates\recipe_view.html:41 msgid "by" msgstr "" -#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:144 +#: .\cookbook\templates\recipe_view.html:59 .\cookbook\views\delete.py:144 #: .\cookbook\views\edit.py:171 msgid "Comment" msgstr "" -#: .\cookbook\templates\recipes_table.html:19 -#: .\cookbook\templates\recipes_table.html:23 -msgid "Recipe Image" -msgstr "" - -#: .\cookbook\templates\recipes_table.html:51 -msgid "Preparation time ca." -msgstr "" - -#: .\cookbook\templates\recipes_table.html:57 -msgid "Waiting time ca." -msgstr "" - -#: .\cookbook\templates\recipes_table.html:60 -msgid "External" -msgstr "" - -#: .\cookbook\templates\recipes_table.html:86 -msgid "Log Cooking" -msgstr "" - #: .\cookbook\templates\rest_framework\api.html:5 msgid "Recipe Home" msgstr "" #: .\cookbook\templates\search_info.html:5 #: .\cookbook\templates\search_info.html:9 -#: .\cookbook\templates\settings.html:172 +#: .\cookbook\templates\settings.html:24 msgid "Search Settings" msgstr "" @@ -1782,127 +1703,57 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\settings.html:28 -msgid "Account" -msgstr "" - -#: .\cookbook\templates\settings.html:35 -msgid "Preferences" -msgstr "" - -#: .\cookbook\templates\settings.html:42 -msgid "API-Settings" -msgstr "" - -#: .\cookbook\templates\settings.html:49 -msgid "Search-Settings" -msgstr "" - -#: .\cookbook\templates\settings.html:56 -msgid "Shopping-Settings" -msgstr "" - -#: .\cookbook\templates\settings.html:65 -msgid "Name Settings" -msgstr "" - -#: .\cookbook\templates\settings.html:73 -msgid "Account Settings" -msgstr "" - -#: .\cookbook\templates\settings.html:75 -msgid "Emails" -msgstr "" - -#: .\cookbook\templates\settings.html:78 -#: .\cookbook\templates\socialaccount\connections.html:11 -msgid "Social" -msgstr "" - -#: .\cookbook\templates\settings.html:91 -msgid "Language" -msgstr "" - -#: .\cookbook\templates\settings.html:121 -msgid "Style" -msgstr "" - -#: .\cookbook\templates\settings.html:142 -msgid "API Token" -msgstr "" - -#: .\cookbook\templates\settings.html:143 -msgid "" -"You can use both basic authentication and token based authentication to " -"access the REST API." -msgstr "" - -#: .\cookbook\templates\settings.html:160 -msgid "" -"Use the token as an Authorization header prefixed by the word token as shown " -"in the following examples:" -msgstr "" - -#: .\cookbook\templates\settings.html:162 -msgid "or" -msgstr "" - -#: .\cookbook\templates\settings.html:173 +#: .\cookbook\templates\settings.html:25 msgid "" "There are many options to configure the search depending on your personal " "preferences." msgstr "" -#: .\cookbook\templates\settings.html:174 +#: .\cookbook\templates\settings.html:26 msgid "" "Usually you do not need to configure any of them and can just stick " "with either the default or one of the following presets." msgstr "" -#: .\cookbook\templates\settings.html:175 +#: .\cookbook\templates\settings.html:27 msgid "" "If you do want to configure the search you can read about the different " "options here." msgstr "" -#: .\cookbook\templates\settings.html:180 +#: .\cookbook\templates\settings.html:32 msgid "Fuzzy" msgstr "" -#: .\cookbook\templates\settings.html:181 +#: .\cookbook\templates\settings.html:33 msgid "" "Find what you need even if your search or the recipe contains typos. Might " "return more results than needed to make sure you find what you are looking " "for." msgstr "" -#: .\cookbook\templates\settings.html:182 +#: .\cookbook\templates\settings.html:34 msgid "This is the default behavior" msgstr "" -#: .\cookbook\templates\settings.html:183 -#: .\cookbook\templates\settings.html:191 +#: .\cookbook\templates\settings.html:37 .\cookbook\templates\settings.html:46 msgid "Apply" msgstr "" -#: .\cookbook\templates\settings.html:188 +#: .\cookbook\templates\settings.html:42 msgid "Precise" msgstr "" -#: .\cookbook\templates\settings.html:189 +#: .\cookbook\templates\settings.html:43 msgid "" "Allows fine control over search results but might not return results if too " "many spelling mistakes are made." msgstr "" -#: .\cookbook\templates\settings.html:190 +#: .\cookbook\templates\settings.html:44 msgid "Perfect for large Databases" msgstr "" -#: .\cookbook\templates\settings.html:207 -msgid "Shopping Settings" -msgstr "" - #: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5 msgid "Cookbook Setup" msgstr "" @@ -1935,6 +1786,10 @@ msgstr "" msgid "Account Connections" msgstr "" +#: .\cookbook\templates\socialaccount\connections.html:11 +msgid "Social" +msgstr "" + #: .\cookbook\templates\socialaccount\connections.html:18 msgid "" "You can sign in to your account using any of the following third party\n" @@ -2027,70 +1882,42 @@ msgid "" "You can either be invited into an existing space or create your own one." msgstr "" -#: .\cookbook\templates\space_overview.html:45 +#: .\cookbook\templates\space_overview.html:53 msgid "Owner" msgstr "" -#: .\cookbook\templates\space_overview.html:49 +#: .\cookbook\templates\space_overview.html:57 msgid "Leave Space" msgstr "" -#: .\cookbook\templates\space_overview.html:70 -#: .\cookbook\templates\space_overview.html:80 +#: .\cookbook\templates\space_overview.html:78 +#: .\cookbook\templates\space_overview.html:88 msgid "Join Space" msgstr "" -#: .\cookbook\templates\space_overview.html:73 +#: .\cookbook\templates\space_overview.html:81 msgid "Join an existing space." msgstr "" -#: .\cookbook\templates\space_overview.html:75 +#: .\cookbook\templates\space_overview.html:83 msgid "" "To join an existing space either enter your invite token or click on the " "invite link the space owner send you." msgstr "" -#: .\cookbook\templates\space_overview.html:88 -#: .\cookbook\templates\space_overview.html:97 +#: .\cookbook\templates\space_overview.html:96 +#: .\cookbook\templates\space_overview.html:105 msgid "Create Space" msgstr "" -#: .\cookbook\templates\space_overview.html:91 +#: .\cookbook\templates\space_overview.html:99 msgid "Create your own recipe space." msgstr "" -#: .\cookbook\templates\space_overview.html:93 +#: .\cookbook\templates\space_overview.html:101 msgid "Start your own recipe space and invite other users to it." msgstr "" -#: .\cookbook\templates\stats.html:4 -msgid "Stats" -msgstr "" - -#: .\cookbook\templates\stats.html:10 -msgid "Statistics" -msgstr "" - -#: .\cookbook\templates\stats.html:19 -msgid "Number of objects" -msgstr "" - -#: .\cookbook\templates\stats.html:30 -msgid "Recipe Imports" -msgstr "" - -#: .\cookbook\templates\stats.html:38 -msgid "Objects stats" -msgstr "" - -#: .\cookbook\templates\stats.html:41 -msgid "Recipes without Keywords" -msgstr "" - -#: .\cookbook\templates\stats.html:45 -msgid "Internal Recipes" -msgstr "" - #: .\cookbook\templates\system.html:20 msgid "System Information" msgstr "" @@ -2188,249 +2015,262 @@ msgstr "" msgid "URL Import" msgstr "" -#: .\cookbook\views\api.py:105 .\cookbook\views\api.py:197 +#: .\cookbook\views\api.py:110 .\cookbook\views\api.py:202 msgid "Parameter updated_at incorrectly formatted" msgstr "" -#: .\cookbook\views\api.py:217 .\cookbook\views\api.py:320 +#: .\cookbook\views\api.py:222 .\cookbook\views\api.py:325 +#, python-brace-format msgid "No {self.basename} with id {pk} exists" msgstr "" -#: .\cookbook\views\api.py:221 +#: .\cookbook\views\api.py:226 msgid "Cannot merge with the same object!" msgstr "" -#: .\cookbook\views\api.py:228 +#: .\cookbook\views\api.py:233 +#, python-brace-format msgid "No {self.basename} with id {target} exists" msgstr "" -#: .\cookbook\views\api.py:233 +#: .\cookbook\views\api.py:238 msgid "Cannot merge with child object!" msgstr "" -#: .\cookbook\views\api.py:266 +#: .\cookbook\views\api.py:271 +#, python-brace-format msgid "{source.name} was merged successfully with {target.name}" msgstr "" -#: .\cookbook\views\api.py:271 +#: .\cookbook\views\api.py:276 +#, python-brace-format msgid "An error occurred attempting to merge {source.name} with {target.name}" msgstr "" -#: .\cookbook\views\api.py:329 +#: .\cookbook\views\api.py:334 +#, python-brace-format msgid "{child.name} was moved successfully to the root." msgstr "" -#: .\cookbook\views\api.py:332 .\cookbook\views\api.py:350 +#: .\cookbook\views\api.py:337 .\cookbook\views\api.py:355 msgid "An error occurred attempting to move " msgstr "" -#: .\cookbook\views\api.py:335 +#: .\cookbook\views\api.py:340 msgid "Cannot move an object to itself!" msgstr "" -#: .\cookbook\views\api.py:341 +#: .\cookbook\views\api.py:346 +#, python-brace-format msgid "No {self.basename} with id {parent} exists" msgstr "" -#: .\cookbook\views\api.py:347 +#: .\cookbook\views\api.py:352 +#, python-brace-format msgid "{child.name} was moved successfully to parent {parent.name}" msgstr "" -#: .\cookbook\views\api.py:542 +#: .\cookbook\views\api.py:553 +#, python-brace-format msgid "{obj.name} was removed from the shopping list." msgstr "" -#: .\cookbook\views\api.py:547 .\cookbook\views\api.py:879 -#: .\cookbook\views\api.py:892 +#: .\cookbook\views\api.py:558 .\cookbook\views\api.py:888 +#: .\cookbook\views\api.py:901 +#, python-brace-format msgid "{obj.name} was added to the shopping list." msgstr "" -#: .\cookbook\views\api.py:674 +#: .\cookbook\views\api.py:685 msgid "ID of recipe a step is part of. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:676 +#: .\cookbook\views\api.py:687 msgid "Query string matched (fuzzy) against object name." msgstr "" -#: .\cookbook\views\api.py:720 +#: .\cookbook\views\api.py:731 msgid "" "Query string matched (fuzzy) against recipe name. In the future also " "fulltext search." msgstr "" -#: .\cookbook\views\api.py:722 +#: .\cookbook\views\api.py:733 msgid "" "ID of keyword a recipe should have. For multiple repeat parameter. " "Equivalent to keywords_or" msgstr "" -#: .\cookbook\views\api.py:725 +#: .\cookbook\views\api.py:736 msgid "" "Keyword IDs, repeat for multiple. Return recipes with any of the keywords" msgstr "" -#: .\cookbook\views\api.py:728 +#: .\cookbook\views\api.py:739 msgid "" "Keyword IDs, repeat for multiple. Return recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:742 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords." msgstr "" -#: .\cookbook\views\api.py:734 +#: .\cookbook\views\api.py:745 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:736 +#: .\cookbook\views\api.py:747 msgid "ID of food a recipe should have. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:739 +#: .\cookbook\views\api.py:750 msgid "Food IDs, repeat for multiple. Return recipes with any of the foods" msgstr "" -#: .\cookbook\views\api.py:741 +#: .\cookbook\views\api.py:752 msgid "Food IDs, repeat for multiple. Return recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:743 +#: .\cookbook\views\api.py:754 msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods." msgstr "" -#: .\cookbook\views\api.py:745 +#: .\cookbook\views\api.py:756 msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:746 +#: .\cookbook\views\api.py:757 msgid "ID of unit a recipe should have." msgstr "" -#: .\cookbook\views\api.py:748 +#: .\cookbook\views\api.py:759 msgid "" "Rating a recipe should have or greater. [0 - 5] Negative value filters " "rating less than." msgstr "" -#: .\cookbook\views\api.py:749 +#: .\cookbook\views\api.py:760 msgid "ID of book a recipe should be in. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:751 +#: .\cookbook\views\api.py:762 msgid "Book IDs, repeat for multiple. Return recipes with any of the books" msgstr "" -#: .\cookbook\views\api.py:753 +#: .\cookbook\views\api.py:764 msgid "Book IDs, repeat for multiple. Return recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:755 +#: .\cookbook\views\api.py:766 msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books." msgstr "" -#: .\cookbook\views\api.py:757 +#: .\cookbook\views\api.py:768 msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:759 +#: .\cookbook\views\api.py:770 msgid "If only internal recipes should be returned. [true/false]" msgstr "" -#: .\cookbook\views\api.py:761 +#: .\cookbook\views\api.py:772 msgid "Returns the results in randomized order. [true/false]" msgstr "" -#: .\cookbook\views\api.py:763 +#: .\cookbook\views\api.py:774 msgid "Returns new results first in search results. [true/false]" msgstr "" -#: .\cookbook\views\api.py:765 +#: .\cookbook\views\api.py:776 msgid "" "Filter recipes cooked X times or more. Negative values returns cooked less " "than X times" msgstr "" -#: .\cookbook\views\api.py:767 +#: .\cookbook\views\api.py:778 msgid "" "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:769 +#: .\cookbook\views\api.py:780 msgid "" "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:771 +#: .\cookbook\views\api.py:782 msgid "" "Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:773 +#: .\cookbook\views\api.py:784 msgid "" "Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:775 +#: .\cookbook\views\api.py:786 msgid "Filter recipes that can be made with OnHand food. [true/false]" msgstr "" -#: .\cookbook\views\api.py:937 +#: .\cookbook\views\api.py:946 msgid "" "Returns the shopping list entry with a primary key of id. Multiple values " "allowed." msgstr "" -#: .\cookbook\views\api.py:942 +#: .\cookbook\views\api.py:951 msgid "" -"Filter shopping list entries on checked. [true, false, both, recent]" -"
    - recent includes unchecked items and recently completed items." +"Filter shopping list entries on checked. [true, false, both, recent]
    - recent includes unchecked items and recently completed items." msgstr "" -#: .\cookbook\views\api.py:945 +#: .\cookbook\views\api.py:954 msgid "Returns the shopping list entries sorted by supermarket category order." msgstr "" -#: .\cookbook\views\api.py:1140 +#: .\cookbook\views\api.py:1166 msgid "Nothing to do." msgstr "" -#: .\cookbook\views\api.py:1160 +#: .\cookbook\views\api.py:1198 msgid "Invalid Url" msgstr "" -#: .\cookbook\views\api.py:1167 +#: .\cookbook\views\api.py:1205 msgid "Connection Refused." msgstr "" -#: .\cookbook\views\api.py:1172 +#: .\cookbook\views\api.py:1210 msgid "Bad URL Schema." msgstr "" -#: .\cookbook\views\api.py:1195 +#: .\cookbook\views\api.py:1233 msgid "No usable data could be found." msgstr "" -#: .\cookbook\views\api.py:1303 .\cookbook\views\data.py:28 +#: .\cookbook\views\api.py:1326 .\cookbook\views\import_export.py:117 +msgid "Importing is not implemented for this provider" +msgstr "" + +#: .\cookbook\views\api.py:1372 .\cookbook\views\data.py:31 #: .\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:1325 +#: .\cookbook\views\api.py:1394 msgid "Sync successful!" msgstr "" -#: .\cookbook\views\api.py:1330 +#: .\cookbook\views\api.py:1399 msgid "Error synchronizing with Storage" msgstr "" -#: .\cookbook\views\data.py:97 +#: .\cookbook\views\data.py:100 #, python-format msgid "Batch edit done. %(count)d recipe was updated." msgid_plural "Batch edit done. %(count)d Recipes where updated." @@ -2487,11 +2327,7 @@ msgstr "" msgid "Error saving changes!" msgstr "" -#: .\cookbook\views\import_export.py:111 .\cookbook\views\import_export.py:150 -msgid "Importing is not implemented for this provider" -msgstr "" - -#: .\cookbook\views\import_export.py:137 +#: .\cookbook\views\import_export.py:104 msgid "" "The PDF Exporter is not enabled on this instance as it is still in an " "experimental state." @@ -2537,72 +2373,73 @@ msgstr "" msgid "There was an error importing this recipe!" msgstr "" -#: .\cookbook\views\views.py:124 +#: .\cookbook\views\views.py:73 .\cookbook\views\views.py:191 +#: .\cookbook\views\views.py:213 .\cookbook\views\views.py:399 +msgid "This feature is not available in the demo version!" +msgstr "" + +#: .\cookbook\views\views.py:89 msgid "" "You have successfully created your own recipe space. Start by adding some " "recipes or invite other people to join you." msgstr "" -#: .\cookbook\views\views.py:178 +#: .\cookbook\views\views.py:143 msgid "You do not have the required permissions to perform this action!" msgstr "" -#: .\cookbook\views\views.py:189 +#: .\cookbook\views\views.py:154 msgid "Comment saved!" msgstr "" -#: .\cookbook\views\views.py:264 -msgid "This feature is not available in the demo version!" -msgstr "" - -#: .\cookbook\views\views.py:324 +#: .\cookbook\views\views.py:253 msgid "You must select at least one field to search!" msgstr "" -#: .\cookbook\views\views.py:329 +#: .\cookbook\views\views.py:258 msgid "" "To use this search method you must select at least one full text search " "field!" msgstr "" -#: .\cookbook\views\views.py:333 +#: .\cookbook\views\views.py:262 msgid "Fuzzy search is not compatible with this search method!" msgstr "" -#: .\cookbook\views\views.py:463 +#: .\cookbook\views\views.py:338 msgid "" "The setup page can only be used to create the first user! If you have " "forgotten your superuser credentials please consult the django documentation " "on how to reset passwords." msgstr "" -#: .\cookbook\views\views.py:470 +#: .\cookbook\views\views.py:345 msgid "Passwords dont match!" msgstr "" -#: .\cookbook\views\views.py:478 +#: .\cookbook\views\views.py:353 msgid "User has been created, please login!" msgstr "" -#: .\cookbook\views\views.py:494 +#: .\cookbook\views\views.py:369 msgid "Malformed Invite Link supplied!" msgstr "" -#: .\cookbook\views\views.py:510 +#: .\cookbook\views\views.py:386 msgid "Successfully joined space." msgstr "" -#: .\cookbook\views\views.py:516 +#: .\cookbook\views\views.py:392 msgid "Invite Link not valid or already used!" msgstr "" -#: .\cookbook\views\views.py:530 +#: .\cookbook\views\views.py:409 msgid "" "Reporting share links is not enabled for this instance. Please notify the " "page administrator to report problems." msgstr "" -#: .\cookbook\views\views.py:536 +#: .\cookbook\views\views.py:415 msgid "" "Recipe sharing link has been disabled! For additional information please " "contact the page administrator." diff --git a/cookbook/locale/ro/LC_MESSAGES/django.mo b/cookbook/locale/ro/LC_MESSAGES/django.mo index acb36632e..5d9c9507c 100644 Binary files a/cookbook/locale/ro/LC_MESSAGES/django.mo and b/cookbook/locale/ro/LC_MESSAGES/django.mo differ diff --git a/cookbook/locale/ro/LC_MESSAGES/django.po b/cookbook/locale/ro/LC_MESSAGES/django.po index 7cd2aecef..f8867bdab 100644 --- a/cookbook/locale/ro/LC_MESSAGES/django.po +++ b/cookbook/locale/ro/LC_MESSAGES/django.po @@ -8,113 +8,123 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-11-08 16:27+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" +"PO-Revision-Date: 2023-04-27 08:55+0000\n" +"Last-Translator: noxonad \n" +"Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2;\n" +"X-Generator: Weblate 4.15\n" #: .\cookbook\filters.py:23 .\cookbook\templates\base.html:125 #: .\cookbook\templates\forms\ingredients.html:34 #: .\cookbook\templates\space.html:43 .\cookbook\templates\stats.html:28 #: .\cookbook\templates\url_import.html:274 msgid "Ingredients" -msgstr "" +msgstr "Ingrediente" #: .\cookbook\forms.py:54 msgid "Default unit" -msgstr "" +msgstr "Unitate implicită" #: .\cookbook\forms.py:55 msgid "Use fractions" -msgstr "" +msgstr "Utilizare fracții" #: .\cookbook\forms.py:56 msgid "Use KJ" -msgstr "" +msgstr "Utilizare KJ" #: .\cookbook\forms.py:57 msgid "Theme" -msgstr "" +msgstr "Teme" #: .\cookbook\forms.py:58 msgid "Navbar color" -msgstr "" +msgstr "Culoarea barei de navigare" #: .\cookbook\forms.py:59 msgid "Sticky navbar" -msgstr "" +msgstr "Bară de navigare lipicioasă" #: .\cookbook\forms.py:60 msgid "Default page" -msgstr "" +msgstr "Pagină implicită" #: .\cookbook\forms.py:61 msgid "Show recent recipes" -msgstr "" +msgstr "Afișează rețete recente" #: .\cookbook\forms.py:62 msgid "Search style" -msgstr "" +msgstr "Căutare stil" #: .\cookbook\forms.py:63 msgid "Plan sharing" -msgstr "" +msgstr "Partajarea planurilor" #: .\cookbook\forms.py:64 msgid "Ingredient decimal places" -msgstr "" +msgstr "Zecimale ale ingredientelor" #: .\cookbook\forms.py:65 msgid "Shopping list auto sync period" -msgstr "" +msgstr "Perioada de sincronizare automată a listei de cumpărături" #: .\cookbook\forms.py:66 .\cookbook\templates\recipe_view.html:21 #: .\cookbook\templates\space.html:62 .\cookbook\templates\stats.html:47 msgid "Comments" -msgstr "" +msgstr "Comentarii" #: .\cookbook\forms.py:70 msgid "" "Color of the top navigation bar. Not all colors work with all themes, just " "try them out!" msgstr "" +"Culoarea barei de navigare de sus. Nu toate culorile funcționează cu toate " +"temele, doar încercați-le!" #: .\cookbook\forms.py:72 msgid "Default Unit to be used when inserting a new ingredient into a recipe." msgstr "" +"Unitate implicită care trebuie utilizată la introducerea unui ingredient nou " +"într-o rețetă." #: .\cookbook\forms.py:74 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" msgstr "" +"Permite suport pentru fracții în cantități de ingrediente (de exemplu, " +"conversia zecimalelor în fracții automat)" #: .\cookbook\forms.py:76 msgid "Display nutritional energy amounts in joules instead of calories" -msgstr "" +msgstr "Afișați cantitățile de energie nutrițională în Jouli în loc de calorii" #: .\cookbook\forms.py:78 msgid "" "Users with whom newly created meal plan/shopping list entries should be " "shared by default." msgstr "" +"Utilizatorii cu care intrările din planul alimentar/lista de cumpărături nou " +"create ar trebui să fie partajate în mod implicit." #: .\cookbook\forms.py:80 msgid "Show recently viewed recipes on search page." -msgstr "" +msgstr "Afișați rețetele vizualizate recent pe pagina de căutare." #: .\cookbook\forms.py:81 msgid "Number of decimals to round ingredients." -msgstr "" +msgstr "Numărul de zecimale la ingrediente rotunde." #: .\cookbook\forms.py:82 msgid "If you want to be able to create and see comments underneath recipes." -msgstr "" +msgstr "Dacă doriți să puteți crea și vedea comentarii sub rețete." #: .\cookbook\forms.py:84 msgid "" @@ -123,211 +133,250 @@ msgid "" "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." msgstr "" +"Setarea la 0 va dezactiva sincronizarea automată. Atunci când vizualizați o " +"listă de cumpărături, lista este actualizată la fiecare câteva secunde " +"setate pentru a sincroniza modificările pe care altcineva le-ar fi putut " +"face. Util atunci când faceți cumpărături cu mai multe persoane, dar ar " +"putea folosi un pic de date mobile. Dacă este mai mică decât limita " +"instanței, aceasta este resetată la salvare." #: .\cookbook\forms.py:87 msgid "Makes the navbar stick to the top of the page." -msgstr "" +msgstr "Face ca bara de navigare să se lipească în partea de sus a paginii." #: .\cookbook\forms.py:103 msgid "" "Both fields are optional. If none are given the username will be displayed " "instead" msgstr "" +"Ambele câmpuri sunt opționale. Dacă niciuna nu este setată, numele de " +"utilizator va fi afișată în schimb" #: .\cookbook\forms.py:124 .\cookbook\forms.py:289 #: .\cookbook\templates\url_import.html:158 msgid "Name" -msgstr "" +msgstr "Nume" #: .\cookbook\forms.py:125 .\cookbook\forms.py:290 #: .\cookbook\templates\space.html:39 .\cookbook\templates\stats.html:24 #: .\cookbook\templates\url_import.html:192 #: .\cookbook\templates\url_import.html:578 .\cookbook\views\lists.py:112 msgid "Keywords" -msgstr "" +msgstr "Cuvinte cheie" #: .\cookbook\forms.py:126 msgid "Preparation time in minutes" -msgstr "" +msgstr "Timp de pregătire în minute" #: .\cookbook\forms.py:127 msgid "Waiting time (cooking/baking) in minutes" -msgstr "" +msgstr "Timp de așteptare (gătit/coacere) în minute" #: .\cookbook\forms.py:128 .\cookbook\forms.py:259 .\cookbook\forms.py:291 msgid "Path" -msgstr "" +msgstr "Drum" #: .\cookbook\forms.py:129 msgid "Storage UID" -msgstr "" +msgstr "UID de stocare" #: .\cookbook\forms.py:157 msgid "Default" -msgstr "" +msgstr "Standard" #: .\cookbook\forms.py:168 .\cookbook\templates\url_import.html:94 msgid "" "To prevent duplicates recipes with the same name as existing ones are " "ignored. Check this box to import everything." msgstr "" +"Pentru a preveni duplicatele, rețetele cu același nume ca și cele existente " +"sunt ignorate. Bifați această casetă pentru a importa totul." #: .\cookbook\forms.py:190 msgid "Add your comment: " -msgstr "" +msgstr "Adaugă comentariul tău: " #: .\cookbook\forms.py:205 msgid "Leave empty for dropbox and enter app password for nextcloud." msgstr "" +"Lăsați gol pentru dropbox și introduceți parola aplicației pentru nextcloud." #: .\cookbook\forms.py:212 msgid "Leave empty for nextcloud and enter api token for dropbox." -msgstr "" +msgstr "Lăsați gol pentru nextcloud și introduceți token-ul API pentru dropbox." #: .\cookbook\forms.py:221 msgid "" "Leave empty for dropbox and enter only base url for nextcloud (/remote." "php/webdav/ is added automatically)" msgstr "" +"Lăsați gol pentru dropbox și introduceți numai URL-ul de bază pentru " +"nextcloud (/remote.php/webdav/ este adăugat automat)" #: .\cookbook\forms.py:258 .\cookbook\views\edit.py:166 msgid "Storage" -msgstr "" +msgstr "Stocare" #: .\cookbook\forms.py:260 msgid "Active" -msgstr "" +msgstr "Activ" #: .\cookbook\forms.py:265 msgid "Search String" -msgstr "" +msgstr "Șir de căutare" #: .\cookbook\forms.py:292 msgid "File ID" -msgstr "" +msgstr "ID-ul fișierului" #: .\cookbook\forms.py:313 msgid "You must provide at least a recipe or a title." -msgstr "" +msgstr "Trebuie să furnizați cel puțin o rețetă sau un titlu." #: .\cookbook\forms.py:326 msgid "You can list default users to share recipes with in the settings." msgstr "" +"Puteți lista utilizatorii impliciți cu care să partajați rețete în setări." #: .\cookbook\forms.py:327 msgid "" "You can use markdown to format this field. See the docs here" msgstr "" +"Puteți utiliza markdown pentru a formata acest câmp. Vezi documentația aici" #: .\cookbook\forms.py:353 msgid "Maximum number of users for this space reached." -msgstr "" +msgstr "Numărul maxim de utilizatori pentru acest spațiu atins." #: .\cookbook\forms.py:359 msgid "Email address already taken!" -msgstr "" +msgstr "Adresa de e-mail deja în uz!" #: .\cookbook\forms.py:367 msgid "" "An email address is not required but if present the invite link will be sent " "to the user." msgstr "" +"Nu este necesară o adresă de e-mail, dar dacă este prezentă, linkul de " +"invitație va fi trimis utilizatorului." #: .\cookbook\forms.py:382 msgid "Name already taken." -msgstr "" +msgstr "Nume deja în uz." #: .\cookbook\forms.py:393 msgid "Accept Terms and Privacy" -msgstr "" +msgstr "Acceptă condițiile și politicile de confidențialitate" #: .\cookbook\forms.py:425 msgid "" "Determines how fuzzy a search is if it uses trigram similarity matching (e." "g. low values mean more typos are ignored)." msgstr "" +"Determină cât de vagă este o căutare dacă utilizează potrivirea " +"similitudinii trigramelor (de exemplu, valorile scăzute înseamnă că mai " +"multe greșeli de scriere sunt ignorate)." #: .\cookbook\forms.py:435 msgid "" "Select type method of search. Click here for " "full desciption of choices." msgstr "" +"Selectează metoda de căutare. Apasă aici " +"pentru descrierea completă a alegerilor." #: .\cookbook\forms.py:436 msgid "" "Use fuzzy matching on units, keywords and ingredients when editing and " "importing recipes." msgstr "" +"Utilizați potrivirea vagă pe unități, cuvinte cheie și ingrediente atunci " +"când editați și importați rețete." #: .\cookbook\forms.py:438 msgid "" "Fields to search ignoring accents. Selecting this option can improve or " "degrade search quality depending on language" msgstr "" +"Câmpuri pentru a căuta ignorând accente. Selectarea acestei opțiuni poate " +"îmbunătăți sau degrada calitatea căutării în funcție de limbă" #: .\cookbook\forms.py:440 msgid "" "Fields to search for partial matches. (e.g. searching for 'Pie' will return " "'pie' and 'piece' and 'soapie')" msgstr "" +"Câmpuri pentru a căuta potriviri parțiale. (de exemplu, căutarea " +"'Plăcintei' va returna 'plăcintă' și 'plăci' și 'simplă')" #: .\cookbook\forms.py:442 msgid "" "Fields to search for beginning of word matches. (e.g. searching for 'sa' " "will return 'salad' and 'sandwich')" msgstr "" +"Câmpuri pentru a căuta începutul potrivirilor de cuvinte. (ex. căutarea 'sa' " +"va returna 'salată' și 'sandwich')" #: .\cookbook\forms.py:444 msgid "" "Fields to 'fuzzy' search. (e.g. searching for 'recpie' will find 'recipe'.) " "Note: this option will conflict with 'web' and 'raw' methods of search." msgstr "" +"Câmpuri pentru căutarea 'vagă'. (ex., căutarea 'rețetă' va găsi 'rețetă'. " +"Notă: această opțiune va intra în conflict cu metodele de căutare 'web' și " +"'raw'." #: .\cookbook\forms.py:446 msgid "" "Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " "only function with fulltext fields." msgstr "" +"Câmpuri pentru căutarea completă a textului. Notă: metodele de căutare " +"'web', 'frază' și 'raw' funcționează numai cu câmpuri full-text." #: .\cookbook\forms.py:450 msgid "Search Method" -msgstr "" +msgstr "Metodă de căutare" #: .\cookbook\forms.py:451 msgid "Fuzzy Lookups" -msgstr "" +msgstr "Căutare vagă" #: .\cookbook\forms.py:452 msgid "Ignore Accent" -msgstr "" +msgstr "Ignoră accent" #: .\cookbook\forms.py:453 msgid "Partial Match" -msgstr "" +msgstr "Potrivire parțială" #: .\cookbook\forms.py:454 msgid "Starts Wtih" -msgstr "" +msgstr "Începe cu" #: .\cookbook\forms.py:455 msgid "Fuzzy Search" -msgstr "" +msgstr "Căutare vagă" #: .\cookbook\forms.py:456 msgid "Full Text" -msgstr "" +msgstr "Text complet" #: .\cookbook\helper\AllAuthCustomAdapter.py:36 msgid "" "In order to prevent spam, the requested email was not send. Please wait a " "few minutes and try again." msgstr "" +"Pentru a preveni spam-ul, e-mailul solicitat nu a fost trimis. Vă rugăm să " +"așteptați câteva minute și încercați din nou." #: .\cookbook\helper\permission_helper.py:136 #: .\cookbook\helper\permission_helper.py:159 .\cookbook\views\views.py:149 msgid "You are not logged in and therefore cannot view this page!" msgstr "" +"Nu sunteți conectat și, prin urmare, nu puteți vizualiza această pagină!" #: .\cookbook\helper\permission_helper.py:140 #: .\cookbook\helper\permission_helper.py:146 @@ -339,18 +388,18 @@ msgstr "" #: .\cookbook\views\views.py:160 .\cookbook\views\views.py:167 #: .\cookbook\views\views.py:233 msgid "You do not have the required permissions to view this page!" -msgstr "" +msgstr "Nu aveți permisiunile necesare pentru a vizualiza această pagină!" #: .\cookbook\helper\permission_helper.py:164 #: .\cookbook\helper\permission_helper.py:187 #: .\cookbook\helper\permission_helper.py:202 msgid "You cannot interact with this object as it is not owned by you!" -msgstr "" +msgstr "Nu poți interacționa cu acest obiect, deoarece nu este deținut de tine!" #: .\cookbook\helper\template_helper.py:61 #: .\cookbook\helper\template_helper.py:63 msgid "Could not parse template code." -msgstr "" +msgstr "Nu s-a putut analiza codul șablonului." #: .\cookbook\integration\integration.py:126 #: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 @@ -363,191 +412,199 @@ msgstr "" #: .\cookbook\templates\url_import.html:609 .\cookbook\views\delete.py:89 #: .\cookbook\views\edit.py:200 msgid "Import" -msgstr "" +msgstr "Importă" #: .\cookbook\integration\integration.py:208 msgid "" "Importer expected a .zip file. Did you choose the correct importer type for " "your data ?" msgstr "" +"Importatorul se aștepta la un fișier.zip. Ați ales tipul corect de " +"importator pentru datele dvs.?" #: .\cookbook\integration\integration.py:211 msgid "" "An unexpected error occurred during the import. Please make sure you have " "uploaded a valid file." msgstr "" +"A apărut o eroare neașteptată în timpul importului. Asigurați-vă că ați " +"încărcat un fișier valid." #: .\cookbook\integration\integration.py:216 msgid "The following recipes were ignored because they already existed:" -msgstr "" +msgstr "Următoarele rețete au fost ignorate pentru că existau deja:" #: .\cookbook\integration\integration.py:220 #, python-format msgid "Imported %s recipes." -msgstr "" +msgstr "%s rețete importate." #: .\cookbook\integration\paprika.py:46 msgid "Notes" -msgstr "" +msgstr "Note" #: .\cookbook\integration\paprika.py:49 msgid "Nutritional Information" -msgstr "" +msgstr "Informații nutriționale" #: .\cookbook\integration\paprika.py:53 .\cookbook\templates\url_import.html:40 msgid "Source" -msgstr "" +msgstr "Sursă" #: .\cookbook\integration\safron.py:23 #: .\cookbook\templates\include\log_cooking.html:16 #: .\cookbook\templates\url_import.html:228 #: .\cookbook\templates\url_import.html:459 msgid "Servings" -msgstr "" +msgstr "Porții" #: .\cookbook\integration\safron.py:25 msgid "Waiting time" -msgstr "" +msgstr "Timp de așteptare" #: .\cookbook\integration\safron.py:27 msgid "Preparation Time" -msgstr "" +msgstr "Timp de pregătire" #: .\cookbook\integration\safron.py:29 .\cookbook\templates\base.html:78 #: .\cookbook\templates\forms\ingredients.html:7 #: .\cookbook\templates\index.html:7 msgid "Cookbook" -msgstr "" +msgstr "Bucate" #: .\cookbook\integration\safron.py:31 msgid "Section" -msgstr "" +msgstr "Secțiune" #: .\cookbook\management\commands\rebuildindex.py:14 msgid "Rebuilds full text search index on Recipe" -msgstr "" +msgstr "Reconstruiește indexul de căutare text complet pe rețetă" #: .\cookbook\management\commands\rebuildindex.py:18 msgid "Only Postgress databases use full text search, no index to rebuild" msgstr "" +"Numai bazele de date Postgress utilizează căutare text complet, nici un " +"index de reconstruit" #: .\cookbook\management\commands\rebuildindex.py:29 msgid "Recipe index rebuild complete." -msgstr "" +msgstr "Index rețetă reconstruit complet." #: .\cookbook\management\commands\rebuildindex.py:31 msgid "Recipe index rebuild failed." -msgstr "" +msgstr "Reconstruirea index-ului rețetă nu a reușit." #: .\cookbook\migrations\0047_auto_20200602_1133.py:14 msgid "Breakfast" -msgstr "" +msgstr "Mic dejun" #: .\cookbook\migrations\0047_auto_20200602_1133.py:19 msgid "Lunch" -msgstr "" +msgstr "Prânz" #: .\cookbook\migrations\0047_auto_20200602_1133.py:24 msgid "Dinner" -msgstr "" +msgstr "Cină" #: .\cookbook\migrations\0047_auto_20200602_1133.py:29 msgid "Other" -msgstr "" +msgstr "Altele" #: .\cookbook\models.py:150 msgid "" "Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " "upload." msgstr "" +"Spațiu maxim de stocare a fișierelor pentru spațiu în MB. 0 pentru " +"nelimitat, -1 pentru a dezactiva încărcarea fișierelor." #: .\cookbook\models.py:202 .\cookbook\templates\search.html:7 #: .\cookbook\templates\shopping_list.html:59 msgid "Search" -msgstr "" +msgstr "Căutare" #: .\cookbook\models.py:203 .\cookbook\templates\base.html:82 #: .\cookbook\templates\meal_plan.html:7 #: .\cookbook\templates\meal_plan_new.html:7 .\cookbook\views\delete.py:181 #: .\cookbook\views\edit.py:220 .\cookbook\views\new.py:184 msgid "Meal-Plan" -msgstr "" +msgstr "Plan de alimentare" #: .\cookbook\models.py:204 .\cookbook\templates\base.html:90 msgid "Books" -msgstr "" +msgstr "Cărți" #: .\cookbook\models.py:212 msgid "Small" -msgstr "" +msgstr "Mic" #: .\cookbook\models.py:212 msgid "Large" -msgstr "" +msgstr "Mare" #: .\cookbook\models.py:212 .\cookbook\templates\generic\new_template.html:6 #: .\cookbook\templates\generic\new_template.html:14 msgid "New" -msgstr "" +msgstr "Nou" #: .\cookbook\models.py:396 msgid " is part of a recipe step and cannot be deleted" -msgstr "" +msgstr " face parte dintr-un pas de rețetă și nu poate fi șters" #: .\cookbook\models.py:441 .\cookbook\templates\url_import.html:42 msgid "Text" -msgstr "" +msgstr "Text" #: .\cookbook\models.py:441 msgid "Time" -msgstr "" +msgstr "Timp" #: .\cookbook\models.py:441 .\cookbook\templates\url_import.html:44 msgid "File" -msgstr "" +msgstr "Fișier" #: .\cookbook\models.py:441 #: .\cookbook\templates\include\recipe_open_modal.html:7 #: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260 #: .\cookbook\views\new.py:53 msgid "Recipe" -msgstr "" +msgstr "Rețetă" #: .\cookbook\models.py:871 .\cookbook\templates\search_info.html:28 msgid "Simple" -msgstr "" +msgstr "Simplu" #: .\cookbook\models.py:872 .\cookbook\templates\search_info.html:33 msgid "Phrase" -msgstr "" +msgstr "Frază" #: .\cookbook\models.py:873 .\cookbook\templates\search_info.html:38 msgid "Web" -msgstr "" +msgstr "Web" #: .\cookbook\models.py:874 .\cookbook\templates\search_info.html:47 msgid "Raw" -msgstr "" +msgstr "Crud" #: .\cookbook\models.py:912 msgid "Food Alias" -msgstr "" +msgstr "Pseudonim produse alimentare" #: .\cookbook\models.py:912 msgid "Unit Alias" -msgstr "" +msgstr "Pseudonim unități" #: .\cookbook\models.py:912 msgid "Keyword Alias" -msgstr "" +msgstr "Pseudonim cuvânt cheie" #: .\cookbook\serializer.py:157 msgid "File uploads are not enabled for this Space." -msgstr "" +msgstr "Încărcările de fișiere nu sunt permise pentru acest spațiu." #: .\cookbook\serializer.py:168 msgid "You have reached your file upload limit." -msgstr "" +msgstr "Ați atins limita de încărcare a fișierelor." #: .\cookbook\tables.py:35 .\cookbook\templates\generic\edit_template.html:6 #: .\cookbook\templates\generic\edit_template.html:14 @@ -555,7 +612,7 @@ msgstr "" #: .\cookbook\templates\shopping_list.html:40 #: .\cookbook\templates\space.html:90 msgid "Edit" -msgstr "" +msgstr "Editare" #: .\cookbook\tables.py:115 .\cookbook\tables.py:138 #: .\cookbook\templates\generic\delete_template.html:7 @@ -563,28 +620,28 @@ msgstr "" #: .\cookbook\templates\generic\edit_template.html:28 #: .\cookbook\templates\recipes_table.html:90 msgid "Delete" -msgstr "" +msgstr "Ștergere" #: .\cookbook\templates\404.html:5 msgid "404 Error" -msgstr "" +msgstr "Eroare 404" #: .\cookbook\templates\404.html:18 msgid "The page you are looking for could not be found." -msgstr "" +msgstr "Pagina pe care o căutați nu a putut fi găsită." #: .\cookbook\templates\404.html:33 msgid "Take me Home" -msgstr "" +msgstr "Du-ma acasă" #: .\cookbook\templates\404.html:35 msgid "Report a Bug" -msgstr "" +msgstr "Raportați o eroare" #: .\cookbook\templates\account\email.html:6 #: .\cookbook\templates\account\email.html:17 msgid "E-mail Addresses" -msgstr "" +msgstr "Adrese e-mail" #: .\cookbook\templates\account\email.html:12 #: .\cookbook\templates\account\password_change.html:11 @@ -593,68 +650,71 @@ msgstr "" #: .\cookbook\templates\settings.html:17 #: .\cookbook\templates\socialaccount\connections.html:10 msgid "Settings" -msgstr "" +msgstr "Setări" #: .\cookbook\templates\account\email.html:13 msgid "Email" -msgstr "" +msgstr "E-mail" #: .\cookbook\templates\account\email.html:19 msgid "The following e-mail addresses are associated with your account:" -msgstr "" +msgstr "Următoarele adrese de e-mail sunt asociate contului dvs.:" #: .\cookbook\templates\account\email.html:36 msgid "Verified" -msgstr "" +msgstr "Verificat" #: .\cookbook\templates\account\email.html:38 msgid "Unverified" -msgstr "" +msgstr "Neverificat" #: .\cookbook\templates\account\email.html:40 msgid "Primary" -msgstr "" +msgstr "Principal" #: .\cookbook\templates\account\email.html:47 msgid "Make Primary" -msgstr "" +msgstr "Setează ca principal" #: .\cookbook\templates\account\email.html:49 msgid "Re-send Verification" -msgstr "" +msgstr "Retrimite verificare" #: .\cookbook\templates\account\email.html:50 #: .\cookbook\templates\generic\delete_template.html:56 #: .\cookbook\templates\socialaccount\connections.html:44 msgid "Remove" -msgstr "" +msgstr "Elimină" #: .\cookbook\templates\account\email.html:58 msgid "Warning:" -msgstr "" +msgstr "Atenție:" #: .\cookbook\templates\account\email.html:58 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" +"În prezent, nu aveți nicio adresă de e-mail configurată. Ar trebui să " +"adăugați într-adevăr o adresă de e-mail, astfel încât să puteți primi " +"notificări, resetați parola etc." #: .\cookbook\templates\account\email.html:64 msgid "Add E-mail Address" -msgstr "" +msgstr "Adăugă adresa de E-mail" #: .\cookbook\templates\account\email.html:69 msgid "Add E-mail" -msgstr "" +msgstr "Adaugă E-mail" #: .\cookbook\templates\account\email.html:79 msgid "Do you really want to remove the selected e-mail address?" -msgstr "" +msgstr "Chiar doriți să eliminați adresa de e-mail selectată?" #: .\cookbook\templates\account\email_confirm.html:6 #: .\cookbook\templates\account\email_confirm.html:10 msgid "Confirm E-mail Address" -msgstr "" +msgstr "Confirmarea adresei E-mail" #: .\cookbook\templates\account\email_confirm.html:16 #, python-format @@ -664,11 +724,15 @@ msgid "" "for user %(user_display)s\n" " ." msgstr "" +"Vă rugăm să confirmați că:\n" +" %(email)s este adresa de e-mail " +"a utilizatorului %(user_display)s\n" +" ." #: .\cookbook\templates\account\email_confirm.html:22 #: .\cookbook\templates\generic\delete_template.html:71 msgid "Confirm" -msgstr "" +msgstr "Confirmă" #: .\cookbook\templates\account\email_confirm.html:29 #, python-format @@ -677,51 +741,54 @@ msgid "" " issue a new e-mail confirmation " "request." msgstr "" +"Acest link de confirmare prin e-mail a expirat sau nu este valid. Vă rugăm\n" +" să emiteți o nouă solicitare de " +"confirmare prin e-mail." #: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:289 msgid "Login" -msgstr "" +msgstr "Conectare" #: .\cookbook\templates\account\login.html:15 #: .\cookbook\templates\account\login.html:31 #: .\cookbook\templates\account\signup.html:69 #: .\cookbook\templates\account\signup_closed.html:15 msgid "Sign In" -msgstr "" +msgstr "Autentificare" #: .\cookbook\templates\account\login.html:32 #: .\cookbook\templates\socialaccount\signup.html:8 #: .\cookbook\templates\socialaccount\signup.html:57 msgid "Sign Up" -msgstr "" +msgstr "Înregistrare" #: .\cookbook\templates\account\login.html:36 #: .\cookbook\templates\account\login.html:37 #: .\cookbook\templates\account\password_reset.html:29 msgid "Reset My Password" -msgstr "" +msgstr "Resetarea parolei mele" #: .\cookbook\templates\account\login.html:37 msgid "Lost your password?" -msgstr "" +msgstr "V-ați pierdut parola?" #: .\cookbook\templates\account\login.html:48 msgid "Social Login" -msgstr "" +msgstr "Autentificare utilizând rețeaua socială" #: .\cookbook\templates\account\login.html:49 msgid "You can use any of the following providers to sign in." -msgstr "" +msgstr "Puteți utiliza oricare dintre următorii furnizori pentru a vă conecta." #: .\cookbook\templates\account\logout.html:5 #: .\cookbook\templates\account\logout.html:9 #: .\cookbook\templates\account\logout.html:18 msgid "Sign Out" -msgstr "" +msgstr "Deconectare" #: .\cookbook\templates\account\logout.html:11 msgid "Are you sure you want to sign out?" -msgstr "" +msgstr "Sunteți sigur că doriți să vă deconectați?" #: .\cookbook\templates\account\password_change.html:6 #: .\cookbook\templates\account\password_change.html:16 @@ -731,44 +798,48 @@ msgstr "" #: .\cookbook\templates\account\password_reset_from_key_done.html:7 #: .\cookbook\templates\account\password_reset_from_key_done.html:13 msgid "Change Password" -msgstr "" +msgstr "Schimbare parolă" #: .\cookbook\templates\account\password_change.html:12 #: .\cookbook\templates\account\password_set.html:12 #: .\cookbook\templates\settings.html:69 msgid "Password" -msgstr "" +msgstr "Parola" #: .\cookbook\templates\account\password_change.html:22 msgid "Forgot Password?" -msgstr "" +msgstr "Ai uitat parola?" #: .\cookbook\templates\account\password_reset.html:7 #: .\cookbook\templates\account\password_reset.html:13 #: .\cookbook\templates\account\password_reset_done.html:7 #: .\cookbook\templates\account\password_reset_done.html:10 msgid "Password Reset" -msgstr "" +msgstr "Resetare parolă" #: .\cookbook\templates\account\password_reset.html:24 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" +"V-ați uitat parola? Introduceți adresa de e-mail de mai jos și vă vom " +"trimite un e-mail care vă permite să o resetați." #: .\cookbook\templates\account\password_reset.html:32 msgid "Password reset is disabled on this instance." -msgstr "" +msgstr "Resetarea parolei este dezactivată în această instanță." #: .\cookbook\templates\account\password_reset_done.html:16 msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." msgstr "" +"V-am trimis un e-mail. Vă rugăm să ne contactați dacă nu îl primiți în " +"câteva minute." #: .\cookbook\templates\account\password_reset_from_key.html:13 msgid "Bad Token" -msgstr "" +msgstr "Token invalid" #: .\cookbook\templates\account\password_reset_from_key.html:25 #, python-format @@ -778,199 +849,206 @@ msgid "" " Please request a new " "password reset." msgstr "" +"Linkul de resetare a parolei nu a fost valid, posibil pentru că a fost deja " +"utilizat.\n" +" Vă rugam să cereți o " +"nouă resetare a parolei." #: .\cookbook\templates\account\password_reset_from_key.html:33 msgid "change password" -msgstr "" +msgstr "schimbare parolă" #: .\cookbook\templates\account\password_reset_from_key.html:36 #: .\cookbook\templates\account\password_reset_from_key_done.html:19 msgid "Your password is now changed." -msgstr "" +msgstr "Parola este acum schimbată." #: .\cookbook\templates\account\password_set.html:6 #: .\cookbook\templates\account\password_set.html:16 #: .\cookbook\templates\account\password_set.html:21 msgid "Set Password" -msgstr "" +msgstr "Setare parolă" #: .\cookbook\templates\account\signup.html:6 msgid "Register" -msgstr "" +msgstr "Înregistrare" #: .\cookbook\templates\account\signup.html:12 msgid "Create an Account" -msgstr "" +msgstr "Create cont" #: .\cookbook\templates\account\signup.html:42 #: .\cookbook\templates\socialaccount\signup.html:33 msgid "I accept the follwoing" -msgstr "" +msgstr "Accept următoarele" #: .\cookbook\templates\account\signup.html:45 #: .\cookbook\templates\socialaccount\signup.html:36 msgid "Terms and Conditions" -msgstr "" +msgstr "Termeni și condiții" #: .\cookbook\templates\account\signup.html:48 #: .\cookbook\templates\socialaccount\signup.html:39 msgid "and" -msgstr "" +msgstr "și" #: .\cookbook\templates\account\signup.html:52 #: .\cookbook\templates\socialaccount\signup.html:43 msgid "Privacy Policy" -msgstr "" +msgstr "Politica de confidențialitate" #: .\cookbook\templates\account\signup.html:65 msgid "Create User" -msgstr "" +msgstr "Creare utilizator" #: .\cookbook\templates\account\signup.html:69 msgid "Already have an account?" -msgstr "" +msgstr "Aveți deja un cont?" #: .\cookbook\templates\account\signup_closed.html:5 #: .\cookbook\templates\account\signup_closed.html:11 msgid "Sign Up Closed" -msgstr "" +msgstr "Înscrierea închisă" #: .\cookbook\templates\account\signup_closed.html:13 msgid "We are sorry, but the sign up is currently closed." -msgstr "" +msgstr "Ne pare rău, dar înscrierea este în prezent închisă." #: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:279 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" -msgstr "" +msgstr "Documentare API" #: .\cookbook\templates\base.html:86 msgid "Shopping" -msgstr "" +msgstr "Cumpărături" #: .\cookbook\templates\base.html:113 msgid "Keyword" -msgstr "" +msgstr "Cuvânt cheie" #: .\cookbook\templates\base.html:137 #: .\cookbook\templates\forms\ingredients.html:24 #: .\cookbook\templates\space.html:41 .\cookbook\templates\stats.html:26 #: .\cookbook\views\lists.py:146 msgid "Units" -msgstr "" +msgstr "Unități" #: .\cookbook\templates\base.html:151 #: .\cookbook\templates\shopping_list.html:237 #: .\cookbook\templates\supermarket.html:7 msgid "Supermarket" -msgstr "" +msgstr "Supermarket" #: .\cookbook\templates\base.html:163 msgid "Supermarket Category" -msgstr "" +msgstr "Categorie supermarket" #: .\cookbook\templates\base.html:175 .\cookbook\views\lists.py:195 msgid "Automations" -msgstr "" +msgstr "Automatizări" #: .\cookbook\templates\base.html:189 .\cookbook\views\lists.py:215 msgid "Files" -msgstr "" +msgstr "Fișiere" #: .\cookbook\templates\base.html:201 msgid "Batch Edit" -msgstr "" +msgstr "Editare în mod batch" #: .\cookbook\templates\base.html:213 .\cookbook\templates\history.html:6 #: .\cookbook\templates\history.html:14 msgid "History" -msgstr "" +msgstr "Istoric" #: .\cookbook\templates\base.html:228 .\cookbook\templates\export.html:14 #: .\cookbook\templates\export.html:20 #: .\cookbook\templates\shopping_list.html:358 #: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 msgid "Export" -msgstr "" +msgstr "Exportă" #: .\cookbook\templates\base.html:244 .\cookbook\templates\index.html:47 msgid "Import Recipe" -msgstr "" +msgstr "Importă rețeta" #: .\cookbook\templates\base.html:246 #: .\cookbook\templates\shopping_list.html:195 #: .\cookbook\templates\shopping_list.html:217 msgid "Create" -msgstr "" +msgstr "Creează" #: .\cookbook\templates\base.html:259 #: .\cookbook\templates\generic\list_template.html:14 #: .\cookbook\templates\space.html:58 .\cookbook\templates\stats.html:43 msgid "External Recipes" -msgstr "" +msgstr "Rețete externe" #: .\cookbook\templates\base.html:262 .\cookbook\templates\space.html:7 #: .\cookbook\templates\space.html:19 msgid "Space Settings" -msgstr "" +msgstr "Setări spațiu" #: .\cookbook\templates\base.html:267 .\cookbook\templates\system.html:13 msgid "System" -msgstr "" +msgstr "Sistem" #: .\cookbook\templates\base.html:269 msgid "Admin" -msgstr "" +msgstr "Admin" #: .\cookbook\templates\base.html:273 msgid "Markdown Guide" -msgstr "" +msgstr "Ghid Markdown" #: .\cookbook\templates\base.html:275 msgid "GitHub" -msgstr "" +msgstr "GitHub" #: .\cookbook\templates\base.html:277 msgid "Translate Tandoor" -msgstr "" +msgstr "Traducere Tandoor" #: .\cookbook\templates\base.html:281 msgid "API Browser" -msgstr "" +msgstr "Browser API" #: .\cookbook\templates\base.html:284 msgid "Log out" -msgstr "" +msgstr "Deconectare" #: .\cookbook\templates\batch\edit.html:6 msgid "Batch edit Category" -msgstr "" +msgstr "Editează categoria in mod batch" #: .\cookbook\templates\batch\edit.html:15 msgid "Batch edit Recipes" -msgstr "" +msgstr "Editează rețetele in mod batch" #: .\cookbook\templates\batch\edit.html:20 msgid "Add the specified keywords to all recipes containing a word" msgstr "" +"Adăugați cuvintele cheie specificate la toate rețetele care conțin un cuvânt" #: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:82 msgid "Sync" -msgstr "" +msgstr "Sincronizare" #: .\cookbook\templates\batch\monitor.html:10 msgid "Manage watched Folders" -msgstr "" +msgstr "Gestionarea folderelor urmărite" #: .\cookbook\templates\batch\monitor.html:14 msgid "" "On this Page you can manage all storage folder locations that should be " "monitored and synced." msgstr "" +"Pe această Pagină puteți gestiona toate locațiile folderului de stocare care " +"ar trebui monitorizate și sincronizate." #: .\cookbook\templates\batch\monitor.html:16 msgid "The path must be in the following format" -msgstr "" +msgstr "Calea trebuie să fie în următorul format" #: .\cookbook\templates\batch\monitor.html:20 #: .\cookbook\templates\forms\edit_import_recipe.html:14 @@ -982,55 +1060,57 @@ msgstr "" #: .\cookbook\templates\settings.html:195 #: .\cookbook\templates\shopping_list.html:360 msgid "Save" -msgstr "" +msgstr "Salvare" #: .\cookbook\templates\batch\monitor.html:21 msgid "Manage External Storage" -msgstr "" +msgstr "Gestionarea spațiului de stocare extern" #: .\cookbook\templates\batch\monitor.html:28 msgid "Sync Now!" -msgstr "" +msgstr "Sincronizează acum!" #: .\cookbook\templates\batch\monitor.html:29 msgid "Show Recipes" -msgstr "" +msgstr "Afișare rețete" #: .\cookbook\templates\batch\monitor.html:30 msgid "Show Log" -msgstr "" +msgstr "Afișare jurnal" #: .\cookbook\templates\batch\waiting.html:4 #: .\cookbook\templates\batch\waiting.html:10 msgid "Importing Recipes" -msgstr "" +msgstr "Importă rețete" #: .\cookbook\templates\batch\waiting.html:28 msgid "" "This can take a few minutes, depending on the number of recipes in sync, " "please wait." msgstr "" +"Acest lucru poate dura câteva minute, în funcție de numărul de rețete " +"sincronizate, vă rugăm să așteptați." #: .\cookbook\templates\books.html:7 msgid "Recipe Books" -msgstr "" +msgstr "Cărți de rețete" #: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6 msgid "Export Recipes" -msgstr "" +msgstr "Exportă rețete" #: .\cookbook\templates\forms\edit_import_recipe.html:5 #: .\cookbook\templates\forms\edit_import_recipe.html:9 msgid "Import new Recipe" -msgstr "" +msgstr "Importă rețetă nouă" #: .\cookbook\templates\forms\edit_internal_recipe.html:7 msgid "Edit Recipe" -msgstr "" +msgstr "Editează rețetă" #: .\cookbook\templates\forms\ingredients.html:15 msgid "Edit Ingredients" -msgstr "" +msgstr "Editează ingrediente" #: .\cookbook\templates\forms\ingredients.html:16 msgid "" @@ -1042,104 +1122,112 @@ msgid "" "them.\n" " " msgstr "" +"\n" +" Următorul formular poate fi utilizat dacă, accidental, două (sau mai " +"multe) unități sau ingrediente în cazul în care au fost create care ar " +"trebui să fie\n" +" la fel.\n" +" Îmbină două unități sau ingrediente și actualizează toate rețetele " +"folosindu-le.\n" +" " #: .\cookbook\templates\forms\ingredients.html:26 msgid "Are you sure that you want to merge these two units?" -msgstr "" +msgstr "Sunteți sigur că doriți să uniți aceste două unități?" #: .\cookbook\templates\forms\ingredients.html:31 #: .\cookbook\templates\forms\ingredients.html:40 msgid "Merge" -msgstr "" +msgstr "Unire" #: .\cookbook\templates\forms\ingredients.html:36 msgid "Are you sure that you want to merge these two ingredients?" -msgstr "" +msgstr "Sunteți sigur că doriți să uniți aceste două ingrediente?" #: .\cookbook\templates\generic\delete_template.html:21 #, python-format msgid "Are you sure you want to delete the %(title)s: %(object)s " -msgstr "" +msgstr "Sunteți sigur că doriți să ștergeți %(title)s: %(object)s " #: .\cookbook\templates\generic\delete_template.html:26 msgid "Protected" -msgstr "" +msgstr "Protejat" #: .\cookbook\templates\generic\delete_template.html:41 msgid "Cascade" -msgstr "" +msgstr "Cascadă" #: .\cookbook\templates\generic\delete_template.html:72 msgid "Cancel" -msgstr "" +msgstr "Anulare" #: .\cookbook\templates\generic\edit_template.html:32 msgid "View" -msgstr "" +msgstr "Vizualizare" #: .\cookbook\templates\generic\edit_template.html:36 msgid "Delete original file" -msgstr "" +msgstr "Ștergerea fișierului original" #: .\cookbook\templates\generic\list_template.html:6 #: .\cookbook\templates\generic\list_template.html:21 msgid "List" -msgstr "" +msgstr "Listă" #: .\cookbook\templates\generic\list_template.html:34 msgid "Filter" -msgstr "" +msgstr "Filtru" #: .\cookbook\templates\generic\list_template.html:39 msgid "Import all" -msgstr "" +msgstr "Importare toate" #: .\cookbook\templates\generic\table_template.html:76 #: .\cookbook\templates\recipes_table.html:121 msgid "previous" -msgstr "" +msgstr "precedent" #: .\cookbook\templates\generic\table_template.html:98 #: .\cookbook\templates\recipes_table.html:143 msgid "next" -msgstr "" +msgstr "următor" #: .\cookbook\templates\history.html:20 msgid "View Log" -msgstr "" +msgstr "Vizionare jurnal" #: .\cookbook\templates\history.html:24 msgid "Cook Log" -msgstr "" +msgstr "Jurnal de pregătire" #: .\cookbook\templates\import.html:6 .\cookbook\templates\test.html:6 msgid "Import Recipes" -msgstr "" +msgstr "Importă rețete" #: .\cookbook\templates\include\log_cooking.html:7 msgid "Log Recipe Cooking" -msgstr "" +msgstr "Jurnal rețetă de gătire" #: .\cookbook\templates\include\log_cooking.html:13 msgid "All fields are optional and can be left empty." -msgstr "" +msgstr "Toate câmpurile sunt opționale și pot fi lăsate goale." #: .\cookbook\templates\include\log_cooking.html:19 msgid "Rating" -msgstr "" +msgstr "Evaluare" #: .\cookbook\templates\include\log_cooking.html:27 #: .\cookbook\templates\include\recipe_open_modal.html:18 msgid "Close" -msgstr "" +msgstr "Închide" #: .\cookbook\templates\include\recipe_open_modal.html:32 msgid "Open Recipe" -msgstr "" +msgstr "Deschide rețetă" #: .\cookbook\templates\include\storage_backend_warning.html:4 msgid "Security Warning" -msgstr "" +msgstr "Avertizare de securitate" #: .\cookbook\templates\include\storage_backend_warning.html:5 msgid "" @@ -1153,40 +1241,49 @@ msgid "" "can be used.\n" " " msgstr "" +"\n" +" Câmpurile de Parolă și Token sunt stocate ca text simplu în interiorul bazei de date.\n" +" Acest lucru este necesar deoarece acestea sunt necesare pentru a " +"face cereri API, dar, de asemenea, crește riscul de\n" +" furt.
    \n" +" Limitarea posibilelor deteriorări ale token-urilor sau conturilor cu " +"acces limitat ce pot fi utilizate.\n" +" " #: .\cookbook\templates\index.html:29 msgid "Search recipe ..." -msgstr "" +msgstr "Căutare rețetă ..." #: .\cookbook\templates\index.html:44 msgid "New Recipe" -msgstr "" +msgstr "Rețetă nouă" #: .\cookbook\templates\index.html:53 msgid "Advanced Search" -msgstr "" +msgstr "Căutare avansată" #: .\cookbook\templates\index.html:57 msgid "Reset Search" -msgstr "" +msgstr "Resetarea căutării" #: .\cookbook\templates\index.html:85 msgid "Last viewed" -msgstr "" +msgstr "Ultima vizualizare" #: .\cookbook\templates\index.html:87 .\cookbook\templates\space.html:35 #: .\cookbook\templates\stats.html:22 msgid "Recipes" -msgstr "" +msgstr "Rețete" #: .\cookbook\templates\index.html:94 msgid "Log in to view recipes" -msgstr "" +msgstr "Conectați-vă pentru a vizualiza rețetele" #: .\cookbook\templates\markdown_info.html:5 #: .\cookbook\templates\markdown_info.html:13 msgid "Markdown Info" -msgstr "" +msgstr "Informații Markdown" #: .\cookbook\templates\markdown_info.html:14 msgid "" @@ -1203,54 +1300,70 @@ msgid "" "below.\n" " " msgstr "" +"\n" +" Markdown este un limbaj de marcare ușor, care poate fi folosit " +"pentru formatarea textul simplu cu ușurință.\n" +" Acest site utilizează biblioteca Python Markdown pentru a\n" +" converti textului într-un document HTML frumos stilizat. " +"Documentația completă Markdown poate fi găsită\n" +" aici.\n" +" O documentație incompletă, dar cel mai probabil suficientă poate fi " +"găsită mai jos.\n" +" " #: .\cookbook\templates\markdown_info.html:25 msgid "Headers" -msgstr "" +msgstr "Anteturi" #: .\cookbook\templates\markdown_info.html:54 msgid "Formatting" -msgstr "" +msgstr "Formatare" #: .\cookbook\templates\markdown_info.html:56 #: .\cookbook\templates\markdown_info.html:72 msgid "Line breaks are inserted by adding two spaces after the end of a line" msgstr "" +"Sfârșiturile de linie sunt inserate prin adăugarea a două spații după " +"sfârșitul unei linii" #: .\cookbook\templates\markdown_info.html:57 #: .\cookbook\templates\markdown_info.html:73 msgid "or by leaving a blank line inbetween." -msgstr "" +msgstr "sau lăsând o linie goală între ele." #: .\cookbook\templates\markdown_info.html:59 #: .\cookbook\templates\markdown_info.html:74 msgid "This text is bold" -msgstr "" +msgstr "Acest text este îngroșat" #: .\cookbook\templates\markdown_info.html:60 #: .\cookbook\templates\markdown_info.html:75 msgid "This text is italic" -msgstr "" +msgstr "Acest text este cursiv" #: .\cookbook\templates\markdown_info.html:61 #: .\cookbook\templates\markdown_info.html:77 msgid "Blockquotes are also possible" -msgstr "" +msgstr "Ghilimelele bloc sunt, de asemenea, posibile" #: .\cookbook\templates\markdown_info.html:84 msgid "Lists" -msgstr "" +msgstr "Liste" #: .\cookbook\templates\markdown_info.html:85 msgid "" "Lists can ordered or unorderd. It is important to leave a blank line " "before the list!" msgstr "" +"Listele pot fi ordonate sau neordonate. Este important să lăsați o linie " +"goală înainte de listă!" #: .\cookbook\templates\markdown_info.html:87 #: .\cookbook\templates\markdown_info.html:108 msgid "Ordered List" -msgstr "" +msgstr "Listă ordonată" #: .\cookbook\templates\markdown_info.html:89 #: .\cookbook\templates\markdown_info.html:90 @@ -1259,12 +1372,12 @@ msgstr "" #: .\cookbook\templates\markdown_info.html:111 #: .\cookbook\templates\markdown_info.html:112 msgid "unordered list item" -msgstr "" +msgstr "element a listei neordonate" #: .\cookbook\templates\markdown_info.html:93 #: .\cookbook\templates\markdown_info.html:114 msgid "Unordered List" -msgstr "" +msgstr "Listă neordonată" #: .\cookbook\templates\markdown_info.html:95 #: .\cookbook\templates\markdown_info.html:96 @@ -1273,26 +1386,29 @@ msgstr "" #: .\cookbook\templates\markdown_info.html:117 #: .\cookbook\templates\markdown_info.html:118 msgid "ordered list item" -msgstr "" +msgstr "element a listei ordonate" #: .\cookbook\templates\markdown_info.html:125 msgid "Images & Links" -msgstr "" +msgstr "Imagini și link-uri" #: .\cookbook\templates\markdown_info.html:126 msgid "" "Links can be formatted with Markdown. This application also allows to paste " "links directly into markdown fields without any formatting." msgstr "" +"Link-urile pot fi formatate cu Markdown. Această aplicație permite, de " +"asemenea, să lipiți linkuri direct în câmpurile de marcare fără nicio " +"formatare." #: .\cookbook\templates\markdown_info.html:132 #: .\cookbook\templates\markdown_info.html:145 msgid "This will become an image" -msgstr "" +msgstr "Aceasta va deveni o imagine" #: .\cookbook\templates\markdown_info.html:152 msgid "Tables" -msgstr "" +msgstr "Tabele" #: .\cookbook\templates\markdown_info.html:153 msgid "" @@ -1300,175 +1416,190 @@ msgid "" "editor like this one." msgstr "" +"Tabelele Markdown sunt cu greu create de mână. Este recomandat folosirea " +"unor editoare de tabele precum acesta." #: .\cookbook\templates\markdown_info.html:155 #: .\cookbook\templates\markdown_info.html:157 #: .\cookbook\templates\markdown_info.html:171 #: .\cookbook\templates\markdown_info.html:177 msgid "Table" -msgstr "" +msgstr "Tabel" #: .\cookbook\templates\markdown_info.html:155 #: .\cookbook\templates\markdown_info.html:172 msgid "Header" -msgstr "" +msgstr "Antet" #: .\cookbook\templates\markdown_info.html:157 #: .\cookbook\templates\markdown_info.html:178 msgid "Cell" -msgstr "" +msgstr "Celulă" #: .\cookbook\templates\meal_plan_entry.html:6 msgid "Meal Plan View" -msgstr "" +msgstr "Vizualizarea planului de alimentare" #: .\cookbook\templates\meal_plan_entry.html:18 msgid "Created by" -msgstr "" +msgstr "Creat de" #: .\cookbook\templates\meal_plan_entry.html:20 #: .\cookbook\templates\shopping_list.html:261 msgid "Shared with" -msgstr "" +msgstr "Partajat cu" #: .\cookbook\templates\meal_plan_entry.html:48 #: .\cookbook\templates\recipes_table.html:64 msgid "Last cooked" -msgstr "" +msgstr "Ultima gătită" #: .\cookbook\templates\meal_plan_entry.html:50 msgid "Never cooked before." -msgstr "" +msgstr "Niciodată gătită înainte." #: .\cookbook\templates\meal_plan_entry.html:76 msgid "Other meals on this day" -msgstr "" +msgstr "Alte mese în această zi" #: .\cookbook\templates\no_groups_info.html:5 #: .\cookbook\templates\no_groups_info.html:12 msgid "No Permissions" -msgstr "" +msgstr "Fără permisiuni" #: .\cookbook\templates\no_groups_info.html:17 msgid "You do not have any groups and therefor cannot use this application." msgstr "" +"Nu aveți nici un grup și de aceea nu se poate utiliza această aplicație." #: .\cookbook\templates\no_groups_info.html:18 #: .\cookbook\templates\no_perm_info.html:15 msgid "Please contact your administrator." -msgstr "" +msgstr "Vă rugăm să contactați administratorul." #: .\cookbook\templates\no_perm_info.html:5 #: .\cookbook\templates\no_perm_info.html:12 msgid "No Permission" -msgstr "" +msgstr "Fără permisiune" #: .\cookbook\templates\no_perm_info.html:15 msgid "" "You do not have the required permissions to view this page or perform this " "action." msgstr "" +"Nu aveți permisiunile necesare pentru a vizualiza această pagină sau pentru " +"a efectua această acțiune." #: .\cookbook\templates\no_space_info.html:6 #: .\cookbook\templates\no_space_info.html:13 msgid "No Space" -msgstr "" +msgstr "Fără spațiu" #: .\cookbook\templates\no_space_info.html:17 msgid "" "Recipes, foods, shopping lists and more are organized in spaces of one or " "more people." msgstr "" +"Rețetele, alimentele, listele de cumpărături și multe altele sunt organizate " +"în spațiile uneia sau mai multor persoane." #: .\cookbook\templates\no_space_info.html:18 msgid "" "You can either be invited into an existing space or create your own one." msgstr "" +"Puteți fi invitat într-un spațiu existent sau puteți crea propriul spațiu." #: .\cookbook\templates\no_space_info.html:31 #: .\cookbook\templates\no_space_info.html:40 msgid "Join Space" -msgstr "" +msgstr "Alăturați-vă spațiului" #: .\cookbook\templates\no_space_info.html:34 msgid "Join an existing space." -msgstr "" +msgstr "Alăturați-vă unui spațiu existent." #: .\cookbook\templates\no_space_info.html:35 msgid "" "To join an existing space either enter your invite token or click on the " "invite link the space owner send you." msgstr "" +"Pentru a vă alătura unui spațiu existent, introduceți simbolul de invitație " +"sau faceți clic pe linkul de invitație pe care vi-l trimite proprietarul " +"spațiului." #: .\cookbook\templates\no_space_info.html:48 #: .\cookbook\templates\no_space_info.html:56 msgid "Create Space" -msgstr "" +msgstr "Creare spațiu" #: .\cookbook\templates\no_space_info.html:51 msgid "Create your own recipe space." -msgstr "" +msgstr "Creați-vă propriul spațiu de rețete." #: .\cookbook\templates\no_space_info.html:52 msgid "Start your own recipe space and invite other users to it." msgstr "" +"Începeți propriul spațiu de rețete și invitați alți utilizatori la acesta." #: .\cookbook\templates\offline.html:6 msgid "Offline" -msgstr "" +msgstr "Offline" #: .\cookbook\templates\offline.html:19 msgid "You are currently offline!" -msgstr "" +msgstr "Sunteți în prezent offline!" #: .\cookbook\templates\offline.html:20 msgid "" "The recipes listed below are available for offline viewing because you have " "recently viewed them. Keep in mind that data might be outdated." msgstr "" +"Rețetele enumerate mai jos sunt disponibile pentru vizualizare offline, " +"deoarece le-ați vizualizat recent. Rețineți că datele pot fi învechite." #: .\cookbook\templates\recipe_view.html:26 msgid "by" -msgstr "" +msgstr "de" #: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:147 #: .\cookbook\views\edit.py:180 msgid "Comment" -msgstr "" +msgstr "Comentariu" #: .\cookbook\templates\recipes_table.html:19 #: .\cookbook\templates\recipes_table.html:23 #: .\cookbook\templates\url_import.html:444 msgid "Recipe Image" -msgstr "" +msgstr "Imagine rețetă" #: .\cookbook\templates\recipes_table.html:51 #: .\cookbook\templates\url_import.html:449 msgid "Preparation time ca." -msgstr "" +msgstr "Timp de pregătire cca." #: .\cookbook\templates\recipes_table.html:57 #: .\cookbook\templates\url_import.html:454 msgid "Waiting time ca." -msgstr "" +msgstr "Timp de așteptare cca." #: .\cookbook\templates\recipes_table.html:60 msgid "External" -msgstr "" +msgstr "Extern" #: .\cookbook\templates\recipes_table.html:86 msgid "Log Cooking" -msgstr "" +msgstr "Jurnal de pregătire" #: .\cookbook\templates\rest_framework\api.html:5 msgid "Recipe Home" -msgstr "" +msgstr "Rețetă acasă" #: .\cookbook\templates\search_info.html:5 #: .\cookbook\templates\search_info.html:9 #: .\cookbook\templates\settings.html:165 msgid "Search Settings" -msgstr "" +msgstr "Setări de căutare" #: .\cookbook\templates\search_info.html:10 msgid "" @@ -1481,10 +1612,18 @@ msgid "" "only available if you are using Postgres for your database.\n" " " msgstr "" +"\n" +" Crearea celei mai bune experiențe de căutare este complicată și " +"cântărește foarte mult asupra configurației personale. \n" +" Modificarea oricăreia dintre setările de căutare poate avea un " +"impact semnificativ asupra vitezei și calității rezultatelor.\n" +" Configurațiile metode de căutare, trigrame și căutare text complet " +"sunt disponibile numai dacă utilizați Postgres pentru baza de date.\n" +" " #: .\cookbook\templates\search_info.html:19 msgid "Search Methods" -msgstr "" +msgstr "Metode de căutare" #: .\cookbook\templates\search_info.html:23 msgid "" @@ -1500,6 +1639,18 @@ msgid "" "html#TEXTSEARCH-PARSING-QUERIES>Postgresql's website.\n" " " msgstr "" +" \n" +" Căutările de text complet încearcă să normalizeze cuvintele " +"furnizate pentru a se potrivi variantelor comune. De exemplu: 'bifurcat', " +"'furcă', 'furculițe' se vor normaliza la 'furculiță'.\n" +" Există mai multe metode disponibile, descrise mai jos, care vor " +"controla modul în care comportamentul de căutare ar trebui să reacționeze " +"atunci când sunt căutate mai multe cuvinte.\n" +" Detalii tehnice complete cu privire la modul în care acestea " +"funcționează pot fi vizualizate pe website-ul " +"Postgresql.\n" +" " #: .\cookbook\templates\search_info.html:29 msgid "" @@ -1511,6 +1662,14 @@ msgid "" "selected for a full text search.\n" " " msgstr "" +" \n" +" Căutările simple ignoră semnele de punctuație și cuvintele " +"comune, cum ar fi 'de', 'și', 'a', și va trata cuvinte separate după cum " +"este necesar.\n" +" Căutarea 'măr sau făină' va returna orice rețetă care include " +"atât 'măr', cât și 'făină' oriunde în câmpurile care au fost selectate " +"pentru o căutare completă de text.\n" +" " #: .\cookbook\templates\search_info.html:34 msgid "" @@ -1522,6 +1681,13 @@ msgid "" "been selected for a full text search.\n" " " msgstr "" +" \n" +" Căutările de expresii ignoră semnele de punctuație, dar vor " +"căuta toate cuvintele în ordinea exactă furnizată.\n" +" Căutarea 'măr sau făină' va returna doar o rețetă care include " +"expresia exactă 'măr sau făină' în oricare dintre câmpurile care au fost " +"selectate pentru o căutare completă a textului.\n" +" " #: .\cookbook\templates\search_info.html:39 msgid "" @@ -1541,6 +1707,21 @@ msgid "" "recipe that has the word 'butter' in any field included.\n" " " msgstr "" +" \n" +" Căutările web simulează funcționalitatea găsită pe multe site-" +"uri de căutare web care acceptă sintaxa specială.\n" +" Plasarea ghilimelelor în jurul mai multor cuvinte va converti " +"aceste cuvinte într-o frază.\n" +" 'sau' este recunoscut pentru căutarea pentru cuvântul (sau fraza)" +" imediat înainte de 'sau' SAU cuvântul (sau fraza) direct după.\n" +" '-' este recunoscut pentru căutarea rețetelor care nu includ " +"cuvântul (sau fraza) care vine imediat după. \n" +" De exemplu, căutarea 'plăcintei cu mere' sau a untului de cireșe " +"va returna orice rețetă care include expresia 'plăcintă cu mere' sau " +"cuvântul 'cireș' \n" +" în orice câmp inclus în căutarea completă a textului, dar " +"exclude orice rețetă care are cuvântul 'unt' în orice câmp inclus.\n" +" " #: .\cookbook\templates\search_info.html:48 msgid "" @@ -1549,6 +1730,10 @@ msgid "" "operators such as '|', '&' and '()'\n" " " msgstr "" +" \n" +" Căutarea brută este similară cu web-ul, cu excepția caracterelor " +"speciale, cum ar fi '|', '&' și '()'\n" +" " #: .\cookbook\templates\search_info.html:59 msgid "" @@ -1564,10 +1749,21 @@ msgid "" "methods.\n" " " msgstr "" +" \n" +" O altă abordare a căutării care, de asemenea, necesită " +"Postgresql este căutarea vagă, sau similitudinea trigramelor. O trigramă " +"este un grup de trei caractere consecutive.\n" +" De exemplu, căutarea 'mărului' va crea x trigrame 'măr', 'ăru', " +"'rul' și va crea un scor al cât de strâns se potrivesc cuvintele cu " +"trigramele generate.\n" +" Un beneficiu de căutare a trigramelor este că o căutare pentru " +"'plăcintă' va găsi cuvinte scrise greșit, cum ar fi \"plăcine\", care ar fi " +"ratat de alte metode.\n" +" " #: .\cookbook\templates\search_info.html:69 msgid "Search Fields" -msgstr "" +msgstr "Câmpuri de căutare" #: .\cookbook\templates\search_info.html:73 msgid "" @@ -1603,10 +1799,43 @@ msgid "" "full text results, it does match the trigram results.\n" " " msgstr "" +" \n" +" Unaccent este un caz special prin faptul că permite căutarea " +"unui câmp 'neaccentuat' pentru fiecare stil de căutare care încearcă să " +"ignore valorile accentuate. \n" +" De exemplu, atunci când activați unaccent pentru 'Nume', orice " +"căutare (începe cu, conține, trigramă) va încerca căutarea ignorând " +"caracterele accentuate.\n" +" \n" +" Pentru celelalte opțiuni, puteți activa căutarea pe oricare sau " +"pe toate câmpurile și acestea vor fi combinate împreună cu un presupus 'SAU'." +"\n" +" De exemplu, activarea 'Nume' pentru începe cu, 'Nume' și " +"'Descriere' pentru potrivire parțială și 'Ingrediente' și 'Cuvinte cheie' " +"pentru căutare completă\n" +" și căutarea de 'mărului' va genera o căutare care va returna " +"rețete care au:\n" +" - Un nume de rețetă care începe cu 'măr'\n" +" - SAU un nume de rețetă care conține 'măr''\n" +" - SAU o descriere a rețetei care conține 'măr'\n" +" - SAU o rețetă care va avea o potrivire completă de căutare text " +"('măr' sau 'mere') în ingrediente\n" +" - SAU o rețetă care va avea un text complet de căutare se " +"potrivesc în cuvinte cheie\n" +"\n" +" Combinarea prea multor câmpuri în prea multe tipuri de căutare " +"poate avea un impact negativ asupra performanței, poate crea rezultate " +"dublate sau poate returna rezultate neașteptate.\n" +" De exemplu, activarea căutării vage sau a potrivirilor parțiale " +"va interfera cu metodele de căutare pe web. \n" +" Căutarea 'plăcinte -mere' cu căutare vagă și căutare text " +"complet va returna rețeta plăcintelor cu mere. Deși nu este inclus în " +"rezultatele textului complet, se potrivește cu rezultatele trigramei.\n" +" " #: .\cookbook\templates\search_info.html:95 msgid "Search Index" -msgstr "" +msgstr "Index de căutare" #: .\cookbook\templates\search_info.html:99 msgid "" @@ -1620,89 +1849,108 @@ msgid "" "the management command 'python manage.py rebuildindex'\n" " " msgstr "" +" \n" +" Trigrama de căutare și full text search ambele se bazează pe " +"indexurile bazei de date pentru a efectua în mod eficient. \n" +" Puteți reconstrui indexurile pe toate câmpurile din pagina Admin " +"pentru rețete și selectând toate rețetele și rulând 'reconstrui index pentru " +"rețetele selectate'\n" +" De asemenea, puteți reconstrui indexurile la linia de comandă " +"executând comanda de gestionare 'python manage.py rebuildindex'\n" +" " #: .\cookbook\templates\settings.html:28 msgid "Account" -msgstr "" +msgstr "Cont" #: .\cookbook\templates\settings.html:35 msgid "Preferences" -msgstr "" +msgstr "Preferințe" #: .\cookbook\templates\settings.html:42 msgid "API-Settings" -msgstr "" +msgstr "Setări API" #: .\cookbook\templates\settings.html:49 msgid "Search-Settings" -msgstr "" +msgstr "Setări de căutare" #: .\cookbook\templates\settings.html:58 msgid "Name Settings" -msgstr "" +msgstr "Setări de nume" #: .\cookbook\templates\settings.html:66 msgid "Account Settings" -msgstr "" +msgstr "Setpri cont" #: .\cookbook\templates\settings.html:68 msgid "Emails" -msgstr "" +msgstr "E-mailuri" #: .\cookbook\templates\settings.html:71 #: .\cookbook\templates\socialaccount\connections.html:11 msgid "Social" -msgstr "" +msgstr "Social" #: .\cookbook\templates\settings.html:84 msgid "Language" -msgstr "" +msgstr "Limbă" #: .\cookbook\templates\settings.html:114 msgid "Style" -msgstr "" +msgstr "Stil" #: .\cookbook\templates\settings.html:135 msgid "API Token" -msgstr "" +msgstr "API Token" #: .\cookbook\templates\settings.html:136 msgid "" "You can use both basic authentication and token based authentication to " "access the REST API." msgstr "" +"Puteți utiliza atât autentificarea de bază, cât și autentificarea bazată pe " +"token pentru a accesa REST API." #: .\cookbook\templates\settings.html:153 msgid "" "Use the token as an Authorization header prefixed by the word token as shown " "in the following examples:" msgstr "" +"Utilizați token-ul ca antet de autorizare prefixat de token-ul cuvântului, " +"așa cum se arată în următoarele exemple:" #: .\cookbook\templates\settings.html:155 msgid "or" -msgstr "" +msgstr "sau" #: .\cookbook\templates\settings.html:166 msgid "" "There are many options to configure the search depending on your personal " "preferences." msgstr "" +"Există multe opțiuni pentru a configura căutarea în funcție de preferințele " +"personale." #: .\cookbook\templates\settings.html:167 msgid "" "Usually you do not need to configure any of them and can just stick " "with either the default or one of the following presets." msgstr "" +"De obicei, nu aveți nevoie să configurați niciuna dintre ele și poate " +"rămâne doar cu implicit sau una dintre următoarele presetări." #: .\cookbook\templates\settings.html:168 msgid "" "If you do want to configure the search you can read about the different " "options here." msgstr "" +"Dacă doriți să configurați căutarea, puteți citi despre diferitele opțiuni " +"aici." #: .\cookbook\templates\settings.html:173 msgid "Fuzzy" -msgstr "" +msgstr "Vag" #: .\cookbook\templates\settings.html:174 msgid "" @@ -1710,84 +1958,91 @@ msgid "" "return more results than needed to make sure you find what you are looking " "for." msgstr "" +"Găsiți ceea ce aveți nevoie, chiar dacă căutarea sau rețeta conține greșeli " +"de scriere. S-ar putea returna mai multe rezultate decât este necesar pentru " +"a vă asigura că găsiți ceea ce căutați." #: .\cookbook\templates\settings.html:175 msgid "This is the default behavior" -msgstr "" +msgstr "Acesta este comportamentul implicit" #: .\cookbook\templates\settings.html:176 #: .\cookbook\templates\settings.html:184 msgid "Apply" -msgstr "" +msgstr "Aplică" #: .\cookbook\templates\settings.html:181 msgid "Precise" -msgstr "" +msgstr "Precis" #: .\cookbook\templates\settings.html:182 msgid "" "Allows fine control over search results but might not return results if too " "many spelling mistakes are made." msgstr "" +"Permite un control fin asupra rezultatelor căutării, dar este posibil să nu " +"returneze rezultate dacă se fac prea multe greșeli de ortografie." #: .\cookbook\templates\settings.html:183 msgid "Perfect for large Databases" -msgstr "" +msgstr "Perfect pentru bazele de date mari" #: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5 msgid "Cookbook Setup" -msgstr "" +msgstr "Setarea cărții de bucate" #: .\cookbook\templates\setup.html:14 msgid "Setup" -msgstr "" +msgstr "Setare" #: .\cookbook\templates\setup.html:15 msgid "" "To start using this application you must first create a superuser account." msgstr "" +"Pentru a începe să utilizați această aplicație, trebuie mai întâi să creați " +"un cont superuser." #: .\cookbook\templates\setup.html:20 msgid "Create Superuser account" -msgstr "" +msgstr "Creează cont superuser" #: .\cookbook\templates\shopping_list.html:7 #: .\cookbook\templates\shopping_list.html:29 #: .\cookbook\templates\shopping_list.html:721 msgid "Shopping List" -msgstr "" +msgstr "Listă de cumpărături" #: .\cookbook\templates\shopping_list.html:34 msgid "Try the new shopping list" -msgstr "" +msgstr "Încercați noua listă de cumpărături" #: .\cookbook\templates\shopping_list.html:63 msgid "Search Recipe" -msgstr "" +msgstr "Căutare rețetă" #: .\cookbook\templates\shopping_list.html:86 msgid "Shopping Recipes" -msgstr "" +msgstr "Rețete de cumpărături" #: .\cookbook\templates\shopping_list.html:90 msgid "No recipes selected" -msgstr "" +msgstr "Nici o rețetă selectată" #: .\cookbook\templates\shopping_list.html:157 msgid "Entry Mode" -msgstr "" +msgstr "Mod de intrare" #: .\cookbook\templates\shopping_list.html:165 msgid "Add Entry" -msgstr "" +msgstr "Adăugare intrare" #: .\cookbook\templates\shopping_list.html:181 msgid "Amount" -msgstr "" +msgstr "Cantitate" #: .\cookbook\templates\shopping_list.html:194 msgid "Select Unit" -msgstr "" +msgstr "Selectare unitate" #: .\cookbook\templates\shopping_list.html:196 #: .\cookbook\templates\shopping_list.html:218 @@ -1796,59 +2051,62 @@ msgstr "" #: .\cookbook\templates\url_import.html:500 #: .\cookbook\templates\url_import.html:532 msgid "Select" -msgstr "" +msgstr "Selectare" #: .\cookbook\templates\shopping_list.html:216 msgid "Select Food" -msgstr "" +msgstr "Selectare mâncare" #: .\cookbook\templates\shopping_list.html:247 msgid "Select Supermarket" -msgstr "" +msgstr "Selectare supermarket" #: .\cookbook\templates\shopping_list.html:271 msgid "Select User" -msgstr "" +msgstr "Selectare utilizator" #: .\cookbook\templates\shopping_list.html:290 msgid "Finished" -msgstr "" +msgstr "Finisat" #: .\cookbook\templates\shopping_list.html:303 msgid "You are offline, shopping list might not syncronize." msgstr "" +"Sunteți offline, este posibil ca lista de cumpărături să nu se sincronizeze." #: .\cookbook\templates\shopping_list.html:368 msgid "Copy/Export" -msgstr "" +msgstr "Copiere/Exportare" #: .\cookbook\templates\shopping_list.html:372 msgid "List Prefix" -msgstr "" +msgstr "Prefix listă" #: .\cookbook\templates\socialaccount\connections.html:4 #: .\cookbook\templates\socialaccount\connections.html:15 msgid "Account Connections" -msgstr "" +msgstr "Conexiuni de cont" #: .\cookbook\templates\socialaccount\connections.html:18 msgid "" "You can sign in to your account using any of the following third party\n" " accounts:" msgstr "" +"Vă puteți conecta la cont utilizând oricare dintre următoarele terțe părți\n" +" de conturi:" #: .\cookbook\templates\socialaccount\connections.html:52 msgid "" "You currently have no social network accounts connected to this account." -msgstr "" +msgstr "În prezent, nu aveți conturi de rețea socială conectate la acest cont." #: .\cookbook\templates\socialaccount\connections.html:55 msgid "Add a 3rd Party Account" -msgstr "" +msgstr "Adăugarea unui cont a părților terțe" #: .\cookbook\templates\socialaccount\signup.html:5 msgid "Signup" -msgstr "" +msgstr "Înregistrare" #: .\cookbook\templates\socialaccount\signup.html:10 #, python-format @@ -1857,6 +2115,10 @@ msgid "" " %(provider_name)s account to login to\n" " %(site_name)s. As a final step, please complete the following form:" msgstr "" +"Sunteți pe cale de a utiliza\n" +" contul %(provider_name)s pentru a vă conecta la \n" +" %(site_name)s. Ca un pas final, vă rugăm să completați următorul " +"formular:" #: .\cookbook\templates\socialaccount\snippets\provider_list.html:23 #: .\cookbook\templates\socialaccount\snippets\provider_list.html:31 @@ -1873,100 +2135,100 @@ msgstr "" #: .\cookbook\templates\socialaccount\snippets\provider_list.html:119 #: .\cookbook\templates\socialaccount\snippets\provider_list.html:127 msgid "Sign in using" -msgstr "" +msgstr "Conectați-vă utilizând" #: .\cookbook\templates\space.html:23 msgid "Space:" -msgstr "" +msgstr "Spațiu:" #: .\cookbook\templates\space.html:24 msgid "Manage Subscription" -msgstr "" +msgstr "Gestionarea abonamentului" #: .\cookbook\templates\space.html:32 .\cookbook\templates\stats.html:19 msgid "Number of objects" -msgstr "" +msgstr "Numărul de obiecte" #: .\cookbook\templates\space.html:45 .\cookbook\templates\stats.html:30 msgid "Recipe Imports" -msgstr "" +msgstr "Importuri de rețete" #: .\cookbook\templates\space.html:53 .\cookbook\templates\stats.html:38 msgid "Objects stats" -msgstr "" +msgstr "Statistici obiecte" #: .\cookbook\templates\space.html:56 .\cookbook\templates\stats.html:41 msgid "Recipes without Keywords" -msgstr "" +msgstr "Rețete fără cuvinte cheie" #: .\cookbook\templates\space.html:60 .\cookbook\templates\stats.html:45 msgid "Internal Recipes" -msgstr "" +msgstr "Rețete interne" #: .\cookbook\templates\space.html:73 msgid "Members" -msgstr "" +msgstr "Membri" #: .\cookbook\templates\space.html:77 msgid "Invite User" -msgstr "" +msgstr "Invită utilizator" #: .\cookbook\templates\space.html:88 msgid "User" -msgstr "" +msgstr "Utilizator" #: .\cookbook\templates\space.html:89 msgid "Groups" -msgstr "" +msgstr "Grupe" #: .\cookbook\templates\space.html:105 msgid "admin" -msgstr "" +msgstr "admin" #: .\cookbook\templates\space.html:106 msgid "user" -msgstr "" +msgstr "utilizator" #: .\cookbook\templates\space.html:107 msgid "guest" -msgstr "" +msgstr "oaspete" #: .\cookbook\templates\space.html:108 msgid "remove" -msgstr "" +msgstr "eliminare" #: .\cookbook\templates\space.html:112 msgid "Update" -msgstr "" +msgstr "Actualizare" #: .\cookbook\templates\space.html:116 msgid "You cannot edit yourself." -msgstr "" +msgstr "Nu te poți edita singur pe tine." #: .\cookbook\templates\space.html:123 msgid "There are no members in your space yet!" -msgstr "" +msgstr "Încă nu există membri în spațiul dumneavoastră!" #: .\cookbook\templates\space.html:130 .\cookbook\templates\system.html:21 #: .\cookbook\views\lists.py:100 msgid "Invite Links" -msgstr "" +msgstr "Link-uri de invitație" #: .\cookbook\templates\stats.html:4 msgid "Stats" -msgstr "" +msgstr "Atribute" #: .\cookbook\templates\stats.html:10 msgid "Statistics" -msgstr "" +msgstr "Statistici" #: .\cookbook\templates\system.html:22 msgid "Show Links" -msgstr "" +msgstr "Afișează link-uri" #: .\cookbook\templates\system.html:32 msgid "System Information" -msgstr "" +msgstr "Informații despre sistem" #: .\cookbook\templates\system.html:34 msgid "" @@ -1978,20 +2240,27 @@ msgid "" "recipes/releases\">here.\n" " " msgstr "" +"\n" +" Django Recipes este o aplicație software gratuită open source. " +"Acesta poate fi găsită pe\n" +" GitHub.\n" +" Istoricul modificării poate fi găsit aici.\n" +" " #: .\cookbook\templates\system.html:48 msgid "Media Serving" -msgstr "" +msgstr "Livrare conținut media" #: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 #: .\cookbook\templates\system.html:80 msgid "Warning" -msgstr "" +msgstr "Atenționare" #: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 #: .\cookbook\templates\system.html:80 .\cookbook\templates\system.html:95 msgid "Ok" -msgstr "" +msgstr "Ok" #: .\cookbook\templates\system.html:51 msgid "" @@ -2002,15 +2271,22 @@ msgid "" " your installation.\n" " " msgstr "" +"Servirea fișierelor media direct folosind gunicorn/python nu este " +"recomandată !\n" +" Vă rugăm să urmați pașii descriși\n" +" aici pentru a actualiza\n" +" instalarea dvs..\n" +" " #: .\cookbook\templates\system.html:57 .\cookbook\templates\system.html:73 #: .\cookbook\templates\system.html:88 .\cookbook\templates\system.html:102 msgid "Everything is fine!" -msgstr "" +msgstr "Totul este bine!" #: .\cookbook\templates\system.html:62 msgid "Secret Key" -msgstr "" +msgstr "Cheie secretă" #: .\cookbook\templates\system.html:66 msgid "" @@ -2024,10 +2300,19 @@ msgid "" "file.\n" " " msgstr "" +"\n" +" Nu aveți un SECRET_KEY configurat în fișierul " +".env. Django utilizează implicit\n" +" cheia standard\n" +" prevazuta cu instalația care este cunoscuta public si nesigura! " +"Vă rugăm să setați\n" +" SECRET_KEY în fișierul de configurare ." +"env.\n" +" " #: .\cookbook\templates\system.html:78 msgid "Debug Mode" -msgstr "" +msgstr "Mod de depanare" #: .\cookbook\templates\system.html:82 msgid "" @@ -2039,14 +2324,21 @@ msgid "" "file.\n" " " msgstr "" +"\n" +" Această aplicație se execută încă în modul de depanare. Acest " +"lucru nu este cel mai probabil necesar. Rândul său, modul de depanare prin\n" +" setarea\n" +" DEBUG=0 in zona .env a fișierului de " +"configurare.\n" +" " #: .\cookbook\templates\system.html:93 msgid "Database" -msgstr "" +msgstr "Bază de date" #: .\cookbook\templates\system.html:95 msgid "Info" -msgstr "" +msgstr "Informație" #: .\cookbook\templates\system.html:97 msgid "" @@ -2056,46 +2348,52 @@ msgid "" " features only work with postgres databases.\n" " " msgstr "" +"\n" +" Această aplicație nu se execută cu un backend de bază de date " +"Postgres. Acest lucru este ok, dar nu este recomandat deoarece unele\n" +" caracteristicile funcționează numai cu baze de date Postgres.\n" +" " #: .\cookbook\templates\url_import.html:6 msgid "URL Import" -msgstr "" +msgstr "Importare URL" #: .\cookbook\templates\url_import.html:31 msgid "Drag me to your bookmarks to import recipes from anywhere" -msgstr "" +msgstr "Trageți-mă în marcajele dvs., pentru a importa rețete de oriunde" #: .\cookbook\templates\url_import.html:32 msgid "Bookmark Me!" -msgstr "" +msgstr "Marcaj-mă!" #: .\cookbook\templates\url_import.html:36 msgid "URL" -msgstr "" +msgstr "URL" #: .\cookbook\templates\url_import.html:38 msgid "App" -msgstr "" +msgstr "Aplicație" #: .\cookbook\templates\url_import.html:62 msgid "Enter website URL" -msgstr "" +msgstr "Introduceți adresa URL a site-ului web" #: .\cookbook\templates\url_import.html:101 msgid "Select recipe files to import or drop them here..." -msgstr "" +msgstr "Selectați fișierele de rețetă pentru a le importa sau a le fixa aici..." #: .\cookbook\templates\url_import.html:122 msgid "Paste json or html source here to load recipe." -msgstr "" +msgstr "Plasează sursa JSON sau HTML aici pentru a încărca rețeta." #: .\cookbook\templates\url_import.html:150 msgid "Preview Recipe Data" -msgstr "" +msgstr "Previzualizați datele rețetei" #: .\cookbook\templates\url_import.html:151 msgid "Drag recipe attributes from the right into the appropriate box below." msgstr "" +"Trageți atributele rețetei din dreapta în caseta corespunzătoare de mai jos." #: .\cookbook\templates\url_import.html:160 #: .\cookbook\templates\url_import.html:177 @@ -2108,113 +2406,116 @@ msgstr "" #: .\cookbook\templates\url_import.html:304 #: .\cookbook\templates\url_import.html:355 msgid "Clear Contents" -msgstr "" +msgstr "Curățare conținut" #: .\cookbook\templates\url_import.html:162 msgid "Text dragged here will be appended to the name." -msgstr "" +msgstr "Textul tras aici va fi adăugat la nume." #: .\cookbook\templates\url_import.html:175 msgid "Description" -msgstr "" +msgstr "Descriere" #: .\cookbook\templates\url_import.html:179 msgid "Text dragged here will be appended to the description." -msgstr "" +msgstr "Textul tras aici va fi adăugat la descriere." #: .\cookbook\templates\url_import.html:196 msgid "Keywords dragged here will be appended to current list" -msgstr "" +msgstr "Cuvintele cheie trase aici vor fi anexate la lista curentă" #: .\cookbook\templates\url_import.html:211 msgid "Image" -msgstr "" +msgstr "Imagine" #: .\cookbook\templates\url_import.html:243 msgid "Prep Time" -msgstr "" +msgstr "Timp de pregătire" #: .\cookbook\templates\url_import.html:258 msgid "Cook Time" -msgstr "" +msgstr "Timp de gătire" #: .\cookbook\templates\url_import.html:279 msgid "Ingredients dragged here will be appended to current list." -msgstr "" +msgstr "Ingredientele trase aici vor fi anexate la lista curentă." #: .\cookbook\templates\url_import.html:301 #: .\cookbook\templates\url_import.html:572 msgid "Instructions" -msgstr "" +msgstr "Instrucțiuni" #: .\cookbook\templates\url_import.html:306 msgid "" "Recipe instructions dragged here will be appended to current instructions." msgstr "" +"Instrucțiunile de rețetă trase aici vor fi anexate la instrucțiunile curente." #: .\cookbook\templates\url_import.html:329 msgid "Discovered Attributes" -msgstr "" +msgstr "Atribute descoperite" #: .\cookbook\templates\url_import.html:331 msgid "" "Drag recipe attributes from below into the appropriate box on the left. " "Click any node to display its full properties." msgstr "" +"Trageți atributele rețetei de mai jos în caseta corespunzătoare din stânga. " +"Faceți clic pe orice nod pentru a afișa proprietățile sale complete." #: .\cookbook\templates\url_import.html:348 msgid "Show Blank Field" -msgstr "" +msgstr "Afișare câmp gol" #: .\cookbook\templates\url_import.html:353 msgid "Blank Field" -msgstr "" +msgstr "Câmp gol" #: .\cookbook\templates\url_import.html:357 msgid "Items dragged to Blank Field will be appended." -msgstr "" +msgstr "Elementele trase în câmpul gol vor fi adăugate." #: .\cookbook\templates\url_import.html:404 msgid "Delete Text" -msgstr "" +msgstr "Ștergere text" #: .\cookbook\templates\url_import.html:417 msgid "Delete image" -msgstr "" +msgstr "Ștergere imagine" #: .\cookbook\templates\url_import.html:433 msgid "Recipe Name" -msgstr "" +msgstr "Nume rețetă" #: .\cookbook\templates\url_import.html:437 msgid "Recipe Description" -msgstr "" +msgstr "Descriere rețetă" #: .\cookbook\templates\url_import.html:499 #: .\cookbook\templates\url_import.html:531 #: .\cookbook\templates\url_import.html:587 msgid "Select one" -msgstr "" +msgstr "Selectați una" #: .\cookbook\templates\url_import.html:547 msgid "Note" -msgstr "" +msgstr "Notă" #: .\cookbook\templates\url_import.html:588 msgid "Add Keyword" -msgstr "" +msgstr "Adaugă cuvânt cheie" #: .\cookbook\templates\url_import.html:601 msgid "All Keywords" -msgstr "" +msgstr "Toate cuvintele cheie" #: .\cookbook\templates\url_import.html:604 msgid "Import all keywords, not only the ones already existing." -msgstr "" +msgstr "Importă toate cuvintele cheie, nu numai cele deja existente." #: .\cookbook\templates\url_import.html:631 msgid "Information" -msgstr "" +msgstr "Informație" #: .\cookbook\templates\url_import.html:633 msgid "" @@ -2226,307 +2527,332 @@ msgid "" "data feel free to post an example in the\n" " github issues." msgstr "" +" Numai site-urile web care conțin informații despre ld+json sau informații " +"microdata în prezent\n" +" pot fi importate. Majoritatea pagini " +"importante de rețete au suport pentru acest lucru. Dacă site-ul nu poate fi " +"importat, dar\n" +" crezi că\n" +" acesta are, probabil, un fel de date " +"structurate nu ezitați să posta un exemplu în\n" +" github probleme." #: .\cookbook\templates\url_import.html:641 msgid "Google ld+json Info" -msgstr "" +msgstr "Informații Google ld+json" #: .\cookbook\templates\url_import.html:644 msgid "GitHub Issues" -msgstr "" +msgstr "GitHub Probleme" #: .\cookbook\templates\url_import.html:646 msgid "Recipe Markup Specification" -msgstr "" +msgstr "Specificații a Markup-ului de rețetă" #: .\cookbook\views\api.py:83 .\cookbook\views\api.py:132 msgid "Parameter updated_at incorrectly formatted" -msgstr "" +msgstr "Parametrul updated_at formatat incorect" #: .\cookbook\views\api.py:152 #, python-brace-format msgid "No {self.basename} with id {pk} exists" -msgstr "" +msgstr "Nu există {self.basename} cu id {pk}" #: .\cookbook\views\api.py:156 msgid "Cannot merge with the same object!" -msgstr "" +msgstr "Nu se poate uni cu același obiect!" #: .\cookbook\views\api.py:163 #, python-brace-format msgid "No {self.basename} with id {target} exists" -msgstr "" +msgstr "Nu există {self.basename} cu id {target}" #: .\cookbook\views\api.py:168 msgid "Cannot merge with child object!" -msgstr "" +msgstr "Nu se poate uni cu obiect copil!" #: .\cookbook\views\api.py:201 #, python-brace-format msgid "{source.name} was merged successfully with {target.name}" -msgstr "" +msgstr "{source.name} a fost unit cu succes cu {target.name}" #: .\cookbook\views\api.py:205 #, python-brace-format msgid "An error occurred attempting to merge {source.name} with {target.name}" -msgstr "" +msgstr "A apărut o eroare la încercarea de a uni {source.name} cu {target.name}" #: .\cookbook\views\api.py:249 #, python-brace-format msgid "No {self.basename} with id {child} exists" -msgstr "" +msgstr "Nu există {self.basename} cu id {child}" #: .\cookbook\views\api.py:258 #, python-brace-format msgid "{child.name} was moved successfully to the root." -msgstr "" +msgstr "{child.name} a fost mutat cu succes la rădăcină." #: .\cookbook\views\api.py:261 .\cookbook\views\api.py:279 msgid "An error occurred attempting to move " -msgstr "" +msgstr "A apărut o eroare la încercarea de a muta " #: .\cookbook\views\api.py:264 msgid "Cannot move an object to itself!" -msgstr "" +msgstr "Nu se poate muta un obiect la sine!" #: .\cookbook\views\api.py:270 #, python-brace-format msgid "No {self.basename} with id {parent} exists" -msgstr "" +msgstr "Nu există {self.basename} cu id {parent}" #: .\cookbook\views\api.py:276 #, python-brace-format msgid "{child.name} was moved successfully to parent {parent.name}" -msgstr "" +msgstr "{child.name} a fost mutat cu succes la părintele {parent.name}" #: .\cookbook\views\api.py:723 .\cookbook\views\data.py:42 #: .\cookbook\views\edit.py:129 .\cookbook\views\new.py:95 msgid "This feature is not yet available in the hosted version of tandoor!" msgstr "" +"Această funcție nu este încă disponibilă în versiunea găzduită a tandoor!" #: .\cookbook\views\api.py:745 msgid "Sync successful!" -msgstr "" +msgstr "Sincronizare de succes!" #: .\cookbook\views\api.py:750 msgid "Error synchronizing with Storage" -msgstr "" +msgstr "Eroare la sincronizarea cu stocarea" #: .\cookbook\views\api.py:828 msgid "Nothing to do." -msgstr "" +msgstr "Nimic de făcut." #: .\cookbook\views\api.py:843 msgid "The requested site provided malformed data and cannot be read." -msgstr "" +msgstr "Site-ul solicitat a furnizat date eronate și nu poate fi citit." #: .\cookbook\views\api.py:850 msgid "The requested page could not be found." -msgstr "" +msgstr "Pagina solicitată nu a putut fi găsită." #: .\cookbook\views\api.py:859 msgid "" "The requested site does not provide any recognized data format to import the " "recipe from." msgstr "" +"Site-ul solicitat nu oferă niciun format de date recunoscut din care să " +"importați rețeta." #: .\cookbook\views\api.py:873 msgid "No useable data could be found." -msgstr "" +msgstr "Nu au putut fi găsite date utilizabile." #: .\cookbook\views\api.py:889 msgid "I couldn't find anything to do." -msgstr "" +msgstr "Nu am putut găsi nimic de făcut." #: .\cookbook\views\data.py:34 .\cookbook\views\data.py:129 #: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:73 #: .\cookbook\views\new.py:33 msgid "You have reached the maximum number of recipes for your space." -msgstr "" +msgstr "Ai ajuns la numărul maxim de rețete pentru spațiul dvs." #: .\cookbook\views\data.py:38 .\cookbook\views\data.py:133 #: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:77 #: .\cookbook\views\new.py:37 msgid "You have more users than allowed in your space." -msgstr "" +msgstr "Aveți mai mulți utilizatori decât este permis în spațiul dvs." #: .\cookbook\views\data.py:111 #, python-format msgid "Batch edit done. %(count)d recipe was updated." msgid_plural "Batch edit done. %(count)d Recipes where updated." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Editarea de tip batch completă. %(count)d rețetă a fost actualizată." +msgstr[1] "Editarea de tip batch completă. %(count)d rețete au fost actualizate." +msgstr[2] "Editarea de tip batch completă. %(count)d rețete au fost actualizate." #: .\cookbook\views\delete.py:101 msgid "Monitor" -msgstr "" +msgstr "Monitorizare" #: .\cookbook\views\delete.py:125 .\cookbook\views\lists.py:86 #: .\cookbook\views\new.py:101 msgid "Storage Backend" -msgstr "" +msgstr "Backend de stocare" #: .\cookbook\views\delete.py:135 msgid "" "Could not delete this storage backend as it is used in at least one monitor." msgstr "" +"Nu s-a putut șterge acest backend de stocare, deoarece este utilizat în cel " +"puțin un supervizor." #: .\cookbook\views\delete.py:158 msgid "Recipe Book" -msgstr "" +msgstr "Carte de rețete" #: .\cookbook\views\delete.py:170 msgid "Bookmarks" -msgstr "" +msgstr "Marcaje" #: .\cookbook\views\delete.py:192 .\cookbook\views\new.py:235 msgid "Invite Link" -msgstr "" +msgstr "Link de invitare" #: .\cookbook\views\edit.py:125 msgid "You cannot edit this storage!" -msgstr "" +msgstr "Nu puteți edita acest spațiu de stocare!" #: .\cookbook\views\edit.py:149 msgid "Storage saved!" -msgstr "" +msgstr "Spațiu de stocare salvat!" #: .\cookbook\views\edit.py:155 msgid "There was an error updating this storage backend!" -msgstr "" +msgstr "A existat o eroare la actualizarea acestui backend de stocare!" #: .\cookbook\views\edit.py:248 msgid "Changes saved!" -msgstr "" +msgstr "Modificări salvate!" #: .\cookbook\views\edit.py:252 msgid "Error saving changes!" -msgstr "" +msgstr "Eroare la salvarea modificărilor!" #: .\cookbook\views\import_export.py:99 msgid "Importing is not implemented for this provider" -msgstr "" +msgstr "Importul nu este implementat pentru acest furnizor" #: .\cookbook\views\import_export.py:121 msgid "Exporting is not implemented for this provider" -msgstr "" +msgstr "Exportul nu este implementat pentru acest furnizor" #: .\cookbook\views\lists.py:26 msgid "Import Log" -msgstr "" +msgstr "Jurnal de import" #: .\cookbook\views\lists.py:39 msgid "Discovery" -msgstr "" +msgstr "Descoperă" #: .\cookbook\views\lists.py:69 msgid "Shopping Lists" -msgstr "" +msgstr "Liste de cumpărături" #: .\cookbook\views\lists.py:129 msgid "Foods" -msgstr "" +msgstr "Alimente" #: .\cookbook\views\lists.py:163 msgid "Supermarkets" -msgstr "" +msgstr "Supermarketuri" #: .\cookbook\views\lists.py:179 msgid "Shopping Categories" -msgstr "" +msgstr "Categorii de cumpărături" #: .\cookbook\views\lists.py:232 msgid "New Shopping List" -msgstr "" +msgstr "Listă de cumpărături nouă" #: .\cookbook\views\new.py:126 msgid "Imported new recipe!" -msgstr "" +msgstr "Rețetă nouă importată!" #: .\cookbook\views\new.py:129 msgid "There was an error importing this recipe!" -msgstr "" +msgstr "A existat o eroare la importul acestei rețete!" #: .\cookbook\views\new.py:209 msgid "Hello" -msgstr "" +msgstr "Bună" #: .\cookbook\views\new.py:209 msgid "You have been invited by " -msgstr "" +msgstr "Ați fost invitat de " #: .\cookbook\views\new.py:210 msgid " to join their Tandoor Recipes space " -msgstr "" +msgstr " pentru a vă alătura la spațiul lor de rețete Tandoor " #: .\cookbook\views\new.py:211 msgid "Click the following link to activate your account: " -msgstr "" +msgstr "Faceți clic pe următorul link pentru a vă activa contul: " #: .\cookbook\views\new.py:212 msgid "" "If the link does not work use the following code to manually join the space: " msgstr "" +"Dacă linkul nu funcționează, utilizați următorul cod pentru a vă alătura " +"manual spațiului: " #: .\cookbook\views\new.py:213 msgid "The invitation is valid until " -msgstr "" +msgstr "Invitația este valabilă până la " #: .\cookbook\views\new.py:214 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " msgstr "" +"Tandoor Recipes este un manager de rețete Open Source. Priviți pe GitHub " #: .\cookbook\views\new.py:217 msgid "Tandoor Recipes Invite" -msgstr "" +msgstr "Invitație Tandoor Recipes" #: .\cookbook\views\new.py:224 msgid "Invite link successfully send to user." -msgstr "" +msgstr "Link-ul invita cu succes trimite la utilizator." #: .\cookbook\views\new.py:227 msgid "" -"You have send to many emails, please share the link manually or wait a few " +"You have sent too many emails, please share the link manually or wait a few " "hours." msgstr "" +"Ați trimis prea multe e-mailuri, vă rugăm să partajați manual linkul sau să " +"așteptați câteva ore." #: .\cookbook\views\new.py:229 msgid "Email could not be sent to user. Please share the link manually." msgstr "" +"E-mailul nu a putut fi trimis utilizatorului. Vă rugăm să partajați link-ul " +"manual." #: .\cookbook\views\views.py:127 msgid "" "You have successfully created your own recipe space. Start by adding some " "recipes or invite other people to join you." msgstr "" +"V-ați creat cu succes propriul spațiu de rețete. Începeți prin a adăuga " +"câteva rețete sau invitați alte persoane să vi se alăture." #: .\cookbook\views\views.py:175 msgid "You do not have the required permissions to perform this action!" -msgstr "" +msgstr "Nu aveți permisiunile necesare pentru a efectua această acțiune!" #: .\cookbook\views\views.py:186 msgid "Comment saved!" -msgstr "" +msgstr "Comentariu salvat!" #: .\cookbook\views\views.py:277 msgid "This feature is not available in the demo version!" -msgstr "" +msgstr "Această funcție nu este disponibilă în versiunea demo!" #: .\cookbook\views\views.py:340 msgid "You must select at least one field to search!" -msgstr "" +msgstr "Trebuie să selectați cel puțin un câmp pentru a căuta!" #: .\cookbook\views\views.py:345 msgid "" "To use this search method you must select at least one full text search " "field!" msgstr "" +"Pentru a utiliza această metodă de căutare, trebuie să selectați cel puțin " +"un câmp de căutare text complet!" #: .\cookbook\views\views.py:349 msgid "Fuzzy search is not compatible with this search method!" -msgstr "" +msgstr "Căutarea vagă nu este compatibilă cu această metodă de căutare!" #: .\cookbook\views\views.py:452 msgid "" @@ -2534,39 +2860,48 @@ msgid "" "forgotten your superuser credentials please consult the django documentation " "on how to reset passwords." msgstr "" +"Pagina de inițializare poate fi utilizată numai pentru a crea primul " +"utilizator! Dacă ați uitat datele superutilizatorului, vă rugăm să " +"consultați documentația Django despre cum să resetați parolele." #: .\cookbook\views\views.py:459 msgid "Passwords dont match!" -msgstr "" +msgstr "Parolele nu se potrivesc!" #: .\cookbook\views\views.py:475 msgid "User has been created, please login!" -msgstr "" +msgstr "Utilizatorul a fost creat, vă rugăm să vă autentificați!" #: .\cookbook\views\views.py:491 msgid "Malformed Invite Link supplied!" -msgstr "" +msgstr "Link-ul de invitație este furnizat malformat!" #: .\cookbook\views\views.py:498 msgid "You are already member of a space and therefore cannot join this one." msgstr "" +"Sunteți deja membru al unui spațiu și, prin urmare, nu vă puteți alătura " +"acestuia." #: .\cookbook\views\views.py:509 msgid "Successfully joined space." -msgstr "" +msgstr "Spațiu alăturat cu succes." #: .\cookbook\views\views.py:515 msgid "Invite Link not valid or already used!" -msgstr "" +msgstr "Link-ul de invitație nu este valid sau deja utilizat!" #: .\cookbook\views\views.py:579 msgid "" "Reporting share links is not enabled for this instance. Please notify the " "page administrator to report problems." msgstr "" +"Raportarea linkurilor de partajare nu este activată pentru această instanță. " +"Vă rugăm să anunțați administratorul paginii pentru a raporta probleme." #: .\cookbook\views\views.py:585 msgid "" "Recipe sharing link has been disabled! For additional information please " "contact the page administrator." msgstr "" +"Partajare link-urilor de rețete a fost dezactivată! Pentru informații " +"suplimentare, vă rugăm să contactați administratorul paginii." diff --git a/cookbook/locale/ru/LC_MESSAGES/django.mo b/cookbook/locale/ru/LC_MESSAGES/django.mo index aa9816bc6..eea0334b2 100644 Binary files a/cookbook/locale/ru/LC_MESSAGES/django.mo and b/cookbook/locale/ru/LC_MESSAGES/django.mo differ diff --git a/cookbook/locale/ru/LC_MESSAGES/django.po b/cookbook/locale/ru/LC_MESSAGES/django.po index 31c4280d7..52a4708a3 100644 --- a/cookbook/locale/ru/LC_MESSAGES/django.po +++ b/cookbook/locale/ru/LC_MESSAGES/django.po @@ -8,17 +8,17 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-09-13 22:40+0200\n" -"PO-Revision-Date: 2022-11-30 19:09+0000\n" -"Last-Translator: Alex \n" +"PO-Revision-Date: 2023-05-01 07:55+0000\n" +"Last-Translator: axeron2036 \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.14.1\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 4.15\n" #: .\cookbook\filters.py:23 .\cookbook\templates\base.html:125 #: .\cookbook\templates\forms\ingredients.html:34 @@ -286,7 +286,7 @@ msgstr "" #: .\cookbook\forms.py:497 msgid "Search Method" -msgstr "" +msgstr "Способ поиска" #: .\cookbook\forms.py:498 msgid "Fuzzy Lookups" @@ -861,7 +861,7 @@ msgstr "" #: .\cookbook\templates\base.html:220 msgid "GitHub" -msgstr "" +msgstr "GitHub" #: .\cookbook\templates\base.html:224 msgid "API Browser" @@ -1937,7 +1937,7 @@ msgstr "" #: .\cookbook\templates\space.html:106 msgid "user" -msgstr "" +msgstr "пользователь" #: .\cookbook\templates\space.html:107 msgid "guest" diff --git a/cookbook/locale/sl/LC_MESSAGES/django.mo b/cookbook/locale/sl/LC_MESSAGES/django.mo index a6153c74f..d2a3587b9 100644 Binary files a/cookbook/locale/sl/LC_MESSAGES/django.mo and b/cookbook/locale/sl/LC_MESSAGES/django.mo differ diff --git a/cookbook/locale/sl/LC_MESSAGES/django.po b/cookbook/locale/sl/LC_MESSAGES/django.po index cb96c830e..3ef3f5f09 100644 --- a/cookbook/locale/sl/LC_MESSAGES/django.po +++ b/cookbook/locale/sl/LC_MESSAGES/django.po @@ -8,17 +8,17 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-11-08 16:27+0100\n" -"PO-Revision-Date: 2022-02-02 15:31+0000\n" -"Last-Translator: Mario Dvorsek \n" +"PO-Revision-Date: 2023-04-12 11:55+0000\n" +"Last-Translator: noxonad \n" "Language-Team: Slovenian \n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" -"%100==4 ? 2 : 3;\n" -"X-Generator: Weblate 4.10.1\n" +"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " +"n%100==4 ? 2 : 3;\n" +"X-Generator: Weblate 4.15\n" #: .\cookbook\filters.py:23 .\cookbook\templates\base.html:125 #: .\cookbook\templates\forms\ingredients.html:34 @@ -2107,7 +2107,7 @@ msgstr "" #: .\cookbook\templates\url_import.html:36 msgid "URL" -msgstr "" +msgstr "URL" #: .\cookbook\templates\url_import.html:38 msgid "App" diff --git a/cookbook/locale/tr/LC_MESSAGES/django.mo b/cookbook/locale/tr/LC_MESSAGES/django.mo index 94cbafa57..9b45dacfc 100644 Binary files a/cookbook/locale/tr/LC_MESSAGES/django.mo and b/cookbook/locale/tr/LC_MESSAGES/django.mo differ diff --git a/cookbook/locale/tr/LC_MESSAGES/django.po b/cookbook/locale/tr/LC_MESSAGES/django.po index ce151113c..7d24fb255 100644 --- a/cookbook/locale/tr/LC_MESSAGES/django.po +++ b/cookbook/locale/tr/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-07-12 19:20+0200\n" +"POT-Creation-Date: 2023-04-26 07:46+0200\n" "PO-Revision-Date: 2022-11-06 22:09+0000\n" "Last-Translator: Gorkem \n" "Language-Team: Turkish 1);\n" "X-Generator: Weblate 4.14.1\n" -#: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 -#: .\cookbook\templates\stats.html:28 -msgid "Ingredients" -msgstr "Malzemeler" - -#: .\cookbook\forms.py:53 +#: .\cookbook\forms.py:52 msgid "Default unit" msgstr "Varsayılan birim" -#: .\cookbook\forms.py:54 +#: .\cookbook\forms.py:53 msgid "Use fractions" msgstr "" -#: .\cookbook\forms.py:55 +#: .\cookbook\forms.py:54 msgid "Use KJ" msgstr "" -#: .\cookbook\forms.py:56 +#: .\cookbook\forms.py:55 msgid "Theme" msgstr "" -#: .\cookbook\forms.py:57 +#: .\cookbook\forms.py:56 msgid "Navbar color" msgstr "" -#: .\cookbook\forms.py:58 +#: .\cookbook\forms.py:57 msgid "Sticky navbar" msgstr "" -#: .\cookbook\forms.py:59 +#: .\cookbook\forms.py:58 msgid "Default page" msgstr "" -#: .\cookbook\forms.py:60 -#, fuzzy -#| msgid "Show recently viewed recipes on search page." -msgid "Show recent recipes" -msgstr "Son görüntülenen tarifleri arama sayfasında göster." - -#: .\cookbook\forms.py:61 -msgid "Search style" -msgstr "" - -#: .\cookbook\forms.py:62 +#: .\cookbook\forms.py:59 msgid "Plan sharing" msgstr "" -#: .\cookbook\forms.py:63 +#: .\cookbook\forms.py:60 #, fuzzy #| msgid "Ingredients" msgid "Ingredient decimal places" msgstr "Malzemeler" -#: .\cookbook\forms.py:64 +#: .\cookbook\forms.py:61 msgid "Shopping list auto sync period" msgstr "" -#: .\cookbook\forms.py:65 .\cookbook\templates\recipe_view.html:21 -#: .\cookbook\templates\stats.html:47 +#: .\cookbook\forms.py:62 .\cookbook\templates\recipe_view.html:36 msgid "Comments" msgstr "Yorumlar" -#: .\cookbook\forms.py:66 +#: .\cookbook\forms.py:63 msgid "Left-handed mode" msgstr "" -#: .\cookbook\forms.py:70 +#: .\cookbook\forms.py:67 msgid "" "Color of the top navigation bar. Not all colors work with all themes, just " "try them out!" @@ -96,41 +80,37 @@ msgstr "" "Gezinti çubuğunun rengi. Bütün renkeler bütün temalarla çalışmayabilir, önce " "deneyin!" -#: .\cookbook\forms.py:72 +#: .\cookbook\forms.py:69 msgid "Default Unit to be used when inserting a new ingredient into a recipe." msgstr "Bir tarife yeni bir malzeme eklenirken kullanılacak Varsayılan Birim." -#: .\cookbook\forms.py:74 +#: .\cookbook\forms.py:71 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" msgstr "" -#: .\cookbook\forms.py:76 +#: .\cookbook\forms.py:73 msgid "Display nutritional energy amounts in joules instead of calories" msgstr "" -#: .\cookbook\forms.py:77 +#: .\cookbook\forms.py:74 msgid "Users with whom newly created meal plans should be shared by default." msgstr "" -#: .\cookbook\forms.py:78 +#: .\cookbook\forms.py:75 msgid "Users with whom to share shopping lists." msgstr "" -#: .\cookbook\forms.py:80 -msgid "Show recently viewed recipes on search page." -msgstr "Son görüntülenen tarifleri arama sayfasında göster." - -#: .\cookbook\forms.py:81 +#: .\cookbook\forms.py:76 msgid "Number of decimals to round ingredients." msgstr "Malzeme birimleri için yuvarlanma basamağı." -#: .\cookbook\forms.py:82 +#: .\cookbook\forms.py:77 msgid "If you want to be able to create and see comments underneath recipes." msgstr "Tariflerin altında yorumlar oluşturup görebilmek istiyorsanız." -#: .\cookbook\forms.py:84 .\cookbook\forms.py:496 +#: .\cookbook\forms.py:79 .\cookbook\forms.py:492 msgid "" "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. " @@ -143,408 +123,447 @@ msgstr "" "fazla kişiyle alışveriş yaparken kullanışlıdır, ancak biraz mobil veri " "kullanabilir. Örnek sınırından düşükse, kaydederken sıfırlanır." -#: .\cookbook\forms.py:87 +#: .\cookbook\forms.py:82 msgid "Makes the navbar stick to the top of the page." msgstr "" -#: .\cookbook\forms.py:88 .\cookbook\forms.py:499 +#: .\cookbook\forms.py:83 .\cookbook\forms.py:495 msgid "Automatically add meal plan ingredients to shopping list." msgstr "" -#: .\cookbook\forms.py:89 +#: .\cookbook\forms.py:84 msgid "Exclude ingredients that are on hand." msgstr "" -#: .\cookbook\forms.py:90 +#: .\cookbook\forms.py:85 msgid "Will optimize the UI for use with your left hand." msgstr "" -#: .\cookbook\forms.py:107 +#: .\cookbook\forms.py:102 msgid "" "Both fields are optional. If none are given the username will be displayed " "instead" msgstr "" -#: .\cookbook\forms.py:128 .\cookbook\forms.py:301 +#: .\cookbook\forms.py:123 .\cookbook\forms.py:297 msgid "Name" msgstr "İsim" -#: .\cookbook\forms.py:129 .\cookbook\forms.py:302 -#: .\cookbook\templates\stats.html:24 .\cookbook\views\lists.py:88 +#: .\cookbook\forms.py:124 .\cookbook\forms.py:298 .\cookbook\views\lists.py:88 msgid "Keywords" msgstr "" -#: .\cookbook\forms.py:130 +#: .\cookbook\forms.py:125 msgid "Preparation time in minutes" msgstr "" -#: .\cookbook\forms.py:131 +#: .\cookbook\forms.py:126 msgid "Waiting time (cooking/baking) in minutes" msgstr "" -#: .\cookbook\forms.py:132 .\cookbook\forms.py:270 .\cookbook\forms.py:303 +#: .\cookbook\forms.py:127 .\cookbook\forms.py:266 .\cookbook\forms.py:299 msgid "Path" msgstr "" -#: .\cookbook\forms.py:133 +#: .\cookbook\forms.py:128 msgid "Storage UID" msgstr "" -#: .\cookbook\forms.py:165 +#: .\cookbook\forms.py:161 msgid "Default" msgstr "Varsayılan" -#: .\cookbook\forms.py:177 +#: .\cookbook\forms.py:173 msgid "" "To prevent duplicates recipes with the same name as existing ones are " "ignored. Check this box to import everything." msgstr "" -#: .\cookbook\forms.py:200 +#: .\cookbook\forms.py:196 msgid "Add your comment: " msgstr "" -#: .\cookbook\forms.py:215 +#: .\cookbook\forms.py:211 msgid "Leave empty for dropbox and enter app password for nextcloud." msgstr "" -#: .\cookbook\forms.py:222 +#: .\cookbook\forms.py:218 msgid "Leave empty for nextcloud and enter api token for dropbox." msgstr "" -#: .\cookbook\forms.py:231 +#: .\cookbook\forms.py:227 msgid "" "Leave empty for dropbox and enter only base url for nextcloud (/remote." "php/webdav/ is added automatically)" msgstr "" -#: .\cookbook\forms.py:269 .\cookbook\views\edit.py:157 +#: .\cookbook\forms.py:265 .\cookbook\views\edit.py:157 msgid "Storage" msgstr "" -#: .\cookbook\forms.py:271 +#: .\cookbook\forms.py:267 msgid "Active" msgstr "Aktif" -#: .\cookbook\forms.py:277 +#: .\cookbook\forms.py:273 msgid "Search String" msgstr "" -#: .\cookbook\forms.py:304 +#: .\cookbook\forms.py:300 msgid "File ID" msgstr "" -#: .\cookbook\forms.py:326 +#: .\cookbook\forms.py:322 msgid "You must provide at least a recipe or a title." msgstr "" -#: .\cookbook\forms.py:339 +#: .\cookbook\forms.py:335 msgid "You can list default users to share recipes with in the settings." msgstr "" -#: .\cookbook\forms.py:340 +#: .\cookbook\forms.py:336 msgid "" "You can use markdown to format this field. See the docs here" msgstr "" -#: .\cookbook\forms.py:366 +#: .\cookbook\forms.py:362 msgid "Maximum number of users for this space reached." msgstr "" -#: .\cookbook\forms.py:372 +#: .\cookbook\forms.py:368 msgid "Email address already taken!" msgstr "" -#: .\cookbook\forms.py:380 +#: .\cookbook\forms.py:376 msgid "" "An email address is not required but if present the invite link will be sent " "to the user." msgstr "" -#: .\cookbook\forms.py:395 +#: .\cookbook\forms.py:391 msgid "Name already taken." msgstr "" -#: .\cookbook\forms.py:406 +#: .\cookbook\forms.py:402 msgid "Accept Terms and Privacy" msgstr "" -#: .\cookbook\forms.py:438 +#: .\cookbook\forms.py:434 msgid "" "Determines how fuzzy a search is if it uses trigram similarity matching (e." "g. low values mean more typos are ignored)." msgstr "" -#: .\cookbook\forms.py:448 +#: .\cookbook\forms.py:444 msgid "" "Select type method of search. Click here for " "full description of choices." msgstr "" -#: .\cookbook\forms.py:449 +#: .\cookbook\forms.py:445 msgid "" "Use fuzzy matching on units, keywords and ingredients when editing and " "importing recipes." msgstr "" -#: .\cookbook\forms.py:451 +#: .\cookbook\forms.py:447 msgid "" "Fields to search ignoring accents. Selecting this option can improve or " "degrade search quality depending on language" msgstr "" -#: .\cookbook\forms.py:453 +#: .\cookbook\forms.py:449 msgid "" "Fields to search for partial matches. (e.g. searching for 'Pie' will return " "'pie' and 'piece' and 'soapie')" msgstr "" -#: .\cookbook\forms.py:455 +#: .\cookbook\forms.py:451 msgid "" "Fields to search for beginning of word matches. (e.g. searching for 'sa' " "will return 'salad' and 'sandwich')" msgstr "" -#: .\cookbook\forms.py:457 +#: .\cookbook\forms.py:453 msgid "" "Fields to 'fuzzy' search. (e.g. searching for 'recpie' will find 'recipe'.) " "Note: this option will conflict with 'web' and 'raw' methods of search." msgstr "" -#: .\cookbook\forms.py:459 +#: .\cookbook\forms.py:455 msgid "" "Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " "only function with fulltext fields." msgstr "" -#: .\cookbook\forms.py:463 +#: .\cookbook\forms.py:459 msgid "Search Method" msgstr "" -#: .\cookbook\forms.py:464 +#: .\cookbook\forms.py:460 msgid "Fuzzy Lookups" msgstr "" -#: .\cookbook\forms.py:465 +#: .\cookbook\forms.py:461 msgid "Ignore Accent" msgstr "" -#: .\cookbook\forms.py:466 +#: .\cookbook\forms.py:462 msgid "Partial Match" msgstr "" -#: .\cookbook\forms.py:467 +#: .\cookbook\forms.py:463 msgid "Starts With" msgstr "" -#: .\cookbook\forms.py:468 +#: .\cookbook\forms.py:464 msgid "Fuzzy Search" msgstr "" -#: .\cookbook\forms.py:469 +#: .\cookbook\forms.py:465 msgid "Full Text" msgstr "" -#: .\cookbook\forms.py:494 +#: .\cookbook\forms.py:490 msgid "" "Users will see all items you add to your shopping list. They must add you " "to see items on their list." msgstr "" -#: .\cookbook\forms.py:500 +#: .\cookbook\forms.py:496 msgid "" "When adding a meal plan to the shopping list (manually or automatically), " "include all related recipes." msgstr "" -#: .\cookbook\forms.py:501 +#: .\cookbook\forms.py:497 msgid "" "When adding a meal plan to the shopping list (manually or automatically), " "exclude ingredients that are on hand." msgstr "" -#: .\cookbook\forms.py:502 +#: .\cookbook\forms.py:498 msgid "Default number of hours to delay a shopping list entry." msgstr "" -#: .\cookbook\forms.py:503 +#: .\cookbook\forms.py:499 msgid "Filter shopping list to only include supermarket categories." msgstr "" -#: .\cookbook\forms.py:504 +#: .\cookbook\forms.py:500 msgid "Days of recent shopping list entries to display." msgstr "" -#: .\cookbook\forms.py:505 +#: .\cookbook\forms.py:501 msgid "Mark food 'On Hand' when checked off shopping list." msgstr "" -#: .\cookbook\forms.py:506 +#: .\cookbook\forms.py:502 msgid "Delimiter to use for CSV exports." msgstr "" -#: .\cookbook\forms.py:507 +#: .\cookbook\forms.py:503 msgid "Prefix to add when copying list to the clipboard." msgstr "" -#: .\cookbook\forms.py:511 +#: .\cookbook\forms.py:507 msgid "Share Shopping List" msgstr "" -#: .\cookbook\forms.py:512 +#: .\cookbook\forms.py:508 msgid "Autosync" msgstr "" -#: .\cookbook\forms.py:513 +#: .\cookbook\forms.py:509 msgid "Auto Add Meal Plan" msgstr "" -#: .\cookbook\forms.py:514 +#: .\cookbook\forms.py:510 msgid "Exclude On Hand" msgstr "" -#: .\cookbook\forms.py:515 +#: .\cookbook\forms.py:511 msgid "Include Related" msgstr "" -#: .\cookbook\forms.py:516 +#: .\cookbook\forms.py:512 msgid "Default Delay Hours" msgstr "" -#: .\cookbook\forms.py:517 +#: .\cookbook\forms.py:513 msgid "Filter to Supermarket" msgstr "" -#: .\cookbook\forms.py:518 +#: .\cookbook\forms.py:514 msgid "Recent Days" msgstr "" -#: .\cookbook\forms.py:519 +#: .\cookbook\forms.py:515 msgid "CSV Delimiter" msgstr "" -#: .\cookbook\forms.py:520 +#: .\cookbook\forms.py:516 msgid "List Prefix" msgstr "" -#: .\cookbook\forms.py:521 +#: .\cookbook\forms.py:517 msgid "Auto On Hand" msgstr "" -#: .\cookbook\forms.py:531 +#: .\cookbook\forms.py:527 msgid "Reset Food Inheritance" msgstr "" -#: .\cookbook\forms.py:532 +#: .\cookbook\forms.py:528 msgid "Reset all food to inherit the fields configured." msgstr "" -#: .\cookbook\forms.py:544 +#: .\cookbook\forms.py:540 msgid "Fields on food that should be inherited by default." msgstr "" -#: .\cookbook\forms.py:545 +#: .\cookbook\forms.py:541 #, fuzzy #| msgid "Show recently viewed recipes on search page." msgid "Show recipe counts on search filters" msgstr "Son görüntülenen tarifleri arama sayfasında göster." -#: .\cookbook\helper\AllAuthCustomAdapter.py:36 +#: .\cookbook\forms.py:542 +msgid "Use the plural form for units and food inside this space." +msgstr "" + +#: .\cookbook\helper\AllAuthCustomAdapter.py:39 msgid "" "In order to prevent spam, the requested email was not send. Please wait a " "few minutes and try again." msgstr "" -#: .\cookbook\helper\permission_helper.py:149 -#: .\cookbook\helper\permission_helper.py:172 .\cookbook\views\views.py:152 +#: .\cookbook\helper\permission_helper.py:164 +#: .\cookbook\helper\permission_helper.py:187 .\cookbook\views\views.py:117 msgid "You are not logged in and therefore cannot view this page!" msgstr "" -#: .\cookbook\helper\permission_helper.py:153 -#: .\cookbook\helper\permission_helper.py:159 -#: .\cookbook\helper\permission_helper.py:184 -#: .\cookbook\helper\permission_helper.py:254 -#: .\cookbook\helper\permission_helper.py:268 -#: .\cookbook\helper\permission_helper.py:279 -#: .\cookbook\helper\permission_helper.py:290 .\cookbook\views\data.py:33 -#: .\cookbook\views\views.py:163 .\cookbook\views\views.py:170 -#: .\cookbook\views\views.py:249 +#: .\cookbook\helper\permission_helper.py:168 +#: .\cookbook\helper\permission_helper.py:174 +#: .\cookbook\helper\permission_helper.py:199 +#: .\cookbook\helper\permission_helper.py:269 +#: .\cookbook\helper\permission_helper.py:283 +#: .\cookbook\helper\permission_helper.py:294 +#: .\cookbook\helper\permission_helper.py:305 +#: .\cookbook\helper\permission_helper.py:321 +#: .\cookbook\helper\permission_helper.py:342 .\cookbook\views\data.py:36 +#: .\cookbook\views\views.py:128 .\cookbook\views\views.py:135 msgid "You do not have the required permissions to view this page!" msgstr "" -#: .\cookbook\helper\permission_helper.py:177 -#: .\cookbook\helper\permission_helper.py:200 -#: .\cookbook\helper\permission_helper.py:222 +#: .\cookbook\helper\permission_helper.py:192 +#: .\cookbook\helper\permission_helper.py:215 #: .\cookbook\helper\permission_helper.py:237 +#: .\cookbook\helper\permission_helper.py:252 msgid "You cannot interact with this object as it is not owned by you!" msgstr "" -#: .\cookbook\helper\permission_helper.py:321 +#: .\cookbook\helper\permission_helper.py:403 msgid "You have reached the maximum number of recipes for your space." msgstr "" -#: .\cookbook\helper\permission_helper.py:333 +#: .\cookbook\helper\permission_helper.py:415 msgid "You have more users than allowed in your space." msgstr "" -#: .\cookbook\helper\recipe_search.py:565 +#: .\cookbook\helper\recipe_search.py:630 msgid "One of queryset or hash_key must be provided" msgstr "" -#: .\cookbook\helper\shopping_helper.py:152 +#: .\cookbook\helper\recipe_url_import.py:266 +msgid "reverse rotation" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:267 +msgid "careful rotation" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:268 +msgid "knead" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:269 +msgid "thicken" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:270 +msgid "warm up" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:271 +msgid "ferment" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:272 +msgid "sous-vide" +msgstr "" + +#: .\cookbook\helper\shopping_helper.py:157 msgid "You must supply a servings size" msgstr "" -#: .\cookbook\helper\template_helper.py:64 -#: .\cookbook\helper\template_helper.py:66 +#: .\cookbook\helper\template_helper.py:79 +#: .\cookbook\helper\template_helper.py:81 msgid "Could not parse template code." msgstr "" -#: .\cookbook\integration\copymethat.py:41 +#: .\cookbook\integration\copymethat.py:44 #: .\cookbook\integration\melarecipes.py:37 msgid "Favorite" msgstr "" -#: .\cookbook\integration\copymethat.py:70 -#: .\cookbook\integration\recettetek.py:54 -#: .\cookbook\integration\recipekeeper.py:63 -msgid "Imported from" +#: .\cookbook\integration\copymethat.py:50 +msgid "I made this" msgstr "" -#: .\cookbook\integration\integration.py:223 +#: .\cookbook\integration\integration.py:218 msgid "" "Importer expected a .zip file. Did you choose the correct importer type for " "your data ?" msgstr "" -#: .\cookbook\integration\integration.py:226 +#: .\cookbook\integration\integration.py:221 msgid "" "An unexpected error occurred during the import. Please make sure you have " "uploaded a valid file." msgstr "" -#: .\cookbook\integration\integration.py:231 +#: .\cookbook\integration\integration.py:226 msgid "The following recipes were ignored because they already existed:" msgstr "" -#: .\cookbook\integration\integration.py:235 +#: .\cookbook\integration\integration.py:230 #, python-format msgid "Imported %s recipes." msgstr "" -#: .\cookbook\integration\paprika.py:46 -msgid "Notes" +#: .\cookbook\integration\openeats.py:26 +msgid "Recipe source:" msgstr "" #: .\cookbook\integration\paprika.py:49 +msgid "Notes" +msgstr "" + +#: .\cookbook\integration\paprika.py:52 msgid "Nutritional Information" msgstr "" -#: .\cookbook\integration\paprika.py:53 +#: .\cookbook\integration\paprika.py:56 msgid "Source" msgstr "" +#: .\cookbook\integration\recettetek.py:54 +#: .\cookbook\integration\recipekeeper.py:70 +msgid "Imported from" +msgstr "" + #: .\cookbook\integration\saffron.py:23 msgid "Servings" msgstr "" @@ -557,9 +576,7 @@ msgstr "" msgid "Preparation Time" msgstr "" -#: .\cookbook\integration\saffron.py:29 -#: .\cookbook\templates\forms\ingredients.html:7 -#: .\cookbook\templates\index.html:7 +#: .\cookbook\integration\saffron.py:29 .\cookbook\templates\index.html:7 msgid "Cookbook" msgstr "" @@ -599,171 +616,158 @@ msgstr "" msgid "Other" msgstr "" -#: .\cookbook\models.py:251 +#: .\cookbook\models.py:261 msgid "" "Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " "upload." msgstr "" -#: .\cookbook\models.py:353 .\cookbook\templates\search.html:7 +#: .\cookbook\models.py:365 .\cookbook\templates\search.html:7 +#: .\cookbook\templates\settings.html:18 #: .\cookbook\templates\space_manage.html:7 msgid "Search" msgstr "" -#: .\cookbook\models.py:354 .\cookbook\templates\base.html:107 +#: .\cookbook\models.py:366 .\cookbook\templates\base.html:110 #: .\cookbook\templates\meal_plan.html:7 .\cookbook\views\delete.py:178 #: .\cookbook\views\edit.py:211 .\cookbook\views\new.py:179 msgid "Meal-Plan" msgstr "" -#: .\cookbook\models.py:355 .\cookbook\templates\base.html:115 +#: .\cookbook\models.py:367 .\cookbook\templates\base.html:118 msgid "Books" msgstr "" -#: .\cookbook\models.py:363 -msgid "Small" -msgstr "" - -#: .\cookbook\models.py:363 -msgid "Large" -msgstr "" - -#: .\cookbook\models.py:363 .\cookbook\templates\generic\new_template.html:6 -#: .\cookbook\templates\generic\new_template.html:14 -msgid "New" -msgstr "" - -#: .\cookbook\models.py:584 +#: .\cookbook\models.py:580 msgid " is part of a recipe step and cannot be deleted" msgstr "" -#: .\cookbook\models.py:1162 .\cookbook\templates\search_info.html:28 +#: .\cookbook\models.py:1181 .\cookbook\templates\search_info.html:28 msgid "Simple" msgstr "" -#: .\cookbook\models.py:1163 .\cookbook\templates\search_info.html:33 +#: .\cookbook\models.py:1182 .\cookbook\templates\search_info.html:33 msgid "Phrase" msgstr "" -#: .\cookbook\models.py:1164 .\cookbook\templates\search_info.html:38 +#: .\cookbook\models.py:1183 .\cookbook\templates\search_info.html:38 msgid "Web" msgstr "" -#: .\cookbook\models.py:1165 .\cookbook\templates\search_info.html:47 +#: .\cookbook\models.py:1184 .\cookbook\templates\search_info.html:47 msgid "Raw" msgstr "" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 msgid "Food Alias" msgstr "" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 msgid "Unit Alias" msgstr "" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 msgid "Keyword Alias" msgstr "" -#: .\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 +#: .\cookbook\models.py:1232 +msgid "Description Replace" +msgstr "" + +#: .\cookbook\models.py:1232 +msgid "Instruction Replace" +msgstr "" + +#: .\cookbook\models.py:1258 .\cookbook\views\delete.py:36 +#: .\cookbook\views\edit.py:251 .\cookbook\views\new.py:48 msgid "Recipe" msgstr "" -#: .\cookbook\models.py:1228 +#: .\cookbook\models.py:1259 msgid "Food" msgstr "" -#: .\cookbook\models.py:1229 .\cookbook\templates\base.html:138 +#: .\cookbook\models.py:1260 .\cookbook\templates\base.html:141 msgid "Keyword" msgstr "" -#: .\cookbook\serializer.py:207 -msgid "Cannot modify Space owner permission." -msgstr "" - -#: .\cookbook\serializer.py:290 +#: .\cookbook\serializer.py:198 msgid "File uploads are not enabled for this Space." msgstr "" -#: .\cookbook\serializer.py:301 +#: .\cookbook\serializer.py:209 msgid "You have reached your file upload limit." msgstr "" -#: .\cookbook\serializer.py:1081 +#: .\cookbook\serializer.py:291 +msgid "Cannot modify Space owner permission." +msgstr "" + +#: .\cookbook\serializer.py:1093 msgid "Hello" msgstr "" -#: .\cookbook\serializer.py:1081 +#: .\cookbook\serializer.py:1093 msgid "You have been invited by " msgstr "" -#: .\cookbook\serializer.py:1082 +#: .\cookbook\serializer.py:1094 msgid " to join their Tandoor Recipes space " msgstr "" -#: .\cookbook\serializer.py:1083 +#: .\cookbook\serializer.py:1095 msgid "Click the following link to activate your account: " msgstr "" -#: .\cookbook\serializer.py:1084 +#: .\cookbook\serializer.py:1096 msgid "" "If the link does not work use the following code to manually join the space: " msgstr "" -#: .\cookbook\serializer.py:1085 +#: .\cookbook\serializer.py:1097 msgid "The invitation is valid until " msgstr "" -#: .\cookbook\serializer.py:1086 +#: .\cookbook\serializer.py:1098 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " msgstr "" -#: .\cookbook\serializer.py:1089 +#: .\cookbook\serializer.py:1101 msgid "Tandoor Recipes Invite" msgstr "" -#: .\cookbook\serializer.py:1209 +#: .\cookbook\serializer.py:1242 msgid "Existing shopping list to update" msgstr "" -#: .\cookbook\serializer.py:1211 +#: .\cookbook\serializer.py:1244 msgid "" "List of ingredient IDs from the recipe to add, if not provided all " "ingredients will be added." msgstr "" -#: .\cookbook\serializer.py:1213 +#: .\cookbook\serializer.py:1246 msgid "" "Providing a list_recipe ID and servings of 0 will delete that shopping list." msgstr "" -#: .\cookbook\serializer.py:1222 +#: .\cookbook\serializer.py:1255 msgid "Amount of food to add to the shopping list" msgstr "" -#: .\cookbook\serializer.py:1224 +#: .\cookbook\serializer.py:1257 msgid "ID of unit to use for the shopping list" msgstr "" -#: .\cookbook\serializer.py:1226 +#: .\cookbook\serializer.py:1259 msgid "When set to true will delete all food from active shopping lists." msgstr "" -#: .\cookbook\tables.py:36 .\cookbook\templates\generic\edit_template.html:6 -#: .\cookbook\templates\generic\edit_template.html:14 -#: .\cookbook\templates\recipes_table.html:82 -msgid "Edit" -msgstr "" - -#: .\cookbook\tables.py:116 .\cookbook\tables.py:131 +#: .\cookbook\tables.py:61 .\cookbook\tables.py:75 #: .\cookbook\templates\generic\delete_template.html:7 #: .\cookbook\templates\generic\delete_template.html:15 #: .\cookbook\templates\generic\edit_template.html:28 -#: .\cookbook\templates\recipes_table.html:90 msgid "Delete" msgstr "" @@ -791,9 +795,10 @@ msgstr "" #: .\cookbook\templates\account\email.html:12 #: .\cookbook\templates\account\password_change.html:11 #: .\cookbook\templates\account\password_set.html:11 -#: .\cookbook\templates\base.html:293 .\cookbook\templates\settings.html:6 +#: .\cookbook\templates\base.html:296 .\cookbook\templates\settings.html:6 #: .\cookbook\templates\settings.html:17 #: .\cookbook\templates\socialaccount\connections.html:10 +#: .\cookbook\templates\user_settings.html:8 msgid "Settings" msgstr "" @@ -880,8 +885,8 @@ msgid "" "request." msgstr "" -#: .\cookbook\templates\account\login.html:8 -#: .\cookbook\templates\base.html:340 .\cookbook\templates\openid\login.html:8 +#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:343 +#: .\cookbook\templates\openid\login.html:8 msgid "Login" msgstr "" @@ -901,21 +906,20 @@ msgstr "" msgid "Sign Up" msgstr "" +#: .\cookbook\templates\account\login.html:38 +msgid "Lost your password?" +msgstr "" + #: .\cookbook\templates\account\login.html:39 -#: .\cookbook\templates\account\login.html:41 #: .\cookbook\templates\account\password_reset.html:29 msgid "Reset My Password" msgstr "" -#: .\cookbook\templates\account\login.html:40 -msgid "Lost your password?" -msgstr "" - -#: .\cookbook\templates\account\login.html:52 +#: .\cookbook\templates\account\login.html:50 msgid "Social Login" msgstr "" -#: .\cookbook\templates\account\login.html:53 +#: .\cookbook\templates\account\login.html:51 msgid "You can use any of the following providers to sign in." msgstr "" @@ -941,7 +945,6 @@ msgstr "" #: .\cookbook\templates\account\password_change.html:12 #: .\cookbook\templates\account\password_set.html:12 -#: .\cookbook\templates\settings.html:76 msgid "Password" msgstr "" @@ -1045,56 +1048,53 @@ msgstr "" msgid "We are sorry, but the sign up is currently closed." msgstr "" -#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:330 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:333 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "" -#: .\cookbook\templates\base.html:103 .\cookbook\templates\index.html:87 -#: .\cookbook\templates\stats.html:22 +#: .\cookbook\templates\base.html:106 .\cookbook\templates\index.html:87 msgid "Recipes" msgstr "" -#: .\cookbook\templates\base.html:111 +#: .\cookbook\templates\base.html:114 msgid "Shopping" msgstr "" -#: .\cookbook\templates\base.html:150 .\cookbook\views\lists.py:105 +#: .\cookbook\templates\base.html:153 .\cookbook\views\lists.py:105 msgid "Foods" msgstr "" -#: .\cookbook\templates\base.html:162 -#: .\cookbook\templates\forms\ingredients.html:24 -#: .\cookbook\templates\stats.html:26 .\cookbook\views\lists.py:122 +#: .\cookbook\templates\base.html:165 .\cookbook\views\lists.py:122 msgid "Units" msgstr "" -#: .\cookbook\templates\base.html:176 .\cookbook\templates\supermarket.html:7 +#: .\cookbook\templates\base.html:179 .\cookbook\templates\supermarket.html:7 msgid "Supermarket" msgstr "" -#: .\cookbook\templates\base.html:188 +#: .\cookbook\templates\base.html:191 msgid "Supermarket Category" msgstr "" -#: .\cookbook\templates\base.html:200 .\cookbook\views\lists.py:171 +#: .\cookbook\templates\base.html:203 .\cookbook\views\lists.py:171 msgid "Automations" msgstr "" -#: .\cookbook\templates\base.html:214 .\cookbook\views\lists.py:207 +#: .\cookbook\templates\base.html:217 .\cookbook\views\lists.py:207 msgid "Files" msgstr "" -#: .\cookbook\templates\base.html:226 +#: .\cookbook\templates\base.html:229 msgid "Batch Edit" msgstr "" -#: .\cookbook\templates\base.html:238 .\cookbook\templates\history.html:6 +#: .\cookbook\templates\base.html:241 .\cookbook\templates\history.html:6 #: .\cookbook\templates\history.html:14 msgid "History" msgstr "" -#: .\cookbook\templates\base.html:252 +#: .\cookbook\templates\base.html:255 #: .\cookbook\templates\ingredient_editor.html:7 #: .\cookbook\templates\ingredient_editor.html:13 #, fuzzy @@ -1102,74 +1102,72 @@ msgstr "" msgid "Ingredient Editor" msgstr "Malzemeler" -#: .\cookbook\templates\base.html:264 +#: .\cookbook\templates\base.html:267 #: .\cookbook\templates\export_response.html:7 #: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 msgid "Export" msgstr "" -#: .\cookbook\templates\base.html:280 .\cookbook\templates\index.html:47 +#: .\cookbook\templates\base.html:283 .\cookbook\templates\index.html:47 msgid "Import Recipe" msgstr "" -#: .\cookbook\templates\base.html:282 +#: .\cookbook\templates\base.html:285 msgid "Create" msgstr "" -#: .\cookbook\templates\base.html:295 +#: .\cookbook\templates\base.html:298 #: .\cookbook\templates\generic\list_template.html:14 -#: .\cookbook\templates\stats.html:43 msgid "External Recipes" msgstr "" -#: .\cookbook\templates\base.html:298 -#: .\cookbook\templates\space_manage.html:15 +#: .\cookbook\templates\base.html:301 .\cookbook\templates\space_manage.html:15 msgid "Space Settings" msgstr "" -#: .\cookbook\templates\base.html:303 .\cookbook\templates\system.html:13 +#: .\cookbook\templates\base.html:306 .\cookbook\templates\system.html:13 msgid "System" msgstr "" -#: .\cookbook\templates\base.html:305 +#: .\cookbook\templates\base.html:308 msgid "Admin" msgstr "" -#: .\cookbook\templates\base.html:309 +#: .\cookbook\templates\base.html:312 #: .\cookbook\templates\space_overview.html:25 msgid "Your Spaces" msgstr "" -#: .\cookbook\templates\base.html:320 +#: .\cookbook\templates\base.html:323 #: .\cookbook\templates\space_overview.html:6 msgid "Overview" msgstr "" -#: .\cookbook\templates\base.html:324 +#: .\cookbook\templates\base.html:327 msgid "Markdown Guide" msgstr "" -#: .\cookbook\templates\base.html:326 +#: .\cookbook\templates\base.html:329 msgid "GitHub" msgstr "" -#: .\cookbook\templates\base.html:328 +#: .\cookbook\templates\base.html:331 msgid "Translate Tandoor" msgstr "" -#: .\cookbook\templates\base.html:332 +#: .\cookbook\templates\base.html:335 msgid "API Browser" msgstr "" -#: .\cookbook\templates\base.html:335 +#: .\cookbook\templates\base.html:338 msgid "Log out" msgstr "" -#: .\cookbook\templates\base.html:357 +#: .\cookbook\templates\base.html:360 msgid "You are using the free version of Tandor" msgstr "" -#: .\cookbook\templates\base.html:358 +#: .\cookbook\templates\base.html:361 msgid "Upgrade Now" msgstr "" @@ -1207,11 +1205,7 @@ msgstr "" #: .\cookbook\templates\forms\edit_import_recipe.html:14 #: .\cookbook\templates\generic\edit_template.html:23 #: .\cookbook\templates\generic\new_template.html:23 -#: .\cookbook\templates\settings.html:70 -#: .\cookbook\templates\settings.html:112 -#: .\cookbook\templates\settings.html:130 -#: .\cookbook\templates\settings.html:202 -#: .\cookbook\templates\settings.html:213 +#: .\cookbook\templates\settings.html:57 msgid "Save" msgstr "" @@ -1259,34 +1253,6 @@ msgstr "" msgid "Edit Recipe" msgstr "" -#: .\cookbook\templates\forms\ingredients.html:15 -msgid "Edit Ingredients" -msgstr "" - -#: .\cookbook\templates\forms\ingredients.html:16 -msgid "" -"\n" -" The following form can be used if, accidentally, two (or more) units " -"or ingredients where created that should be\n" -" the same.\n" -" It merges two units or ingredients and updates all recipes using " -"them.\n" -" " -msgstr "" - -#: .\cookbook\templates\forms\ingredients.html:26 -msgid "Are you sure that you want to merge these two units?" -msgstr "" - -#: .\cookbook\templates\forms\ingredients.html:31 -#: .\cookbook\templates\forms\ingredients.html:40 -msgid "Merge" -msgstr "" - -#: .\cookbook\templates\forms\ingredients.html:36 -msgid "Are you sure that you want to merge these two ingredients?" -msgstr "" - #: .\cookbook\templates\generic\delete_template.html:21 #, python-format msgid "Are you sure you want to delete the %(title)s: %(object)s " @@ -1308,6 +1274,11 @@ msgstr "" msgid "Cancel" msgstr "" +#: .\cookbook\templates\generic\edit_template.html:6 +#: .\cookbook\templates\generic\edit_template.html:14 +msgid "Edit" +msgstr "" + #: .\cookbook\templates\generic\edit_template.html:32 msgid "View" msgstr "" @@ -1329,13 +1300,16 @@ msgstr "" msgid "Import all" msgstr "" +#: .\cookbook\templates\generic\new_template.html:6 +#: .\cookbook\templates\generic\new_template.html:14 +msgid "New" +msgstr "" + #: .\cookbook\templates\generic\table_template.html:76 -#: .\cookbook\templates\recipes_table.html:121 msgid "previous" msgstr "" #: .\cookbook\templates\generic\table_template.html:98 -#: .\cookbook\templates\recipes_table.html:143 msgid "next" msgstr "" @@ -1347,24 +1321,11 @@ msgstr "" msgid "Cook Log" msgstr "" -#: .\cookbook\templates\import.html:6 -msgid "Import Recipes" -msgstr "" - -#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 #: .\cookbook\templates\import_response.html:7 .\cookbook\views\delete.py:86 #: .\cookbook\views\edit.py:191 msgid "Import" msgstr "" -#: .\cookbook\templates\include\recipe_open_modal.html:18 -msgid "Close" -msgstr "" - -#: .\cookbook\templates\include\recipe_open_modal.html:32 -msgid "Open Recipe" -msgstr "" - #: .\cookbook\templates\include\storage_backend_warning.html:4 msgid "Security Warning" msgstr "" @@ -1541,31 +1502,6 @@ msgstr "" msgid "Cell" msgstr "" -#: .\cookbook\templates\meal_plan_entry.html:6 -msgid "Meal Plan View" -msgstr "" - -#: .\cookbook\templates\meal_plan_entry.html:18 -msgid "Created by" -msgstr "" - -#: .\cookbook\templates\meal_plan_entry.html:20 -msgid "Shared with" -msgstr "" - -#: .\cookbook\templates\meal_plan_entry.html:48 -#: .\cookbook\templates\recipes_table.html:64 -msgid "Last cooked" -msgstr "" - -#: .\cookbook\templates\meal_plan_entry.html:50 -msgid "Never cooked before." -msgstr "" - -#: .\cookbook\templates\meal_plan_entry.html:76 -msgid "Other meals on this day" -msgstr "" - #: .\cookbook\templates\no_groups_info.html:5 #: .\cookbook\templates\no_groups_info.html:12 msgid "No Permissions" @@ -1610,43 +1546,26 @@ msgstr "" msgid "Back" msgstr "" -#: .\cookbook\templates\recipe_view.html:26 +#: .\cookbook\templates\profile.html:7 +msgid "Profile" +msgstr "" + +#: .\cookbook\templates\recipe_view.html:41 msgid "by" msgstr "" -#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:144 +#: .\cookbook\templates\recipe_view.html:59 .\cookbook\views\delete.py:144 #: .\cookbook\views\edit.py:171 msgid "Comment" msgstr "" -#: .\cookbook\templates\recipes_table.html:19 -#: .\cookbook\templates\recipes_table.html:23 -msgid "Recipe Image" -msgstr "" - -#: .\cookbook\templates\recipes_table.html:51 -msgid "Preparation time ca." -msgstr "" - -#: .\cookbook\templates\recipes_table.html:57 -msgid "Waiting time ca." -msgstr "" - -#: .\cookbook\templates\recipes_table.html:60 -msgid "External" -msgstr "" - -#: .\cookbook\templates\recipes_table.html:86 -msgid "Log Cooking" -msgstr "" - #: .\cookbook\templates\rest_framework\api.html:5 msgid "Recipe Home" msgstr "" #: .\cookbook\templates\search_info.html:5 #: .\cookbook\templates\search_info.html:9 -#: .\cookbook\templates\settings.html:172 +#: .\cookbook\templates\settings.html:24 msgid "Search Settings" msgstr "" @@ -1801,127 +1720,57 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\settings.html:28 -msgid "Account" -msgstr "" - -#: .\cookbook\templates\settings.html:35 -msgid "Preferences" -msgstr "" - -#: .\cookbook\templates\settings.html:42 -msgid "API-Settings" -msgstr "" - -#: .\cookbook\templates\settings.html:49 -msgid "Search-Settings" -msgstr "" - -#: .\cookbook\templates\settings.html:56 -msgid "Shopping-Settings" -msgstr "" - -#: .\cookbook\templates\settings.html:65 -msgid "Name Settings" -msgstr "" - -#: .\cookbook\templates\settings.html:73 -msgid "Account Settings" -msgstr "" - -#: .\cookbook\templates\settings.html:75 -msgid "Emails" -msgstr "" - -#: .\cookbook\templates\settings.html:78 -#: .\cookbook\templates\socialaccount\connections.html:11 -msgid "Social" -msgstr "" - -#: .\cookbook\templates\settings.html:91 -msgid "Language" -msgstr "" - -#: .\cookbook\templates\settings.html:121 -msgid "Style" -msgstr "" - -#: .\cookbook\templates\settings.html:142 -msgid "API Token" -msgstr "" - -#: .\cookbook\templates\settings.html:143 -msgid "" -"You can use both basic authentication and token based authentication to " -"access the REST API." -msgstr "" - -#: .\cookbook\templates\settings.html:160 -msgid "" -"Use the token as an Authorization header prefixed by the word token as shown " -"in the following examples:" -msgstr "" - -#: .\cookbook\templates\settings.html:162 -msgid "or" -msgstr "" - -#: .\cookbook\templates\settings.html:173 +#: .\cookbook\templates\settings.html:25 msgid "" "There are many options to configure the search depending on your personal " "preferences." msgstr "" -#: .\cookbook\templates\settings.html:174 +#: .\cookbook\templates\settings.html:26 msgid "" "Usually you do not need to configure any of them and can just stick " "with either the default or one of the following presets." msgstr "" -#: .\cookbook\templates\settings.html:175 +#: .\cookbook\templates\settings.html:27 msgid "" "If you do want to configure the search you can read about the different " "options here." msgstr "" -#: .\cookbook\templates\settings.html:180 +#: .\cookbook\templates\settings.html:32 msgid "Fuzzy" msgstr "" -#: .\cookbook\templates\settings.html:181 +#: .\cookbook\templates\settings.html:33 msgid "" "Find what you need even if your search or the recipe contains typos. Might " "return more results than needed to make sure you find what you are looking " "for." msgstr "" -#: .\cookbook\templates\settings.html:182 +#: .\cookbook\templates\settings.html:34 msgid "This is the default behavior" msgstr "" -#: .\cookbook\templates\settings.html:183 -#: .\cookbook\templates\settings.html:191 +#: .\cookbook\templates\settings.html:37 .\cookbook\templates\settings.html:46 msgid "Apply" msgstr "" -#: .\cookbook\templates\settings.html:188 +#: .\cookbook\templates\settings.html:42 msgid "Precise" msgstr "" -#: .\cookbook\templates\settings.html:189 +#: .\cookbook\templates\settings.html:43 msgid "" "Allows fine control over search results but might not return results if too " "many spelling mistakes are made." msgstr "" -#: .\cookbook\templates\settings.html:190 +#: .\cookbook\templates\settings.html:44 msgid "Perfect for large Databases" msgstr "" -#: .\cookbook\templates\settings.html:207 -msgid "Shopping Settings" -msgstr "" - #: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5 msgid "Cookbook Setup" msgstr "" @@ -1954,6 +1803,10 @@ msgstr "" msgid "Account Connections" msgstr "" +#: .\cookbook\templates\socialaccount\connections.html:11 +msgid "Social" +msgstr "" + #: .\cookbook\templates\socialaccount\connections.html:18 msgid "" "You can sign in to your account using any of the following third party\n" @@ -2046,70 +1899,42 @@ msgid "" "You can either be invited into an existing space or create your own one." msgstr "" -#: .\cookbook\templates\space_overview.html:45 +#: .\cookbook\templates\space_overview.html:53 msgid "Owner" msgstr "" -#: .\cookbook\templates\space_overview.html:49 +#: .\cookbook\templates\space_overview.html:57 msgid "Leave Space" msgstr "" -#: .\cookbook\templates\space_overview.html:70 -#: .\cookbook\templates\space_overview.html:80 +#: .\cookbook\templates\space_overview.html:78 +#: .\cookbook\templates\space_overview.html:88 msgid "Join Space" msgstr "" -#: .\cookbook\templates\space_overview.html:73 +#: .\cookbook\templates\space_overview.html:81 msgid "Join an existing space." msgstr "" -#: .\cookbook\templates\space_overview.html:75 +#: .\cookbook\templates\space_overview.html:83 msgid "" "To join an existing space either enter your invite token or click on the " "invite link the space owner send you." msgstr "" -#: .\cookbook\templates\space_overview.html:88 -#: .\cookbook\templates\space_overview.html:97 +#: .\cookbook\templates\space_overview.html:96 +#: .\cookbook\templates\space_overview.html:105 msgid "Create Space" msgstr "" -#: .\cookbook\templates\space_overview.html:91 +#: .\cookbook\templates\space_overview.html:99 msgid "Create your own recipe space." msgstr "" -#: .\cookbook\templates\space_overview.html:93 +#: .\cookbook\templates\space_overview.html:101 msgid "Start your own recipe space and invite other users to it." msgstr "" -#: .\cookbook\templates\stats.html:4 -msgid "Stats" -msgstr "" - -#: .\cookbook\templates\stats.html:10 -msgid "Statistics" -msgstr "" - -#: .\cookbook\templates\stats.html:19 -msgid "Number of objects" -msgstr "" - -#: .\cookbook\templates\stats.html:30 -msgid "Recipe Imports" -msgstr "" - -#: .\cookbook\templates\stats.html:38 -msgid "Objects stats" -msgstr "" - -#: .\cookbook\templates\stats.html:41 -msgid "Recipes without Keywords" -msgstr "" - -#: .\cookbook\templates\stats.html:45 -msgid "Internal Recipes" -msgstr "" - #: .\cookbook\templates\system.html:20 msgid "System Information" msgstr "" @@ -2207,249 +2032,262 @@ msgstr "" msgid "URL Import" msgstr "" -#: .\cookbook\views\api.py:105 .\cookbook\views\api.py:197 +#: .\cookbook\views\api.py:110 .\cookbook\views\api.py:202 msgid "Parameter updated_at incorrectly formatted" msgstr "" -#: .\cookbook\views\api.py:217 .\cookbook\views\api.py:320 +#: .\cookbook\views\api.py:222 .\cookbook\views\api.py:325 +#, python-brace-format msgid "No {self.basename} with id {pk} exists" msgstr "" -#: .\cookbook\views\api.py:221 +#: .\cookbook\views\api.py:226 msgid "Cannot merge with the same object!" msgstr "" -#: .\cookbook\views\api.py:228 +#: .\cookbook\views\api.py:233 +#, python-brace-format msgid "No {self.basename} with id {target} exists" msgstr "" -#: .\cookbook\views\api.py:233 +#: .\cookbook\views\api.py:238 msgid "Cannot merge with child object!" msgstr "" -#: .\cookbook\views\api.py:266 +#: .\cookbook\views\api.py:271 +#, python-brace-format msgid "{source.name} was merged successfully with {target.name}" msgstr "" -#: .\cookbook\views\api.py:271 +#: .\cookbook\views\api.py:276 +#, python-brace-format msgid "An error occurred attempting to merge {source.name} with {target.name}" msgstr "" -#: .\cookbook\views\api.py:329 +#: .\cookbook\views\api.py:334 +#, python-brace-format msgid "{child.name} was moved successfully to the root." msgstr "" -#: .\cookbook\views\api.py:332 .\cookbook\views\api.py:350 +#: .\cookbook\views\api.py:337 .\cookbook\views\api.py:355 msgid "An error occurred attempting to move " msgstr "" -#: .\cookbook\views\api.py:335 +#: .\cookbook\views\api.py:340 msgid "Cannot move an object to itself!" msgstr "" -#: .\cookbook\views\api.py:341 +#: .\cookbook\views\api.py:346 +#, python-brace-format msgid "No {self.basename} with id {parent} exists" msgstr "" -#: .\cookbook\views\api.py:347 +#: .\cookbook\views\api.py:352 +#, python-brace-format msgid "{child.name} was moved successfully to parent {parent.name}" msgstr "" -#: .\cookbook\views\api.py:542 +#: .\cookbook\views\api.py:553 +#, python-brace-format msgid "{obj.name} was removed from the shopping list." msgstr "" -#: .\cookbook\views\api.py:547 .\cookbook\views\api.py:879 -#: .\cookbook\views\api.py:892 +#: .\cookbook\views\api.py:558 .\cookbook\views\api.py:888 +#: .\cookbook\views\api.py:901 +#, python-brace-format msgid "{obj.name} was added to the shopping list." msgstr "" -#: .\cookbook\views\api.py:674 +#: .\cookbook\views\api.py:685 msgid "ID of recipe a step is part of. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:676 +#: .\cookbook\views\api.py:687 msgid "Query string matched (fuzzy) against object name." msgstr "" -#: .\cookbook\views\api.py:720 +#: .\cookbook\views\api.py:731 msgid "" "Query string matched (fuzzy) against recipe name. In the future also " "fulltext search." msgstr "" -#: .\cookbook\views\api.py:722 +#: .\cookbook\views\api.py:733 msgid "" "ID of keyword a recipe should have. For multiple repeat parameter. " "Equivalent to keywords_or" msgstr "" -#: .\cookbook\views\api.py:725 +#: .\cookbook\views\api.py:736 msgid "" "Keyword IDs, repeat for multiple. Return recipes with any of the keywords" msgstr "" -#: .\cookbook\views\api.py:728 +#: .\cookbook\views\api.py:739 msgid "" "Keyword IDs, repeat for multiple. Return recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:742 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords." msgstr "" -#: .\cookbook\views\api.py:734 +#: .\cookbook\views\api.py:745 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:736 +#: .\cookbook\views\api.py:747 msgid "ID of food a recipe should have. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:739 +#: .\cookbook\views\api.py:750 msgid "Food IDs, repeat for multiple. Return recipes with any of the foods" msgstr "" -#: .\cookbook\views\api.py:741 +#: .\cookbook\views\api.py:752 msgid "Food IDs, repeat for multiple. Return recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:743 +#: .\cookbook\views\api.py:754 msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods." msgstr "" -#: .\cookbook\views\api.py:745 +#: .\cookbook\views\api.py:756 msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:746 +#: .\cookbook\views\api.py:757 msgid "ID of unit a recipe should have." msgstr "" -#: .\cookbook\views\api.py:748 +#: .\cookbook\views\api.py:759 msgid "" "Rating a recipe should have or greater. [0 - 5] Negative value filters " "rating less than." msgstr "" -#: .\cookbook\views\api.py:749 +#: .\cookbook\views\api.py:760 msgid "ID of book a recipe should be in. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:751 +#: .\cookbook\views\api.py:762 msgid "Book IDs, repeat for multiple. Return recipes with any of the books" msgstr "" -#: .\cookbook\views\api.py:753 +#: .\cookbook\views\api.py:764 msgid "Book IDs, repeat for multiple. Return recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:755 +#: .\cookbook\views\api.py:766 msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books." msgstr "" -#: .\cookbook\views\api.py:757 +#: .\cookbook\views\api.py:768 msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:759 +#: .\cookbook\views\api.py:770 msgid "If only internal recipes should be returned. [true/false]" msgstr "" -#: .\cookbook\views\api.py:761 +#: .\cookbook\views\api.py:772 msgid "Returns the results in randomized order. [true/false]" msgstr "" -#: .\cookbook\views\api.py:763 +#: .\cookbook\views\api.py:774 msgid "Returns new results first in search results. [true/false]" msgstr "" -#: .\cookbook\views\api.py:765 +#: .\cookbook\views\api.py:776 msgid "" "Filter recipes cooked X times or more. Negative values returns cooked less " "than X times" msgstr "" -#: .\cookbook\views\api.py:767 +#: .\cookbook\views\api.py:778 msgid "" "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:769 +#: .\cookbook\views\api.py:780 msgid "" "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:771 +#: .\cookbook\views\api.py:782 msgid "" "Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:773 +#: .\cookbook\views\api.py:784 msgid "" "Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:775 +#: .\cookbook\views\api.py:786 msgid "Filter recipes that can be made with OnHand food. [true/false]" msgstr "" -#: .\cookbook\views\api.py:937 +#: .\cookbook\views\api.py:946 msgid "" "Returns the shopping list entry with a primary key of id. Multiple values " "allowed." msgstr "" -#: .\cookbook\views\api.py:942 +#: .\cookbook\views\api.py:951 msgid "" -"Filter shopping list entries on checked. [true, false, both, recent]" -"
    - recent includes unchecked items and recently completed items." +"Filter shopping list entries on checked. [true, false, both, recent]
    - recent includes unchecked items and recently completed items." msgstr "" -#: .\cookbook\views\api.py:945 +#: .\cookbook\views\api.py:954 msgid "Returns the shopping list entries sorted by supermarket category order." msgstr "" -#: .\cookbook\views\api.py:1140 +#: .\cookbook\views\api.py:1166 msgid "Nothing to do." msgstr "" -#: .\cookbook\views\api.py:1160 +#: .\cookbook\views\api.py:1198 msgid "Invalid Url" msgstr "" -#: .\cookbook\views\api.py:1167 +#: .\cookbook\views\api.py:1205 msgid "Connection Refused." msgstr "" -#: .\cookbook\views\api.py:1172 +#: .\cookbook\views\api.py:1210 msgid "Bad URL Schema." msgstr "" -#: .\cookbook\views\api.py:1195 +#: .\cookbook\views\api.py:1233 msgid "No usable data could be found." msgstr "" -#: .\cookbook\views\api.py:1303 .\cookbook\views\data.py:28 +#: .\cookbook\views\api.py:1326 .\cookbook\views\import_export.py:117 +msgid "Importing is not implemented for this provider" +msgstr "" + +#: .\cookbook\views\api.py:1372 .\cookbook\views\data.py:31 #: .\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:1325 +#: .\cookbook\views\api.py:1394 msgid "Sync successful!" msgstr "" -#: .\cookbook\views\api.py:1330 +#: .\cookbook\views\api.py:1399 msgid "Error synchronizing with Storage" msgstr "" -#: .\cookbook\views\data.py:97 +#: .\cookbook\views\data.py:100 #, python-format msgid "Batch edit done. %(count)d recipe was updated." msgid_plural "Batch edit done. %(count)d Recipes where updated." @@ -2506,11 +2344,7 @@ msgstr "" msgid "Error saving changes!" msgstr "" -#: .\cookbook\views\import_export.py:111 .\cookbook\views\import_export.py:150 -msgid "Importing is not implemented for this provider" -msgstr "" - -#: .\cookbook\views\import_export.py:137 +#: .\cookbook\views\import_export.py:104 msgid "" "The PDF Exporter is not enabled on this instance as it is still in an " "experimental state." @@ -2556,73 +2390,85 @@ msgstr "" msgid "There was an error importing this recipe!" msgstr "" -#: .\cookbook\views\views.py:124 +#: .\cookbook\views\views.py:73 .\cookbook\views\views.py:191 +#: .\cookbook\views\views.py:213 .\cookbook\views\views.py:399 +msgid "This feature is not available in the demo version!" +msgstr "" + +#: .\cookbook\views\views.py:89 msgid "" "You have successfully created your own recipe space. Start by adding some " "recipes or invite other people to join you." msgstr "" -#: .\cookbook\views\views.py:178 +#: .\cookbook\views\views.py:143 msgid "You do not have the required permissions to perform this action!" msgstr "" -#: .\cookbook\views\views.py:189 +#: .\cookbook\views\views.py:154 msgid "Comment saved!" msgstr "" -#: .\cookbook\views\views.py:264 -msgid "This feature is not available in the demo version!" -msgstr "" - -#: .\cookbook\views\views.py:324 +#: .\cookbook\views\views.py:253 msgid "You must select at least one field to search!" msgstr "" -#: .\cookbook\views\views.py:329 +#: .\cookbook\views\views.py:258 msgid "" "To use this search method you must select at least one full text search " "field!" msgstr "" -#: .\cookbook\views\views.py:333 +#: .\cookbook\views\views.py:262 msgid "Fuzzy search is not compatible with this search method!" msgstr "" -#: .\cookbook\views\views.py:463 +#: .\cookbook\views\views.py:338 msgid "" "The setup page can only be used to create the first user! If you have " "forgotten your superuser credentials please consult the django documentation " "on how to reset passwords." msgstr "" -#: .\cookbook\views\views.py:470 +#: .\cookbook\views\views.py:345 msgid "Passwords dont match!" msgstr "" -#: .\cookbook\views\views.py:478 +#: .\cookbook\views\views.py:353 msgid "User has been created, please login!" msgstr "" -#: .\cookbook\views\views.py:494 +#: .\cookbook\views\views.py:369 msgid "Malformed Invite Link supplied!" msgstr "" -#: .\cookbook\views\views.py:510 +#: .\cookbook\views\views.py:386 msgid "Successfully joined space." msgstr "" -#: .\cookbook\views\views.py:516 +#: .\cookbook\views\views.py:392 msgid "Invite Link not valid or already used!" msgstr "" -#: .\cookbook\views\views.py:530 +#: .\cookbook\views\views.py:409 msgid "" "Reporting share links is not enabled for this instance. Please notify the " "page administrator to report problems." msgstr "" -#: .\cookbook\views\views.py:536 +#: .\cookbook\views\views.py:415 msgid "" "Recipe sharing link has been disabled! For additional information please " "contact the page administrator." msgstr "" + +#~ msgid "Ingredients" +#~ msgstr "Malzemeler" + +#, fuzzy +#~| msgid "Show recently viewed recipes on search page." +#~ msgid "Show recent recipes" +#~ msgstr "Son görüntülenen tarifleri arama sayfasında göster." + +#~ msgid "Show recently viewed recipes on search page." +#~ msgstr "Son görüntülenen tarifleri arama sayfasında göster." diff --git a/cookbook/locale/uk/LC_MESSAGES/django.mo b/cookbook/locale/uk/LC_MESSAGES/django.mo index 4218b426c..939847015 100644 Binary files a/cookbook/locale/uk/LC_MESSAGES/django.mo and b/cookbook/locale/uk/LC_MESSAGES/django.mo differ diff --git a/cookbook/locale/uk/LC_MESSAGES/django.po b/cookbook/locale/uk/LC_MESSAGES/django.po index d155ee35a..b48ed6a51 100644 --- a/cookbook/locale/uk/LC_MESSAGES/django.po +++ b/cookbook/locale/uk/LC_MESSAGES/django.po @@ -8,15 +8,17 @@ 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: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" +"PO-Revision-Date: 2023-04-12 11:55+0000\n" +"Last-Translator: noxonad \n" +"Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 4.15\n" #: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 #: .\cookbook\templates\space.html:49 .\cookbook\templates\stats.html:28 @@ -1089,7 +1091,7 @@ msgstr "" #: .\cookbook\templates\base.html:311 msgid "GitHub" -msgstr "" +msgstr "GitHub" #: .\cookbook\templates\base.html:313 msgid "Translate Tandoor" @@ -2026,7 +2028,7 @@ msgstr "" #: .\cookbook\templates\space.html:118 msgid "user" -msgstr "" +msgstr "користувач" #: .\cookbook\templates\space.html:119 msgid "guest" diff --git a/cookbook/locale/vi/LC_MESSAGES/django.mo b/cookbook/locale/vi/LC_MESSAGES/django.mo index a4dd71bc4..b2616462e 100644 Binary files a/cookbook/locale/vi/LC_MESSAGES/django.mo and b/cookbook/locale/vi/LC_MESSAGES/django.mo differ diff --git a/cookbook/locale/zh_CN/LC_MESSAGES/django.mo b/cookbook/locale/zh_CN/LC_MESSAGES/django.mo index fc5d2e351..9a6271941 100644 Binary files a/cookbook/locale/zh_CN/LC_MESSAGES/django.mo and b/cookbook/locale/zh_CN/LC_MESSAGES/django.mo differ diff --git a/cookbook/locale/zh_CN/LC_MESSAGES/django.po b/cookbook/locale/zh_CN/LC_MESSAGES/django.po index e505429a0..b6fa35b4e 100644 --- a/cookbook/locale/zh_CN/LC_MESSAGES/django.po +++ b/cookbook/locale/zh_CN/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 19:20+0200\n" -"PO-Revision-Date: 2022-08-23 13:32+0000\n" +"POT-Creation-Date: 2023-04-26 07:46+0200\n" +"PO-Revision-Date: 2023-02-26 13:15+0000\n" "Last-Translator: 吕楪 \n" "Language-Team: Chinese (Simplified) \n" @@ -17,112 +17,94 @@ 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.10.1\n" +"X-Generator: Weblate 4.15\n" -#: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 -#: .\cookbook\templates\stats.html:28 -msgid "Ingredients" -msgstr "食材" - -#: .\cookbook\forms.py:53 +#: .\cookbook\forms.py:52 msgid "Default unit" msgstr "默认单位" -#: .\cookbook\forms.py:54 +#: .\cookbook\forms.py:53 msgid "Use fractions" msgstr "使用分数" -#: .\cookbook\forms.py:55 +#: .\cookbook\forms.py:54 msgid "Use KJ" msgstr "使用千焦" -#: .\cookbook\forms.py:56 +#: .\cookbook\forms.py:55 msgid "Theme" msgstr "主题" -#: .\cookbook\forms.py:57 +#: .\cookbook\forms.py:56 msgid "Navbar color" msgstr "导航栏颜色" -#: .\cookbook\forms.py:58 +#: .\cookbook\forms.py:57 msgid "Sticky navbar" msgstr "悬浮导航栏" -#: .\cookbook\forms.py:59 +#: .\cookbook\forms.py:58 msgid "Default page" msgstr "默认页面" -#: .\cookbook\forms.py:60 -msgid "Show recent recipes" -msgstr "显示最近的菜谱" - -#: .\cookbook\forms.py:61 -msgid "Search style" -msgstr "搜索风格" - -#: .\cookbook\forms.py:62 +#: .\cookbook\forms.py:59 msgid "Plan sharing" msgstr "计划分享" -#: .\cookbook\forms.py:63 +#: .\cookbook\forms.py:60 msgid "Ingredient decimal places" msgstr "食材小数位" -#: .\cookbook\forms.py:64 +#: .\cookbook\forms.py:61 msgid "Shopping list auto sync period" msgstr "购物清单自动同步周期" -#: .\cookbook\forms.py:65 .\cookbook\templates\recipe_view.html:21 -#: .\cookbook\templates\stats.html:47 +#: .\cookbook\forms.py:62 .\cookbook\templates\recipe_view.html:36 msgid "Comments" msgstr "评论" -#: .\cookbook\forms.py:66 +#: .\cookbook\forms.py:63 msgid "Left-handed mode" msgstr "左手模式" -#: .\cookbook\forms.py:70 +#: .\cookbook\forms.py:67 msgid "" "Color of the top navigation bar. Not all colors work with all themes, just " "try them out!" msgstr "" "顶部导航栏的颜色。并非所有的颜色都适用于所有的主题,只要试一试就可以了!" -#: .\cookbook\forms.py:72 +#: .\cookbook\forms.py:69 msgid "Default Unit to be used when inserting a new ingredient into a recipe." msgstr "在菜谱中插入新食材时使用的默认单位。" -#: .\cookbook\forms.py:74 +#: .\cookbook\forms.py:71 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" msgstr "启用对食材数量的分数支持(例如自动将小数转换为分数)" -#: .\cookbook\forms.py:76 +#: .\cookbook\forms.py:73 msgid "Display nutritional energy amounts in joules instead of calories" msgstr "用焦耳来显示营养能量而不是卡路里" -#: .\cookbook\forms.py:77 +#: .\cookbook\forms.py:74 msgid "Users with whom newly created meal plans should be shared by default." msgstr "默认情况下,将自动与用户共享新创建的膳食计划。" -#: .\cookbook\forms.py:78 +#: .\cookbook\forms.py:75 msgid "Users with whom to share shopping lists." msgstr "与之共享购物清单的用户。" -#: .\cookbook\forms.py:80 -msgid "Show recently viewed recipes on search page." -msgstr "在搜索页面上显示最近查看的菜谱。" - -#: .\cookbook\forms.py:81 +#: .\cookbook\forms.py:76 msgid "Number of decimals to round ingredients." msgstr "四舍五入食材的小数点数量。" -#: .\cookbook\forms.py:82 +#: .\cookbook\forms.py:77 msgid "If you want to be able to create and see comments underneath recipes." msgstr "如果你希望能够在菜谱下面创建并看到评论。" -#: .\cookbook\forms.py:84 .\cookbook\forms.py:496 +#: .\cookbook\forms.py:79 .\cookbook\forms.py:492 msgid "" "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. " @@ -133,58 +115,57 @@ msgstr "" "人可能做出的改变。在与多人一起购物时很有用,但可能会消耗一点移动数据。如果低" "于实例限制,它将在保存时被重置。" -#: .\cookbook\forms.py:87 +#: .\cookbook\forms.py:82 msgid "Makes the navbar stick to the top of the page." msgstr "使导航栏悬浮在页面的顶部。" -#: .\cookbook\forms.py:88 .\cookbook\forms.py:499 +#: .\cookbook\forms.py:83 .\cookbook\forms.py:495 msgid "Automatically add meal plan ingredients to shopping list." msgstr "自动将膳食计划食材添加到购物清单中。" -#: .\cookbook\forms.py:89 +#: .\cookbook\forms.py:84 msgid "Exclude ingredients that are on hand." msgstr "排除现有食材。" -#: .\cookbook\forms.py:90 +#: .\cookbook\forms.py:85 msgid "Will optimize the UI for use with your left hand." msgstr "将使用左手模式优化界面显示。" -#: .\cookbook\forms.py:107 +#: .\cookbook\forms.py:102 msgid "" "Both fields are optional. If none are given the username will be displayed " "instead" msgstr "这两个字段都是可选的。如果没有给出,将显示用户名" -#: .\cookbook\forms.py:128 .\cookbook\forms.py:301 +#: .\cookbook\forms.py:123 .\cookbook\forms.py:297 msgid "Name" msgstr "名字" -#: .\cookbook\forms.py:129 .\cookbook\forms.py:302 -#: .\cookbook\templates\stats.html:24 .\cookbook\views\lists.py:88 +#: .\cookbook\forms.py:124 .\cookbook\forms.py:298 .\cookbook\views\lists.py:88 msgid "Keywords" msgstr "关键词" -#: .\cookbook\forms.py:130 +#: .\cookbook\forms.py:125 msgid "Preparation time in minutes" msgstr "准备时间(分钟)" -#: .\cookbook\forms.py:131 +#: .\cookbook\forms.py:126 msgid "Waiting time (cooking/baking) in minutes" msgstr "等候(烹饪、烘焙等)时间(分钟)" -#: .\cookbook\forms.py:132 .\cookbook\forms.py:270 .\cookbook\forms.py:303 +#: .\cookbook\forms.py:127 .\cookbook\forms.py:266 .\cookbook\forms.py:299 msgid "Path" msgstr "路径" -#: .\cookbook\forms.py:133 +#: .\cookbook\forms.py:128 msgid "Storage UID" msgstr "存储 UID" -#: .\cookbook\forms.py:165 +#: .\cookbook\forms.py:161 msgid "Default" msgstr "默认" -#: .\cookbook\forms.py:177 +#: .\cookbook\forms.py:173 msgid "" "To prevent duplicates recipes with the same name as existing ones are " "ignored. Check this box to import everything." @@ -192,19 +173,19 @@ msgstr "" "为防止重复,忽略与现有同名的菜谱。选中此框可导入所有内容(危险操作,请先备" "份)。" -#: .\cookbook\forms.py:200 +#: .\cookbook\forms.py:196 msgid "Add your comment: " msgstr "发表评论: " -#: .\cookbook\forms.py:215 +#: .\cookbook\forms.py:211 msgid "Leave empty for dropbox and enter app password for nextcloud." msgstr "Dropbox 留空并输入 Nextcloud 应用密码。" -#: .\cookbook\forms.py:222 +#: .\cookbook\forms.py:218 msgid "Leave empty for nextcloud and enter api token for dropbox." msgstr "Nextcloud 留空并输入 Dropbox API 令牌。" -#: .\cookbook\forms.py:231 +#: .\cookbook\forms.py:227 msgid "" "Leave empty for dropbox and enter only base url for nextcloud (/remote." "php/webdav/ is added automatically)" @@ -212,60 +193,60 @@ msgstr "" "Dropbox 留空并输入基础 Nextcloud 网址(/remote.php/webdav/ 会自" "动添加)" -#: .\cookbook\forms.py:269 .\cookbook\views\edit.py:157 +#: .\cookbook\forms.py:265 .\cookbook\views\edit.py:157 msgid "Storage" msgstr "存储" -#: .\cookbook\forms.py:271 +#: .\cookbook\forms.py:267 msgid "Active" msgstr "活跃" -#: .\cookbook\forms.py:277 +#: .\cookbook\forms.py:273 msgid "Search String" msgstr "搜索字符串" -#: .\cookbook\forms.py:304 +#: .\cookbook\forms.py:300 msgid "File ID" msgstr "文件编号" -#: .\cookbook\forms.py:326 +#: .\cookbook\forms.py:322 msgid "You must provide at least a recipe or a title." msgstr "你必须至少提供一份菜谱或一个标题。" -#: .\cookbook\forms.py:339 +#: .\cookbook\forms.py:335 msgid "You can list default users to share recipes with in the settings." msgstr "你可以在设置中列出默认用户来分享菜谱。" -#: .\cookbook\forms.py:340 +#: .\cookbook\forms.py:336 msgid "" "You can use markdown to format this field. See the docs here" msgstr "" "可以使用 Markdown 设置此字段格式。查看文档" -#: .\cookbook\forms.py:366 +#: .\cookbook\forms.py:362 msgid "Maximum number of users for this space reached." msgstr "已达到该空间的最大用户数。" -#: .\cookbook\forms.py:372 +#: .\cookbook\forms.py:368 msgid "Email address already taken!" msgstr "电子邮件地址已被注册!" -#: .\cookbook\forms.py:380 +#: .\cookbook\forms.py:376 msgid "" "An email address is not required but if present the invite link will be sent " "to the user." msgstr "电子邮件地址不是必需的,但如果存在,邀请链接将被发送给用户。" -#: .\cookbook\forms.py:395 +#: .\cookbook\forms.py:391 msgid "Name already taken." msgstr "名字已被占用。" -#: .\cookbook\forms.py:406 +#: .\cookbook\forms.py:402 msgid "Accept Terms and Privacy" msgstr "接受条款及隐私政策" -#: .\cookbook\forms.py:438 +#: .\cookbook\forms.py:434 msgid "" "Determines how fuzzy a search is if it uses trigram similarity matching (e." "g. low values mean more typos are ignored)." @@ -273,37 +254,39 @@ msgstr "" "确定使用三元图相似性匹配时搜索的模糊程度(例如,较低的值意味着忽略更多的打字" "错误)。" -#: .\cookbook\forms.py:448 +#: .\cookbook\forms.py:444 msgid "" "Select type method of search. Click here for " "full description of choices." -msgstr "选择搜索类型方法。 点击此处 查看选项的完整说明。" +msgstr "" +"选择搜索类型方法。 点击此处 查看选项的完整说" +"明。" -#: .\cookbook\forms.py:449 +#: .\cookbook\forms.py:445 msgid "" "Use fuzzy matching on units, keywords and ingredients when editing and " "importing recipes." msgstr "编辑和导入菜谱时,对单位、关键词和食材使用模糊匹配。" -#: .\cookbook\forms.py:451 +#: .\cookbook\forms.py:447 msgid "" "Fields to search ignoring accents. Selecting this option can improve or " "degrade search quality depending on language" msgstr "忽略搜索字段的重音。此选项会因语言差异导致搜索质量产生变化" -#: .\cookbook\forms.py:453 +#: .\cookbook\forms.py:449 msgid "" "Fields to search for partial matches. (e.g. searching for 'Pie' will return " "'pie' and 'piece' and 'soapie')" msgstr "用于搜索部分匹配的字段。(如搜索“Pie”会返回“pie”、“piece”和“soapie”)" -#: .\cookbook\forms.py:455 +#: .\cookbook\forms.py:451 msgid "" "Fields to search for beginning of word matches. (e.g. searching for 'sa' " "will return 'salad' and 'sandwich')" msgstr "用于搜索开头匹配的字段。(如搜索“sa”会返回“salad”和“sandwich”)" -#: .\cookbook\forms.py:457 +#: .\cookbook\forms.py:453 msgid "" "Fields to 'fuzzy' search. (e.g. searching for 'recpie' will find 'recipe'.) " "Note: this option will conflict with 'web' and 'raw' methods of search." @@ -311,41 +294,41 @@ msgstr "" "“模糊”搜索字段。(例如搜索“recpie”将会找到“recipe”。)注意:此选项将" "与“web”和“raw”搜索方法冲突。" -#: .\cookbook\forms.py:459 +#: .\cookbook\forms.py:455 msgid "" "Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " "only function with fulltext fields." msgstr "全文搜索字段。“web”、“phrase”和“raw”搜索方法仅适用于全文字段。" -#: .\cookbook\forms.py:463 +#: .\cookbook\forms.py:459 msgid "Search Method" msgstr "搜索方法" -#: .\cookbook\forms.py:464 +#: .\cookbook\forms.py:460 msgid "Fuzzy Lookups" msgstr "模糊查找" -#: .\cookbook\forms.py:465 +#: .\cookbook\forms.py:461 msgid "Ignore Accent" msgstr "忽略重音" -#: .\cookbook\forms.py:466 +#: .\cookbook\forms.py:462 msgid "Partial Match" msgstr "部分匹配" -#: .\cookbook\forms.py:467 +#: .\cookbook\forms.py:463 msgid "Starts With" msgstr "起始于" -#: .\cookbook\forms.py:468 +#: .\cookbook\forms.py:464 msgid "Fuzzy Search" msgstr "模糊搜索" -#: .\cookbook\forms.py:469 +#: .\cookbook\forms.py:465 msgid "Full Text" msgstr "全文" -#: .\cookbook\forms.py:494 +#: .\cookbook\forms.py:490 msgid "" "Users will see all items you add to your shopping list. They must add you " "to see items on their list." @@ -353,197 +336,241 @@ msgstr "" "用户将看到你添加到购物清单中的所有商品。他们必须将你添加到列表才能看到他们清" "单上的项目。" -#: .\cookbook\forms.py:500 +#: .\cookbook\forms.py:496 msgid "" "When adding a meal plan to the shopping list (manually or automatically), " "include all related recipes." msgstr "将膳食计划(手动或自动)添加到购物清单时,包括所有相关食谱。" -#: .\cookbook\forms.py:501 +#: .\cookbook\forms.py:497 msgid "" "When adding a meal plan to the shopping list (manually or automatically), " "exclude ingredients that are on hand." msgstr "将膳食计划(手动或自动)添加到购物清单时,排除现有食材。" -#: .\cookbook\forms.py:502 +#: .\cookbook\forms.py:498 msgid "Default number of hours to delay a shopping list entry." msgstr "延迟购物清单条目的默认小时数。" -#: .\cookbook\forms.py:503 +#: .\cookbook\forms.py:499 msgid "Filter shopping list to only include supermarket categories." msgstr "筛选购物清单仅包含超市分类。" -#: .\cookbook\forms.py:504 +#: .\cookbook\forms.py:500 msgid "Days of recent shopping list entries to display." msgstr "显示最近几天的购物清单列表。" -#: .\cookbook\forms.py:505 +#: .\cookbook\forms.py:501 msgid "Mark food 'On Hand' when checked off shopping list." msgstr "在核对购物清单时,将食物标记为“入手”。" -#: .\cookbook\forms.py:506 +#: .\cookbook\forms.py:502 msgid "Delimiter to use for CSV exports." msgstr "用于 CSV 导出的分隔符。" -#: .\cookbook\forms.py:507 +#: .\cookbook\forms.py:503 msgid "Prefix to add when copying list to the clipboard." msgstr "将清单复制到剪贴板时要添加的前缀。" -#: .\cookbook\forms.py:511 +#: .\cookbook\forms.py:507 msgid "Share Shopping List" msgstr "分享购物清单" -#: .\cookbook\forms.py:512 +#: .\cookbook\forms.py:508 msgid "Autosync" msgstr "自动同步" -#: .\cookbook\forms.py:513 +#: .\cookbook\forms.py:509 msgid "Auto Add Meal Plan" msgstr "自动添加膳食计划" -#: .\cookbook\forms.py:514 +#: .\cookbook\forms.py:510 msgid "Exclude On Hand" msgstr "排除现有" -#: .\cookbook\forms.py:515 +#: .\cookbook\forms.py:511 msgid "Include Related" msgstr "包括相关" -#: .\cookbook\forms.py:516 +#: .\cookbook\forms.py:512 msgid "Default Delay Hours" msgstr "默认延迟时间" -#: .\cookbook\forms.py:517 +#: .\cookbook\forms.py:513 msgid "Filter to Supermarket" msgstr "按超市筛选" -#: .\cookbook\forms.py:518 +#: .\cookbook\forms.py:514 msgid "Recent Days" msgstr "最近几天" -#: .\cookbook\forms.py:519 +#: .\cookbook\forms.py:515 msgid "CSV Delimiter" msgstr "CSV 分隔符" -#: .\cookbook\forms.py:520 +#: .\cookbook\forms.py:516 msgid "List Prefix" msgstr "清单前缀" -#: .\cookbook\forms.py:521 +#: .\cookbook\forms.py:517 msgid "Auto On Hand" msgstr "自动入手" -#: .\cookbook\forms.py:531 +#: .\cookbook\forms.py:527 msgid "Reset Food Inheritance" msgstr "重置食物材料" -#: .\cookbook\forms.py:532 +#: .\cookbook\forms.py:528 msgid "Reset all food to inherit the fields configured." msgstr "重置所有食物以继承配置的字段。" -#: .\cookbook\forms.py:544 +#: .\cookbook\forms.py:540 msgid "Fields on food that should be inherited by default." msgstr "默认情况下应继承的食物上的字段。" -#: .\cookbook\forms.py:545 +#: .\cookbook\forms.py:541 msgid "Show recipe counts on search filters" msgstr "显示搜索筛选器上的食谱计数" -#: .\cookbook\helper\AllAuthCustomAdapter.py:36 +#: .\cookbook\forms.py:542 +msgid "Use the plural form for units and food inside this space." +msgstr "在此空间内使用复数形式表示单位和食物。" + +#: .\cookbook\helper\AllAuthCustomAdapter.py:39 msgid "" "In order to prevent spam, the requested email was not send. Please wait a " "few minutes and try again." msgstr "为了防止垃圾邮件,所要求的电子邮件没有被发送。请等待几分钟后再试。" -#: .\cookbook\helper\permission_helper.py:149 -#: .\cookbook\helper\permission_helper.py:172 .\cookbook\views\views.py:152 +#: .\cookbook\helper\permission_helper.py:164 +#: .\cookbook\helper\permission_helper.py:187 .\cookbook\views\views.py:117 msgid "You are not logged in and therefore cannot view this page!" msgstr "你没有登录,因此不能查看这个页面!" -#: .\cookbook\helper\permission_helper.py:153 -#: .\cookbook\helper\permission_helper.py:159 -#: .\cookbook\helper\permission_helper.py:184 -#: .\cookbook\helper\permission_helper.py:254 -#: .\cookbook\helper\permission_helper.py:268 -#: .\cookbook\helper\permission_helper.py:279 -#: .\cookbook\helper\permission_helper.py:290 .\cookbook\views\data.py:33 -#: .\cookbook\views\views.py:163 .\cookbook\views\views.py:170 -#: .\cookbook\views\views.py:249 +#: .\cookbook\helper\permission_helper.py:168 +#: .\cookbook\helper\permission_helper.py:174 +#: .\cookbook\helper\permission_helper.py:199 +#: .\cookbook\helper\permission_helper.py:269 +#: .\cookbook\helper\permission_helper.py:283 +#: .\cookbook\helper\permission_helper.py:294 +#: .\cookbook\helper\permission_helper.py:305 +#: .\cookbook\helper\permission_helper.py:321 +#: .\cookbook\helper\permission_helper.py:342 .\cookbook\views\data.py:36 +#: .\cookbook\views\views.py:128 .\cookbook\views\views.py:135 msgid "You do not have the required permissions to view this page!" msgstr "你没有必要的权限来查看这个页面!" -#: .\cookbook\helper\permission_helper.py:177 -#: .\cookbook\helper\permission_helper.py:200 -#: .\cookbook\helper\permission_helper.py:222 +#: .\cookbook\helper\permission_helper.py:192 +#: .\cookbook\helper\permission_helper.py:215 #: .\cookbook\helper\permission_helper.py:237 +#: .\cookbook\helper\permission_helper.py:252 msgid "You cannot interact with this object as it is not owned by you!" msgstr "你不能与此对象交互,因为它不属于你!" -#: .\cookbook\helper\permission_helper.py:321 +#: .\cookbook\helper\permission_helper.py:403 msgid "You have reached the maximum number of recipes for your space." msgstr "你已经达到了空间的菜谱的最大数量。" -#: .\cookbook\helper\permission_helper.py:333 +#: .\cookbook\helper\permission_helper.py:415 msgid "You have more users than allowed in your space." msgstr "你的空间中的用户数超过了允许的数量。" -#: .\cookbook\helper\recipe_search.py:565 +#: .\cookbook\helper\recipe_search.py:630 msgid "One of queryset or hash_key must be provided" msgstr "必须提供 queryset 或 hash_key 之一" -#: .\cookbook\helper\shopping_helper.py:152 +#: .\cookbook\helper\recipe_url_import.py:266 +#, fuzzy +#| msgid "Use fractions" +msgid "reverse rotation" +msgstr "使用分数" + +#: .\cookbook\helper\recipe_url_import.py:267 +msgid "careful rotation" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:268 +msgid "knead" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:269 +msgid "thicken" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:270 +msgid "warm up" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:271 +msgid "ferment" +msgstr "" + +#: .\cookbook\helper\recipe_url_import.py:272 +msgid "sous-vide" +msgstr "" + +#: .\cookbook\helper\shopping_helper.py:157 msgid "You must supply a servings size" msgstr "你必须提供一些份量" -#: .\cookbook\helper\template_helper.py:64 -#: .\cookbook\helper\template_helper.py:66 +#: .\cookbook\helper\template_helper.py:79 +#: .\cookbook\helper\template_helper.py:81 msgid "Could not parse template code." msgstr "无法解析模板代码。" -#: .\cookbook\integration\copymethat.py:41 +#: .\cookbook\integration\copymethat.py:44 #: .\cookbook\integration\melarecipes.py:37 msgid "Favorite" msgstr "喜欢" -#: .\cookbook\integration\copymethat.py:70 -#: .\cookbook\integration\recettetek.py:54 -#: .\cookbook\integration\recipekeeper.py:63 -msgid "Imported from" -msgstr "导入" +#: .\cookbook\integration\copymethat.py:50 +msgid "I made this" +msgstr "我做的" -#: .\cookbook\integration\integration.py:223 +#: .\cookbook\integration\integration.py:218 msgid "" "Importer expected a .zip file. Did you choose the correct importer type for " "your data ?" msgstr "需要一个 .zip 文件。你是否为数据选择了正确的导入器类型?" -#: .\cookbook\integration\integration.py:226 +#: .\cookbook\integration\integration.py:221 msgid "" "An unexpected error occurred during the import. Please make sure you have " "uploaded a valid file." msgstr "在导入过程中发生了一个意外的错误。请确认你已经上传了一个有效的文件。" -#: .\cookbook\integration\integration.py:231 +#: .\cookbook\integration\integration.py:226 msgid "The following recipes were ignored because they already existed:" msgstr "以下菜谱被忽略了,因为它们已经存在了:" -#: .\cookbook\integration\integration.py:235 +#: .\cookbook\integration\integration.py:230 #, python-format msgid "Imported %s recipes." msgstr "导入了%s菜谱。" -#: .\cookbook\integration\paprika.py:46 +#: .\cookbook\integration\openeats.py:26 +#, fuzzy +#| msgid "Recipe Home" +msgid "Recipe source:" +msgstr "菜谱主页" + +#: .\cookbook\integration\paprika.py:49 msgid "Notes" msgstr "说明" -#: .\cookbook\integration\paprika.py:49 +#: .\cookbook\integration\paprika.py:52 msgid "Nutritional Information" msgstr "营养信息" -#: .\cookbook\integration\paprika.py:53 +#: .\cookbook\integration\paprika.py:56 msgid "Source" msgstr "来源" +#: .\cookbook\integration\recettetek.py:54 +#: .\cookbook\integration\recipekeeper.py:70 +msgid "Imported from" +msgstr "导入" + #: .\cookbook\integration\saffron.py:23 msgid "Servings" msgstr "份量" @@ -556,9 +583,7 @@ msgstr "等待时间" msgid "Preparation Time" msgstr "准备时间" -#: .\cookbook\integration\saffron.py:29 -#: .\cookbook\templates\forms\ingredients.html:7 -#: .\cookbook\templates\index.html:7 +#: .\cookbook\integration\saffron.py:29 .\cookbook\templates\index.html:7 msgid "Cookbook" msgstr "菜谱" @@ -598,171 +623,158 @@ msgstr "晚餐" msgid "Other" msgstr "其他" -#: .\cookbook\models.py:251 +#: .\cookbook\models.py:261 msgid "" "Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " "upload." msgstr "空间的最大文件存储量,单位为 MB。0表示无限制,-1表示禁止上传文件。" -#: .\cookbook\models.py:353 .\cookbook\templates\search.html:7 +#: .\cookbook\models.py:365 .\cookbook\templates\search.html:7 +#: .\cookbook\templates\settings.html:18 #: .\cookbook\templates\space_manage.html:7 msgid "Search" msgstr "搜索" -#: .\cookbook\models.py:354 .\cookbook\templates\base.html:107 +#: .\cookbook\models.py:366 .\cookbook\templates\base.html:110 #: .\cookbook\templates\meal_plan.html:7 .\cookbook\views\delete.py:178 #: .\cookbook\views\edit.py:211 .\cookbook\views\new.py:179 msgid "Meal-Plan" msgstr "膳食计划" -#: .\cookbook\models.py:355 .\cookbook\templates\base.html:115 +#: .\cookbook\models.py:367 .\cookbook\templates\base.html:118 msgid "Books" msgstr "书籍" -#: .\cookbook\models.py:363 -msgid "Small" -msgstr "小" - -#: .\cookbook\models.py:363 -msgid "Large" -msgstr "大" - -#: .\cookbook\models.py:363 .\cookbook\templates\generic\new_template.html:6 -#: .\cookbook\templates\generic\new_template.html:14 -msgid "New" -msgstr "新" - -#: .\cookbook\models.py:584 +#: .\cookbook\models.py:580 msgid " is part of a recipe step and cannot be deleted" msgstr " 是菜谱步骤的一部分,不能删除" -#: .\cookbook\models.py:1162 .\cookbook\templates\search_info.html:28 +#: .\cookbook\models.py:1181 .\cookbook\templates\search_info.html:28 msgid "Simple" msgstr "简明" -#: .\cookbook\models.py:1163 .\cookbook\templates\search_info.html:33 +#: .\cookbook\models.py:1182 .\cookbook\templates\search_info.html:33 msgid "Phrase" msgstr "短语" -#: .\cookbook\models.py:1164 .\cookbook\templates\search_info.html:38 +#: .\cookbook\models.py:1183 .\cookbook\templates\search_info.html:38 msgid "Web" msgstr "网络" -#: .\cookbook\models.py:1165 .\cookbook\templates\search_info.html:47 +#: .\cookbook\models.py:1184 .\cookbook\templates\search_info.html:47 msgid "Raw" msgstr "原始" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 msgid "Food Alias" msgstr "食物别名" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 msgid "Unit Alias" msgstr "单位别名" -#: .\cookbook\models.py:1203 +#: .\cookbook\models.py:1231 msgid "Keyword Alias" msgstr "关键词别名" -#: .\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 +#: .\cookbook\models.py:1232 +msgid "Description Replace" +msgstr "描述" + +#: .\cookbook\models.py:1232 +msgid "Instruction Replace" +msgstr "指示" + +#: .\cookbook\models.py:1258 .\cookbook\views\delete.py:36 +#: .\cookbook\views\edit.py:251 .\cookbook\views\new.py:48 msgid "Recipe" msgstr "菜谱" -#: .\cookbook\models.py:1228 +#: .\cookbook\models.py:1259 msgid "Food" msgstr "食物" -#: .\cookbook\models.py:1229 .\cookbook\templates\base.html:138 +#: .\cookbook\models.py:1260 .\cookbook\templates\base.html:141 msgid "Keyword" msgstr "关键词" -#: .\cookbook\serializer.py:207 -msgid "Cannot modify Space owner permission." -msgstr "无法修改空间所有者权限。" - -#: .\cookbook\serializer.py:290 +#: .\cookbook\serializer.py:198 msgid "File uploads are not enabled for this Space." msgstr "未为此空间启用文件上传。" -#: .\cookbook\serializer.py:301 +#: .\cookbook\serializer.py:209 msgid "You have reached your file upload limit." msgstr "你已达到文件上传的限制。" -#: .\cookbook\serializer.py:1081 +#: .\cookbook\serializer.py:291 +msgid "Cannot modify Space owner permission." +msgstr "无法修改空间所有者权限。" + +#: .\cookbook\serializer.py:1093 msgid "Hello" msgstr "你好" -#: .\cookbook\serializer.py:1081 +#: .\cookbook\serializer.py:1093 msgid "You have been invited by " msgstr "您已被邀请至 " -#: .\cookbook\serializer.py:1082 +#: .\cookbook\serializer.py:1094 msgid " to join their Tandoor Recipes space " msgstr " 加入他们的泥炉食谱空间 " -#: .\cookbook\serializer.py:1083 +#: .\cookbook\serializer.py:1095 msgid "Click the following link to activate your account: " msgstr "点击以下链接激活您的帐户: " -#: .\cookbook\serializer.py:1084 +#: .\cookbook\serializer.py:1096 msgid "" "If the link does not work use the following code to manually join the space: " msgstr "如果链接不起作用,请使用下面的代码手动加入空间: " -#: .\cookbook\serializer.py:1085 +#: .\cookbook\serializer.py:1097 msgid "The invitation is valid until " msgstr "邀请有效期至 " -#: .\cookbook\serializer.py:1086 +#: .\cookbook\serializer.py:1098 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " msgstr "泥炉食谱是一个开源食谱管理器。 在 GitHub 上查看 " -#: .\cookbook\serializer.py:1089 +#: .\cookbook\serializer.py:1101 msgid "Tandoor Recipes Invite" msgstr "泥炉食谱邀请" -#: .\cookbook\serializer.py:1209 +#: .\cookbook\serializer.py:1242 msgid "Existing shopping list to update" msgstr "要更新现有的购物清单" -#: .\cookbook\serializer.py:1211 +#: .\cookbook\serializer.py:1244 msgid "" "List of ingredient IDs from the recipe to add, if not provided all " "ingredients will be added." msgstr "要添加的食谱中食材识别符列表,不提供则添加所有食材。" -#: .\cookbook\serializer.py:1213 +#: .\cookbook\serializer.py:1246 msgid "" "Providing a list_recipe ID and servings of 0 will delete that shopping list." msgstr "提供一个菜谱列表识别符或份数为0将删除该购物清单。" -#: .\cookbook\serializer.py:1222 +#: .\cookbook\serializer.py:1255 msgid "Amount of food to add to the shopping list" msgstr "要添加到购物清单中的食物数量" -#: .\cookbook\serializer.py:1224 +#: .\cookbook\serializer.py:1257 msgid "ID of unit to use for the shopping list" msgstr "用于购物清单的单位识别符" -#: .\cookbook\serializer.py:1226 +#: .\cookbook\serializer.py:1259 msgid "When set to true will delete all food from active shopping lists." msgstr "当设置为 true 时,将从活动的购物列表中删除所有食物。" -#: .\cookbook\tables.py:36 .\cookbook\templates\generic\edit_template.html:6 -#: .\cookbook\templates\generic\edit_template.html:14 -#: .\cookbook\templates\recipes_table.html:82 -msgid "Edit" -msgstr "编辑" - -#: .\cookbook\tables.py:116 .\cookbook\tables.py:131 +#: .\cookbook\tables.py:61 .\cookbook\tables.py:75 #: .\cookbook\templates\generic\delete_template.html:7 #: .\cookbook\templates\generic\delete_template.html:15 #: .\cookbook\templates\generic\edit_template.html:28 -#: .\cookbook\templates\recipes_table.html:90 msgid "Delete" msgstr "删除" @@ -790,9 +802,10 @@ msgstr "电子邮件地址" #: .\cookbook\templates\account\email.html:12 #: .\cookbook\templates\account\password_change.html:11 #: .\cookbook\templates\account\password_set.html:11 -#: .\cookbook\templates\base.html:293 .\cookbook\templates\settings.html:6 +#: .\cookbook\templates\base.html:296 .\cookbook\templates\settings.html:6 #: .\cookbook\templates\settings.html:17 #: .\cookbook\templates\socialaccount\connections.html:10 +#: .\cookbook\templates\user_settings.html:8 msgid "Settings" msgstr "设置" @@ -887,8 +900,8 @@ msgstr "" "此电子邮件确认链接已过期或无效。请\n" " 发起新的电子邮件确认请求。" -#: .\cookbook\templates\account\login.html:8 -#: .\cookbook\templates\base.html:340 .\cookbook\templates\openid\login.html:8 +#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:343 +#: .\cookbook\templates\openid\login.html:8 msgid "Login" msgstr "登录" @@ -908,21 +921,20 @@ msgstr "登录" msgid "Sign Up" msgstr "注册" +#: .\cookbook\templates\account\login.html:38 +msgid "Lost your password?" +msgstr "遗失密码?" + #: .\cookbook\templates\account\login.html:39 -#: .\cookbook\templates\account\login.html:41 #: .\cookbook\templates\account\password_reset.html:29 msgid "Reset My Password" msgstr "重置我的密码" -#: .\cookbook\templates\account\login.html:40 -msgid "Lost your password?" -msgstr "遗失密码?" - -#: .\cookbook\templates\account\login.html:52 +#: .\cookbook\templates\account\login.html:50 msgid "Social Login" msgstr "关联登录" -#: .\cookbook\templates\account\login.html:53 +#: .\cookbook\templates\account\login.html:51 msgid "You can use any of the following providers to sign in." msgstr "你可以使用以下任意提供程序来登录。" @@ -948,7 +960,6 @@ msgstr "更改密码" #: .\cookbook\templates\account\password_change.html:12 #: .\cookbook\templates\account\password_set.html:12 -#: .\cookbook\templates\settings.html:76 msgid "Password" msgstr "密码" @@ -1057,129 +1068,124 @@ msgstr "注册已关闭" msgid "We are sorry, but the sign up is currently closed." msgstr "我们很抱歉,但目前注册已经结束。" -#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:330 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:333 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "应用程序接口文档" -#: .\cookbook\templates\base.html:103 .\cookbook\templates\index.html:87 -#: .\cookbook\templates\stats.html:22 +#: .\cookbook\templates\base.html:106 .\cookbook\templates\index.html:87 msgid "Recipes" msgstr "菜谱" -#: .\cookbook\templates\base.html:111 +#: .\cookbook\templates\base.html:114 msgid "Shopping" msgstr "购物" -#: .\cookbook\templates\base.html:150 .\cookbook\views\lists.py:105 +#: .\cookbook\templates\base.html:153 .\cookbook\views\lists.py:105 msgid "Foods" msgstr "食物" -#: .\cookbook\templates\base.html:162 -#: .\cookbook\templates\forms\ingredients.html:24 -#: .\cookbook\templates\stats.html:26 .\cookbook\views\lists.py:122 +#: .\cookbook\templates\base.html:165 .\cookbook\views\lists.py:122 msgid "Units" msgstr "单位" -#: .\cookbook\templates\base.html:176 .\cookbook\templates\supermarket.html:7 +#: .\cookbook\templates\base.html:179 .\cookbook\templates\supermarket.html:7 msgid "Supermarket" msgstr "超市" -#: .\cookbook\templates\base.html:188 +#: .\cookbook\templates\base.html:191 msgid "Supermarket Category" msgstr "超市类型" -#: .\cookbook\templates\base.html:200 .\cookbook\views\lists.py:171 +#: .\cookbook\templates\base.html:203 .\cookbook\views\lists.py:171 msgid "Automations" msgstr "自动化" -#: .\cookbook\templates\base.html:214 .\cookbook\views\lists.py:207 +#: .\cookbook\templates\base.html:217 .\cookbook\views\lists.py:207 msgid "Files" msgstr "文件" -#: .\cookbook\templates\base.html:226 +#: .\cookbook\templates\base.html:229 msgid "Batch Edit" msgstr "批量编辑" -#: .\cookbook\templates\base.html:238 .\cookbook\templates\history.html:6 +#: .\cookbook\templates\base.html:241 .\cookbook\templates\history.html:6 #: .\cookbook\templates\history.html:14 msgid "History" msgstr "历史" -#: .\cookbook\templates\base.html:252 +#: .\cookbook\templates\base.html:255 #: .\cookbook\templates\ingredient_editor.html:7 #: .\cookbook\templates\ingredient_editor.html:13 msgid "Ingredient Editor" msgstr "食材编辑器" -#: .\cookbook\templates\base.html:264 +#: .\cookbook\templates\base.html:267 #: .\cookbook\templates\export_response.html:7 #: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 msgid "Export" msgstr "导出" -#: .\cookbook\templates\base.html:280 .\cookbook\templates\index.html:47 +#: .\cookbook\templates\base.html:283 .\cookbook\templates\index.html:47 msgid "Import Recipe" msgstr "导入菜谱" -#: .\cookbook\templates\base.html:282 +#: .\cookbook\templates\base.html:285 msgid "Create" msgstr "创建" -#: .\cookbook\templates\base.html:295 +#: .\cookbook\templates\base.html:298 #: .\cookbook\templates\generic\list_template.html:14 -#: .\cookbook\templates\stats.html:43 msgid "External Recipes" msgstr "外部菜谱" -#: .\cookbook\templates\base.html:298 -#: .\cookbook\templates\space_manage.html:15 +#: .\cookbook\templates\base.html:301 .\cookbook\templates\space_manage.html:15 msgid "Space Settings" msgstr "空间设置" -#: .\cookbook\templates\base.html:303 .\cookbook\templates\system.html:13 +#: .\cookbook\templates\base.html:306 .\cookbook\templates\system.html:13 msgid "System" msgstr "系统" -#: .\cookbook\templates\base.html:305 +#: .\cookbook\templates\base.html:308 msgid "Admin" msgstr "管理员" -#: .\cookbook\templates\base.html:309 +#: .\cookbook\templates\base.html:312 #: .\cookbook\templates\space_overview.html:25 msgid "Your Spaces" msgstr "你的空间" -#: .\cookbook\templates\base.html:320 +#: .\cookbook\templates\base.html:323 #: .\cookbook\templates\space_overview.html:6 msgid "Overview" msgstr "概述" -#: .\cookbook\templates\base.html:324 +#: .\cookbook\templates\base.html:327 msgid "Markdown Guide" msgstr "Markdown 手册" -#: .\cookbook\templates\base.html:326 +#: .\cookbook\templates\base.html:329 msgid "GitHub" msgstr "GitHub" -#: .\cookbook\templates\base.html:328 +#: .\cookbook\templates\base.html:331 msgid "Translate Tandoor" msgstr "翻译泥炉" -#: .\cookbook\templates\base.html:332 +#: .\cookbook\templates\base.html:335 msgid "API Browser" msgstr "应用程序接口浏览器" -#: .\cookbook\templates\base.html:335 +#: .\cookbook\templates\base.html:338 msgid "Log out" msgstr "退出" -#: .\cookbook\templates\base.html:357 +#: .\cookbook\templates\base.html:360 msgid "You are using the free version of Tandor" msgstr "你正在使用免费版的泥炉" -#: .\cookbook\templates\base.html:358 +#: .\cookbook\templates\base.html:361 msgid "Upgrade Now" msgstr "现在升级" @@ -1217,11 +1223,7 @@ msgstr "路径必须采用以下格式" #: .\cookbook\templates\forms\edit_import_recipe.html:14 #: .\cookbook\templates\generic\edit_template.html:23 #: .\cookbook\templates\generic\new_template.html:23 -#: .\cookbook\templates\settings.html:70 -#: .\cookbook\templates\settings.html:112 -#: .\cookbook\templates\settings.html:130 -#: .\cookbook\templates\settings.html:202 -#: .\cookbook\templates\settings.html:213 +#: .\cookbook\templates\settings.html:57 msgid "Save" msgstr "保存" @@ -1269,39 +1271,6 @@ msgstr "导入新菜谱" msgid "Edit Recipe" msgstr "编辑菜谱" -#: .\cookbook\templates\forms\ingredients.html:15 -msgid "Edit Ingredients" -msgstr "编辑食材" - -#: .\cookbook\templates\forms\ingredients.html:16 -msgid "" -"\n" -" The following form can be used if, accidentally, two (or more) units " -"or ingredients where created that should be\n" -" the same.\n" -" It merges two units or ingredients and updates all recipes using " -"them.\n" -" " -msgstr "" -"\n" -" 如果意外创建两个(或更多)单位的相同食材,则可以使用下面的\n" -" 表格。\n" -" 可以合并两个单位的食材并使用它们更新所有菜谱。\n" -" " - -#: .\cookbook\templates\forms\ingredients.html:26 -msgid "Are you sure that you want to merge these two units?" -msgstr "你确定要合并这两个单位吗?" - -#: .\cookbook\templates\forms\ingredients.html:31 -#: .\cookbook\templates\forms\ingredients.html:40 -msgid "Merge" -msgstr "合并" - -#: .\cookbook\templates\forms\ingredients.html:36 -msgid "Are you sure that you want to merge these two ingredients?" -msgstr "你确定要合并这两种食材吗?" - #: .\cookbook\templates\generic\delete_template.html:21 #, python-format msgid "Are you sure you want to delete the %(title)s: %(object)s " @@ -1323,6 +1292,11 @@ msgstr "串联" msgid "Cancel" msgstr "取消" +#: .\cookbook\templates\generic\edit_template.html:6 +#: .\cookbook\templates\generic\edit_template.html:14 +msgid "Edit" +msgstr "编辑" + #: .\cookbook\templates\generic\edit_template.html:32 msgid "View" msgstr "查看" @@ -1344,13 +1318,16 @@ msgstr "筛选" msgid "Import all" msgstr "全部导入" +#: .\cookbook\templates\generic\new_template.html:6 +#: .\cookbook\templates\generic\new_template.html:14 +msgid "New" +msgstr "新" + #: .\cookbook\templates\generic\table_template.html:76 -#: .\cookbook\templates\recipes_table.html:121 msgid "previous" msgstr "之前" #: .\cookbook\templates\generic\table_template.html:98 -#: .\cookbook\templates\recipes_table.html:143 msgid "next" msgstr "之后" @@ -1362,24 +1339,11 @@ msgstr "查看记录" msgid "Cook Log" msgstr "烹饪记录" -#: .\cookbook\templates\import.html:6 -msgid "Import Recipes" -msgstr "导入菜谱" - -#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 #: .\cookbook\templates\import_response.html:7 .\cookbook\views\delete.py:86 #: .\cookbook\views\edit.py:191 msgid "Import" msgstr "导入" -#: .\cookbook\templates\include\recipe_open_modal.html:18 -msgid "Close" -msgstr "关闭" - -#: .\cookbook\templates\include\recipe_open_modal.html:32 -msgid "Open Recipe" -msgstr "打开菜谱" - #: .\cookbook\templates\include\storage_backend_warning.html:4 msgid "Security Warning" msgstr "安全警告" @@ -1575,31 +1539,6 @@ msgstr "头部" msgid "Cell" msgstr "单元格" -#: .\cookbook\templates\meal_plan_entry.html:6 -msgid "Meal Plan View" -msgstr "膳食计划视图" - -#: .\cookbook\templates\meal_plan_entry.html:18 -msgid "Created by" -msgstr "创建者" - -#: .\cookbook\templates\meal_plan_entry.html:20 -msgid "Shared with" -msgstr "分享自" - -#: .\cookbook\templates\meal_plan_entry.html:48 -#: .\cookbook\templates\recipes_table.html:64 -msgid "Last cooked" -msgstr "最近烹饪" - -#: .\cookbook\templates\meal_plan_entry.html:50 -msgid "Never cooked before." -msgstr "从来没有烹饪。" - -#: .\cookbook\templates\meal_plan_entry.html:76 -msgid "Other meals on this day" -msgstr "这天的其他餐点" - #: .\cookbook\templates\no_groups_info.html:5 #: .\cookbook\templates\no_groups_info.html:12 msgid "No Permissions" @@ -1646,43 +1585,26 @@ msgstr "" msgid "Back" msgstr "返回" -#: .\cookbook\templates\recipe_view.html:26 +#: .\cookbook\templates\profile.html:7 +msgid "Profile" +msgstr "简介" + +#: .\cookbook\templates\recipe_view.html:41 msgid "by" msgstr "评论者" -#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:144 +#: .\cookbook\templates\recipe_view.html:59 .\cookbook\views\delete.py:144 #: .\cookbook\views\edit.py:171 msgid "Comment" msgstr "评论" -#: .\cookbook\templates\recipes_table.html:19 -#: .\cookbook\templates\recipes_table.html:23 -msgid "Recipe Image" -msgstr "菜谱图像" - -#: .\cookbook\templates\recipes_table.html:51 -msgid "Preparation time ca." -msgstr "准备时间约" - -#: .\cookbook\templates\recipes_table.html:57 -msgid "Waiting time ca." -msgstr "等待时间约" - -#: .\cookbook\templates\recipes_table.html:60 -msgid "External" -msgstr "外部" - -#: .\cookbook\templates\recipes_table.html:86 -msgid "Log Cooking" -msgstr "烹饪记录" - #: .\cookbook\templates\rest_framework\api.html:5 msgid "Recipe Home" msgstr "菜谱主页" #: .\cookbook\templates\search_info.html:5 #: .\cookbook\templates\search_info.html:9 -#: .\cookbook\templates\settings.html:172 +#: .\cookbook\templates\settings.html:24 msgid "Search Settings" msgstr "搜索设置" @@ -1743,8 +1665,10 @@ 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 @@ -1759,7 +1683,8 @@ msgid "" msgstr "" " \n" " 短语搜索会忽略标点符号,但会按照搜索顺序查询所有单词。\n" -" 搜索“苹果或面粉”将只返回一个食谱,这个食谱包含进行全文搜索时准确的字段短语“苹果或面粉”。\n" +" 搜索“苹果或面粉”将只返回一个食谱,这个食谱包含进行全文搜索时准确" +"的字段短语“苹果或面粉”。\n" " " #: .\cookbook\templates\search_info.html:39 @@ -1783,10 +1708,13 @@ msgstr "" " \n" " 网页搜索模拟许多支持特殊语法的网页搜索站点上的功能。\n" " 在几个单词周围加上引号会将这些单词转换为一个短语。\n" -" 'or' 被识别为搜索紧接在 'or' 之前的单词(或短语)或紧随其后的单词(或短语)。\n" +" 'or' 被识别为搜索紧接在 'or' 之前的单词(或短语)或紧随其后的单词" +"(或短语)。\n" " '-' 被识别为搜索不包含紧随其后的单词(或短语)的食谱。 \n" -" 例如,搜索 “苹果派” 或“樱桃 -黄油” 将返回任何包含短语“苹果派”或“樱桃”的食谱 \n" -" 与在全文搜索中包含的任何 “樱桃” 字段中,但排除包含单词“黄油”的任何食谱。\n" +" 例如,搜索 “苹果派” 或“樱桃 -黄油” 将返回任何包含短语“苹果" +"派”或“樱桃”的食谱 \n" +" 与在全文搜索中包含的任何 “樱桃” 字段中,但排除包含单词“黄油”的任" +"何食谱。\n" " " #: .\cookbook\templates\search_info.html:48 @@ -1797,7 +1725,8 @@ msgid "" " " msgstr "" " \n" -" 原始搜索与网页类似,不同的是会采用标点运算符,例如 '|', '&' 和 '()'\n" +" 原始搜索与网页类似,不同的是会采用标点运算符,例如 '|', '&' 和 " +"'()'\n" " " #: .\cookbook\templates\search_info.html:59 @@ -1815,10 +1744,12 @@ msgid "" " " msgstr "" " \n" -" 另一种也需要 PostgreSQL 的搜索方法是模糊搜索或三元组。 三元组是一组三个连续的字符。\n" -" 例如,搜索“apple”将创建 x 个三元组“app”、“ppl”、“ple”,并将创建单词与生成的三元组匹配程度的分数。\n" -" 使用模糊搜索或三元组一个好处是搜索“sandwich”会找到拼写错误的单词,例如“sandwhich”,而其他方法会漏掉这些单词。" -"\n" +" 另一种也需要 PostgreSQL 的搜索方法是模糊搜索或三元组。 三元组是一" +"组三个连续的字符。\n" +" 例如,搜索“apple”将创建 x 个三元组“app”、“ppl”、“ple”,并将创建单" +"词与生成的三元组匹配程度的分数。\n" +" 使用模糊搜索或三元组一个好处是搜索“sandwich”会找到拼写错误的单" +"词,例如“sandwhich”,而其他方法会漏掉这些单词。\n" " " #: .\cookbook\templates\search_info.html:69 @@ -1860,11 +1791,15 @@ msgid "" " " msgstr "" " \n" -" 不重音 是一种特殊情况,因为它可以为每个尝试忽略重音值的搜索进行搜索“不重音”字段。 \n" -" 例如,当您为“名字”启用不重音时,任何搜索(开头、包含、三元组)都将尝试搜索忽略重音字符。\n" +" 不重音 是一种特殊情况,因为它可以为每个尝试忽略重音值的搜索进行搜" +"索“不重音”字段。 \n" +" 例如,当您为“名字”启用不重音时,任何搜索(开头、包含、三元组)都" +"将尝试搜索忽略重音字符。\n" " \n" -" 对于其他选项,您可以在任一或所有字段上启用搜索,它们将与假定的“or”组合在一起。\n" -" 例如,为 起始于 启用“名字”,为 部分匹配 启用“名字”和“描述”,为 全文搜索 启用“食材”和“关键字”\n" +" 对于其他选项,您可以在任一或所有字段上启用搜索,它们将与假定" +"的“or”组合在一起。\n" +" 例如,为 起始于 启用“名字”,为 部分匹配 启用“名字”和“描述”,为 全" +"文搜索 启用“食材”和“关键字”\n" " 并搜索“苹果”将生成一个搜索,该搜索将返回具有以下内容的食谱:\n" " - 以“苹果”开头的食谱名称\n" " - 或包含“苹果”的食谱名称\n" @@ -1872,9 +1807,11 @@ msgstr "" " - 或在食材中具有全文搜索匹配(“苹果”或“很多苹果”)的食谱\n" " - 或将在关键字中进行全文搜索匹配的食谱\n" "\n" -" 在多种类型搜索中组合大量字段可能会对性能产生负面影响、创建重复结果或返回意外结果。\n" +" 在多种类型搜索中组合大量字段可能会对性能产生负面影响、创建重复结" +"果或返回意外结果。\n" " 例如,启用模糊搜索或部分匹配会干扰网络搜索算法。 \n" -" 使用模糊搜索或全文搜索进行搜索“苹果 -派”将返回食谱 苹果派。虽然它不包含在全文结果中,但它确实与三元组结果匹配。\n" +" 使用模糊搜索或全文搜索进行搜索“苹果 -派”将返回食谱 苹果派。虽然它" +"不包含在全文结果中,但它确实与三元组结果匹配。\n" " " #: .\cookbook\templates\search_info.html:95 @@ -1895,91 +1832,26 @@ msgid "" msgstr "" " \n" " 三元搜索和全文搜索都依赖于数据库索引执行。 \n" -" 你可以在“食谱”的“管理”页面中的所有字段上重建索引并选择任一食谱运行“为所选食谱重建索引”\n" -" 你还可以通过执行管理命令“python manage.py rebuildindex”在命令行重建索引\n" +" 你可以在“食谱”的“管理”页面中的所有字段上重建索引并选择任一食谱运" +"行“为所选食谱重建索引”\n" +" 你还可以通过执行管理命令“python manage.py rebuildindex”在命令行重" +"建索引\n" " " -#: .\cookbook\templates\settings.html:28 -msgid "Account" -msgstr "账户" - -#: .\cookbook\templates\settings.html:35 -msgid "Preferences" -msgstr "首选项" - -#: .\cookbook\templates\settings.html:42 -msgid "API-Settings" -msgstr "应用程序接口设置" - -#: .\cookbook\templates\settings.html:49 -msgid "Search-Settings" -msgstr "搜索设置" - -#: .\cookbook\templates\settings.html:56 -msgid "Shopping-Settings" -msgstr "购物设置" - -#: .\cookbook\templates\settings.html:65 -msgid "Name Settings" -msgstr "名字设置" - -#: .\cookbook\templates\settings.html:73 -msgid "Account Settings" -msgstr "帐号设置" - -#: .\cookbook\templates\settings.html:75 -msgid "Emails" -msgstr "电子邮件" - -#: .\cookbook\templates\settings.html:78 -#: .\cookbook\templates\socialaccount\connections.html:11 -msgid "Social" -msgstr "社交" - -#: .\cookbook\templates\settings.html:91 -msgid "Language" -msgstr "语言" - -#: .\cookbook\templates\settings.html:121 -msgid "Style" -msgstr "样式" - -#: .\cookbook\templates\settings.html:142 -msgid "API Token" -msgstr "应用程序接口令牌" - -#: .\cookbook\templates\settings.html:143 -msgid "" -"You can use both basic authentication and token based authentication to " -"access the REST API." -msgstr "" -"您可以使用基本身份验证和基于令牌的身份验证来访问表现层状态转换应用程序接口" -"(REST API)。" - -#: .\cookbook\templates\settings.html:160 -msgid "" -"Use the token as an Authorization header prefixed by the word token as shown " -"in the following examples:" -msgstr "使用令牌作为授权标头,前缀为单词令牌,如以下示例所示:" - -#: .\cookbook\templates\settings.html:162 -msgid "or" -msgstr "或" - -#: .\cookbook\templates\settings.html:173 +#: .\cookbook\templates\settings.html:25 msgid "" "There are many options to configure the search depending on your personal " "preferences." msgstr "根据个人偏好,有许多选项可以配置搜索。" -#: .\cookbook\templates\settings.html:174 +#: .\cookbook\templates\settings.html:26 msgid "" "Usually you do not need to configure any of them and can just stick " "with either the default or one of the following presets." msgstr "" "通常你 不需要 配置它们中的任何一个,只需使用默认设置或以下预设值之一。" -#: .\cookbook\templates\settings.html:175 +#: .\cookbook\templates\settings.html:27 msgid "" "If you do want to configure the search you can read about the different " "options here." @@ -1987,11 +1859,11 @@ msgstr "" "如果你想要配置搜索,可以在 这里 阅读不同的选" "项。" -#: .\cookbook\templates\settings.html:180 +#: .\cookbook\templates\settings.html:32 msgid "Fuzzy" msgstr "模糊" -#: .\cookbook\templates\settings.html:181 +#: .\cookbook\templates\settings.html:33 msgid "" "Find what you need even if your search or the recipe contains typos. Might " "return more results than needed to make sure you find what you are looking " @@ -2000,34 +1872,29 @@ msgstr "" "即使你的搜索或菜谱中有拼写错误,也要找到你需要的东西。可能会返回比需要更多的" "结果,以确保你找到所需的内容。" -#: .\cookbook\templates\settings.html:182 +#: .\cookbook\templates\settings.html:34 msgid "This is the default behavior" msgstr "这是默认行为" -#: .\cookbook\templates\settings.html:183 -#: .\cookbook\templates\settings.html:191 +#: .\cookbook\templates\settings.html:37 .\cookbook\templates\settings.html:46 msgid "Apply" msgstr "应用" -#: .\cookbook\templates\settings.html:188 +#: .\cookbook\templates\settings.html:42 msgid "Precise" msgstr "精确" -#: .\cookbook\templates\settings.html:189 +#: .\cookbook\templates\settings.html:43 msgid "" "Allows fine control over search results but might not return results if too " "many spelling mistakes are made." msgstr "" "允许对搜索结果进行精细控制,但如果出现太多拼写错误,则可能不会返回结果。" -#: .\cookbook\templates\settings.html:190 +#: .\cookbook\templates\settings.html:44 msgid "Perfect for large Databases" msgstr "非常适合大型数据库" -#: .\cookbook\templates\settings.html:207 -msgid "Shopping Settings" -msgstr "购物设置" - #: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5 msgid "Cookbook Setup" msgstr "安装菜谱" @@ -2060,6 +1927,10 @@ msgstr "尝试通过您的社交网络帐户登录时出错。" msgid "Account Connections" msgstr "帐号连接" +#: .\cookbook\templates\socialaccount\connections.html:11 +msgid "Social" +msgstr "社交" + #: .\cookbook\templates\socialaccount\connections.html:18 msgid "" "You can sign in to your account using any of the following third party\n" @@ -2157,24 +2028,24 @@ msgid "" "You can either be invited into an existing space or create your own one." msgstr "你可以被邀请进入现有空间,也可以创建自己的空间。" -#: .\cookbook\templates\space_overview.html:45 +#: .\cookbook\templates\space_overview.html:53 msgid "Owner" msgstr "所有者" -#: .\cookbook\templates\space_overview.html:49 +#: .\cookbook\templates\space_overview.html:57 msgid "Leave Space" msgstr "留出空间" -#: .\cookbook\templates\space_overview.html:70 -#: .\cookbook\templates\space_overview.html:80 +#: .\cookbook\templates\space_overview.html:78 +#: .\cookbook\templates\space_overview.html:88 msgid "Join Space" msgstr "加入空间" -#: .\cookbook\templates\space_overview.html:73 +#: .\cookbook\templates\space_overview.html:81 msgid "Join an existing space." msgstr "加入一个现有的空间。" -#: .\cookbook\templates\space_overview.html:75 +#: .\cookbook\templates\space_overview.html:83 msgid "" "To join an existing space either enter your invite token or click on the " "invite link the space owner send you." @@ -2182,47 +2053,19 @@ msgstr "" "要加入一个现有的空间,要么输入你的邀请令牌,要么单击空间所有者发送给你的邀请" "链接。" -#: .\cookbook\templates\space_overview.html:88 -#: .\cookbook\templates\space_overview.html:97 +#: .\cookbook\templates\space_overview.html:96 +#: .\cookbook\templates\space_overview.html:105 msgid "Create Space" msgstr "创建空间" -#: .\cookbook\templates\space_overview.html:91 +#: .\cookbook\templates\space_overview.html:99 msgid "Create your own recipe space." msgstr "创建你自己的菜谱空间。" -#: .\cookbook\templates\space_overview.html:93 +#: .\cookbook\templates\space_overview.html:101 msgid "Start your own recipe space and invite other users to it." msgstr "创建自己的食谱空间,并邀请其他用户加入。" -#: .\cookbook\templates\stats.html:4 -msgid "Stats" -msgstr "统计数据" - -#: .\cookbook\templates\stats.html:10 -msgid "Statistics" -msgstr "统计数据" - -#: .\cookbook\templates\stats.html:19 -msgid "Number of objects" -msgstr "对象数" - -#: .\cookbook\templates\stats.html:30 -msgid "Recipe Imports" -msgstr "食谱导入" - -#: .\cookbook\templates\stats.html:38 -msgid "Objects stats" -msgstr "对象统计" - -#: .\cookbook\templates\stats.html:41 -msgid "Recipes without Keywords" -msgstr "菜谱没有关键字" - -#: .\cookbook\templates\stats.html:45 -msgid "Internal Recipes" -msgstr "内部菜谱" - #: .\cookbook\templates\system.html:20 msgid "System Information" msgstr "系统信息" @@ -2295,8 +2138,8 @@ msgid "" " " msgstr "" "\n" -" 您没有在 .env 文件中配置 SECRET_KEY。 Django " -"默认为\n" +" 您没有在 .env 文件中配置 SECRET_KEY。 " +"Django 默认为\n" " 标准键\n" " 提供公开但并不安全的安装! 请设置\n" " SECRET_KEY.env 文件中配置。\n" @@ -2339,7 +2182,8 @@ msgid "" " " msgstr "" "\n" -" 此应用程序未使用 PostgreSQL 数据库在后端运行。 这并没有关系,但这是不推荐的,\n" +" 此应用程序未使用 PostgreSQL 数据库在后端运行。 这并没有关系,但这" +"是不推荐的,\n" " 因为有些功能仅适用于 PostgreSQL 数据库。\n" " " @@ -2347,249 +2191,266 @@ msgstr "" msgid "URL Import" msgstr "链接导入" -#: .\cookbook\views\api.py:105 .\cookbook\views\api.py:197 +#: .\cookbook\views\api.py:110 .\cookbook\views\api.py:202 msgid "Parameter updated_at incorrectly formatted" msgstr "参数 updated_at 格式不正确" -#: .\cookbook\views\api.py:217 .\cookbook\views\api.py:320 +#: .\cookbook\views\api.py:222 .\cookbook\views\api.py:325 +#, python-brace-format msgid "No {self.basename} with id {pk} exists" msgstr "不存在ID是 {pk} 的 {self.basename}" -#: .\cookbook\views\api.py:221 +#: .\cookbook\views\api.py:226 msgid "Cannot merge with the same object!" msgstr "无法与同一对象合并!" -#: .\cookbook\views\api.py:228 -msgid "No {self.basename} with id {target} exists" -msgstr "不存在 ID 为 {pk} 的 {self.basename}" - #: .\cookbook\views\api.py:233 +#, python-brace-format +msgid "No {self.basename} with id {target} exists" +msgstr "不存在 ID 为 {target} 的 {self.basename}" + +#: .\cookbook\views\api.py:238 msgid "Cannot merge with child object!" msgstr "无法与子对象合并!" -#: .\cookbook\views\api.py:266 +#: .\cookbook\views\api.py:271 +#, python-brace-format msgid "{source.name} was merged successfully with {target.name}" msgstr "{source.name} 已成功与 {target.name} 合并" -#: .\cookbook\views\api.py:271 +#: .\cookbook\views\api.py:276 +#, python-brace-format msgid "An error occurred attempting to merge {source.name} with {target.name}" msgstr "视图合并 {source.name} 和 {target.name} 时出错" -#: .\cookbook\views\api.py:329 +#: .\cookbook\views\api.py:334 +#, python-brace-format msgid "{child.name} was moved successfully to the root." msgstr "{child.name} 已成功移动到根目录。" -#: .\cookbook\views\api.py:332 .\cookbook\views\api.py:350 +#: .\cookbook\views\api.py:337 .\cookbook\views\api.py:355 msgid "An error occurred attempting to move " msgstr "尝试移动时出错 " -#: .\cookbook\views\api.py:335 +#: .\cookbook\views\api.py:340 msgid "Cannot move an object to itself!" msgstr "无法将对象移动到自身!" -#: .\cookbook\views\api.py:341 +#: .\cookbook\views\api.py:346 +#, python-brace-format msgid "No {self.basename} with id {parent} exists" msgstr "不存在 ID 为 {parent} 的 {self.basename}" -#: .\cookbook\views\api.py:347 +#: .\cookbook\views\api.py:352 +#, python-brace-format msgid "{child.name} was moved successfully to parent {parent.name}" msgstr "{child.name} 成功移动到父节点 {parent.name}" -#: .\cookbook\views\api.py:542 +#: .\cookbook\views\api.py:553 +#, python-brace-format msgid "{obj.name} was removed from the shopping list." msgstr "{obj.name} 已从购物清单中删除。" -#: .\cookbook\views\api.py:547 .\cookbook\views\api.py:879 -#: .\cookbook\views\api.py:892 +#: .\cookbook\views\api.py:558 .\cookbook\views\api.py:888 +#: .\cookbook\views\api.py:901 +#, python-brace-format msgid "{obj.name} was added to the shopping list." msgstr "{obj.name} 已添加到购物清单中。" -#: .\cookbook\views\api.py:674 +#: .\cookbook\views\api.py:685 msgid "ID of recipe a step is part of. For multiple repeat parameter." msgstr "食谱中的步骤ID。 对于多个重复参数。" -#: .\cookbook\views\api.py:676 +#: .\cookbook\views\api.py:687 msgid "Query string matched (fuzzy) against object name." msgstr "请求参数与对象名称匹配(模糊)。" -#: .\cookbook\views\api.py:720 +#: .\cookbook\views\api.py:731 msgid "" "Query string matched (fuzzy) against recipe name. In the future also " "fulltext search." msgstr "请求参数与食谱名称匹配(模糊)。 未来会添加全文搜索。" -#: .\cookbook\views\api.py:722 +#: .\cookbook\views\api.py:733 msgid "" "ID of keyword a recipe should have. For multiple repeat parameter. " "Equivalent to keywords_or" msgstr "菜谱应包含的关键字 ID。 对于多个重复参数。 相当于keywords_or" -#: .\cookbook\views\api.py:725 +#: .\cookbook\views\api.py:736 msgid "" "Keyword IDs, repeat for multiple. Return recipes with any of the keywords" msgstr "允许多个关键字 ID。 返回带有任一关键字的食谱" -#: .\cookbook\views\api.py:728 +#: .\cookbook\views\api.py:739 msgid "" "Keyword IDs, repeat for multiple. Return recipes with all of the keywords." msgstr "允许多个关键字 ID。 返回带有所有关键字的食谱。" -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:742 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords." msgstr "允许多个关键字 ID。 排除带有任一关键字的食谱。" -#: .\cookbook\views\api.py:734 +#: .\cookbook\views\api.py:745 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords." msgstr "允许多个关键字 ID。 排除带有所有关键字的食谱。" -#: .\cookbook\views\api.py:736 +#: .\cookbook\views\api.py:747 msgid "ID of food a recipe should have. For multiple repeat parameter." msgstr "食谱中食物带有ID。并可添加多个食物。" -#: .\cookbook\views\api.py:739 +#: .\cookbook\views\api.py:750 msgid "Food IDs, repeat for multiple. Return recipes with any of the foods" msgstr "食谱中食物带有ID。并可添加多个食物" -#: .\cookbook\views\api.py:741 +#: .\cookbook\views\api.py:752 msgid "Food IDs, repeat for multiple. Return recipes with all of the foods." msgstr "食谱中食物带有ID。返回包含任何食物的食谱。" -#: .\cookbook\views\api.py:743 +#: .\cookbook\views\api.py:754 msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods." msgstr "食谱中食物带有ID。排除包含任一食物的食谱。" -#: .\cookbook\views\api.py:745 +#: .\cookbook\views\api.py:756 msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods." msgstr "食谱中食物带有ID。排除包含所有食物的食谱。" -#: .\cookbook\views\api.py:746 +#: .\cookbook\views\api.py:757 msgid "ID of unit a recipe should have." msgstr "食谱应具有单一ID。" -#: .\cookbook\views\api.py:748 +#: .\cookbook\views\api.py:759 msgid "" "Rating a recipe should have or greater. [0 - 5] Negative value filters " "rating less than." msgstr "配方的评分范围从 0 到 5。" -#: .\cookbook\views\api.py:749 +#: .\cookbook\views\api.py:760 msgid "ID of book a recipe should be in. For multiple repeat parameter." msgstr "烹饪书应该在食谱中具有ID。并且可以添加多本。" -#: .\cookbook\views\api.py:751 +#: .\cookbook\views\api.py:762 msgid "Book IDs, repeat for multiple. Return recipes with any of the books" msgstr "书的ID允许多个。返回包含任一书籍的食谱" -#: .\cookbook\views\api.py:753 +#: .\cookbook\views\api.py:764 msgid "Book IDs, repeat for multiple. Return recipes with all of the books." msgstr "书的ID允许多个。返回包含所有书籍的食谱。" -#: .\cookbook\views\api.py:755 +#: .\cookbook\views\api.py:766 msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books." msgstr "书的ID允许多个。排除包含任一书籍的食谱。" -#: .\cookbook\views\api.py:757 +#: .\cookbook\views\api.py:768 msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books." msgstr "书的ID允许多个。排除包含所有书籍的食谱。" -#: .\cookbook\views\api.py:759 +#: .\cookbook\views\api.py:770 msgid "If only internal recipes should be returned. [true/false]" msgstr "只返回内部食谱。 [true/false]" -#: .\cookbook\views\api.py:761 +#: .\cookbook\views\api.py:772 msgid "Returns the results in randomized order. [true/false]" msgstr "按随机排序返回结果。 [true/ false ]" -#: .\cookbook\views\api.py:763 +#: .\cookbook\views\api.py:774 msgid "Returns new results first in search results. [true/false]" msgstr "在搜索结果中首先返回新结果。 [是/]" -#: .\cookbook\views\api.py:765 +#: .\cookbook\views\api.py:776 msgid "" "Filter recipes cooked X times or more. Negative values returns cooked less " "than X times" msgstr "筛选烹饪 X 次或更多次的食谱。 负值返回烹饪少于 X 次" -#: .\cookbook\views\api.py:767 +#: .\cookbook\views\api.py:778 msgid "" "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on " "or before date." -msgstr "筛选最后烹饪在 YYYY-MM-DD 当天或之后的食谱。 前置 - 在日期或日期之前筛选。" +msgstr "" +"筛选最后烹饪在 YYYY-MM-DD 当天或之后的食谱。 前置 - 在日期或日期之前筛选。" -#: .\cookbook\views\api.py:769 +#: .\cookbook\views\api.py:780 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 +#: .\cookbook\views\api.py:782 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 +#: .\cookbook\views\api.py:784 msgid "" "Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on " "or before date." -msgstr "筛选最后查看时间是在 YYYY-MM-DD 或之后的食谱。 前置 - 在日期或日期之前筛选。" +msgstr "" +"筛选最后查看时间是在 YYYY-MM-DD 或之后的食谱。 前置 - 在日期或日期之前筛选。" -#: .\cookbook\views\api.py:775 +#: .\cookbook\views\api.py:786 msgid "Filter recipes that can be made with OnHand food. [true/false]" msgstr "筛选可以直接用手制作的食谱。 [真/]" -#: .\cookbook\views\api.py:937 +#: .\cookbook\views\api.py:946 msgid "" "Returns the shopping list entry with a primary key of id. Multiple values " "allowed." msgstr "返回主键为 id 的购物清单条目。 允许多个值。" -#: .\cookbook\views\api.py:942 +#: .\cookbook\views\api.py:951 msgid "" -"Filter shopping list entries on checked. [true, false, both, recent]" -"
    - recent includes unchecked items and recently completed items." -msgstr "在选中时筛选购物清单列表。 [真, 假, 两者都有, 最近]
    - 最近包括未选中的项目和最近完成的项目。" +"Filter shopping list entries on checked. [true, false, both, recent]
    - recent includes unchecked items and recently completed items." +msgstr "" +"在选中时筛选购物清单列表。 [真, 假, 两者都有, 最近]
    - 最近包括未" +"选中的项目和最近完成的项目。" -#: .\cookbook\views\api.py:945 +#: .\cookbook\views\api.py:954 msgid "Returns the shopping list entries sorted by supermarket category order." msgstr "返回按超市分类排序的购物清单列表。" -#: .\cookbook\views\api.py:1140 +#: .\cookbook\views\api.py:1166 msgid "Nothing to do." msgstr "无事可做。" -#: .\cookbook\views\api.py:1160 +#: .\cookbook\views\api.py:1198 msgid "Invalid Url" msgstr "无效网址" -#: .\cookbook\views\api.py:1167 +#: .\cookbook\views\api.py:1205 msgid "Connection Refused." msgstr "连接被拒绝。" -#: .\cookbook\views\api.py:1172 +#: .\cookbook\views\api.py:1210 msgid "Bad URL Schema." msgstr "错误的 URL Schema。" -#: .\cookbook\views\api.py:1195 +#: .\cookbook\views\api.py:1233 msgid "No usable data could be found." msgstr "找不到可用的数据。" -#: .\cookbook\views\api.py:1303 .\cookbook\views\data.py:28 +#: .\cookbook\views\api.py:1326 .\cookbook\views\import_export.py:117 +msgid "Importing is not implemented for this provider" +msgstr "此提供程序未实现导入" + +#: .\cookbook\views\api.py:1372 .\cookbook\views\data.py:31 #: .\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:1325 +#: .\cookbook\views\api.py:1394 msgid "Sync successful!" msgstr "同步成功!" -#: .\cookbook\views\api.py:1330 +#: .\cookbook\views\api.py:1399 msgid "Error synchronizing with Storage" msgstr "与存储同步时出错" -#: .\cookbook\views\data.py:97 +#: .\cookbook\views\data.py:100 #, python-format msgid "Batch edit done. %(count)d recipe was updated." msgid_plural "Batch edit done. %(count)d Recipes where updated." @@ -2645,11 +2506,7 @@ msgstr "更改已保存!" msgid "Error saving changes!" msgstr "保存更改时出错!" -#: .\cookbook\views\import_export.py:111 .\cookbook\views\import_export.py:150 -msgid "Importing is not implemented for this provider" -msgstr "此提供程序未实现导入" - -#: .\cookbook\views\import_export.py:137 +#: .\cookbook\views\import_export.py:104 msgid "" "The PDF Exporter is not enabled on this instance as it is still in an " "experimental state." @@ -2695,39 +2552,40 @@ msgstr "导入新菜谱!" msgid "There was an error importing this recipe!" msgstr "导入此菜谱时出错!" -#: .\cookbook\views\views.py:124 +#: .\cookbook\views\views.py:73 .\cookbook\views\views.py:191 +#: .\cookbook\views\views.py:213 .\cookbook\views\views.py:399 +msgid "This feature is not available in the demo version!" +msgstr "此功能在演示版本中不可用!" + +#: .\cookbook\views\views.py:89 msgid "" "You have successfully created your own recipe space. Start by adding some " "recipes or invite other people to join you." msgstr "你已成功创建自己的菜谱空间。 首先添加一些菜谱或邀请其他人加入。" -#: .\cookbook\views\views.py:178 +#: .\cookbook\views\views.py:143 msgid "You do not have the required permissions to perform this action!" msgstr "您没有执行此操作所需的权限!" -#: .\cookbook\views\views.py:189 +#: .\cookbook\views\views.py:154 msgid "Comment saved!" msgstr "评论已保存!" -#: .\cookbook\views\views.py:264 -msgid "This feature is not available in the demo version!" -msgstr "此功能在演示版本中不可用!" - -#: .\cookbook\views\views.py:324 +#: .\cookbook\views\views.py:253 msgid "You must select at least one field to search!" msgstr "你必须至少选择一个字段进行搜索!" -#: .\cookbook\views\views.py:329 +#: .\cookbook\views\views.py:258 msgid "" "To use this search method you must select at least one full text search " "field!" msgstr "要使用此搜索方法,至少选择一个全文搜索字段!" -#: .\cookbook\views\views.py:333 +#: .\cookbook\views\views.py:262 msgid "Fuzzy search is not compatible with this search method!" msgstr "模糊搜索与此搜索方法不兼容!" -#: .\cookbook\views\views.py:463 +#: .\cookbook\views\views.py:338 msgid "" "The setup page can only be used to create the first user! If you have " "forgotten your superuser credentials please consult the django documentation " @@ -2736,38 +2594,197 @@ msgstr "" "设置页面只能用于创建第一个用户!如果您忘记了超级用户凭据,请参阅 Django 文" "档,了解如何重置密码。" -#: .\cookbook\views\views.py:470 +#: .\cookbook\views\views.py:345 msgid "Passwords dont match!" msgstr "密码不匹配!" -#: .\cookbook\views\views.py:478 +#: .\cookbook\views\views.py:353 msgid "User has been created, please login!" msgstr "用户已创建,请登录!" -#: .\cookbook\views\views.py:494 +#: .\cookbook\views\views.py:369 msgid "Malformed Invite Link supplied!" msgstr "提供了格式错误的邀请链接!" -#: .\cookbook\views\views.py:510 +#: .\cookbook\views\views.py:386 msgid "Successfully joined space." msgstr "成功加入空间。" -#: .\cookbook\views\views.py:516 +#: .\cookbook\views\views.py:392 msgid "Invite Link not valid or already used!" msgstr "邀请链接无效或已使用!" -#: .\cookbook\views\views.py:530 +#: .\cookbook\views\views.py:409 msgid "" "Reporting share links is not enabled for this instance. Please notify the " "page administrator to report problems." msgstr "未为此实例启用报告共享链接。请通知页面管理员报告问题。" -#: .\cookbook\views\views.py:536 +#: .\cookbook\views\views.py:415 msgid "" "Recipe sharing link has been disabled! For additional information please " "contact the page administrator." msgstr "菜谱共享链接已被禁用!有关更多信息,请与页面管理员联系。" +#~ msgid "Ingredients" +#~ msgstr "食材" + +#~ msgid "Show recent recipes" +#~ msgstr "显示最近的菜谱" + +#~ msgid "Search style" +#~ msgstr "搜索风格" + +#~ msgid "Show recently viewed recipes on search page." +#~ msgstr "在搜索页面上显示最近查看的菜谱。" + +#~ msgid "Small" +#~ msgstr "小" + +#~ msgid "Large" +#~ msgstr "大" + +#~ msgid "Edit Ingredients" +#~ msgstr "编辑食材" + +#~ msgid "" +#~ "\n" +#~ " The following form can be used if, accidentally, two (or more) " +#~ "units or ingredients where created that should be\n" +#~ " the same.\n" +#~ " It merges two units or ingredients and updates all recipes using " +#~ "them.\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ " 如果意外创建两个(或更多)单位的相同食材,则可以使用下面的\n" +#~ " 表格。\n" +#~ " 可以合并两个单位的食材并使用它们更新所有菜谱。\n" +#~ " " + +#~ msgid "Are you sure that you want to merge these two units?" +#~ msgstr "你确定要合并这两个单位吗?" + +#~ msgid "Merge" +#~ msgstr "合并" + +#~ msgid "Are you sure that you want to merge these two ingredients?" +#~ msgstr "你确定要合并这两种食材吗?" + +#~ msgid "Import Recipes" +#~ msgstr "导入菜谱" + +#~ msgid "Close" +#~ msgstr "关闭" + +#~ msgid "Open Recipe" +#~ msgstr "打开菜谱" + +#~ msgid "Meal Plan View" +#~ msgstr "膳食计划视图" + +#~ msgid "Created by" +#~ msgstr "创建者" + +#~ msgid "Shared with" +#~ msgstr "分享自" + +#~ msgid "Last cooked" +#~ msgstr "最近烹饪" + +#~ msgid "Never cooked before." +#~ msgstr "从来没有烹饪。" + +#~ msgid "Other meals on this day" +#~ msgstr "这天的其他餐点" + +#~ msgid "Recipe Image" +#~ msgstr "菜谱图像" + +#~ msgid "Preparation time ca." +#~ msgstr "准备时间约" + +#~ msgid "Waiting time ca." +#~ msgstr "等待时间约" + +#~ msgid "External" +#~ msgstr "外部" + +#~ msgid "Log Cooking" +#~ msgstr "烹饪记录" + +#~ msgid "Account" +#~ msgstr "账户" + +#~ msgid "Preferences" +#~ msgstr "首选项" + +#~ msgid "API-Settings" +#~ msgstr "应用程序接口设置" + +#~ msgid "Search-Settings" +#~ msgstr "搜索设置" + +#~ msgid "Shopping-Settings" +#~ msgstr "购物设置" + +#~ msgid "Name Settings" +#~ msgstr "名字设置" + +#~ msgid "Account Settings" +#~ msgstr "帐号设置" + +#~ msgid "Emails" +#~ msgstr "电子邮件" + +#~ msgid "Language" +#~ msgstr "语言" + +#~ msgid "Style" +#~ msgstr "样式" + +#~ msgid "API Token" +#~ msgstr "应用程序接口令牌" + +#~ msgid "" +#~ "You can use both basic authentication and token based authentication to " +#~ "access the REST API." +#~ msgstr "" +#~ "您可以使用基本身份验证和基于令牌的身份验证来访问表现层状态转换应用程序接口" +#~ "(REST API)。" + +#~ msgid "" +#~ "Use the token as an Authorization header prefixed by the word token as " +#~ "shown in the following examples:" +#~ msgstr "使用令牌作为授权标头,前缀为单词令牌,如以下示例所示:" + +#~ msgid "or" +#~ msgstr "或" + +#~ msgid "Shopping Settings" +#~ msgstr "购物设置" + +#~ msgid "Stats" +#~ msgstr "统计数据" + +#~ msgid "Statistics" +#~ msgstr "统计数据" + +#~ msgid "Number of objects" +#~ msgstr "对象数" + +#~ msgid "Recipe Imports" +#~ msgstr "食谱导入" + +#~ msgid "Objects stats" +#~ msgstr "对象统计" + +#~ msgid "Recipes without Keywords" +#~ msgstr "菜谱没有关键字" + +#~ msgid "Internal Recipes" +#~ msgstr "内部菜谱" + #~ msgid "Show Links" #~ msgstr "显示链接" @@ -2897,9 +2914,6 @@ msgstr "菜谱共享链接已被禁用!有关更多信息,请与页面管理 #~ msgid "Text dragged here will be appended to the name." #~ msgstr "拖动到此处的文本将附加到名称中。" -#~ msgid "Description" -#~ msgstr "描述" - #~ msgid "Text dragged here will be appended to the description." #~ msgstr "拖动到此处的文本将附加到描述中。" @@ -2918,9 +2932,6 @@ msgstr "菜谱共享链接已被禁用!有关更多信息,请与页面管理 #~ msgid "Ingredients dragged here will be appended to current list." #~ msgstr "拖动到这里的材料将被添加到当前列表。" -#~ msgid "Instructions" -#~ msgstr "说明" - #~ msgid "Show Blank Field" #~ msgstr "显示空白域" diff --git a/cookbook/locale/zh_Hant/LC_MESSAGES/django.mo b/cookbook/locale/zh_Hant/LC_MESSAGES/django.mo index cb5715cda..7517dc2c3 100644 Binary files a/cookbook/locale/zh_Hant/LC_MESSAGES/django.mo and b/cookbook/locale/zh_Hant/LC_MESSAGES/django.mo differ diff --git a/cookbook/locale/zh_Hant/LC_MESSAGES/django.po b/cookbook/locale/zh_Hant/LC_MESSAGES/django.po index ae52972b3..c948c725a 100644 --- a/cookbook/locale/zh_Hant/LC_MESSAGES/django.po +++ b/cookbook/locale/zh_Hant/LC_MESSAGES/django.po @@ -8,14 +8,16 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-06-12 20:30+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" +"PO-Revision-Date: 2023-03-12 02:55+0000\n" +"Last-Translator: Feng Zhong \n" +"Language-Team: Chinese (Traditional) \n" "Language: zh_Hant\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.15\n" #: .\cookbook\filters.py:23 .\cookbook\templates\base.html:98 #: .\cookbook\templates\forms\edit_internal_recipe.html:246 @@ -23,41 +25,41 @@ msgstr "" #: .\cookbook\templates\space.html:37 .\cookbook\templates\stats.html:28 #: .\cookbook\templates\url_import.html:270 .\cookbook\views\lists.py:67 msgid "Ingredients" -msgstr "" +msgstr "食材" #: .\cookbook\forms.py:49 msgid "" "Color of the top navigation bar. Not all colors work with all themes, just " "try them out!" -msgstr "" +msgstr "頂部導航欄的顏色。並非所有的顏色都適用於所有的主題,只要試一試就可以了!" #: .\cookbook\forms.py:51 msgid "Default Unit to be used when inserting a new ingredient into a recipe." -msgstr "" +msgstr "在菜譜中插入新食材時使用的默認單位。" #: .\cookbook\forms.py:53 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" -msgstr "" +msgstr "啟用對食材數量的分數支持(例如自動將小數轉換為分數)" #: .\cookbook\forms.py:56 msgid "" "Users with whom newly created meal plan/shopping list entries should be " "shared by default." -msgstr "" +msgstr "默認情況下,將自動與用戶共享新創建的膳食計劃。" #: .\cookbook\forms.py:58 msgid "Show recently viewed recipes on search page." -msgstr "" +msgstr "在搜索頁面上查看最近看過的食譜。" #: .\cookbook\forms.py:59 msgid "Number of decimals to round ingredients." -msgstr "" +msgstr "四舍五入食材的小數點數量。" #: .\cookbook\forms.py:60 msgid "If you want to be able to create and see comments underneath recipes." -msgstr "" +msgstr "如果你希望能夠在菜譜下面創建並看到評論。" #: .\cookbook\forms.py:62 msgid "" @@ -66,22 +68,25 @@ msgid "" "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." msgstr "" +"設置為0將禁用自動同步。當查看購物清單時,清單會每隔幾秒鐘更新一次,以同步其他" +"人可能做出的改變。在與多人一起購物時很有用,但可能會消耗一點移動數據。如果低" +"於實例限制,它將在保存時被重置。" #: .\cookbook\forms.py:65 msgid "Makes the navbar stick to the top of the page." -msgstr "" +msgstr "使導航欄保持在頁面的頂部。" #: .\cookbook\forms.py:81 msgid "" "Both fields are optional. If none are given the username will be displayed " "instead" -msgstr "" +msgstr "這兩個字段都是可選的。如果沒有輸入,將顯示用戶名" #: .\cookbook\forms.py:102 .\cookbook\forms.py:331 #: .\cookbook\templates\forms\edit_internal_recipe.html:49 #: .\cookbook\templates\url_import.html:154 msgid "Name" -msgstr "" +msgstr "名字" #: .\cookbook\forms.py:103 .\cookbook\forms.py:332 #: .\cookbook\templates\base.html:105 @@ -90,37 +95,37 @@ msgstr "" #: .\cookbook\templates\url_import.html:188 #: .\cookbook\templates\url_import.html:573 msgid "Keywords" -msgstr "" +msgstr "關鍵詞" #: .\cookbook\forms.py:104 msgid "Preparation time in minutes" -msgstr "" +msgstr "準備時間(分鐘)" #: .\cookbook\forms.py:105 msgid "Waiting time (cooking/baking) in minutes" -msgstr "" +msgstr "等候(烹飪、烘焙等)時間(分鐘)" #: .\cookbook\forms.py:106 .\cookbook\forms.py:333 msgid "Path" -msgstr "" +msgstr "路徑" #: .\cookbook\forms.py:107 msgid "Storage UID" -msgstr "" +msgstr "存儲ID" #: .\cookbook\forms.py:133 msgid "Default" -msgstr "" +msgstr "默認" #: .\cookbook\forms.py:144 .\cookbook\templates\url_import.html:90 msgid "" "To prevent duplicates recipes with the same name as existing ones are " "ignored. Check this box to import everything." -msgstr "" +msgstr "為防止重復,忽略與現有同名的菜譜。選中此框可導入所有內容(包括同名菜譜)。" #: .\cookbook\forms.py:164 msgid "New Unit" -msgstr "" +msgstr "新單位" #: .\cookbook\forms.py:165 msgid "New unit that other gets replaced by." @@ -128,15 +133,15 @@ msgstr "" #: .\cookbook\forms.py:170 msgid "Old Unit" -msgstr "" +msgstr "舊單位" #: .\cookbook\forms.py:171 msgid "Unit that should be replaced." -msgstr "" +msgstr "該被替換的單位。" #: .\cookbook\forms.py:187 msgid "New Food" -msgstr "" +msgstr "新食物" #: .\cookbook\forms.py:188 msgid "New food that other gets replaced by." @@ -144,85 +149,86 @@ msgstr "" #: .\cookbook\forms.py:193 msgid "Old Food" -msgstr "" +msgstr "舊食物" #: .\cookbook\forms.py:194 msgid "Food that should be replaced." -msgstr "" +msgstr "該被替換的食物。" #: .\cookbook\forms.py:212 msgid "Add your comment: " -msgstr "" +msgstr "發表評論。 " #: .\cookbook\forms.py:253 msgid "Leave empty for dropbox and enter app password for nextcloud." -msgstr "" +msgstr "Dropbox 留空並輸入 Nextcloud 應用密碼。" #: .\cookbook\forms.py:260 msgid "Leave empty for nextcloud and enter api token for dropbox." -msgstr "" +msgstr "Nextcloud 留空並輸入 Dropbox API 令牌。" #: .\cookbook\forms.py:269 msgid "" "Leave empty for dropbox and enter only base url for nextcloud (/remote." "php/webdav/ is added automatically)" -msgstr "" +msgstr "Dropbox 留空並輸入基礎 Nextcloud 網址(/remote.php/webdav/ " +"會自動添加)" #: .\cookbook\forms.py:307 msgid "Search String" -msgstr "" +msgstr "搜索字符串" #: .\cookbook\forms.py:334 msgid "File ID" -msgstr "" +msgstr "文件編號" #: .\cookbook\forms.py:370 msgid "You must provide at least a recipe or a title." -msgstr "" +msgstr "你必須至少提供一份菜譜或一個標題。" #: .\cookbook\forms.py:383 msgid "You can list default users to share recipes with in the settings." -msgstr "" +msgstr "你可以在設置中列出默認用戶來分享菜譜。" #: .\cookbook\forms.py:384 #: .\cookbook\templates\forms\edit_internal_recipe.html:404 msgid "" "You can use markdown to format this field. See the docs here" -msgstr "" +msgstr "可以使用 Markdown 設置此字段格式。查看文檔" #: .\cookbook\forms.py:409 msgid "Maximum number of users for this space reached." -msgstr "" +msgstr "已達到該空間的最大用戶數。" #: .\cookbook\forms.py:415 msgid "Email address already taken!" -msgstr "" +msgstr "電子郵件地址已被註冊!" #: .\cookbook\forms.py:423 msgid "" "An email address is not required but if present the invite link will be send " "to the user." -msgstr "" +msgstr "電子郵件地址不是必需的,但如果存在,邀請鏈接將被發送給用戶。" #: .\cookbook\forms.py:438 msgid "Name already taken." -msgstr "" +msgstr "名字已被占用。" #: .\cookbook\forms.py:449 msgid "Accept Terms and Privacy" -msgstr "" +msgstr "接受條款及隱私政策" #: .\cookbook\helper\AllAuthCustomAdapter.py:30 msgid "" "In order to prevent spam, the requested email was not send. Please wait a " "few minutes and try again." -msgstr "" +msgstr "為了防止垃圾郵件,所要求的電子郵件沒有被發送。請等待幾分鐘後再試。" #: .\cookbook\helper\permission_helper.py:124 #: .\cookbook\helper\permission_helper.py:144 .\cookbook\views\views.py:147 msgid "You are not logged in and therefore cannot view this page!" -msgstr "" +msgstr "你还沒有登錄,因此不能查看這個頁面!" #: .\cookbook\helper\permission_helper.py:127 #: .\cookbook\helper\permission_helper.py:132 @@ -234,18 +240,18 @@ msgstr "" #: .\cookbook\views\views.py:158 .\cookbook\views\views.py:165 #: .\cookbook\views\views.py:253 msgid "You do not have the required permissions to view this page!" -msgstr "" +msgstr "你沒有必要的權限來查看這個頁面!" #: .\cookbook\helper\permission_helper.py:148 #: .\cookbook\helper\permission_helper.py:170 #: .\cookbook\helper\permission_helper.py:185 msgid "You cannot interact with this object as it is not owned by you!" -msgstr "" +msgstr "你不能與此對象交互,因為它不屬於你!" #: .\cookbook\helper\template_helper.py:60 #: .\cookbook\helper\template_helper.py:62 msgid "Could not parse template code." -msgstr "" +msgstr "無法解析模板代碼。" #: .\cookbook\integration\integration.py:102 #: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 @@ -258,40 +264,40 @@ msgstr "" #: .\cookbook\templates\url_import.html:604 .\cookbook\views\delete.py:60 #: .\cookbook\views\edit.py:199 msgid "Import" -msgstr "" +msgstr "導入" #: .\cookbook\integration\integration.py:162 msgid "" "Importer expected a .zip file. Did you choose the correct importer type for " "your data ?" -msgstr "" +msgstr "導入需要一個 .zip 文件。你是否為數據選擇了正確的導入器類型?" #: .\cookbook\integration\integration.py:165 msgid "" "An unexpected error occurred during the import. Please make sure you have " "uploaded a valid file." -msgstr "" +msgstr "在導入過程中發生了一個意外的錯誤。請確認你上傳的文件是否有效。" #: .\cookbook\integration\integration.py:169 msgid "The following recipes were ignored because they already existed:" -msgstr "" +msgstr "以下菜譜被忽略了,因為它們已經存在了:" #: .\cookbook\integration\integration.py:173 #, python-format msgid "Imported %s recipes." -msgstr "" +msgstr "導入了%s菜譜。" #: .\cookbook\integration\paprika.py:46 msgid "Notes" -msgstr "" +msgstr "說明" #: .\cookbook\integration\paprika.py:49 msgid "Nutritional Information" -msgstr "" +msgstr "營養信息" #: .\cookbook\integration\paprika.py:53 msgid "Source" -msgstr "" +msgstr "來源" #: .\cookbook\integration\safron.py:23 #: .\cookbook\templates\forms\edit_internal_recipe.html:79 @@ -299,101 +305,101 @@ msgstr "" #: .\cookbook\templates\url_import.html:224 #: .\cookbook\templates\url_import.html:455 msgid "Servings" -msgstr "" +msgstr "份量" #: .\cookbook\integration\safron.py:25 msgid "Waiting time" -msgstr "" +msgstr "等待時間" #: .\cookbook\integration\safron.py:27 #: .\cookbook\templates\forms\edit_internal_recipe.html:73 msgid "Preparation Time" -msgstr "" +msgstr "準備時間" #: .\cookbook\integration\safron.py:29 .\cookbook\templates\base.html:78 #: .\cookbook\templates\forms\ingredients.html:7 #: .\cookbook\templates\index.html:7 msgid "Cookbook" -msgstr "" +msgstr "菜譜" #: .\cookbook\integration\safron.py:31 msgid "Section" -msgstr "" +msgstr "部分" #: .\cookbook\migrations\0047_auto_20200602_1133.py:14 msgid "Breakfast" -msgstr "" +msgstr "早餐" #: .\cookbook\migrations\0047_auto_20200602_1133.py:19 msgid "Lunch" -msgstr "" +msgstr "午餐" #: .\cookbook\migrations\0047_auto_20200602_1133.py:24 msgid "Dinner" -msgstr "" +msgstr "晚餐" #: .\cookbook\migrations\0047_auto_20200602_1133.py:29 msgid "Other" -msgstr "" +msgstr "其他" #: .\cookbook\models.py:71 msgid "" "Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " "upload." -msgstr "" +msgstr "空間的最大文件存儲量,單位為 MB。0表示無限製,-1表示禁止上傳文件。" #: .\cookbook\models.py:121 .\cookbook\templates\search.html:7 #: .\cookbook\templates\shopping_list.html:52 msgid "Search" -msgstr "" +msgstr "搜索" #: .\cookbook\models.py:122 .\cookbook\templates\base.html:92 #: .\cookbook\templates\meal_plan.html:5 .\cookbook\views\delete.py:152 #: .\cookbook\views\edit.py:233 .\cookbook\views\new.py:201 msgid "Meal-Plan" -msgstr "" +msgstr "膳食計劃" #: .\cookbook\models.py:123 .\cookbook\templates\base.html:89 msgid "Books" -msgstr "" +msgstr "書籍" #: .\cookbook\models.py:131 msgid "Small" -msgstr "" +msgstr "小" #: .\cookbook\models.py:131 msgid "Large" -msgstr "" +msgstr "大" #: .\cookbook\models.py:131 .\cookbook\templates\generic\new_template.html:6 #: .\cookbook\templates\generic\new_template.html:14 #: .\cookbook\templates\meal_plan.html:323 msgid "New" -msgstr "" +msgstr "新" #: .\cookbook\models.py:340 #: .\cookbook\templates\forms\edit_internal_recipe.html:202 msgid "Text" -msgstr "" +msgstr "文本" #: .\cookbook\models.py:340 #: .\cookbook\templates\forms\edit_internal_recipe.html:203 msgid "Time" -msgstr "" +msgstr "時間" #: .\cookbook\models.py:340 #: .\cookbook\templates\forms\edit_internal_recipe.html:204 #: .\cookbook\templates\forms\edit_internal_recipe.html:218 msgid "File" -msgstr "" +msgstr "文件" #: .\cookbook\serializer.py:109 msgid "File uploads are not enabled for this Space." -msgstr "" +msgstr "未為此空間啟用文件上傳。" #: .\cookbook\serializer.py:117 msgid "You have reached your file upload limit." -msgstr "" +msgstr "你已達到文件上傳的限製。" #: .\cookbook\tables.py:35 .\cookbook\templates\books.html:36 #: .\cookbook\templates\generic\edit_template.html:6 @@ -403,7 +409,7 @@ msgstr "" #: .\cookbook\templates\shopping_list.html:33 #: .\cookbook\templates\space.html:84 msgid "Edit" -msgstr "" +msgstr "編輯" #: .\cookbook\tables.py:124 .\cookbook\tables.py:147 #: .\cookbook\templates\books.html:38 @@ -413,28 +419,28 @@ msgstr "" #: .\cookbook\templates\meal_plan.html:277 #: .\cookbook\templates\recipes_table.html:90 msgid "Delete" -msgstr "" +msgstr "刪除" #: .\cookbook\templates\404.html:5 msgid "404 Error" -msgstr "" +msgstr "404錯誤" #: .\cookbook\templates\404.html:18 msgid "The page you are looking for could not be found." -msgstr "" +msgstr "找不到你要找的頁面。" #: .\cookbook\templates\404.html:33 msgid "Take me Home" -msgstr "" +msgstr "回到主頁" #: .\cookbook\templates\404.html:35 msgid "Report a Bug" -msgstr "" +msgstr "報告一個錯誤" #: .\cookbook\templates\account\email.html:6 #: .\cookbook\templates\account\email.html:9 msgid "E-mail Addresses" -msgstr "" +msgstr "電子郵件地址" #: .\cookbook\templates\account\email.html:11 msgid "The following e-mail addresses are associated with your account:" @@ -1769,7 +1775,7 @@ msgstr "" #: .\cookbook\templates\space.html:100 msgid "user" -msgstr "" +msgstr "用戶" #: .\cookbook\templates\space.html:101 msgid "guest" diff --git a/cookbook/migrations/0186_automation_order_alter_automation_type.py b/cookbook/migrations/0186_automation_order_alter_automation_type.py new file mode 100644 index 000000000..42615ce4a --- /dev/null +++ b/cookbook/migrations/0186_automation_order_alter_automation_type.py @@ -0,0 +1,23 @@ +# Generated by Django 4.1.4 on 2023-01-03 21:38 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cookbook', '0185_food_plural_name_ingredient_always_use_plural_food_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='automation', + name='order', + field=models.IntegerField(default=1000), + ), + migrations.AlterField( + model_name='automation', + name='type', + field=models.CharField(choices=[('FOOD_ALIAS', 'Food Alias'), ('UNIT_ALIAS', 'Unit Alias'), ('KEYWORD_ALIAS', 'Keyword Alias'), ('DESCRIPTION_REPLACE', 'Description Replace'), ('INSTRUCTION_REPLACE', 'Instruction Replace')], max_length=128), + ), + ] diff --git a/cookbook/migrations/0187_alter_space_use_plural.py b/cookbook/migrations/0187_alter_space_use_plural.py new file mode 100644 index 000000000..c668f8844 --- /dev/null +++ b/cookbook/migrations/0187_alter_space_use_plural.py @@ -0,0 +1,18 @@ +# Generated by Django 4.1.4 on 2023-01-20 09:19 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cookbook', '0186_automation_order_alter_automation_type'), + ] + + operations = [ + migrations.AlterField( + model_name='space', + name='use_plural', + field=models.BooleanField(default=True), + ), + ] diff --git a/cookbook/migrations/0188_space_no_sharing_limit.py b/cookbook/migrations/0188_space_no_sharing_limit.py new file mode 100644 index 000000000..5f7dce192 --- /dev/null +++ b/cookbook/migrations/0188_space_no_sharing_limit.py @@ -0,0 +1,18 @@ +# Generated by Django 4.1.4 on 2023-02-12 16:44 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cookbook', '0187_alter_space_use_plural'), + ] + + operations = [ + migrations.AddField( + model_name='space', + name='no_sharing_limit', + field=models.BooleanField(default=False), + ), + ] diff --git a/cookbook/models.py b/cookbook/models.py index 2295266c1..1732750b9 100644 --- a/cookbook/models.py +++ b/cookbook/models.py @@ -260,8 +260,9 @@ class Space(ExportModelOperationsMixin('space'), models.Model): max_recipes = models.IntegerField(default=0) max_file_storage_mb = models.IntegerField(default=0, help_text=_('Maximum file storage for space in MB. 0 for unlimited, -1 to disable file upload.')) max_users = models.IntegerField(default=0) - use_plural = models.BooleanField(default=False) + use_plural = models.BooleanField(default=True) allow_sharing = models.BooleanField(default=True) + no_sharing_limit = models.BooleanField(default=False) demo = models.BooleanField(default=False) food_inherit = models.ManyToManyField(FoodInheritField, blank=True) show_facet_count = models.BooleanField(default=False) @@ -367,7 +368,7 @@ class UserPreference(models.Model, PermissionModelMixin): ) user = AutoOneToOneField(User, on_delete=models.CASCADE, primary_key=True) - image = models.ForeignKey("UserFile", on_delete=models.SET_NULL, null=True,blank=True, related_name='user_image') + image = models.ForeignKey("UserFile", on_delete=models.SET_NULL, null=True, blank=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) default_unit = models.CharField(max_length=32, default='g') @@ -680,7 +681,7 @@ class Ingredient(ExportModelOperationsMixin('ingredient'), models.Model, Permiss if self.always_use_plural_unit and self.unit.plural_name not in (None, "") and not self.no_amount: unit = self.unit.plural_name else: - if self.amount > 1 and self.unit.plural_name not in (None, "") and not self.no_amount: + if self.amount > 1 and self.unit is not None and self.unit.plural_name not in (None, "") and not self.no_amount: unit = self.unit.plural_name else: unit = str(self.unit) @@ -1223,9 +1224,12 @@ class Automation(ExportModelOperationsMixin('automations'), models.Model, Permis FOOD_ALIAS = 'FOOD_ALIAS' UNIT_ALIAS = 'UNIT_ALIAS' KEYWORD_ALIAS = 'KEYWORD_ALIAS' + DESCRIPTION_REPLACE = 'DESCRIPTION_REPLACE' + INSTRUCTION_REPLACE = 'INSTRUCTION_REPLACE' type = models.CharField(max_length=128, - choices=((FOOD_ALIAS, _('Food Alias')), (UNIT_ALIAS, _('Unit Alias')), (KEYWORD_ALIAS, _('Keyword Alias')),)) + choices=((FOOD_ALIAS, _('Food Alias')), (UNIT_ALIAS, _('Unit Alias')), (KEYWORD_ALIAS, _('Keyword Alias')), + (DESCRIPTION_REPLACE, _('Description Replace')), (INSTRUCTION_REPLACE, _('Instruction Replace')),)) name = models.CharField(max_length=128, default='') description = models.TextField(blank=True, null=True) @@ -1233,6 +1237,8 @@ class Automation(ExportModelOperationsMixin('automations'), models.Model, Permis param_2 = models.CharField(max_length=128, blank=True, null=True) param_3 = models.CharField(max_length=128, blank=True, null=True) + order = models.IntegerField(default=1000) + disabled = models.BooleanField(default=False) updated_at = models.DateTimeField(auto_now=True) diff --git a/cookbook/serializer.py b/cookbook/serializer.py index 0a799528a..44bc14223 100644 --- a/cookbook/serializer.py +++ b/cookbook/serializer.py @@ -432,9 +432,13 @@ class UnitSerializer(UniqueFieldsMixin, ExtendedRecipeMixin): def create(self, validated_data): name = validated_data.pop('name').strip() - plural_name = validated_data.pop('plural_name', None) - if plural_name: + + if plural_name := validated_data.pop('plural_name', None): plural_name = plural_name.strip() + + if unit := Unit.objects.filter(Q(name=name) | Q(plural_name=name)).first(): + return unit + space = validated_data.pop('space', self.context['request'].space) obj, created = Unit.objects.get_or_create(name=name, plural_name=plural_name, space=space, defaults=validated_data) return obj @@ -544,9 +548,13 @@ class FoodSerializer(UniqueFieldsMixin, WritableNestedModelSerializer, ExtendedR def create(self, validated_data): name = validated_data.pop('name').strip() - plural_name = validated_data.pop('plural_name', None) - if plural_name: + + if plural_name := validated_data.pop('plural_name', None): plural_name = plural_name.strip() + + if food := Food.objects.filter(Q(name=name) | Q(plural_name=name)).first(): + return food + space = validated_data.pop('space', self.context['request'].space) # supermarket category needs to be handled manually as food.get or create does not create nested serializers unlike a super.create of serializer if 'supermarket_category' in validated_data and validated_data['supermarket_category']: @@ -876,11 +884,11 @@ class ShoppingListRecipeSerializer(serializers.ModelSerializer): value = value.quantize( Decimal(1)) if value == value.to_integral() else value.normalize() # strips trailing zero return ( - obj.name - or getattr(obj.mealplan, 'title', None) - or (d := getattr(obj.mealplan, 'date', None)) and ': '.join([obj.mealplan.recipe.name, str(d)]) - or obj.recipe.name - ) + f' ({value:.2g})' + obj.name + or getattr(obj.mealplan, 'title', None) + or (d := getattr(obj.mealplan, 'date', None)) and ': '.join([obj.mealplan.recipe.name, str(d)]) + or obj.recipe.name + ) + f' ({value:.2g})' def update(self, instance, validated_data): # TODO remove once old shopping list @@ -1067,7 +1075,7 @@ class AutomationSerializer(serializers.ModelSerializer): class Meta: model = Automation fields = ( - 'id', 'type', 'name', 'description', 'param_1', 'param_2', 'param_3', 'disabled', 'created_by',) + 'id', 'type', 'name', 'description', 'param_1', 'param_2', 'param_3', 'order', 'disabled', 'created_by',) read_only_fields = ('created_by',) diff --git a/cookbook/static/css/app.min.css b/cookbook/static/css/app.min.css index 2167eb22d..f0b66ff49 100644 --- a/cookbook/static/css/app.min.css +++ b/cookbook/static/css/app.min.css @@ -2,6 +2,16 @@ height: 40px; } +.two-row-text { + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; /* number of lines to show */ + line-clamp: 2; + -webkit-box-orient: vertical; +} + + @media (max-width: 991.98px) { .menu-dropdown-text { font-size: 14px; diff --git a/cookbook/static/css/bootstrap-vue.min.css b/cookbook/static/css/bootstrap-vue.min.css index 05693a382..7fdb07589 100644 --- a/cookbook/static/css/bootstrap-vue.min.css +++ b/cookbook/static/css/bootstrap-vue.min.css @@ -1,4 +1,3 @@ @charset "UTF-8";/*! * BootstrapVue Custom CSS (https://bootstrap-vue.org) */.bv-no-focus-ring:focus{outline:0}@media (max-width:575.98px){.bv-d-xs-down-none{display:none!important}}@media (max-width:767.98px){.bv-d-sm-down-none{display:none!important}}@media (max-width:991.98px){.bv-d-md-down-none{display:none!important}}@media (max-width:1199.98px){.bv-d-lg-down-none{display:none!important}}.bv-d-xl-down-none{display:none!important}.form-control.focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control.focus.is-valid{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-control.focus.is-invalid{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.b-avatar{display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;flex-shrink:0;width:2.5rem;height:2.5rem;font-size:inherit;font-weight:400;line-height:1;max-width:100%;max-height:auto;text-align:center;overflow:visible;position:relative;transition:color .15s ease-in-out,background-color .15s ease-in-out,box-shadow .15s ease-in-out}.b-avatar:focus{outline:0}.b-avatar.btn,.b-avatar[href]{padding:0;border:0}.b-avatar.btn .b-avatar-img img,.b-avatar[href] .b-avatar-img img{transition:-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out;transition:transform .15s ease-in-out,-webkit-transform .15s ease-in-out}.b-avatar.btn:not(:disabled):not(.disabled),.b-avatar[href]:not(:disabled):not(.disabled){cursor:pointer}.b-avatar.btn:not(:disabled):not(.disabled):hover .b-avatar-img img,.b-avatar[href]:not(:disabled):not(.disabled):hover .b-avatar-img img{-webkit-transform:scale(1.15);transform:scale(1.15)}.b-avatar.disabled,.b-avatar:disabled,.b-avatar[disabled]{opacity:.65;pointer-events:none}.b-avatar .b-avatar-custom,.b-avatar .b-avatar-img,.b-avatar .b-avatar-text{border-radius:inherit;width:100%;height:100%;overflow:hidden;display:flex;justify-content:center;align-items:center;-webkit-mask-image:radial-gradient(white,#000);mask-image:radial-gradient(white,#000)}.b-avatar .b-avatar-text{text-transform:uppercase;white-space:nowrap}.b-avatar[href]{text-decoration:none}.b-avatar>.b-icon{width:60%;height:auto;max-width:100%}.b-avatar .b-avatar-img img{width:100%;height:100%;max-height:auto;border-radius:inherit;-o-object-fit:cover;object-fit:cover}.b-avatar .b-avatar-badge{position:absolute;min-height:1.5em;min-width:1.5em;padding:.25em;line-height:1;border-radius:10em;font-size:70%;font-weight:700;z-index:1}.b-avatar-sm{width:1.5rem;height:1.5rem}.b-avatar-sm .b-avatar-text{font-size:calc(.6rem)}.b-avatar-sm .b-avatar-badge{font-size:calc(.42rem)}.b-avatar-lg{width:3.5rem;height:3.5rem}.b-avatar-lg .b-avatar-text{font-size:calc(1.4rem)}.b-avatar-lg .b-avatar-badge{font-size:calc(.98rem)}.b-avatar-group .b-avatar-group-inner{display:flex;flex-wrap:wrap}.b-avatar-group .b-avatar{border:1px solid #dee2e6}.b-avatar-group .btn.b-avatar:hover:not(.disabled):not(disabled),.b-avatar-group a.b-avatar:hover:not(.disabled):not(disabled){z-index:1}.b-calendar{display:inline-flex}.b-calendar .b-calendar-inner{min-width:250px}.b-calendar .b-calendar-header,.b-calendar .b-calendar-nav{margin-bottom:.25rem}.b-calendar .b-calendar-nav .btn{padding:.25rem}.b-calendar output{padding:.25rem;font-size:80%}.b-calendar output.readonly{background-color:#e9ecef;opacity:1}.b-calendar .b-calendar-footer{margin-top:.5rem}.b-calendar .b-calendar-grid{padding:0;margin:0;overflow:hidden}.b-calendar .b-calendar-grid .row{flex-wrap:nowrap}.b-calendar .b-calendar-grid-caption{padding:.25rem}.b-calendar .b-calendar-grid-body .col[data-date] .btn{width:32px;height:32px;font-size:14px;line-height:1;margin:3px auto;padding:9px 0}.b-calendar .btn.disabled,.b-calendar .btn:disabled,.b-calendar .btn[aria-disabled=true]{cursor:default;pointer-events:none}.card-img-left{border-top-left-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-img-right{border-top-right-radius:calc(.25rem - 1px);border-bottom-right-radius:calc(.25rem - 1px)}.dropdown:not(.dropleft) .dropdown-toggle.dropdown-toggle-no-caret::after{display:none!important}.dropdown.dropleft .dropdown-toggle.dropdown-toggle-no-caret::before{display:none!important}.dropdown .dropdown-menu:focus{outline:0}.b-dropdown-form{display:inline-block;padding:.25rem 1.5rem;width:100%;clear:both;font-weight:400}.b-dropdown-form:focus{outline:1px dotted!important;outline:5px auto -webkit-focus-ring-color!important}.b-dropdown-form.disabled,.b-dropdown-form:disabled{outline:0!important;color:#6c757d;pointer-events:none}.b-dropdown-text{display:inline-block;padding:.25rem 1.5rem;margin-bottom:0;width:100%;clear:both;font-weight:lighter}.custom-checkbox.b-custom-control-lg,.input-group-lg .custom-checkbox{font-size:1.25rem;line-height:1.5;padding-left:1.875rem}.custom-checkbox.b-custom-control-lg .custom-control-label::before,.input-group-lg .custom-checkbox .custom-control-label::before{top:.3125rem;left:-1.875rem;width:1.25rem;height:1.25rem;border-radius:.3rem}.custom-checkbox.b-custom-control-lg .custom-control-label::after,.input-group-lg .custom-checkbox .custom-control-label::after{top:.3125rem;left:-1.875rem;width:1.25rem;height:1.25rem;background-size:50% 50%}.custom-checkbox.b-custom-control-sm,.input-group-sm .custom-checkbox{font-size:.875rem;line-height:1.5;padding-left:1.3125rem}.custom-checkbox.b-custom-control-sm .custom-control-label::before,.input-group-sm .custom-checkbox .custom-control-label::before{top:.21875rem;left:-1.3125rem;width:.875rem;height:.875rem;border-radius:.2rem}.custom-checkbox.b-custom-control-sm .custom-control-label::after,.input-group-sm .custom-checkbox .custom-control-label::after{top:.21875rem;left:-1.3125rem;width:.875rem;height:.875rem;background-size:50% 50%}.custom-switch.b-custom-control-lg,.input-group-lg .custom-switch{padding-left:2.8125rem}.custom-switch.b-custom-control-lg .custom-control-label,.input-group-lg .custom-switch .custom-control-label{font-size:1.25rem;line-height:1.5}.custom-switch.b-custom-control-lg .custom-control-label::before,.input-group-lg .custom-switch .custom-control-label::before{top:.3125rem;height:1.25rem;left:-2.8125rem;width:2.1875rem;border-radius:.625rem}.custom-switch.b-custom-control-lg .custom-control-label::after,.input-group-lg .custom-switch .custom-control-label::after{top:calc(.3125rem + 2px);left:calc(-2.8125rem + 2px);width:calc(1.25rem - 4px);height:calc(1.25rem - 4px);border-radius:.625rem;background-size:50% 50%}.custom-switch.b-custom-control-lg .custom-control-input:checked~.custom-control-label::after,.input-group-lg .custom-switch .custom-control-input:checked~.custom-control-label::after{-webkit-transform:translateX(.9375rem);transform:translateX(.9375rem)}.custom-switch.b-custom-control-sm,.input-group-sm .custom-switch{padding-left:1.96875rem}.custom-switch.b-custom-control-sm .custom-control-label,.input-group-sm .custom-switch .custom-control-label{font-size:.875rem;line-height:1.5}.custom-switch.b-custom-control-sm .custom-control-label::before,.input-group-sm .custom-switch .custom-control-label::before{top:.21875rem;left:-1.96875rem;width:1.53125rem;height:.875rem;border-radius:.4375rem}.custom-switch.b-custom-control-sm .custom-control-label::after,.input-group-sm .custom-switch .custom-control-label::after{top:calc(.21875rem + 2px);left:calc(-1.96875rem + 2px);width:calc(.875rem - 4px);height:calc(.875rem - 4px);border-radius:.4375rem;background-size:50% 50%}.custom-switch.b-custom-control-sm .custom-control-input:checked~.custom-control-label::after,.input-group-sm .custom-switch .custom-control-input:checked~.custom-control-label::after{-webkit-transform:translateX(.65625rem);transform:translateX(.65625rem)}.input-group>.input-group-append:last-child>.btn-group:not(:last-child):not(.dropdown-toggle)>.btn,.input-group>.input-group-append:not(:last-child)>.btn-group>.btn,.input-group>.input-group-prepend>.btn-group>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn-group>.btn,.input-group>.input-group-prepend:first-child>.btn-group:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.btn-group>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.b-form-btn-label-control.form-control{display:flex;align-items:stretch;height:auto;padding:0;background-image:none}.input-group .b-form-btn-label-control.form-control{padding:0}.b-form-btn-label-control.form-control[dir=rtl],[dir=rtl] .b-form-btn-label-control.form-control{flex-direction:row-reverse}.b-form-btn-label-control.form-control[dir=rtl]>label,[dir=rtl] .b-form-btn-label-control.form-control>label{text-align:right}.b-form-btn-label-control.form-control>.btn{line-height:1;font-size:inherit;box-shadow:none!important;border:0}.b-form-btn-label-control.form-control>.btn:disabled{pointer-events:none}.b-form-btn-label-control.form-control.is-valid>.btn{color:#28a745}.b-form-btn-label-control.form-control.is-invalid>.btn{color:#dc3545}.b-form-btn-label-control.form-control>.dropdown-menu{padding:.5rem}.b-form-btn-label-control.form-control>.form-control{height:auto;min-height:calc(calc(1.5em + .75rem + 2px) - 2px);padding-left:.25rem;margin:0;border:0;outline:0;background:0 0;word-break:break-word;font-size:inherit;white-space:normal;cursor:pointer}.b-form-btn-label-control.form-control>.form-control.form-control-sm{min-height:calc(calc(1.5em + .5rem + 2px) - 2px)}.b-form-btn-label-control.form-control>.form-control.form-control-lg{min-height:calc(calc(1.5em + 1rem + 2px) - 2px)}.input-group.input-group-sm .b-form-btn-label-control.form-control>.form-control{min-height:calc(calc(1.5em + .5rem + 2px) - 2px);padding-top:.25rem;padding-bottom:.25rem}.input-group.input-group-lg .b-form-btn-label-control.form-control>.form-control{min-height:calc(calc(1.5em + 1rem + 2px) - 2px);padding-top:.5rem;padding-bottom:.5rem}.b-form-btn-label-control.form-control[aria-disabled=true],.b-form-btn-label-control.form-control[aria-readonly=true]{background-color:#e9ecef;opacity:1}.b-form-btn-label-control.form-control[aria-disabled=true]{pointer-events:none}.b-form-btn-label-control.form-control[aria-disabled=true]>label{cursor:default}.b-form-btn-label-control.btn-group>.dropdown-menu{padding:.5rem}.custom-file-label{white-space:nowrap;overflow-x:hidden}.b-custom-control-lg .custom-file-input,.b-custom-control-lg .custom-file-label,.b-custom-control-lg.custom-file,.input-group-lg .custom-file-input,.input-group-lg .custom-file-label,.input-group-lg.custom-file{font-size:1.25rem;height:calc(1.5em + 1rem + 2px)}.b-custom-control-lg .custom-file-label,.b-custom-control-lg .custom-file-label:after,.input-group-lg .custom-file-label,.input-group-lg .custom-file-label:after{padding:.5rem 1rem;line-height:1.5}.b-custom-control-lg .custom-file-label,.input-group-lg .custom-file-label{border-radius:.3rem}.b-custom-control-lg .custom-file-label::after,.input-group-lg .custom-file-label::after{font-size:inherit;height:calc(1.5em + 1rem);border-radius:0 .3rem .3rem 0}.b-custom-control-sm .custom-file-input,.b-custom-control-sm .custom-file-label,.b-custom-control-sm.custom-file,.input-group-sm .custom-file-input,.input-group-sm .custom-file-label,.input-group-sm.custom-file{font-size:.875rem;height:calc(1.5em + .5rem + 2px)}.b-custom-control-sm .custom-file-label,.b-custom-control-sm .custom-file-label:after,.input-group-sm .custom-file-label,.input-group-sm .custom-file-label:after{padding:.25rem .5rem;line-height:1.5}.b-custom-control-sm .custom-file-label,.input-group-sm .custom-file-label{border-radius:.2rem}.b-custom-control-sm .custom-file-label::after,.input-group-sm .custom-file-label::after{font-size:inherit;height:calc(1.5em + .5rem);border-radius:0 .2rem .2rem 0}.form-control.is-invalid,.form-control.is-valid,.was-validated .form-control:invalid,.was-validated .form-control:valid{background-position:right calc(.375em + .1875rem) center}input[type=color].form-control{height:calc(1.5em + .75rem + 2px);padding:.125rem .25rem}.input-group-sm input[type=color].form-control,input[type=color].form-control.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.125rem .25rem}.input-group-lg input[type=color].form-control,input[type=color].form-control.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.125rem .25rem}input[type=color].form-control:disabled{background-color:#adb5bd;opacity:.65}.input-group>.custom-range{position:relative;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-range+.custom-file,.input-group>.custom-range+.custom-range,.input-group>.custom-range+.custom-select,.input-group>.custom-range+.form-control,.input-group>.custom-range+.form-control-plaintext{margin-left:-1px}.input-group>.custom-file+.custom-range,.input-group>.custom-range+.custom-range,.input-group>.custom-select+.custom-range,.input-group>.form-control+.custom-range,.input-group>.form-control-plaintext+.custom-range{margin-left:-1px}.input-group>.custom-range:focus{z-index:3}.input-group>.custom-range:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-range:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-range{height:calc(1.5em + .75rem + 2px);padding:0 .75rem;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;height:calc(1.5em + .75rem + 2px);border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.input-group>.custom-range{transition:none}}.input-group>.custom-range:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.input-group>.custom-range:disabled,.input-group>.custom-range[readonly]{background-color:#e9ecef}.input-group-lg>.custom-range{height:calc(1.5em + 1rem + 2px);padding:0 1rem;border-radius:.3rem}.input-group-sm>.custom-range{height:calc(1.5em + .5rem + 2px);padding:0 .5rem;border-radius:.2rem}.input-group .custom-range.is-valid,.was-validated .input-group .custom-range:valid{border-color:#28a745}.input-group .custom-range.is-valid:focus,.was-validated .input-group .custom-range:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-range.is-valid:focus::-webkit-slider-thumb,.was-validated .custom-range:valid:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem #9be7ac}.custom-range.is-valid:focus::-moz-range-thumb,.was-validated .custom-range:valid:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem #9be7ac}.custom-range.is-valid:focus::-ms-thumb,.was-validated .custom-range:valid:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem #9be7ac}.custom-range.is-valid::-webkit-slider-thumb,.was-validated .custom-range:valid::-webkit-slider-thumb{background-color:#28a745;background-image:none}.custom-range.is-valid::-webkit-slider-thumb:active,.was-validated .custom-range:valid::-webkit-slider-thumb:active{background-color:#9be7ac;background-image:none}.custom-range.is-valid::-webkit-slider-runnable-track,.was-validated .custom-range:valid::-webkit-slider-runnable-track{background-color:rgba(40,167,69,.35)}.custom-range.is-valid::-moz-range-thumb,.was-validated .custom-range:valid::-moz-range-thumb{background-color:#28a745;background-image:none}.custom-range.is-valid::-moz-range-thumb:active,.was-validated .custom-range:valid::-moz-range-thumb:active{background-color:#9be7ac;background-image:none}.custom-range.is-valid::-moz-range-track,.was-validated .custom-range:valid::-moz-range-track{background:rgba(40,167,69,.35)}.custom-range.is-valid~.valid-feedback,.custom-range.is-valid~.valid-tooltip,.was-validated .custom-range:valid~.valid-feedback,.was-validated .custom-range:valid~.valid-tooltip{display:block}.custom-range.is-valid::-ms-thumb,.was-validated .custom-range:valid::-ms-thumb{background-color:#28a745;background-image:none}.custom-range.is-valid::-ms-thumb:active,.was-validated .custom-range:valid::-ms-thumb:active{background-color:#9be7ac;background-image:none}.custom-range.is-valid::-ms-track-lower,.was-validated .custom-range:valid::-ms-track-lower{background:rgba(40,167,69,.35)}.custom-range.is-valid::-ms-track-upper,.was-validated .custom-range:valid::-ms-track-upper{background:rgba(40,167,69,.35)}.input-group .custom-range.is-invalid,.was-validated .input-group .custom-range:invalid{border-color:#dc3545}.input-group .custom-range.is-invalid:focus,.was-validated .input-group .custom-range:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-range.is-invalid:focus::-webkit-slider-thumb,.was-validated .custom-range:invalid:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem #f6cdd1}.custom-range.is-invalid:focus::-moz-range-thumb,.was-validated .custom-range:invalid:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem #f6cdd1}.custom-range.is-invalid:focus::-ms-thumb,.was-validated .custom-range:invalid:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem #f6cdd1}.custom-range.is-invalid::-webkit-slider-thumb,.was-validated .custom-range:invalid::-webkit-slider-thumb{background-color:#dc3545;background-image:none}.custom-range.is-invalid::-webkit-slider-thumb:active,.was-validated .custom-range:invalid::-webkit-slider-thumb:active{background-color:#f6cdd1;background-image:none}.custom-range.is-invalid::-webkit-slider-runnable-track,.was-validated .custom-range:invalid::-webkit-slider-runnable-track{background-color:rgba(220,53,69,.35)}.custom-range.is-invalid::-moz-range-thumb,.was-validated .custom-range:invalid::-moz-range-thumb{background-color:#dc3545;background-image:none}.custom-range.is-invalid::-moz-range-thumb:active,.was-validated .custom-range:invalid::-moz-range-thumb:active{background-color:#f6cdd1;background-image:none}.custom-range.is-invalid::-moz-range-track,.was-validated .custom-range:invalid::-moz-range-track{background:rgba(220,53,69,.35)}.custom-range.is-invalid~.invalid-feedback,.custom-range.is-invalid~.invalid-tooltip,.was-validated .custom-range:invalid~.invalid-feedback,.was-validated .custom-range:invalid~.invalid-tooltip{display:block}.custom-range.is-invalid::-ms-thumb,.was-validated .custom-range:invalid::-ms-thumb{background-color:#dc3545;background-image:none}.custom-range.is-invalid::-ms-thumb:active,.was-validated .custom-range:invalid::-ms-thumb:active{background-color:#f6cdd1;background-image:none}.custom-range.is-invalid::-ms-track-lower,.was-validated .custom-range:invalid::-ms-track-lower{background:rgba(220,53,69,.35)}.custom-range.is-invalid::-ms-track-upper,.was-validated .custom-range:invalid::-ms-track-upper{background:rgba(220,53,69,.35)}.custom-radio.b-custom-control-lg,.input-group-lg .custom-radio{font-size:1.25rem;line-height:1.5;padding-left:1.875rem}.custom-radio.b-custom-control-lg .custom-control-label::before,.input-group-lg .custom-radio .custom-control-label::before{top:.3125rem;left:-1.875rem;width:1.25rem;height:1.25rem;border-radius:50%}.custom-radio.b-custom-control-lg .custom-control-label::after,.input-group-lg .custom-radio .custom-control-label::after{top:.3125rem;left:-1.875rem;width:1.25rem;height:1.25rem;background:no-repeat 50%/50% 50%}.custom-radio.b-custom-control-sm,.input-group-sm .custom-radio{font-size:.875rem;line-height:1.5;padding-left:1.3125rem}.custom-radio.b-custom-control-sm .custom-control-label::before,.input-group-sm .custom-radio .custom-control-label::before{top:.21875rem;left:-1.3125rem;width:.875rem;height:.875rem;border-radius:50%}.custom-radio.b-custom-control-sm .custom-control-label::after,.input-group-sm .custom-radio .custom-control-label::after{top:.21875rem;left:-1.3125rem;width:.875rem;height:.875rem;background:no-repeat 50%/50% 50%}.b-rating{text-align:center}.b-rating.d-inline-flex{width:auto}.b-rating .b-rating-star,.b-rating .b-rating-value{padding:0 .25em}.b-rating .b-rating-value{min-width:2.5em}.b-rating .b-rating-star{display:inline-flex;justify-content:center;outline:0}.b-rating .b-rating-star .b-rating-icon{display:inline-flex;transition:all .15s ease-in-out}.b-rating.disabled,.b-rating:disabled{background-color:#e9ecef;color:#6c757d}.b-rating:not(.disabled):not(.readonly) .b-rating-star{cursor:pointer}.b-rating:not(.disabled):not(.readonly) .b-rating-star:hover .b-rating-icon,.b-rating:not(.disabled):not(.readonly):focus:not(:hover) .b-rating-star.focused .b-rating-icon{-webkit-transform:scale(1.5);transform:scale(1.5)}.b-rating[dir=rtl] .b-rating-star-half{-webkit-transform:scale(-1,1);transform:scale(-1,1)}.b-form-spinbutton{text-align:center;overflow:hidden;background-image:none;padding:0}.b-form-spinbutton[dir=rtl]:not(.flex-column),[dir=rtl] .b-form-spinbutton:not(.flex-column){flex-direction:row-reverse}.b-form-spinbutton output{font-size:inherit;outline:0;border:0;background-color:transparent;width:auto;margin:0;padding:0 .25rem}.b-form-spinbutton output>bdi,.b-form-spinbutton output>div{display:block;min-width:2.25em;height:1.5em}.b-form-spinbutton.flex-column{height:auto;width:auto}.b-form-spinbutton.flex-column output{margin:0 .25rem;padding:.25rem 0}.b-form-spinbutton:not(.d-inline-flex):not(.flex-column){output-width:100%}.b-form-spinbutton.d-inline-flex:not(.flex-column){width:auto}.b-form-spinbutton .btn{line-height:1;box-shadow:none!important}.b-form-spinbutton .btn:disabled{pointer-events:none}.b-form-spinbutton .btn:hover:not(:disabled)>div>.b-icon{-webkit-transform:scale(1.25);transform:scale(1.25)}.b-form-spinbutton.disabled,.b-form-spinbutton.readonly{background-color:#e9ecef}.b-form-spinbutton.disabled{pointer-events:none}.b-form-tags .b-form-tags-list{margin-top:-.25rem}.b-form-tags .b-form-tags-list .b-form-tag,.b-form-tags .b-form-tags-list .b-from-tags-field{margin-top:.25rem}.b-form-tags.focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.b-form-tags.focus.is-valid{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.b-form-tags.focus.is-invalid{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.b-form-tags.disabled{background-color:#e9ecef}.b-form-tag{font-size:75%;font-weight:400;line-height:1.5;margin-right:.25rem}.b-form-tag.disabled{opacity:.75}.b-form-tag>button.b-form-tag-remove{color:inherit;font-size:125%;line-height:1;float:none;margin-left:.25rem}.form-control-sm .b-form-tag{line-height:1.5}.form-control-lg .b-form-tag{line-height:1.5}.media-aside{display:flex;margin-right:1rem}.media-aside-right{margin-right:0;margin-left:1rem}.modal-backdrop{opacity:.5}.b-pagination-pills .page-item .page-link{border-radius:50rem!important;margin-left:.25rem;line-height:1}.b-pagination-pills .page-item:first-child .page-link{margin-left:0}.popover.b-popover{display:block;opacity:1;outline:0}.popover.b-popover.fade:not(.show){opacity:0}.popover.b-popover.show{opacity:1}.b-popover-primary.popover{background-color:#cce5ff;border-color:#b8daff}.b-popover-primary.bs-popover-auto[x-placement^=top]>.arrow::before,.b-popover-primary.bs-popover-top>.arrow::before{border-top-color:#b8daff}.b-popover-primary.bs-popover-auto[x-placement^=top]>.arrow::after,.b-popover-primary.bs-popover-top>.arrow::after{border-top-color:#cce5ff}.b-popover-primary.bs-popover-auto[x-placement^=right]>.arrow::before,.b-popover-primary.bs-popover-right>.arrow::before{border-right-color:#b8daff}.b-popover-primary.bs-popover-auto[x-placement^=right]>.arrow::after,.b-popover-primary.bs-popover-right>.arrow::after{border-right-color:#cce5ff}.b-popover-primary.bs-popover-auto[x-placement^=bottom]>.arrow::before,.b-popover-primary.bs-popover-bottom>.arrow::before{border-bottom-color:#b8daff}.b-popover-primary.bs-popover-auto[x-placement^=bottom]>.arrow::after,.b-popover-primary.bs-popover-bottom>.arrow::after{border-bottom-color:#bdddff}.b-popover-primary.bs-popover-auto[x-placement^=bottom] .popover-header::before,.b-popover-primary.bs-popover-bottom .popover-header::before{border-bottom-color:#bdddff}.b-popover-primary.bs-popover-auto[x-placement^=left]>.arrow::before,.b-popover-primary.bs-popover-left>.arrow::before{border-left-color:#b8daff}.b-popover-primary.bs-popover-auto[x-placement^=left]>.arrow::after,.b-popover-primary.bs-popover-left>.arrow::after{border-left-color:#cce5ff}.b-popover-primary .popover-header{color:#212529;background-color:#bdddff;border-bottom-color:#a3d0ff}.b-popover-primary .popover-body{color:#004085}.b-popover-secondary.popover{background-color:#e2e3e5;border-color:#d6d8db}.b-popover-secondary.bs-popover-auto[x-placement^=top]>.arrow::before,.b-popover-secondary.bs-popover-top>.arrow::before{border-top-color:#d6d8db}.b-popover-secondary.bs-popover-auto[x-placement^=top]>.arrow::after,.b-popover-secondary.bs-popover-top>.arrow::after{border-top-color:#e2e3e5}.b-popover-secondary.bs-popover-auto[x-placement^=right]>.arrow::before,.b-popover-secondary.bs-popover-right>.arrow::before{border-right-color:#d6d8db}.b-popover-secondary.bs-popover-auto[x-placement^=right]>.arrow::after,.b-popover-secondary.bs-popover-right>.arrow::after{border-right-color:#e2e3e5}.b-popover-secondary.bs-popover-auto[x-placement^=bottom]>.arrow::before,.b-popover-secondary.bs-popover-bottom>.arrow::before{border-bottom-color:#d6d8db}.b-popover-secondary.bs-popover-auto[x-placement^=bottom]>.arrow::after,.b-popover-secondary.bs-popover-bottom>.arrow::after{border-bottom-color:#dadbde}.b-popover-secondary.bs-popover-auto[x-placement^=bottom] .popover-header::before,.b-popover-secondary.bs-popover-bottom .popover-header::before{border-bottom-color:#dadbde}.b-popover-secondary.bs-popover-auto[x-placement^=left]>.arrow::before,.b-popover-secondary.bs-popover-left>.arrow::before{border-left-color:#d6d8db}.b-popover-secondary.bs-popover-auto[x-placement^=left]>.arrow::after,.b-popover-secondary.bs-popover-left>.arrow::after{border-left-color:#e2e3e5}.b-popover-secondary .popover-header{color:#212529;background-color:#dadbde;border-bottom-color:#ccced2}.b-popover-secondary .popover-body{color:#383d41}.b-popover-success.popover{background-color:#d4edda;border-color:#c3e6cb}.b-popover-success.bs-popover-auto[x-placement^=top]>.arrow::before,.b-popover-success.bs-popover-top>.arrow::before{border-top-color:#c3e6cb}.b-popover-success.bs-popover-auto[x-placement^=top]>.arrow::after,.b-popover-success.bs-popover-top>.arrow::after{border-top-color:#d4edda}.b-popover-success.bs-popover-auto[x-placement^=right]>.arrow::before,.b-popover-success.bs-popover-right>.arrow::before{border-right-color:#c3e6cb}.b-popover-success.bs-popover-auto[x-placement^=right]>.arrow::after,.b-popover-success.bs-popover-right>.arrow::after{border-right-color:#d4edda}.b-popover-success.bs-popover-auto[x-placement^=bottom]>.arrow::before,.b-popover-success.bs-popover-bottom>.arrow::before{border-bottom-color:#c3e6cb}.b-popover-success.bs-popover-auto[x-placement^=bottom]>.arrow::after,.b-popover-success.bs-popover-bottom>.arrow::after{border-bottom-color:#c9e8d1}.b-popover-success.bs-popover-auto[x-placement^=bottom] .popover-header::before,.b-popover-success.bs-popover-bottom .popover-header::before{border-bottom-color:#c9e8d1}.b-popover-success.bs-popover-auto[x-placement^=left]>.arrow::before,.b-popover-success.bs-popover-left>.arrow::before{border-left-color:#c3e6cb}.b-popover-success.bs-popover-auto[x-placement^=left]>.arrow::after,.b-popover-success.bs-popover-left>.arrow::after{border-left-color:#d4edda}.b-popover-success .popover-header{color:#212529;background-color:#c9e8d1;border-bottom-color:#b7e1c1}.b-popover-success .popover-body{color:#155724}.b-popover-info.popover{background-color:#d1ecf1;border-color:#bee5eb}.b-popover-info.bs-popover-auto[x-placement^=top]>.arrow::before,.b-popover-info.bs-popover-top>.arrow::before{border-top-color:#bee5eb}.b-popover-info.bs-popover-auto[x-placement^=top]>.arrow::after,.b-popover-info.bs-popover-top>.arrow::after{border-top-color:#d1ecf1}.b-popover-info.bs-popover-auto[x-placement^=right]>.arrow::before,.b-popover-info.bs-popover-right>.arrow::before{border-right-color:#bee5eb}.b-popover-info.bs-popover-auto[x-placement^=right]>.arrow::after,.b-popover-info.bs-popover-right>.arrow::after{border-right-color:#d1ecf1}.b-popover-info.bs-popover-auto[x-placement^=bottom]>.arrow::before,.b-popover-info.bs-popover-bottom>.arrow::before{border-bottom-color:#bee5eb}.b-popover-info.bs-popover-auto[x-placement^=bottom]>.arrow::after,.b-popover-info.bs-popover-bottom>.arrow::after{border-bottom-color:#c5e7ed}.b-popover-info.bs-popover-auto[x-placement^=bottom] .popover-header::before,.b-popover-info.bs-popover-bottom .popover-header::before{border-bottom-color:#c5e7ed}.b-popover-info.bs-popover-auto[x-placement^=left]>.arrow::before,.b-popover-info.bs-popover-left>.arrow::before{border-left-color:#bee5eb}.b-popover-info.bs-popover-auto[x-placement^=left]>.arrow::after,.b-popover-info.bs-popover-left>.arrow::after{border-left-color:#d1ecf1}.b-popover-info .popover-header{color:#212529;background-color:#c5e7ed;border-bottom-color:#b2dfe7}.b-popover-info .popover-body{color:#0c5460}.b-popover-warning.popover{background-color:#fff3cd;border-color:#ffeeba}.b-popover-warning.bs-popover-auto[x-placement^=top]>.arrow::before,.b-popover-warning.bs-popover-top>.arrow::before{border-top-color:#ffeeba}.b-popover-warning.bs-popover-auto[x-placement^=top]>.arrow::after,.b-popover-warning.bs-popover-top>.arrow::after{border-top-color:#fff3cd}.b-popover-warning.bs-popover-auto[x-placement^=right]>.arrow::before,.b-popover-warning.bs-popover-right>.arrow::before{border-right-color:#ffeeba}.b-popover-warning.bs-popover-auto[x-placement^=right]>.arrow::after,.b-popover-warning.bs-popover-right>.arrow::after{border-right-color:#fff3cd}.b-popover-warning.bs-popover-auto[x-placement^=bottom]>.arrow::before,.b-popover-warning.bs-popover-bottom>.arrow::before{border-bottom-color:#ffeeba}.b-popover-warning.bs-popover-auto[x-placement^=bottom]>.arrow::after,.b-popover-warning.bs-popover-bottom>.arrow::after{border-bottom-color:#ffefbe}.b-popover-warning.bs-popover-auto[x-placement^=bottom] .popover-header::before,.b-popover-warning.bs-popover-bottom .popover-header::before{border-bottom-color:#ffefbe}.b-popover-warning.bs-popover-auto[x-placement^=left]>.arrow::before,.b-popover-warning.bs-popover-left>.arrow::before{border-left-color:#ffeeba}.b-popover-warning.bs-popover-auto[x-placement^=left]>.arrow::after,.b-popover-warning.bs-popover-left>.arrow::after{border-left-color:#fff3cd}.b-popover-warning .popover-header{color:#212529;background-color:#ffefbe;border-bottom-color:#ffe9a4}.b-popover-warning .popover-body{color:#856404}.b-popover-danger.popover{background-color:#f8d7da;border-color:#f5c6cb}.b-popover-danger.bs-popover-auto[x-placement^=top]>.arrow::before,.b-popover-danger.bs-popover-top>.arrow::before{border-top-color:#f5c6cb}.b-popover-danger.bs-popover-auto[x-placement^=top]>.arrow::after,.b-popover-danger.bs-popover-top>.arrow::after{border-top-color:#f8d7da}.b-popover-danger.bs-popover-auto[x-placement^=right]>.arrow::before,.b-popover-danger.bs-popover-right>.arrow::before{border-right-color:#f5c6cb}.b-popover-danger.bs-popover-auto[x-placement^=right]>.arrow::after,.b-popover-danger.bs-popover-right>.arrow::after{border-right-color:#f8d7da}.b-popover-danger.bs-popover-auto[x-placement^=bottom]>.arrow::before,.b-popover-danger.bs-popover-bottom>.arrow::before{border-bottom-color:#f5c6cb}.b-popover-danger.bs-popover-auto[x-placement^=bottom]>.arrow::after,.b-popover-danger.bs-popover-bottom>.arrow::after{border-bottom-color:#f6cace}.b-popover-danger.bs-popover-auto[x-placement^=bottom] .popover-header::before,.b-popover-danger.bs-popover-bottom .popover-header::before{border-bottom-color:#f6cace}.b-popover-danger.bs-popover-auto[x-placement^=left]>.arrow::before,.b-popover-danger.bs-popover-left>.arrow::before{border-left-color:#f5c6cb}.b-popover-danger.bs-popover-auto[x-placement^=left]>.arrow::after,.b-popover-danger.bs-popover-left>.arrow::after{border-left-color:#f8d7da}.b-popover-danger .popover-header{color:#212529;background-color:#f6cace;border-bottom-color:#f2b4ba}.b-popover-danger .popover-body{color:#721c24}.b-popover-light.popover{background-color:#fefefe;border-color:#fdfdfe}.b-popover-light.bs-popover-auto[x-placement^=top]>.arrow::before,.b-popover-light.bs-popover-top>.arrow::before{border-top-color:#fdfdfe}.b-popover-light.bs-popover-auto[x-placement^=top]>.arrow::after,.b-popover-light.bs-popover-top>.arrow::after{border-top-color:#fefefe}.b-popover-light.bs-popover-auto[x-placement^=right]>.arrow::before,.b-popover-light.bs-popover-right>.arrow::before{border-right-color:#fdfdfe}.b-popover-light.bs-popover-auto[x-placement^=right]>.arrow::after,.b-popover-light.bs-popover-right>.arrow::after{border-right-color:#fefefe}.b-popover-light.bs-popover-auto[x-placement^=bottom]>.arrow::before,.b-popover-light.bs-popover-bottom>.arrow::before{border-bottom-color:#fdfdfe}.b-popover-light.bs-popover-auto[x-placement^=bottom]>.arrow::after,.b-popover-light.bs-popover-bottom>.arrow::after{border-bottom-color:#f6f6f6}.b-popover-light.bs-popover-auto[x-placement^=bottom] .popover-header::before,.b-popover-light.bs-popover-bottom .popover-header::before{border-bottom-color:#f6f6f6}.b-popover-light.bs-popover-auto[x-placement^=left]>.arrow::before,.b-popover-light.bs-popover-left>.arrow::before{border-left-color:#fdfdfe}.b-popover-light.bs-popover-auto[x-placement^=left]>.arrow::after,.b-popover-light.bs-popover-left>.arrow::after{border-left-color:#fefefe}.b-popover-light .popover-header{color:#212529;background-color:#f6f6f6;border-bottom-color:#eaeaea}.b-popover-light .popover-body{color:#818182}.b-popover-dark.popover{background-color:#d6d8d9;border-color:#c6c8ca}.b-popover-dark.bs-popover-auto[x-placement^=top]>.arrow::before,.b-popover-dark.bs-popover-top>.arrow::before{border-top-color:#c6c8ca}.b-popover-dark.bs-popover-auto[x-placement^=top]>.arrow::after,.b-popover-dark.bs-popover-top>.arrow::after{border-top-color:#d6d8d9}.b-popover-dark.bs-popover-auto[x-placement^=right]>.arrow::before,.b-popover-dark.bs-popover-right>.arrow::before{border-right-color:#c6c8ca}.b-popover-dark.bs-popover-auto[x-placement^=right]>.arrow::after,.b-popover-dark.bs-popover-right>.arrow::after{border-right-color:#d6d8d9}.b-popover-dark.bs-popover-auto[x-placement^=bottom]>.arrow::before,.b-popover-dark.bs-popover-bottom>.arrow::before{border-bottom-color:#c6c8ca}.b-popover-dark.bs-popover-auto[x-placement^=bottom]>.arrow::after,.b-popover-dark.bs-popover-bottom>.arrow::after{border-bottom-color:#ced0d2}.b-popover-dark.bs-popover-auto[x-placement^=bottom] .popover-header::before,.b-popover-dark.bs-popover-bottom .popover-header::before{border-bottom-color:#ced0d2}.b-popover-dark.bs-popover-auto[x-placement^=left]>.arrow::before,.b-popover-dark.bs-popover-left>.arrow::before{border-left-color:#c6c8ca}.b-popover-dark.bs-popover-auto[x-placement^=left]>.arrow::after,.b-popover-dark.bs-popover-left>.arrow::after{border-left-color:#d6d8d9}.b-popover-dark .popover-header{color:#212529;background-color:#ced0d2;border-bottom-color:#c1c4c5}.b-popover-dark .popover-body{color:#1b1e21}.b-sidebar-outer{position:fixed;top:0;left:0;right:0;height:0;overflow:visible;z-index:calc(1030 + 5)}.b-sidebar-backdrop{position:fixed;top:0;left:0;z-index:-1;width:100vw;height:100vh;opacity:.6}.b-sidebar{display:flex;flex-direction:column;position:fixed;top:0;width:320px;max-width:100%;height:100vh;max-height:100%;margin:0;outline:0;-webkit-transform:translateX(0);transform:translateX(0)}.b-sidebar.slide{transition:-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out;transition:transform .3s ease-in-out,-webkit-transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.b-sidebar.slide{transition:none}}.b-sidebar:not(.b-sidebar-right){left:0;right:auto}.b-sidebar:not(.b-sidebar-right).slide:not(.show){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.b-sidebar:not(.b-sidebar-right)>.b-sidebar-header .close{margin-left:auto}.b-sidebar.b-sidebar-right{left:auto;right:0}.b-sidebar.b-sidebar-right.slide:not(.show){-webkit-transform:translateX(100%);transform:translateX(100%)}.b-sidebar.b-sidebar-right>.b-sidebar-header .close{margin-right:auto}.b-sidebar>.b-sidebar-header{font-size:1.5rem;padding:.5rem 1rem;display:flex;flex-direction:row;flex-grow:0;align-items:center}[dir=rtl] .b-sidebar>.b-sidebar-header{flex-direction:row-reverse}.b-sidebar>.b-sidebar-header .close{float:none;font-size:1.5rem}.b-sidebar>.b-sidebar-body{flex-grow:1;height:100%;overflow-y:auto}.b-sidebar>.b-sidebar-footer{flex-grow:0}.b-skeleton-wrapper{cursor:wait}.b-skeleton{position:relative;overflow:hidden;background-color:rgba(0,0,0,.12);cursor:wait;-webkit-mask-image:radial-gradient(white,#000);mask-image:radial-gradient(white,#000)}.b-skeleton::before{content:" "}.b-skeleton-text{height:1rem;margin-bottom:.25rem;border-radius:.25rem}.b-skeleton-button{width:75px;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem}.b-skeleton-avatar{width:2.5em;height:2.5em;border-radius:50%}.b-skeleton-input{height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;line-height:1.5;border:#ced4da solid 1px;border-radius:.25rem}.b-skeleton-icon-wrapper svg{color:rgba(0,0,0,.12)}.b-skeleton-img{height:100%;width:100%}.b-skeleton-animate-wave::after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:0;background:linear-gradient(90deg,transparent,rgba(255,255,255,.4),transparent);-webkit-animation:b-skeleton-animate-wave 1.75s linear infinite;animation:b-skeleton-animate-wave 1.75s linear infinite}@media (prefers-reduced-motion:reduce){.b-skeleton-animate-wave::after{background:0 0;-webkit-animation:none;animation:none}}@-webkit-keyframes b-skeleton-animate-wave{from{-webkit-transform:translateX(-100%);transform:translateX(-100%)}to{-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes b-skeleton-animate-wave{from{-webkit-transform:translateX(-100%);transform:translateX(-100%)}to{-webkit-transform:translateX(100%);transform:translateX(100%)}}.b-skeleton-animate-fade{-webkit-animation:b-skeleton-animate-fade 875ms ease-in-out alternate infinite;animation:b-skeleton-animate-fade 875ms ease-in-out alternate infinite}@media (prefers-reduced-motion:reduce){.b-skeleton-animate-fade{-webkit-animation:none;animation:none}}@-webkit-keyframes b-skeleton-animate-fade{0%{opacity:1}100%{opacity:.4}}@keyframes b-skeleton-animate-fade{0%{opacity:1}100%{opacity:.4}}.b-skeleton-animate-throb{-webkit-animation:b-skeleton-animate-throb 875ms ease-in alternate infinite;animation:b-skeleton-animate-throb 875ms ease-in alternate infinite}@media (prefers-reduced-motion:reduce){.b-skeleton-animate-throb{-webkit-animation:none;animation:none}}@-webkit-keyframes b-skeleton-animate-throb{0%{-webkit-transform:scale(1);transform:scale(1)}100%{-webkit-transform:scale(.975);transform:scale(.975)}}@keyframes b-skeleton-animate-throb{0%{-webkit-transform:scale(1);transform:scale(1)}100%{-webkit-transform:scale(.975);transform:scale(.975)}}.table.b-table.b-table-fixed{table-layout:fixed}.table.b-table.b-table-no-border-collapse{border-collapse:separate;border-spacing:0}.table.b-table[aria-busy=true]{opacity:.55}.table.b-table>tbody>tr.b-table-details>td{border-top:none!important}.table.b-table>caption{caption-side:bottom}.table.b-table.b-table-caption-top>caption{caption-side:top!important}.table.b-table>tbody>.table-active,.table.b-table>tbody>.table-active>td,.table.b-table>tbody>.table-active>th{background-color:rgba(0,0,0,.075)}.table.b-table.table-hover>tbody>tr.table-active:hover td,.table.b-table.table-hover>tbody>tr.table-active:hover th{color:#212529;background-image:linear-gradient(rgba(0,0,0,.075),rgba(0,0,0,.075));background-repeat:no-repeat}.table.b-table>tbody>.bg-active,.table.b-table>tbody>.bg-active>td,.table.b-table>tbody>.bg-active>th{background-color:rgba(255,255,255,.075)!important}.table.b-table.table-hover.table-dark>tbody>tr.bg-active:hover td,.table.b-table.table-hover.table-dark>tbody>tr.bg-active:hover th{color:#fff;background-image:linear-gradient(rgba(255,255,255,.075),rgba(255,255,255,.075));background-repeat:no-repeat}.b-table-sticky-header,.table-responsive,[class*=table-responsive-]{margin-bottom:1rem}.b-table-sticky-header>.table,.table-responsive>.table,[class*=table-responsive-]>.table{margin-bottom:0}.b-table-sticky-header{overflow-y:auto;max-height:300px}@media print{.b-table-sticky-header{overflow-y:visible!important;max-height:none!important}}@supports ((position:-webkit-sticky) or (position:sticky)){.b-table-sticky-header>.table.b-table>thead>tr>th{position:-webkit-sticky;position:sticky;top:0;z-index:2}.b-table-sticky-header>.table.b-table>tbody>tr>.b-table-sticky-column,.b-table-sticky-header>.table.b-table>tfoot>tr>.b-table-sticky-column,.b-table-sticky-header>.table.b-table>thead>tr>.b-table-sticky-column,.table-responsive>.table.b-table>tbody>tr>.b-table-sticky-column,.table-responsive>.table.b-table>tfoot>tr>.b-table-sticky-column,.table-responsive>.table.b-table>thead>tr>.b-table-sticky-column,[class*=table-responsive-]>.table.b-table>tbody>tr>.b-table-sticky-column,[class*=table-responsive-]>.table.b-table>tfoot>tr>.b-table-sticky-column,[class*=table-responsive-]>.table.b-table>thead>tr>.b-table-sticky-column{position:-webkit-sticky;position:sticky;left:0}.b-table-sticky-header>.table.b-table>thead>tr>.b-table-sticky-column,.table-responsive>.table.b-table>thead>tr>.b-table-sticky-column,[class*=table-responsive-]>.table.b-table>thead>tr>.b-table-sticky-column{z-index:5}.b-table-sticky-header>.table.b-table>tbody>tr>.b-table-sticky-column,.b-table-sticky-header>.table.b-table>tfoot>tr>.b-table-sticky-column,.table-responsive>.table.b-table>tbody>tr>.b-table-sticky-column,.table-responsive>.table.b-table>tfoot>tr>.b-table-sticky-column,[class*=table-responsive-]>.table.b-table>tbody>tr>.b-table-sticky-column,[class*=table-responsive-]>.table.b-table>tfoot>tr>.b-table-sticky-column{z-index:2}.table.b-table>tbody>tr>.table-b-table-default,.table.b-table>tfoot>tr>.table-b-table-default,.table.b-table>thead>tr>.table-b-table-default{color:#212529;background-color:#fff}.table.b-table.table-dark>tbody>tr>.bg-b-table-default,.table.b-table.table-dark>tfoot>tr>.bg-b-table-default,.table.b-table.table-dark>thead>tr>.bg-b-table-default{color:#fff;background-color:#343a40}.table.b-table.table-striped>tbody>tr:nth-of-type(odd)>.table-b-table-default{background-image:linear-gradient(rgba(0,0,0,.05),rgba(0,0,0,.05));background-repeat:no-repeat}.table.b-table.table-striped.table-dark>tbody>tr:nth-of-type(odd)>.bg-b-table-default{background-image:linear-gradient(rgba(255,255,255,.05),rgba(255,255,255,.05));background-repeat:no-repeat}.table.b-table.table-hover>tbody>tr:hover>.table-b-table-default{color:#212529;background-image:linear-gradient(rgba(0,0,0,.075),rgba(0,0,0,.075));background-repeat:no-repeat}.table.b-table.table-hover.table-dark>tbody>tr:hover>.bg-b-table-default{color:#fff;background-image:linear-gradient(rgba(255,255,255,.075),rgba(255,255,255,.075));background-repeat:no-repeat}}.table.b-table>tfoot>tr>[aria-sort],.table.b-table>thead>tr>[aria-sort]{cursor:pointer;background-image:none;background-repeat:no-repeat;background-size:.65em 1em}.table.b-table>tfoot>tr>[aria-sort]:not(.b-table-sort-icon-left),.table.b-table>thead>tr>[aria-sort]:not(.b-table-sort-icon-left){background-position:right calc(.75rem / 2) center;padding-right:calc(.75rem + .65em)}.table.b-table>tfoot>tr>[aria-sort].b-table-sort-icon-left,.table.b-table>thead>tr>[aria-sort].b-table-sort-icon-left{background-position:left calc(.75rem / 2) center;padding-left:calc(.75rem + .65em)}.table.b-table>tfoot>tr>[aria-sort=none],.table.b-table>thead>tr>[aria-sort=none]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='101' height='101' view-box='0 0 101 101' preserveAspectRatio='none'%3e%3cpath fill='black' opacity='.3' d='M51 1l25 23 24 22H1l25-22zM51 101l25-23 24-22H1l25 22z'/%3e%3c/svg%3e")}.table.b-table>tfoot>tr>[aria-sort=ascending],.table.b-table>thead>tr>[aria-sort=ascending]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='101' height='101' view-box='0 0 101 101' preserveAspectRatio='none'%3e%3cpath fill='black' d='M51 1l25 23 24 22H1l25-22z'/%3e%3cpath fill='black' opacity='.3' d='M51 101l25-23 24-22H1l25 22z'/%3e%3c/svg%3e")}.table.b-table>tfoot>tr>[aria-sort=descending],.table.b-table>thead>tr>[aria-sort=descending]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='101' height='101' view-box='0 0 101 101' preserveAspectRatio='none'%3e%3cpath fill='black' opacity='.3' d='M51 1l25 23 24 22H1l25-22z'/%3e%3cpath fill='black' d='M51 101l25-23 24-22H1l25 22z'/%3e%3c/svg%3e")}.table.b-table.table-dark>tfoot>tr>[aria-sort=none],.table.b-table.table-dark>thead>tr>[aria-sort=none],.table.b-table>.thead-dark>tr>[aria-sort=none]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='101' height='101' view-box='0 0 101 101' preserveAspectRatio='none'%3e%3cpath fill='white' opacity='.3' d='M51 1l25 23 24 22H1l25-22zM51 101l25-23 24-22H1l25 22z'/%3e%3c/svg%3e")}.table.b-table.table-dark>tfoot>tr>[aria-sort=ascending],.table.b-table.table-dark>thead>tr>[aria-sort=ascending],.table.b-table>.thead-dark>tr>[aria-sort=ascending]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='101' height='101' view-box='0 0 101 101' preserveAspectRatio='none'%3e%3cpath fill='white' d='M51 1l25 23 24 22H1l25-22z'/%3e%3cpath fill='white' opacity='.3' d='M51 101l25-23 24-22H1l25 22z'/%3e%3c/svg%3e")}.table.b-table.table-dark>tfoot>tr>[aria-sort=descending],.table.b-table.table-dark>thead>tr>[aria-sort=descending],.table.b-table>.thead-dark>tr>[aria-sort=descending]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='101' height='101' view-box='0 0 101 101' preserveAspectRatio='none'%3e%3cpath fill='white' opacity='.3' d='M51 1l25 23 24 22H1l25-22z'/%3e%3cpath fill='white' d='M51 101l25-23 24-22H1l25 22z'/%3e%3c/svg%3e")}.table.b-table>tfoot>tr>.table-dark[aria-sort=none],.table.b-table>thead>tr>.table-dark[aria-sort=none]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='101' height='101' view-box='0 0 101 101' preserveAspectRatio='none'%3e%3cpath fill='white' opacity='.3' d='M51 1l25 23 24 22H1l25-22zM51 101l25-23 24-22H1l25 22z'/%3e%3c/svg%3e")}.table.b-table>tfoot>tr>.table-dark[aria-sort=ascending],.table.b-table>thead>tr>.table-dark[aria-sort=ascending]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='101' height='101' view-box='0 0 101 101' preserveAspectRatio='none'%3e%3cpath fill='white' d='M51 1l25 23 24 22H1l25-22z'/%3e%3cpath fill='white' opacity='.3' d='M51 101l25-23 24-22H1l25 22z'/%3e%3c/svg%3e")}.table.b-table>tfoot>tr>.table-dark[aria-sort=descending],.table.b-table>thead>tr>.table-dark[aria-sort=descending]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='101' height='101' view-box='0 0 101 101' preserveAspectRatio='none'%3e%3cpath fill='white' opacity='.3' d='M51 1l25 23 24 22H1l25-22z'/%3e%3cpath fill='white' d='M51 101l25-23 24-22H1l25 22z'/%3e%3c/svg%3e")}.table.b-table.table-sm>tfoot>tr>[aria-sort]:not(.b-table-sort-icon-left),.table.b-table.table-sm>thead>tr>[aria-sort]:not(.b-table-sort-icon-left){background-position:right calc(.3rem / 2) center;padding-right:calc(.3rem + .65em)}.table.b-table.table-sm>tfoot>tr>[aria-sort].b-table-sort-icon-left,.table.b-table.table-sm>thead>tr>[aria-sort].b-table-sort-icon-left{background-position:left calc(.3rem / 2) center;padding-left:calc(.3rem + .65em)}.table.b-table.b-table-selectable:not(.b-table-selectable-no-click)>tbody>tr{cursor:pointer}.table.b-table.b-table-selectable:not(.b-table-selectable-no-click).b-table-selecting.b-table-select-range>tbody>tr{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media (max-width:575.98px){.table.b-table.b-table-stacked-sm{display:block;width:100%}.table.b-table.b-table-stacked-sm>caption,.table.b-table.b-table-stacked-sm>tbody,.table.b-table.b-table-stacked-sm>tbody>tr,.table.b-table.b-table-stacked-sm>tbody>tr>td,.table.b-table.b-table-stacked-sm>tbody>tr>th{display:block}.table.b-table.b-table-stacked-sm>tfoot,.table.b-table.b-table-stacked-sm>thead{display:none}.table.b-table.b-table-stacked-sm>tfoot>tr.b-table-bottom-row,.table.b-table.b-table-stacked-sm>tfoot>tr.b-table-top-row,.table.b-table.b-table-stacked-sm>thead>tr.b-table-bottom-row,.table.b-table.b-table-stacked-sm>thead>tr.b-table-top-row{display:none}.table.b-table.b-table-stacked-sm>caption{caption-side:top!important}.table.b-table.b-table-stacked-sm>tbody>tr>[data-label]::before{content:attr(data-label);width:40%;float:left;text-align:right;overflow-wrap:break-word;font-weight:700;font-style:normal;padding:0 calc(1rem / 2) 0 0;margin:0}.table.b-table.b-table-stacked-sm>tbody>tr>[data-label]::after{display:block;clear:both;content:""}.table.b-table.b-table-stacked-sm>tbody>tr>[data-label]>div{display:inline-block;width:calc(100% - 40%);padding:0 0 0 calc(1rem / 2);margin:0}.table.b-table.b-table-stacked-sm>tbody>tr.bottom-row,.table.b-table.b-table-stacked-sm>tbody>tr.top-row{display:none}.table.b-table.b-table-stacked-sm>tbody>tr>:first-child{border-top-width:3px}.table.b-table.b-table-stacked-sm>tbody>tr>[rowspan]+td,.table.b-table.b-table-stacked-sm>tbody>tr>[rowspan]+th{border-top-width:3px}}@media (max-width:767.98px){.table.b-table.b-table-stacked-md{display:block;width:100%}.table.b-table.b-table-stacked-md>caption,.table.b-table.b-table-stacked-md>tbody,.table.b-table.b-table-stacked-md>tbody>tr,.table.b-table.b-table-stacked-md>tbody>tr>td,.table.b-table.b-table-stacked-md>tbody>tr>th{display:block}.table.b-table.b-table-stacked-md>tfoot,.table.b-table.b-table-stacked-md>thead{display:none}.table.b-table.b-table-stacked-md>tfoot>tr.b-table-bottom-row,.table.b-table.b-table-stacked-md>tfoot>tr.b-table-top-row,.table.b-table.b-table-stacked-md>thead>tr.b-table-bottom-row,.table.b-table.b-table-stacked-md>thead>tr.b-table-top-row{display:none}.table.b-table.b-table-stacked-md>caption{caption-side:top!important}.table.b-table.b-table-stacked-md>tbody>tr>[data-label]::before{content:attr(data-label);width:40%;float:left;text-align:right;overflow-wrap:break-word;font-weight:700;font-style:normal;padding:0 calc(1rem / 2) 0 0;margin:0}.table.b-table.b-table-stacked-md>tbody>tr>[data-label]::after{display:block;clear:both;content:""}.table.b-table.b-table-stacked-md>tbody>tr>[data-label]>div{display:inline-block;width:calc(100% - 40%);padding:0 0 0 calc(1rem / 2);margin:0}.table.b-table.b-table-stacked-md>tbody>tr.bottom-row,.table.b-table.b-table-stacked-md>tbody>tr.top-row{display:none}.table.b-table.b-table-stacked-md>tbody>tr>:first-child{border-top-width:3px}.table.b-table.b-table-stacked-md>tbody>tr>[rowspan]+td,.table.b-table.b-table-stacked-md>tbody>tr>[rowspan]+th{border-top-width:3px}}@media (max-width:991.98px){.table.b-table.b-table-stacked-lg{display:block;width:100%}.table.b-table.b-table-stacked-lg>caption,.table.b-table.b-table-stacked-lg>tbody,.table.b-table.b-table-stacked-lg>tbody>tr,.table.b-table.b-table-stacked-lg>tbody>tr>td,.table.b-table.b-table-stacked-lg>tbody>tr>th{display:block}.table.b-table.b-table-stacked-lg>tfoot,.table.b-table.b-table-stacked-lg>thead{display:none}.table.b-table.b-table-stacked-lg>tfoot>tr.b-table-bottom-row,.table.b-table.b-table-stacked-lg>tfoot>tr.b-table-top-row,.table.b-table.b-table-stacked-lg>thead>tr.b-table-bottom-row,.table.b-table.b-table-stacked-lg>thead>tr.b-table-top-row{display:none}.table.b-table.b-table-stacked-lg>caption{caption-side:top!important}.table.b-table.b-table-stacked-lg>tbody>tr>[data-label]::before{content:attr(data-label);width:40%;float:left;text-align:right;overflow-wrap:break-word;font-weight:700;font-style:normal;padding:0 calc(1rem / 2) 0 0;margin:0}.table.b-table.b-table-stacked-lg>tbody>tr>[data-label]::after{display:block;clear:both;content:""}.table.b-table.b-table-stacked-lg>tbody>tr>[data-label]>div{display:inline-block;width:calc(100% - 40%);padding:0 0 0 calc(1rem / 2);margin:0}.table.b-table.b-table-stacked-lg>tbody>tr.bottom-row,.table.b-table.b-table-stacked-lg>tbody>tr.top-row{display:none}.table.b-table.b-table-stacked-lg>tbody>tr>:first-child{border-top-width:3px}.table.b-table.b-table-stacked-lg>tbody>tr>[rowspan]+td,.table.b-table.b-table-stacked-lg>tbody>tr>[rowspan]+th{border-top-width:3px}}@media (max-width:1199.98px){.table.b-table.b-table-stacked-xl{display:block;width:100%}.table.b-table.b-table-stacked-xl>caption,.table.b-table.b-table-stacked-xl>tbody,.table.b-table.b-table-stacked-xl>tbody>tr,.table.b-table.b-table-stacked-xl>tbody>tr>td,.table.b-table.b-table-stacked-xl>tbody>tr>th{display:block}.table.b-table.b-table-stacked-xl>tfoot,.table.b-table.b-table-stacked-xl>thead{display:none}.table.b-table.b-table-stacked-xl>tfoot>tr.b-table-bottom-row,.table.b-table.b-table-stacked-xl>tfoot>tr.b-table-top-row,.table.b-table.b-table-stacked-xl>thead>tr.b-table-bottom-row,.table.b-table.b-table-stacked-xl>thead>tr.b-table-top-row{display:none}.table.b-table.b-table-stacked-xl>caption{caption-side:top!important}.table.b-table.b-table-stacked-xl>tbody>tr>[data-label]::before{content:attr(data-label);width:40%;float:left;text-align:right;overflow-wrap:break-word;font-weight:700;font-style:normal;padding:0 calc(1rem / 2) 0 0;margin:0}.table.b-table.b-table-stacked-xl>tbody>tr>[data-label]::after{display:block;clear:both;content:""}.table.b-table.b-table-stacked-xl>tbody>tr>[data-label]>div{display:inline-block;width:calc(100% - 40%);padding:0 0 0 calc(1rem / 2);margin:0}.table.b-table.b-table-stacked-xl>tbody>tr.bottom-row,.table.b-table.b-table-stacked-xl>tbody>tr.top-row{display:none}.table.b-table.b-table-stacked-xl>tbody>tr>:first-child{border-top-width:3px}.table.b-table.b-table-stacked-xl>tbody>tr>[rowspan]+td,.table.b-table.b-table-stacked-xl>tbody>tr>[rowspan]+th{border-top-width:3px}}.table.b-table.b-table-stacked{display:block;width:100%}.table.b-table.b-table-stacked>caption,.table.b-table.b-table-stacked>tbody,.table.b-table.b-table-stacked>tbody>tr,.table.b-table.b-table-stacked>tbody>tr>td,.table.b-table.b-table-stacked>tbody>tr>th{display:block}.table.b-table.b-table-stacked>tfoot,.table.b-table.b-table-stacked>thead{display:none}.table.b-table.b-table-stacked>tfoot>tr.b-table-bottom-row,.table.b-table.b-table-stacked>tfoot>tr.b-table-top-row,.table.b-table.b-table-stacked>thead>tr.b-table-bottom-row,.table.b-table.b-table-stacked>thead>tr.b-table-top-row{display:none}.table.b-table.b-table-stacked>caption{caption-side:top!important}.table.b-table.b-table-stacked>tbody>tr>[data-label]::before{content:attr(data-label);width:40%;float:left;text-align:right;overflow-wrap:break-word;font-weight:700;font-style:normal;padding:0 calc(1rem / 2) 0 0;margin:0}.table.b-table.b-table-stacked>tbody>tr>[data-label]::after{display:block;clear:both;content:""}.table.b-table.b-table-stacked>tbody>tr>[data-label]>div{display:inline-block;width:calc(100% - 40%);padding:0 0 0 calc(1rem / 2);margin:0}.table.b-table.b-table-stacked>tbody>tr.bottom-row,.table.b-table.b-table-stacked>tbody>tr.top-row{display:none}.table.b-table.b-table-stacked>tbody>tr>:first-child{border-top-width:3px}.table.b-table.b-table-stacked>tbody>tr>[rowspan]+td,.table.b-table.b-table-stacked>tbody>tr>[rowspan]+th{border-top-width:3px}.b-time{min-width:150px}.b-time output.disabled,.b-time[aria-disabled=true] output,.b-time[aria-readonly=true] output{background-color:#e9ecef;opacity:1}.b-time[aria-disabled=true] output{pointer-events:none}[dir=rtl] .b-time>.d-flex:not(.flex-column){flex-direction:row-reverse}.b-time .b-time-header{margin-bottom:.5rem}.b-time .b-time-header output{padding:.25rem;font-size:80%}.b-time .b-time-footer{margin-top:.5rem}.b-time .b-time-ampm{margin-left:.5rem}.b-toast{display:block;position:relative;max-width:350px;-webkit-backface-visibility:hidden;backface-visibility:hidden;background-clip:padding-box;z-index:1;border-radius:.25rem}.b-toast .toast{background-color:rgba(255,255,255,.85)}.b-toast:not(:last-child){margin-bottom:.75rem}.b-toast.b-toast-solid .toast{background-color:#fff}.b-toast .toast{opacity:1}.b-toast .toast.fade:not(.show){opacity:0}.b-toast .toast .toast-body{display:block}.b-toast-primary .toast{background-color:rgba(230,242,255,.85);border-color:rgba(184,218,255,.85);color:#004085}.b-toast-primary .toast .toast-header{color:#004085;background-color:rgba(204,229,255,.85);border-bottom-color:rgba(184,218,255,.85)}.b-toast-primary.b-toast-solid .toast{background-color:#e6f2ff}.b-toast-secondary .toast{background-color:rgba(239,240,241,.85);border-color:rgba(214,216,219,.85);color:#383d41}.b-toast-secondary .toast .toast-header{color:#383d41;background-color:rgba(226,227,229,.85);border-bottom-color:rgba(214,216,219,.85)}.b-toast-secondary.b-toast-solid .toast{background-color:#eff0f1}.b-toast-success .toast{background-color:rgba(230,245,233,.85);border-color:rgba(195,230,203,.85);color:#155724}.b-toast-success .toast .toast-header{color:#155724;background-color:rgba(212,237,218,.85);border-bottom-color:rgba(195,230,203,.85)}.b-toast-success.b-toast-solid .toast{background-color:#e6f5e9}.b-toast-info .toast{background-color:rgba(229,244,247,.85);border-color:rgba(190,229,235,.85);color:#0c5460}.b-toast-info .toast .toast-header{color:#0c5460;background-color:rgba(209,236,241,.85);border-bottom-color:rgba(190,229,235,.85)}.b-toast-info.b-toast-solid .toast{background-color:#e5f4f7}.b-toast-warning .toast{background-color:rgba(255,249,231,.85);border-color:rgba(255,238,186,.85);color:#856404}.b-toast-warning .toast .toast-header{color:#856404;background-color:rgba(255,243,205,.85);border-bottom-color:rgba(255,238,186,.85)}.b-toast-warning.b-toast-solid .toast{background-color:#fff9e7}.b-toast-danger .toast{background-color:rgba(252,237,238,.85);border-color:rgba(245,198,203,.85);color:#721c24}.b-toast-danger .toast .toast-header{color:#721c24;background-color:rgba(248,215,218,.85);border-bottom-color:rgba(245,198,203,.85)}.b-toast-danger.b-toast-solid .toast{background-color:#fcedee}.b-toast-light .toast{background-color:rgba(255,255,255,.85);border-color:rgba(253,253,254,.85);color:#818182}.b-toast-light .toast .toast-header{color:#818182;background-color:rgba(254,254,254,.85);border-bottom-color:rgba(253,253,254,.85)}.b-toast-light.b-toast-solid .toast{background-color:#fff}.b-toast-dark .toast{background-color:rgba(227,229,229,.85);border-color:rgba(198,200,202,.85);color:#1b1e21}.b-toast-dark .toast .toast-header{color:#1b1e21;background-color:rgba(214,216,217,.85);border-bottom-color:rgba(198,200,202,.85)}.b-toast-dark.b-toast-solid .toast{background-color:#e3e5e5}.b-toaster{z-index:1100}.b-toaster .b-toaster-slot{position:relative;display:block}.b-toaster .b-toaster-slot:empty{display:none!important}.b-toaster.b-toaster-bottom-center,.b-toaster.b-toaster-bottom-full,.b-toaster.b-toaster-bottom-left,.b-toaster.b-toaster-bottom-right,.b-toaster.b-toaster-top-center,.b-toaster.b-toaster-top-full,.b-toaster.b-toaster-top-left,.b-toaster.b-toaster-top-right{position:fixed;left:.5rem;right:.5rem;margin:0;padding:0;height:0;overflow:visible}.b-toaster.b-toaster-bottom-center .b-toaster-slot,.b-toaster.b-toaster-bottom-full .b-toaster-slot,.b-toaster.b-toaster-bottom-left .b-toaster-slot,.b-toaster.b-toaster-bottom-right .b-toaster-slot,.b-toaster.b-toaster-top-center .b-toaster-slot,.b-toaster.b-toaster-top-full .b-toaster-slot,.b-toaster.b-toaster-top-left .b-toaster-slot,.b-toaster.b-toaster-top-right .b-toaster-slot{position:absolute;max-width:350px;width:100%;left:0;right:0;padding:0;margin:0}.b-toaster.b-toaster-bottom-full .b-toaster-slot,.b-toaster.b-toaster-top-full .b-toaster-slot{width:100%;max-width:100%}.b-toaster.b-toaster-bottom-full .b-toaster-slot .b-toast,.b-toaster.b-toaster-bottom-full .b-toaster-slot .toast,.b-toaster.b-toaster-top-full .b-toaster-slot .b-toast,.b-toaster.b-toaster-top-full .b-toaster-slot .toast{width:100%;max-width:100%}.b-toaster.b-toaster-top-center,.b-toaster.b-toaster-top-full,.b-toaster.b-toaster-top-left,.b-toaster.b-toaster-top-right{top:0}.b-toaster.b-toaster-top-center .b-toaster-slot,.b-toaster.b-toaster-top-full .b-toaster-slot,.b-toaster.b-toaster-top-left .b-toaster-slot,.b-toaster.b-toaster-top-right .b-toaster-slot{top:.5rem}.b-toaster.b-toaster-bottom-center,.b-toaster.b-toaster-bottom-full,.b-toaster.b-toaster-bottom-left,.b-toaster.b-toaster-bottom-right{bottom:0}.b-toaster.b-toaster-bottom-center .b-toaster-slot,.b-toaster.b-toaster-bottom-full .b-toaster-slot,.b-toaster.b-toaster-bottom-left .b-toaster-slot,.b-toaster.b-toaster-bottom-right .b-toaster-slot{bottom:.5rem}.b-toaster.b-toaster-bottom-center .b-toaster-slot,.b-toaster.b-toaster-bottom-right .b-toaster-slot,.b-toaster.b-toaster-top-center .b-toaster-slot,.b-toaster.b-toaster-top-right .b-toaster-slot{margin-left:auto}.b-toaster.b-toaster-bottom-center .b-toaster-slot,.b-toaster.b-toaster-bottom-left .b-toaster-slot,.b-toaster.b-toaster-top-center .b-toaster-slot,.b-toaster.b-toaster-top-left .b-toaster-slot{margin-right:auto}.b-toaster.b-toaster-bottom-left .b-toast.b-toaster-enter-active,.b-toaster.b-toaster-bottom-left .b-toast.b-toaster-leave-active,.b-toaster.b-toaster-bottom-left .b-toast.b-toaster-move,.b-toaster.b-toaster-bottom-right .b-toast.b-toaster-enter-active,.b-toaster.b-toaster-bottom-right .b-toast.b-toaster-leave-active,.b-toaster.b-toaster-bottom-right .b-toast.b-toaster-move,.b-toaster.b-toaster-top-left .b-toast.b-toaster-enter-active,.b-toaster.b-toaster-top-left .b-toast.b-toaster-leave-active,.b-toaster.b-toaster-top-left .b-toast.b-toaster-move,.b-toaster.b-toaster-top-right .b-toast.b-toaster-enter-active,.b-toaster.b-toaster-top-right .b-toast.b-toaster-leave-active,.b-toaster.b-toaster-top-right .b-toast.b-toaster-move{transition:-webkit-transform 175ms;transition:transform 175ms;transition:transform 175ms,-webkit-transform 175ms}.b-toaster.b-toaster-bottom-left .b-toast.b-toaster-enter-active .toast.fade,.b-toaster.b-toaster-bottom-left .b-toast.b-toaster-enter-to .toast.fade,.b-toaster.b-toaster-bottom-right .b-toast.b-toaster-enter-active .toast.fade,.b-toaster.b-toaster-bottom-right .b-toast.b-toaster-enter-to .toast.fade,.b-toaster.b-toaster-top-left .b-toast.b-toaster-enter-active .toast.fade,.b-toaster.b-toaster-top-left .b-toast.b-toaster-enter-to .toast.fade,.b-toaster.b-toaster-top-right .b-toast.b-toaster-enter-active .toast.fade,.b-toaster.b-toaster-top-right .b-toast.b-toaster-enter-to .toast.fade{transition-delay:175ms}.b-toaster.b-toaster-bottom-left .b-toast.b-toaster-leave-active,.b-toaster.b-toaster-bottom-right .b-toast.b-toaster-leave-active,.b-toaster.b-toaster-top-left .b-toast.b-toaster-leave-active,.b-toaster.b-toaster-top-right .b-toast.b-toaster-leave-active{position:absolute;transition-delay:175ms}.b-toaster.b-toaster-bottom-left .b-toast.b-toaster-leave-active .toast.fade,.b-toaster.b-toaster-bottom-right .b-toast.b-toaster-leave-active .toast.fade,.b-toaster.b-toaster-top-left .b-toast.b-toaster-leave-active .toast.fade,.b-toaster.b-toaster-top-right .b-toast.b-toaster-leave-active .toast.fade{transition-delay:0s}.tooltip.b-tooltip{display:block;opacity:.9;outline:0}.tooltip.b-tooltip.fade:not(.show){opacity:0}.tooltip.b-tooltip.show{opacity:.9}.tooltip.b-tooltip.noninteractive{pointer-events:none}.tooltip.b-tooltip .arrow{margin:0 .25rem}.tooltip.b-tooltip.b-tooltip-danger.bs-tooltip-auto[x-placement^=left] .arrow,.tooltip.b-tooltip.b-tooltip-danger.bs-tooltip-auto[x-placement^=right] .arrow,.tooltip.b-tooltip.b-tooltip-dark.bs-tooltip-auto[x-placement^=left] .arrow,.tooltip.b-tooltip.b-tooltip-dark.bs-tooltip-auto[x-placement^=right] .arrow,.tooltip.b-tooltip.b-tooltip-info.bs-tooltip-auto[x-placement^=left] .arrow,.tooltip.b-tooltip.b-tooltip-info.bs-tooltip-auto[x-placement^=right] .arrow,.tooltip.b-tooltip.b-tooltip-light.bs-tooltip-auto[x-placement^=left] .arrow,.tooltip.b-tooltip.b-tooltip-light.bs-tooltip-auto[x-placement^=right] .arrow,.tooltip.b-tooltip.b-tooltip-primary.bs-tooltip-auto[x-placement^=left] .arrow,.tooltip.b-tooltip.b-tooltip-primary.bs-tooltip-auto[x-placement^=right] .arrow,.tooltip.b-tooltip.b-tooltip-secondary.bs-tooltip-auto[x-placement^=left] .arrow,.tooltip.b-tooltip.b-tooltip-secondary.bs-tooltip-auto[x-placement^=right] .arrow,.tooltip.b-tooltip.b-tooltip-success.bs-tooltip-auto[x-placement^=left] .arrow,.tooltip.b-tooltip.b-tooltip-success.bs-tooltip-auto[x-placement^=right] .arrow,.tooltip.b-tooltip.b-tooltip-warning.bs-tooltip-auto[x-placement^=left] .arrow,.tooltip.b-tooltip.b-tooltip-warning.bs-tooltip-auto[x-placement^=right] .arrow,.tooltip.b-tooltip.bs-tooltip-left .arrow,.tooltip.b-tooltip.bs-tooltip-right .arrow{margin:.25rem 0}.tooltip.b-tooltip-primary.bs-tooltip-auto[x-placement^=top] .arrow::before,.tooltip.b-tooltip-primary.bs-tooltip-top .arrow::before{border-top-color:#007bff}.tooltip.b-tooltip-primary.bs-tooltip-auto[x-placement^=right] .arrow::before,.tooltip.b-tooltip-primary.bs-tooltip-right .arrow::before{border-right-color:#007bff}.tooltip.b-tooltip-primary.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.tooltip.b-tooltip-primary.bs-tooltip-bottom .arrow::before{border-bottom-color:#007bff}.tooltip.b-tooltip-primary.bs-tooltip-auto[x-placement^=left] .arrow::before,.tooltip.b-tooltip-primary.bs-tooltip-left .arrow::before{border-left-color:#007bff}.tooltip.b-tooltip-primary .tooltip-inner{color:#fff;background-color:#007bff}.tooltip.b-tooltip-secondary.bs-tooltip-auto[x-placement^=top] .arrow::before,.tooltip.b-tooltip-secondary.bs-tooltip-top .arrow::before{border-top-color:#6c757d}.tooltip.b-tooltip-secondary.bs-tooltip-auto[x-placement^=right] .arrow::before,.tooltip.b-tooltip-secondary.bs-tooltip-right .arrow::before{border-right-color:#6c757d}.tooltip.b-tooltip-secondary.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.tooltip.b-tooltip-secondary.bs-tooltip-bottom .arrow::before{border-bottom-color:#6c757d}.tooltip.b-tooltip-secondary.bs-tooltip-auto[x-placement^=left] .arrow::before,.tooltip.b-tooltip-secondary.bs-tooltip-left .arrow::before{border-left-color:#6c757d}.tooltip.b-tooltip-secondary .tooltip-inner{color:#fff;background-color:#6c757d}.tooltip.b-tooltip-success.bs-tooltip-auto[x-placement^=top] .arrow::before,.tooltip.b-tooltip-success.bs-tooltip-top .arrow::before{border-top-color:#28a745}.tooltip.b-tooltip-success.bs-tooltip-auto[x-placement^=right] .arrow::before,.tooltip.b-tooltip-success.bs-tooltip-right .arrow::before{border-right-color:#28a745}.tooltip.b-tooltip-success.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.tooltip.b-tooltip-success.bs-tooltip-bottom .arrow::before{border-bottom-color:#28a745}.tooltip.b-tooltip-success.bs-tooltip-auto[x-placement^=left] .arrow::before,.tooltip.b-tooltip-success.bs-tooltip-left .arrow::before{border-left-color:#28a745}.tooltip.b-tooltip-success .tooltip-inner{color:#fff;background-color:#28a745}.tooltip.b-tooltip-info.bs-tooltip-auto[x-placement^=top] .arrow::before,.tooltip.b-tooltip-info.bs-tooltip-top .arrow::before{border-top-color:#17a2b8}.tooltip.b-tooltip-info.bs-tooltip-auto[x-placement^=right] .arrow::before,.tooltip.b-tooltip-info.bs-tooltip-right .arrow::before{border-right-color:#17a2b8}.tooltip.b-tooltip-info.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.tooltip.b-tooltip-info.bs-tooltip-bottom .arrow::before{border-bottom-color:#17a2b8}.tooltip.b-tooltip-info.bs-tooltip-auto[x-placement^=left] .arrow::before,.tooltip.b-tooltip-info.bs-tooltip-left .arrow::before{border-left-color:#17a2b8}.tooltip.b-tooltip-info .tooltip-inner{color:#fff;background-color:#17a2b8}.tooltip.b-tooltip-warning.bs-tooltip-auto[x-placement^=top] .arrow::before,.tooltip.b-tooltip-warning.bs-tooltip-top .arrow::before{border-top-color:#ffc107}.tooltip.b-tooltip-warning.bs-tooltip-auto[x-placement^=right] .arrow::before,.tooltip.b-tooltip-warning.bs-tooltip-right .arrow::before{border-right-color:#ffc107}.tooltip.b-tooltip-warning.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.tooltip.b-tooltip-warning.bs-tooltip-bottom .arrow::before{border-bottom-color:#ffc107}.tooltip.b-tooltip-warning.bs-tooltip-auto[x-placement^=left] .arrow::before,.tooltip.b-tooltip-warning.bs-tooltip-left .arrow::before{border-left-color:#ffc107}.tooltip.b-tooltip-warning .tooltip-inner{color:#212529;background-color:#ffc107}.tooltip.b-tooltip-danger.bs-tooltip-auto[x-placement^=top] .arrow::before,.tooltip.b-tooltip-danger.bs-tooltip-top .arrow::before{border-top-color:#dc3545}.tooltip.b-tooltip-danger.bs-tooltip-auto[x-placement^=right] .arrow::before,.tooltip.b-tooltip-danger.bs-tooltip-right .arrow::before{border-right-color:#dc3545}.tooltip.b-tooltip-danger.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.tooltip.b-tooltip-danger.bs-tooltip-bottom .arrow::before{border-bottom-color:#dc3545}.tooltip.b-tooltip-danger.bs-tooltip-auto[x-placement^=left] .arrow::before,.tooltip.b-tooltip-danger.bs-tooltip-left .arrow::before{border-left-color:#dc3545}.tooltip.b-tooltip-danger .tooltip-inner{color:#fff;background-color:#dc3545}.tooltip.b-tooltip-light.bs-tooltip-auto[x-placement^=top] .arrow::before,.tooltip.b-tooltip-light.bs-tooltip-top .arrow::before{border-top-color:#f8f9fa}.tooltip.b-tooltip-light.bs-tooltip-auto[x-placement^=right] .arrow::before,.tooltip.b-tooltip-light.bs-tooltip-right .arrow::before{border-right-color:#f8f9fa}.tooltip.b-tooltip-light.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.tooltip.b-tooltip-light.bs-tooltip-bottom .arrow::before{border-bottom-color:#f8f9fa}.tooltip.b-tooltip-light.bs-tooltip-auto[x-placement^=left] .arrow::before,.tooltip.b-tooltip-light.bs-tooltip-left .arrow::before{border-left-color:#f8f9fa}.tooltip.b-tooltip-light .tooltip-inner{color:#212529;background-color:#f8f9fa}.tooltip.b-tooltip-dark.bs-tooltip-auto[x-placement^=top] .arrow::before,.tooltip.b-tooltip-dark.bs-tooltip-top .arrow::before{border-top-color:#343a40}.tooltip.b-tooltip-dark.bs-tooltip-auto[x-placement^=right] .arrow::before,.tooltip.b-tooltip-dark.bs-tooltip-right .arrow::before{border-right-color:#343a40}.tooltip.b-tooltip-dark.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.tooltip.b-tooltip-dark.bs-tooltip-bottom .arrow::before{border-bottom-color:#343a40}.tooltip.b-tooltip-dark.bs-tooltip-auto[x-placement^=left] .arrow::before,.tooltip.b-tooltip-dark.bs-tooltip-left .arrow::before{border-left-color:#343a40}.tooltip.b-tooltip-dark .tooltip-inner{color:#fff;background-color:#343a40}.b-icon.bi{display:inline-block;overflow:visible;vertical-align:-.15em}.b-icon.b-icon-animation-cylon,.b-icon.b-iconstack .b-icon-animation-cylon>g{-webkit-transform-origin:center;transform-origin:center;-webkit-animation:.75s infinite ease-in-out alternate b-icon-animation-cylon;animation:.75s infinite ease-in-out alternate b-icon-animation-cylon}@media (prefers-reduced-motion:reduce){.b-icon.b-icon-animation-cylon,.b-icon.b-iconstack .b-icon-animation-cylon>g{-webkit-animation:none;animation:none}}.b-icon.b-icon-animation-cylon-vertical,.b-icon.b-iconstack .b-icon-animation-cylon-vertical>g{-webkit-transform-origin:center;transform-origin:center;-webkit-animation:.75s infinite ease-in-out alternate b-icon-animation-cylon-vertical;animation:.75s infinite ease-in-out alternate b-icon-animation-cylon-vertical}@media (prefers-reduced-motion:reduce){.b-icon.b-icon-animation-cylon-vertical,.b-icon.b-iconstack .b-icon-animation-cylon-vertical>g{-webkit-animation:none;animation:none}}.b-icon.b-icon-animation-fade,.b-icon.b-iconstack .b-icon-animation-fade>g{-webkit-transform-origin:center;transform-origin:center;-webkit-animation:.75s infinite ease-in-out alternate b-icon-animation-fade;animation:.75s infinite ease-in-out alternate b-icon-animation-fade}@media (prefers-reduced-motion:reduce){.b-icon.b-icon-animation-fade,.b-icon.b-iconstack .b-icon-animation-fade>g{-webkit-animation:none;animation:none}}.b-icon.b-icon-animation-spin,.b-icon.b-iconstack .b-icon-animation-spin>g{-webkit-transform-origin:center;transform-origin:center;-webkit-animation:2s infinite linear normal b-icon-animation-spin;animation:2s infinite linear normal b-icon-animation-spin}@media (prefers-reduced-motion:reduce){.b-icon.b-icon-animation-spin,.b-icon.b-iconstack .b-icon-animation-spin>g{-webkit-animation:none;animation:none}}.b-icon.b-icon-animation-spin-reverse,.b-icon.b-iconstack .b-icon-animation-spin-reverse>g{-webkit-transform-origin:center;transform-origin:center;animation:2s infinite linear reverse b-icon-animation-spin}@media (prefers-reduced-motion:reduce){.b-icon.b-icon-animation-spin-reverse,.b-icon.b-iconstack .b-icon-animation-spin-reverse>g{-webkit-animation:none;animation:none}}.b-icon.b-icon-animation-spin-pulse,.b-icon.b-iconstack .b-icon-animation-spin-pulse>g{-webkit-transform-origin:center;transform-origin:center;-webkit-animation:1s infinite steps(8) normal b-icon-animation-spin;animation:1s infinite steps(8) normal b-icon-animation-spin}@media (prefers-reduced-motion:reduce){.b-icon.b-icon-animation-spin-pulse,.b-icon.b-iconstack .b-icon-animation-spin-pulse>g{-webkit-animation:none;animation:none}}.b-icon.b-icon-animation-spin-reverse-pulse,.b-icon.b-iconstack .b-icon-animation-spin-reverse-pulse>g{-webkit-transform-origin:center;transform-origin:center;animation:1s infinite steps(8) reverse b-icon-animation-spin}@media (prefers-reduced-motion:reduce){.b-icon.b-icon-animation-spin-reverse-pulse,.b-icon.b-iconstack .b-icon-animation-spin-reverse-pulse>g{-webkit-animation:none;animation:none}}.b-icon.b-icon-animation-throb,.b-icon.b-iconstack .b-icon-animation-throb>g{-webkit-transform-origin:center;transform-origin:center;-webkit-animation:.75s infinite ease-in-out alternate b-icon-animation-throb;animation:.75s infinite ease-in-out alternate b-icon-animation-throb}@media (prefers-reduced-motion:reduce){.b-icon.b-icon-animation-throb,.b-icon.b-iconstack .b-icon-animation-throb>g{-webkit-animation:none;animation:none}}@-webkit-keyframes b-icon-animation-cylon{0%{-webkit-transform:translateX(-25%);transform:translateX(-25%)}100%{-webkit-transform:translateX(25%);transform:translateX(25%)}}@keyframes b-icon-animation-cylon{0%{-webkit-transform:translateX(-25%);transform:translateX(-25%)}100%{-webkit-transform:translateX(25%);transform:translateX(25%)}}@-webkit-keyframes b-icon-animation-cylon-vertical{0%{-webkit-transform:translateY(25%);transform:translateY(25%)}100%{-webkit-transform:translateY(-25%);transform:translateY(-25%)}}@keyframes b-icon-animation-cylon-vertical{0%{-webkit-transform:translateY(25%);transform:translateY(25%)}100%{-webkit-transform:translateY(-25%);transform:translateY(-25%)}}@-webkit-keyframes b-icon-animation-fade{0%{opacity:.1}100%{opacity:1}}@keyframes b-icon-animation-fade{0%{opacity:.1}100%{opacity:1}}@-webkit-keyframes b-icon-animation-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes b-icon-animation-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-webkit-keyframes b-icon-animation-throb{0%{opacity:.5;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes b-icon-animation-throb{0%{opacity:.5;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.btn .b-icon.bi,.dropdown-item .b-icon.bi,.dropdown-toggle .b-icon.bi,.input-group-text .b-icon.bi,.nav-link .b-icon.bi{font-size:125%;vertical-align:text-bottom} -/*# sourceMappingURL=bootstrap-vue.min.css.map */ \ No newline at end of file diff --git a/cookbook/static/themes/bootstrap.min.css b/cookbook/static/themes/bootstrap.min.css index 86b6845bc..613d28aab 100644 --- a/cookbook/static/themes/bootstrap.min.css +++ b/cookbook/static/themes/bootstrap.min.css @@ -4,4 +4,3 @@ * Copyright 2011-2019 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]){color:inherit;text-decoration:none}a:not([href]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-sm-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-sm-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-md-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-md-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-md-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-md-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-md-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-md-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-lg-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-lg-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-xl-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-xl-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#0069d9;border-color:#0062cc;box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{color:#fff;background-color:#5a6268;border-color:#545b62;box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#218838;border-color:#1e7e34;box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#138496;border-color:#117a8b;box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{color:#212529;background-color:#e0a800;border-color:#d39e00;box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c82333;border-color:#bd2130;box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{color:#212529;background-color:#e2e6ea;border-color:#dae0e5;box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{color:#fff;background-color:#23272b;border-color:#1d2124;box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 0%;flex:1 1 0%;min-width:0;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before,.custom-control-input[disabled]~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50%/50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img,.card-img-bottom,.card-img-top{-ms-flex-negative:0;flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{-ms-flex:1 0 0%;flex:1 0 0%;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal .list-group-item.active{margin-top:0}.list-group-horizontal .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm .list-group-item.active{margin-top:0}.list-group-horizontal-sm .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md .list-group-item.active{margin-top:0}.list-group-horizontal-md .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg .list-group-item.active{margin-top:0}.list-group-horizontal-lg .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl .list-group-item.active{margin-top:0}.list-group-horizontal-xl .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush .list-group-item{border-right-width:0;border-left-width:0;border-radius:0}.list-group-flush .list-group-item:first-child{border-top-width:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal.modal-static .modal-dialog{-webkit-transform:scale(1.02);transform:scale(1.02)}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;overflow-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} -/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/cookbook/static/themes/tandoor.min.css b/cookbook/static/themes/tandoor.min.css index b234107c5..a9749252b 100644 --- a/cookbook/static/themes/tandoor.min.css +++ b/cookbook/static/themes/tandoor.min.css @@ -10438,8 +10438,6 @@ footer a:hover { padding: 5px 0 20px 39px } -/*# sourceMappingURL=maps/style.min.css.map */ - .bg-header { background-color: rgb(221, 191, 134) !important; } diff --git a/cookbook/templates/base.html b/cookbook/templates/base.html index ee60fa807..7036ef40a 100644 --- a/cookbook/templates/base.html +++ b/cookbook/templates/base.html @@ -350,8 +350,8 @@ {% message_of_the_day request as message_of_the_day %} {% if message_of_the_day %} -
    - {{ message_of_the_day }} +
    + {{ message_of_the_day | markdown |safe }}
    {% endif %} diff --git a/cookbook/templates/recipe_view.html b/cookbook/templates/recipe_view.html index b1246b5af..2ec2b1179 100644 --- a/cookbook/templates/recipe_view.html +++ b/cookbook/templates/recipe_view.html @@ -7,6 +7,21 @@ {% block title %}{{ recipe.name }}{% endblock %} +{% block extra_head %} + + + + {% if recipe.image %} + + + + {% endif %} + {% if recipe.description %} + + {% endif %} + +{% endblock %} + {% block content %} {% recipe_rating recipe request.user as rating %} @@ -33,7 +48,7 @@ {% endfor %} {% if request.user.is_authenticated %} -
    +
    {% csrf_token %} diff --git a/cookbook/templates/test.html b/cookbook/templates/test.html index f1c083de8..ecb7c527e 100644 --- a/cookbook/templates/test.html +++ b/cookbook/templates/test.html @@ -10,11 +10,24 @@ {% block content_fluid %} - {{ data }} +
    + +
    {% endblock %} {% block script %} + {% if debug %} + + {% else %} + + {% endif %} + + + {% render_bundle 'test_view' %} {% endblock %} \ No newline at end of file diff --git a/cookbook/templatetags/custom_tags.py b/cookbook/templatetags/custom_tags.py index c2407237f..b958999a5 100644 --- a/cookbook/templatetags/custom_tags.py +++ b/cookbook/templatetags/custom_tags.py @@ -57,6 +57,8 @@ def markdown(value): ] ) markdown_attrs['*'] = markdown_attrs['*'] + ['class'] + parsed_md = parsed_md[3:] # remove outer paragraph + parsed_md = parsed_md[:len(parsed_md)-4] return bleach.clean(parsed_md, tags, markdown_attrs) @@ -101,6 +103,7 @@ def page_help(page_name): 'view_shopping': 'https://docs.tandoor.dev/features/shopping/', 'view_import': 'https://docs.tandoor.dev/features/import_export/', 'view_export': 'https://docs.tandoor.dev/features/import_export/', + 'list_automation': 'https://docs.tandoor.dev/features/automation/', } link = help_pages.get(page_name, '') diff --git a/cookbook/tests/api/test_api_food.py b/cookbook/tests/api/test_api_food.py index 98376280f..e180576f8 100644 --- a/cookbook/tests/api/test_api_food.py +++ b/cookbook/tests/api/test_api_food.py @@ -6,7 +6,7 @@ from django.urls import reverse from django_scopes import scope, scopes_disabled from pytest_factoryboy import LazyFixture, register -from cookbook.models import Food, FoodInheritField, Ingredient, ShoppingList, ShoppingListEntry +from cookbook.models import Food, Ingredient, ShoppingListEntry from cookbook.tests.factories import (FoodFactory, IngredientFactory, ShoppingListEntryFactory, SupermarketCategoryFactory) @@ -56,23 +56,32 @@ def obj_tree_1(request, space_1): params = request.param # request.param is a magic variable except AttributeError: params = {} - objs = [] inherit = params.pop('inherit', False) - objs.extend(FoodFactory.create_batch(3, space=space_1, **params)) + FoodFactory.create_batch(3, space=space_1, **params) + objs = Food.objects.values_list('id', flat=True) + obj_id = objs[1] + child_id = objs[0] + parent_id = objs[2] # set all foods to inherit everything if inherit: inherit = Food.inheritable_fields - Through = Food.objects.filter(space=space_1).first().inherit_fields.through + Through = Food.objects.filter( + space=space_1).first().inherit_fields.through for i in inherit: Through.objects.bulk_create([ Through(food_id=x, foodinheritfield_id=i.id) for x in Food.objects.filter(space=space_1).values_list('id', flat=True) ]) - objs[0].move(objs[1], node_location) - objs[1].move(objs[2], node_location) - return Food.objects.get(id=objs[1].id) # whenever you move/merge a tree it's safest to re-get the object + Food.objects.get(id=child_id).move( + Food.objects.get(id=obj_id), node_location) + + Food.objects.get(id=obj_id).move( + Food.objects.get(id=parent_id), node_location) + + # whenever you move/merge a tree it's safest to re-get the object + return Food.objects.get(id=obj_id) @pytest.mark.parametrize("arg", [ @@ -90,8 +99,12 @@ def test_list_space(obj_1, obj_2, u1_s1, u1_s2, space_2): assert json.loads(u1_s1.get(reverse(LIST_URL)).content)['count'] == 2 assert json.loads(u1_s2.get(reverse(LIST_URL)).content)['count'] == 0 - obj_1.space = space_2 - obj_1.save() + with scopes_disabled(): + # for some reason the 'path' attribute changes between the factory and the test + obj_1 = Food.objects.get(id=obj_1.id) + obj_2 = Food.objects.get(id=obj_2.id) + obj_1.space = space_2 + obj_1.save() assert json.loads(u1_s1.get(reverse(LIST_URL)).content)['count'] == 1 assert json.loads(u1_s2.get(reverse(LIST_URL)).content)['count'] == 1 @@ -107,19 +120,23 @@ def test_list_filter(obj_1, obj_2, u1_s1): assert obj_2.name in [x['name'] for x in response['results']] assert response['results'][0]['name'] < response['results'][1]['name'] - response = json.loads(u1_s1.get(f'{reverse(LIST_URL)}?page_size=1').content) + response = json.loads( + u1_s1.get(f'{reverse(LIST_URL)}?page_size=1').content) assert len(response['results']) == 1 response = json.loads(u1_s1.get(f'{reverse(LIST_URL)}?limit=1').content) assert len(response['results']) == 1 - response = json.loads(u1_s1.get(f'{reverse(LIST_URL)}?query=''&limit=1').content) + response = json.loads( + u1_s1.get(f'{reverse(LIST_URL)}?query=''&limit=1').content) assert len(response['results']) == 1 - response = json.loads(u1_s1.get(f'{reverse(LIST_URL)}?query=chicken').content) + response = json.loads( + u1_s1.get(f'{reverse(LIST_URL)}?query=chicken').content) assert response['count'] == 0 - response = json.loads(u1_s1.get(f'{reverse(LIST_URL)}?query={obj_1.name[:-4]}').content) + response = json.loads( + u1_s1.get(f'{reverse(LIST_URL)}?query={obj_1.name[:-4]}').content) assert response['count'] == 1 @@ -262,8 +279,9 @@ def test_integrity(u1_s1, recipe_1_s1): def test_move(u1_s1, obj_tree_1, obj_2, obj_3, space_1): with scope(space=space_1): + # for some reason the 'path' attribute changes between the factory and the test when using both obj_tree and obj + obj_tree_1 = Food.objects.get(id=obj_tree_1.id) parent = obj_tree_1.get_parent() - child = obj_tree_1.get_descendants()[0] assert parent.get_num_children() == 1 assert parent.get_descendant_count() == 2 assert Food.get_root_nodes().filter(space=space_1).count() == 2 @@ -295,8 +313,9 @@ def test_move(u1_s1, obj_tree_1, obj_2, obj_3, space_1): def test_move_errors(u1_s1, obj_tree_1, obj_3, space_1): with scope(space=space_1): + # for some reason the 'path' attribute changes between the factory and the test when using both obj_tree and obj + obj_tree_1 = Food.objects.get(id=obj_tree_1.id) parent = obj_tree_1.get_parent() - child = obj_tree_1.get_descendants()[0] # move child to root r = u1_s1.put(reverse(MOVE_URL, args=[obj_tree_1.id, 0])) assert r.status_code == 200 @@ -351,7 +370,7 @@ def test_merge_shopping_entries(obj_tree_1, u1_s1, space_1): with scope(space=space_1): parent = obj_tree_1.get_parent() child = obj_tree_1.get_descendants()[0] - ShoppingListEntryFactory.create(food=parent, space=space_1) + ShoppingListEntryFactory.create(food=parent, space=space_1) ShoppingListEntryFactory.create(food=child, space=space_1) assert parent.get_num_children() == 1 assert parent.get_descendant_count() == 2 @@ -371,8 +390,10 @@ def test_merge_shopping_entries(obj_tree_1, u1_s1, space_1): assert obj_tree_1.shopping_entries.count() == 1 # now has child's ingredient -def test_merge(u1_s1, obj_tree_1, obj_1, obj_3, space_1): +def test_merge(u1_s1, obj_tree_1, obj_1, obj_3, space_1): with scope(space=space_1): + # for some reason the 'path' attribute changes between the factory and the test when using both obj_tree and obj + obj_tree_1 = Food.objects.get(id=obj_tree_1.id) parent = obj_tree_1.get_parent() child = obj_tree_1.get_descendants()[0] assert parent.get_num_children() == 1 @@ -416,8 +437,9 @@ def test_merge(u1_s1, obj_tree_1, obj_1, obj_3, space_1): def test_merge_errors(u1_s1, obj_tree_1, obj_3, space_1): with scope(space=space_1): + # for some reason the 'path' attribute changes between the factory and the test when using both obj_tree and obj + obj_tree_1 = Food.objects.get(id=obj_tree_1.id) parent = obj_tree_1.get_parent() - child = obj_tree_1.get_descendants()[0] # attempt to merge with non-existent parent r = u1_s1.put( @@ -451,44 +473,63 @@ def test_merge_errors(u1_s1, obj_tree_1, obj_3, space_1): def test_root_filter(obj_tree_1, obj_2, obj_3, u1_s1): with scope(space=obj_tree_1.space): + # for some reason the 'path' attribute changes between the factory and the test when using both obj_tree and obj + obj_tree_1 = Food.objects.get(id=obj_tree_1.id) parent = obj_tree_1.get_parent() - child = obj_tree_1.get_descendants()[0] # should return root objects in the space (obj_1, obj_2), ignoring query filters response = json.loads(u1_s1.get(f'{reverse(LIST_URL)}?root=0').content) assert len(response['results']) == 2 + # django_tree bypasses ORM - best to retrieve all changed objects with scopes_disabled(): obj_2.move(parent, node_location) + obj_2 = Food.objects.get(id=obj_2.id) + parent = Food.objects.get(id=parent.id) # should return direct children of parent (obj_tree_1, obj_2), ignoring query filters - response = json.loads(u1_s1.get(f'{reverse(LIST_URL)}?root={parent.id}').content) + response = json.loads( + u1_s1.get(f'{reverse(LIST_URL)}?root={parent.id}').content) assert response['count'] == 2 - response = json.loads(u1_s1.get(f'{reverse(LIST_URL)}?root={parent.id}&query={obj_2.name[4:]}').content) + response = json.loads(u1_s1.get( + f'{reverse(LIST_URL)}?root={parent.id}&query={obj_2.name[4:]}').content) assert response['count'] == 2 def test_tree_filter(obj_tree_1, obj_2, obj_3, u1_s1): with scope(space=obj_tree_1.space): + # for some reason the 'path' attribute changes between the factory and the test when using both obj_tree and obj + obj_tree_1 = Food.objects.get(id=obj_tree_1.id) parent = obj_tree_1.get_parent() - child = obj_tree_1.get_descendants()[0] obj_2.move(parent, node_location) + obj_2 = Food.objects.get(id=obj_2.id) + parent = Food.objects.get(id=parent.id) + # should return full tree starting at parent (obj_tree_1, obj_2), ignoring query filters - response = json.loads(u1_s1.get(f'{reverse(LIST_URL)}?tree={parent.id}').content) + response = json.loads( + u1_s1.get(f'{reverse(LIST_URL)}?tree={parent.id}').content) assert response['count'] == 4 - response = json.loads(u1_s1.get(f'{reverse(LIST_URL)}?tree={parent.id}&query={obj_2.name[4:]}').content) + response = json.loads(u1_s1.get( + f'{reverse(LIST_URL)}?tree={parent.id}&query={obj_2.name[4:]}').content) assert response['count'] == 4 # This is more about the model than the API - should this be moved to a different test? @pytest.mark.parametrize("obj_tree_1, field, inherit, new_val", [ - ({'has_category': True, 'inherit': True}, 'supermarket_category', True, 'cat_1'), - ({'has_category': True, 'inherit': False}, 'supermarket_category', False, 'cat_1'), - ({'ignore_shopping': True, 'inherit': True}, 'ignore_shopping', True, 'false'), - ({'ignore_shopping': True, 'inherit': False}, 'ignore_shopping', False, 'false'), - ({'substitute_children': True, 'inherit': True}, 'substitute_children', True, 'false'), - ({'substitute_children': True, 'inherit': False}, 'substitute_children', False, 'false'), - ({'substitute_siblings': True, 'inherit': True}, 'substitute_siblings', True, 'false'), - ({'substitute_siblings': True, 'inherit': False}, 'substitute_siblings', False, 'false'), + ({'has_category': True, 'inherit': True}, + 'supermarket_category', True, 'cat_1'), + ({'has_category': True, 'inherit': False}, + 'supermarket_category', False, 'cat_1'), + ({'ignore_shopping': True, 'inherit': True}, 'ignore_shopping', True, 'false'), + ({'ignore_shopping': True, 'inherit': False}, + 'ignore_shopping', False, 'false'), + ({'substitute_children': True, 'inherit': True}, + 'substitute_children', True, 'false'), + ({'substitute_children': True, 'inherit': False}, + 'substitute_children', False, 'false'), + ({'substitute_siblings': True, 'inherit': True}, + 'substitute_siblings', True, 'false'), + ({'substitute_siblings': True, 'inherit': False}, + 'substitute_siblings', False, 'false'), ], indirect=['obj_tree_1']) # indirect=True populates magic variable request.param of obj_tree_1 with the parameter def test_inherit(request, obj_tree_1, field, inherit, new_val, u1_s1): with scope(space=obj_tree_1.space): @@ -498,8 +539,10 @@ def test_inherit(request, obj_tree_1, field, inherit, new_val, u1_s1): new_val = request.getfixturevalue(new_val) # if this test passes it demonstrates that inheritance works # when moving to a parent as each food is created with a different category - assert (getattr(parent, field) == getattr(obj_tree_1, field)) in [inherit, True] - assert (getattr(obj_tree_1, field) == getattr(child, field)) in [inherit, True] + assert (getattr(parent, field) == getattr( + obj_tree_1, field)) in [inherit, True] + assert (getattr(obj_tree_1, field) == getattr( + child, field)) in [inherit, True] # change parent to a new value setattr(parent, field, new_val) with scope(space=parent.space): @@ -515,7 +558,8 @@ def test_inherit(request, obj_tree_1, field, inherit, new_val, u1_s1): @pytest.mark.parametrize("obj_tree_1", [ - ({'has_category': True, 'inherit': False, 'ignore_shopping': True, 'substitute_children': True, 'substitute_siblings': True}), + ({'has_category': True, 'inherit': False, 'ignore_shopping': True, + 'substitute_children': True, 'substitute_siblings': True}), ], indirect=['obj_tree_1']) @pytest.mark.parametrize("global_reset", [True, False]) @pytest.mark.parametrize("field", ['ignore_shopping', 'substitute_children', 'substitute_siblings', 'supermarket_category']) @@ -534,10 +578,13 @@ def test_reset_inherit_space_fields(obj_tree_1, space_1, global_reset, field): assert getattr(parent, field) != getattr(obj_tree_1, field) if global_reset: - space_1.food_inherit.add(*Food.inheritable_fields.values_list('id', flat=True)) # set default inherit fields + # set default inherit fields + space_1.food_inherit.add( + *Food.inheritable_fields.values_list('id', flat=True)) parent.reset_inheritance(space=space_1) else: - obj_tree_1.child_inherit_fields.set(Food.inheritable_fields.values_list('id', flat=True)) + obj_tree_1.child_inherit_fields.set( + Food.inheritable_fields.values_list('id', flat=True)) obj_tree_1.save() parent.reset_inheritance(space=space_1, food=obj_tree_1) # djangotree bypasses ORM and need to be retrieved again @@ -545,12 +592,14 @@ def test_reset_inherit_space_fields(obj_tree_1, space_1, global_reset, field): parent = Food.objects.get(id=parent.id) child = Food.objects.get(id=child.id) - assert (getattr(parent, field) == getattr(obj_tree_1, field)) == global_reset + assert (getattr(parent, field) == getattr( + obj_tree_1, field)) == global_reset assert getattr(obj_tree_1, field) == getattr(child, field) @pytest.mark.parametrize("obj_tree_1", [ - ({'has_category': True, 'inherit': False, 'ignore_shopping': True, 'substitute_children': True, 'substitute_siblings': True}), + ({'has_category': True, 'inherit': False, 'ignore_shopping': True, + 'substitute_children': True, 'substitute_siblings': True}), ], indirect=['obj_tree_1']) @pytest.mark.parametrize("field", ['ignore_shopping', 'substitute_children', 'substitute_siblings', 'supermarket_category']) def test_reset_inherit_no_food_instances(obj_tree_1, space_1, field): @@ -558,13 +607,17 @@ def test_reset_inherit_no_food_instances(obj_tree_1, space_1, field): parent = obj_tree_1.get_parent() Food.objects.all().delete() - space_1.food_inherit.add(*Food.inheritable_fields.values_list('id', flat=True)) # set default inherit fields + # set default inherit fields + space_1.food_inherit.add( + *Food.inheritable_fields.values_list('id', flat=True)) parent.reset_inheritance(space=space_1) def test_onhand(obj_1, u1_s1, u2_s1): - assert json.loads(u1_s1.get(reverse(DETAIL_URL, args={obj_1.id})).content)['food_onhand'] == False - assert json.loads(u2_s1.get(reverse(DETAIL_URL, args={obj_1.id})).content)['food_onhand'] == False + assert json.loads(u1_s1.get(reverse(DETAIL_URL, args={obj_1.id})).content)[ + 'food_onhand'] == False + assert json.loads(u2_s1.get(reverse(DETAIL_URL, args={obj_1.id})).content)[ + 'food_onhand'] == False u1_s1.patch( reverse( @@ -574,10 +627,13 @@ def test_onhand(obj_1, u1_s1, u2_s1): {'food_onhand': True}, content_type='application/json' ) - assert json.loads(u1_s1.get(reverse(DETAIL_URL, args={obj_1.id})).content)['food_onhand'] == True - assert json.loads(u2_s1.get(reverse(DETAIL_URL, args={obj_1.id})).content)['food_onhand'] == False + assert json.loads(u1_s1.get(reverse(DETAIL_URL, args={obj_1.id})).content)[ + 'food_onhand'] == True + assert json.loads(u2_s1.get(reverse(DETAIL_URL, args={obj_1.id})).content)[ + 'food_onhand'] == False user1 = auth.get_user(u1_s1) user2 = auth.get_user(u2_s1) user1.userpreference.shopping_share.add(user2) - assert json.loads(u2_s1.get(reverse(DETAIL_URL, args={obj_1.id})).content)['food_onhand'] == True + assert json.loads(u2_s1.get(reverse(DETAIL_URL, args={obj_1.id})).content)[ + 'food_onhand'] == True diff --git a/cookbook/tests/api/test_api_shopping_recipe.py b/cookbook/tests/api/test_api_shopping_recipe.py index 376f5fef7..56f35683a 100644 --- a/cookbook/tests/api/test_api_shopping_recipe.py +++ b/cookbook/tests/api/test_api_shopping_recipe.py @@ -1,20 +1,14 @@ import json -from datetime import timedelta -import factory import pytest # work around for bug described here https://stackoverflow.com/a/70312265/15762829 from django.conf import settings from django.contrib import auth -from django.forms import model_to_dict from django.urls import reverse -from django.utils import timezone -from django_scopes import scope, scopes_disabled -from pytest_factoryboy import LazyFixture, register +from django_scopes import scopes_disabled -from cookbook.models import Food, Ingredient, ShoppingListEntry, Step -from cookbook.tests.factories import (IngredientFactory, MealPlanFactory, RecipeFactory, - StepFactory, UserFactory) +from cookbook.models import Food, Ingredient +from cookbook.tests.factories import MealPlanFactory, RecipeFactory, StepFactory, UserFactory if settings.DATABASES['default']['ENGINE'] in ['django.db.backends.postgresql_psycopg2', 'django.db.backends.postgresql']: @@ -32,9 +26,12 @@ def user2(request, u1_s1): except AttributeError: params = {} user = auth.get_user(u1_s1) - user.userpreference.mealplan_autoadd_shopping = params.get('mealplan_autoadd_shopping', True) - user.userpreference.mealplan_autoinclude_related = params.get('mealplan_autoinclude_related', True) - user.userpreference.mealplan_autoexclude_onhand = params.get('mealplan_autoexclude_onhand', True) + user.userpreference.mealplan_autoadd_shopping = params.get( + 'mealplan_autoadd_shopping', True) + user.userpreference.mealplan_autoinclude_related = params.get( + 'mealplan_autoinclude_related', True) + user.userpreference.mealplan_autoexclude_onhand = params.get( + 'mealplan_autoexclude_onhand', True) user.userpreference.save() return u1_s1 @@ -50,7 +47,6 @@ def recipe(request, space_1, u1_s1): return RecipeFactory(**params) - @pytest.mark.parametrize("arg", [ ['g1_s1', 204], ['u1_s1', 204], @@ -59,11 +55,14 @@ def recipe(request, space_1, u1_s1): ]) @pytest.mark.parametrize("recipe, sle_count", [ ({}, 10), - ({'steps__recipe_count': 1}, 20), # shopping list from recipe with StepRecipe - ({'steps__food_recipe_count': {'step': 0, 'count': 1}}, 19), # shopping list from recipe with food recipe - ({'steps__food_recipe_count': {'step': 0, 'count': 1}, 'steps__recipe_count': 1}, 29), # shopping list from recipe with StepRecipe and food recipe + # shopping list from recipe with StepRecipe + ({'steps__recipe_count': 1}, 20), + # shopping list from recipe with food recipe + ({'steps__food_recipe_count': {'step': 0, 'count': 1}}, 19), + # shopping list from recipe with StepRecipe and food recipe + ({'steps__food_recipe_count': {'step': 0, 'count': 1}, 'steps__recipe_count': 1}, 29), ], indirect=['recipe']) -def test_shopping_recipe_method(request, arg, recipe, sle_count, u1_s1, u2_s1): +def test_shopping_recipe_method(request, arg, recipe, sle_count, u1_s1, u2_s1): c = request.getfixturevalue(arg[0]) user = auth.get_user(c) user.userpreference.mealplan_autoadd_shopping = True @@ -78,16 +77,20 @@ def test_shopping_recipe_method(request, arg, recipe, sle_count, u1_s1, u2_s1): if r.status_code == 204: # skip anonymous user r = json.loads(c.get(reverse(SHOPPING_LIST_URL)).content) - assert len(r) == sle_count # recipe factory creates 10 ingredients by default + # recipe factory creates 10 ingredients by default + assert len(r) == sle_count assert [x['created_by']['id'] for x in r].count(user.id) == sle_count # user in space can't see shopping list - assert len(json.loads(u2_s1.get(reverse(SHOPPING_LIST_URL)).content)) == 0 + assert len(json.loads( + u2_s1.get(reverse(SHOPPING_LIST_URL)).content)) == 0 user.userpreference.shopping_share.add(auth.get_user(u2_s1)) # after share, user in space can see shopping list - assert len(json.loads(u2_s1.get(reverse(SHOPPING_LIST_URL)).content)) == sle_count + assert len(json.loads( + u2_s1.get(reverse(SHOPPING_LIST_URL)).content)) == sle_count # confirm that the author of the recipe doesn't have access to shopping list if c != u1_s1: - assert len(json.loads(u1_s1.get(reverse(SHOPPING_LIST_URL)).content)) == 0 + assert len(json.loads( + u1_s1.get(reverse(SHOPPING_LIST_URL)).content)) == 0 r = c.get(url) assert r.status_code == 405 @@ -99,9 +102,12 @@ def test_shopping_recipe_method(request, arg, recipe, sle_count, u1_s1, u2_s1): @pytest.mark.parametrize("recipe, sle_count", [ ({}, 10), - ({'steps__recipe_count': 1}, 20), # shopping list from recipe with StepRecipe - ({'steps__food_recipe_count': {'step': 0, 'count': 1}}, 19), # shopping list from recipe with food recipe - ({'steps__food_recipe_count': {'step': 0, 'count': 1}, 'steps__recipe_count': 1}, 29), # shopping list from recipe with StepRecipe and food recipe + # shopping list from recipe with StepRecipe + ({'steps__recipe_count': 1}, 20), + # shopping list from recipe with food recipe + ({'steps__food_recipe_count': {'step': 0, 'count': 1}}, 19), + # shopping list from recipe with StepRecipe and food recipe + ({'steps__food_recipe_count': {'step': 0, 'count': 1}, 'steps__recipe_count': 1}, 29), ], indirect=['recipe']) @pytest.mark.parametrize("use_mealplan", [(False), (True), ]) def test_shopping_recipe_edit(request, recipe, sle_count, use_mealplan, u1_s1, u2_s1): @@ -115,31 +121,33 @@ def test_shopping_recipe_edit(request, recipe, sle_count, use_mealplan, u1_s1, u user.userpreference.save() if use_mealplan: - mealplan = MealPlanFactory(space=recipe.space, created_by=user, servings=recipe.servings, recipe=recipe) + mealplan = MealPlanFactory( + space=recipe.space, created_by=user, servings=recipe.servings, recipe=recipe) else: u1_s1.put(reverse(SHOPPING_RECIPE_URL, args={recipe.id})) r = json.loads(u1_s1.get(reverse(SHOPPING_LIST_URL)).content) assert [x['created_by']['id'] for x in r].count(user.id) == sle_count all_ing = [x['ingredient'] for x in r] keep_ing = all_ing[1:-1] # remove first and last element - del keep_ing[int(len(keep_ing)/2)] # remove a middle element + del keep_ing[int(len(keep_ing) / 2)] # remove a middle element list_recipe = r[0]['list_recipe'] amount_sum = sum([x['amount'] for x in r]) # test modifying shopping list as different user # test increasing servings size of recipe shopping list if use_mealplan: - mealplan.servings = 2*recipe.servings + mealplan.servings = 2 * recipe.servings mealplan.save() else: u2_s1.put(reverse(SHOPPING_RECIPE_URL, args={recipe.id}), - {'list_recipe': list_recipe, 'servings': 2*recipe.servings}, + {'list_recipe': list_recipe, 'servings': 2 * recipe.servings}, content_type='application/json' ) r = json.loads(u1_s1.get(reverse(SHOPPING_LIST_URL)).content) assert sum([x['amount'] for x in r]) == amount_sum * 2 assert len(r) == sle_count - assert len(json.loads(u2_s1.get(reverse(SHOPPING_LIST_URL)).content)) == sle_count + assert len(json.loads( + u2_s1.get(reverse(SHOPPING_LIST_URL)).content)) == sle_count # testing decreasing servings size of recipe shopping list if use_mealplan: @@ -153,7 +161,8 @@ def test_shopping_recipe_edit(request, recipe, sle_count, use_mealplan, u1_s1, u r = json.loads(u1_s1.get(reverse(SHOPPING_LIST_URL)).content) assert sum([x['amount'] for x in r]) == amount_sum * .5 assert len(r) == sle_count - assert len(json.loads(u2_s1.get(reverse(SHOPPING_LIST_URL)).content)) == sle_count + assert len(json.loads( + u2_s1.get(reverse(SHOPPING_LIST_URL)).content)) == sle_count # test removing 3 items from shopping list u2_s1.put(reverse(SHOPPING_RECIPE_URL, args={recipe.id}), @@ -162,7 +171,8 @@ def test_shopping_recipe_edit(request, recipe, sle_count, use_mealplan, u1_s1, u ) r = json.loads(u1_s1.get(reverse(SHOPPING_LIST_URL)).content) assert len(r) == sle_count - 3 - assert len(json.loads(u2_s1.get(reverse(SHOPPING_LIST_URL)).content)) == sle_count - 3 + assert len(json.loads( + u2_s1.get(reverse(SHOPPING_LIST_URL)).content)) == sle_count - 3 # add all ingredients to existing shopping list - don't change serving size u2_s1.put(reverse(SHOPPING_RECIPE_URL, args={recipe.id}), @@ -172,14 +182,16 @@ def test_shopping_recipe_edit(request, recipe, sle_count, use_mealplan, u1_s1, u r = json.loads(u1_s1.get(reverse(SHOPPING_LIST_URL)).content) assert sum([x['amount'] for x in r]) == amount_sum * .5 assert len(r) == sle_count - assert len(json.loads(u2_s1.get(reverse(SHOPPING_LIST_URL)).content)) == sle_count + assert len(json.loads( + u2_s1.get(reverse(SHOPPING_LIST_URL)).content)) == sle_count @pytest.mark.parametrize("user2, sle_count", [ ({'mealplan_autoadd_shopping': False}, (0, 18)), ({'mealplan_autoinclude_related': False}, (9, 9)), ({'mealplan_autoexclude_onhand': False}, (20, 20)), - ({'mealplan_autoexclude_onhand': False, 'mealplan_autoinclude_related': False}, (10, 10)), + ({'mealplan_autoexclude_onhand': False, + 'mealplan_autoinclude_related': False}, (10, 10)), ], indirect=['user2']) @pytest.mark.parametrize("use_mealplan", [(False), (True), ]) @pytest.mark.parametrize("recipe", [({'steps__recipe_count': 1})], indirect=['recipe']) @@ -191,20 +203,24 @@ def test_shopping_recipe_userpreference(recipe, sle_count, use_mealplan, user2): food = Food.objects.get(id=ingredients[2].food.id) food.onhand_users.add(user) food.save() - food = recipe.steps.exclude(step_recipe=None).first().step_recipe.steps.first().ingredients.first().food + food = recipe.steps.exclude(step_recipe=None).first( + ).step_recipe.steps.first().ingredients.first().food food = Food.objects.get(id=food.id) food.onhand_users.add(user) food.save() if use_mealplan: - mealplan = MealPlanFactory(space=recipe.space, created_by=user, servings=recipe.servings, recipe=recipe) - assert len(json.loads(user2.get(reverse(SHOPPING_LIST_URL)).content)) == sle_count[0] + MealPlanFactory( + space=recipe.space, created_by=user, servings=recipe.servings, recipe=recipe) + assert len(json.loads( + user2.get(reverse(SHOPPING_LIST_URL)).content)) == sle_count[0] else: user2.put(reverse(SHOPPING_RECIPE_URL, args={recipe.id})) - assert len(json.loads(user2.get(reverse(SHOPPING_LIST_URL)).content)) == sle_count[1] + assert len(json.loads( + user2.get(reverse(SHOPPING_LIST_URL)).content)) == sle_count[1] -def test_shopping_recipe_mixed_authors(u1_s1, u2_s1,space_1): +def test_shopping_recipe_mixed_authors(u1_s1, u2_s1, space_1): with scopes_disabled(): user1 = auth.get_user(u1_s1) user2 = auth.get_user(u2_s1) @@ -213,15 +229,19 @@ def test_shopping_recipe_mixed_authors(u1_s1, u2_s1,space_1): recipe1 = RecipeFactory(created_by=user1, space=space) recipe2 = RecipeFactory(created_by=user2, space=space) recipe3 = RecipeFactory(created_by=user3, space=space) - food = Food.objects.get(id=recipe1.steps.first().ingredients.first().food.id) + food = Food.objects.get( + id=recipe1.steps.first().ingredients.first().food.id) food.recipe = recipe2 food.save() - recipe1.steps.add(StepFactory(step_recipe=recipe3, ingredients__count=0, space=space)) + recipe1.steps.add(StepFactory(step_recipe=recipe3, + ingredients__count=0, space=space)) recipe1.save() u1_s1.put(reverse(SHOPPING_RECIPE_URL, args={recipe1.id})) - assert len(json.loads(u1_s1.get(reverse(SHOPPING_LIST_URL)).content)) == 29 - assert len(json.loads(u2_s1.get(reverse(SHOPPING_LIST_URL)).content)) == 0 + assert len(json.loads( + u1_s1.get(reverse(SHOPPING_LIST_URL)).content)) == 29 + assert len(json.loads( + u2_s1.get(reverse(SHOPPING_LIST_URL)).content)) == 0 @pytest.mark.parametrize("recipe", [{'steps__ingredients__header': 1}], indirect=['recipe']) @@ -230,4 +250,5 @@ def test_shopping_with_header_ingredient(u1_s1, recipe): # recipe.step_set.first().ingredient_set.add(IngredientFactory(ingredients__header=1)) u1_s1.put(reverse(SHOPPING_RECIPE_URL, args={recipe.id})) assert len(json.loads(u1_s1.get(reverse(SHOPPING_LIST_URL)).content)) == 10 - assert len(json.loads(u1_s1.get(reverse('api:ingredient-list')).content)['results']) == 11 + assert len(json.loads( + u1_s1.get(reverse('api:ingredient-list')).content)['results']) == 11 diff --git a/cookbook/tests/conftest.py b/cookbook/tests/conftest.py index 2cfe75415..85f33145d 100644 --- a/cookbook/tests/conftest.py +++ b/cookbook/tests/conftest.py @@ -5,12 +5,11 @@ import uuid import pytest from django.contrib import auth -from django.contrib.auth.models import Group, User from django_scopes import scopes_disabled -from pytest_factoryboy import LazyFixture, register +from pytest_factoryboy import register -from cookbook.models import Food, Ingredient, Recipe, Space, Step, Unit -from cookbook.tests.factories import FoodFactory, SpaceFactory, UserFactory +from cookbook.models import Food, Ingredient, Recipe, Step, Unit +from cookbook.tests.factories import SpaceFactory, UserFactory register(SpaceFactory, 'space_1') register(SpaceFactory, 'space_2') @@ -60,8 +59,10 @@ def get_random_recipe(space_1, u1_s1): internal=True, ) - s1 = Step.objects.create(name=str(uuid.uuid4()), instruction=str(uuid.uuid4()), space=space_1, ) - s2 = Step.objects.create(name=str(uuid.uuid4()), instruction=str(uuid.uuid4()), space=space_1, ) + s1 = Step.objects.create(name=str(uuid.uuid4()), + instruction=str(uuid.uuid4()), space=space_1, ) + s2 = Step.objects.create(name=str(uuid.uuid4()), + instruction=str(uuid.uuid4()), space=space_1, ) r.steps.add(s1) r.steps.add(s2) @@ -70,8 +71,10 @@ def get_random_recipe(space_1, u1_s1): s1.ingredients.add( Ingredient.objects.create( amount=1, - food=Food.objects.get_or_create(name=str(uuid.uuid4()), space=space_1)[0], - unit=Unit.objects.create(name=str(uuid.uuid4()), space=space_1, ), + food=Food.objects.get_or_create( + name=str(uuid.uuid4()), space=space_1)[0], + unit=Unit.objects.create( + name=str(uuid.uuid4()), space=space_1, ), note=str(uuid.uuid4()), space=space_1, ) @@ -80,8 +83,10 @@ def get_random_recipe(space_1, u1_s1): s2.ingredients.add( Ingredient.objects.create( amount=1, - food=Food.objects.get_or_create(name=str(uuid.uuid4()), space=space_1)[0], - unit=Unit.objects.create(name=str(uuid.uuid4()), space=space_1, ), + food=Food.objects.get_or_create( + name=str(uuid.uuid4()), space=space_1)[0], + unit=Unit.objects.create( + name=str(uuid.uuid4()), space=space_1, ), note=str(uuid.uuid4()), space=space_1, ) @@ -99,8 +104,10 @@ def get_random_json_recipe(): { "instruction": str(uuid.uuid4()), "ingredients": [ - {"food": {"name": str(uuid.uuid4())}, "unit": {"name": str(uuid.uuid4())}, "amount": random.randint(0, 10)}, - {"food": {"name": str(uuid.uuid4())}, "unit": {"name": str(uuid.uuid4())}, "amount": random.randint(0, 10)}, + {"food": {"name": str(uuid.uuid4())}, "unit": {"name": str( + uuid.uuid4())}, "amount": random.randint(0, 10)}, + {"food": {"name": str(uuid.uuid4())}, "unit": {"name": str( + uuid.uuid4())}, "amount": random.randint(0, 10)}, ], } ], @@ -133,7 +140,8 @@ def validate_recipe(expected, recipe): for key in expected_lists: for k in expected_lists[key]: try: - print('comparing ', any([dict_compare(k, i) for i in target_lists[key]])) + print('comparing ', any([dict_compare(k, i) + for i in target_lists[key]])) assert any([dict_compare(k, i) for i in target_lists[key]]) except AssertionError: for result in [dict_compare(k, i, details=True) for i in target_lists[key]]: @@ -152,7 +160,8 @@ def dict_compare(d1, d2, details=False): added = d1_keys - d2_keys removed = d2_keys - d1_keys modified = {o: (d1[o], d2[o]) for o in not_dicts if d1[o] != d2[o]} - modified_dicts = {o: (d1[o], d2[o]) for o in sub_dicts if not d1[o].items() <= d2[o].items()} + modified_dicts = {o: (d1[o], d2[o]) + for o in sub_dicts if not d1[o].items() <= d2[o].items()} if details: return added, removed, modified, modified_dicts else: @@ -173,12 +182,12 @@ def transpose(text, number=2): positions = random.sample(range(len(tokens[token_pos])), number) # swap the positions - l = list(tokens[token_pos]) + lt = list(tokens[token_pos]) for first, second in zip(positions[::2], positions[1::2]): - l[first], l[second] = l[second], l[first] + lt[first], lt[second] = lt[second], lt[first] # replace original tokens with swapped - tokens[token_pos] = ''.join(l) + tokens[token_pos] = ''.join(lt) # return text with the swapped token return ' '.join(tokens) diff --git a/cookbook/tests/factories/__init__.py b/cookbook/tests/factories/__init__.py index 651d9da04..2f740cf99 100644 --- a/cookbook/tests/factories/__init__.py +++ b/cookbook/tests/factories/__init__.py @@ -4,13 +4,12 @@ from decimal import Decimal import factory import pytest -from django.contrib import auth from django.contrib.auth.models import Group, User from django_scopes import scopes_disabled from faker import Factory as FakerFactory from pytest_factoryboy import register -from cookbook.models import Recipe, Step, UserSpace +from cookbook.models import UserSpace # this code will run immediately prior to creating the model object useful when you want a reverse relationship # log = factory.RelatedFactory( @@ -53,7 +52,8 @@ class SpaceFactory(factory.django.DjangoModelFactory): class UserFactory(factory.django.DjangoModelFactory): """User factory.""" - username = factory.LazyAttribute(lambda x: faker.simple_profile()['username']) + username = factory.LazyAttribute( + lambda x: faker.simple_profile()['username']) first_name = factory.LazyAttribute(lambda x: faker.first_name()) last_name = factory.LazyAttribute(lambda x: faker.last_name()) email = factory.LazyAttribute(lambda x: faker.email()) @@ -65,7 +65,8 @@ class UserFactory(factory.django.DjangoModelFactory): return if extracted: - us = UserSpace.objects.create(space=self.space, user=self, active=True) + us = UserSpace.objects.create( + space=self.space, user=self, active=True) us.groups.add(Group.objects.get(name=extracted)) @factory.post_generation @@ -75,10 +76,12 @@ class UserFactory(factory.django.DjangoModelFactory): if extracted: for prefs in extracted: - self.userpreference[prefs] = extracted[prefs]/0 # intentionally break so it can be debugged later + # intentionally break so it can be debugged later + self.userpreference[prefs] = extracted[prefs] / 0 class Meta: model = User + django_get_or_create = ('username', 'space',) @register @@ -97,19 +100,23 @@ class SupermarketCategoryFactory(factory.django.DjangoModelFactory): @register class FoodFactory(factory.django.DjangoModelFactory): """Food factory.""" - name = factory.LazyAttribute(lambda x: faker.sentence(nb_words=3, variable_nb_words=False)) - plural_name = factory.LazyAttribute(lambda x: faker.sentence(nb_words=3, variable_nb_words=False)) + name = factory.LazyAttribute(lambda x: faker.sentence(nb_words=10)[:128]) + plural_name = factory.LazyAttribute( + lambda x: faker.sentence(nb_words=3, variable_nb_words=False)) description = factory.LazyAttribute(lambda x: faker.sentence(nb_words=10)) supermarket_category = factory.Maybe( - factory.LazyAttribute(lambda x: x.has_category), - yes_declaration=factory.SubFactory(SupermarketCategoryFactory, space=factory.SelfAttribute('..space')), + factory.LazyAttribute(lambda x: x.has_category), + yes_declaration=factory.SubFactory( + SupermarketCategoryFactory, space=factory.SelfAttribute('..space')), no_declaration=None ) recipe = factory.Maybe( - factory.LazyAttribute(lambda x: x.has_recipe), - yes_declaration=factory.SubFactory('cookbook.tests.factories.RecipeFactory', space=factory.SelfAttribute('..space')), + factory.LazyAttribute(lambda x: x.has_recipe), + yes_declaration=factory.SubFactory( + 'cookbook.tests.factories.RecipeFactory', space=factory.SelfAttribute('..space')), no_declaration=None ) + path = factory.LazyAttribute(lambda x: faker.numerify(text='%###')) space = factory.SubFactory(SpaceFactory) @factory.post_generation @@ -127,17 +134,19 @@ class FoodFactory(factory.django.DjangoModelFactory): class Meta: model = 'cookbook.Food' - django_get_or_create = ('name', 'plural_name', 'space',) + django_get_or_create = ('name', 'plural_name', 'path', 'space',) @register class RecipeBookFactory(factory.django.DjangoModelFactory): """RecipeBook factory.""" - name = factory.LazyAttribute(lambda x: faker.sentence(nb_words=3, variable_nb_words=False)) + name = factory.LazyAttribute(lambda x: faker.sentence( + nb_words=3, variable_nb_words=False)) description = factory.LazyAttribute(lambda x: faker.sentence(nb_words=10)) icon = None # shared = factory.SubFactory(UserFactory, space=factory.SelfAttribute('..space')) - created_by = factory.SubFactory(UserFactory, space=factory.SelfAttribute('..space')) + created_by = factory.SubFactory( + UserFactory, space=factory.SelfAttribute('..space')) filter = None space = factory.SubFactory(SpaceFactory) @@ -149,7 +158,8 @@ class RecipeBookFactory(factory.django.DjangoModelFactory): @register class RecipeBookEntryFactory(factory.django.DjangoModelFactory): """RecipeBookEntry factory.""" - book = factory.SubFactory(RecipeBookFactory, space=factory.SelfAttribute('..recipe.space')) + book = factory.SubFactory( + RecipeBookFactory, space=factory.SelfAttribute('..recipe.space')) recipe = None class Meta: @@ -160,7 +170,7 @@ class RecipeBookEntryFactory(factory.django.DjangoModelFactory): @register class UnitFactory(factory.django.DjangoModelFactory): """Unit factory.""" - name = factory.LazyAttribute(lambda x: faker.word()) + name = factory.LazyAttribute(lambda x: faker.sentence(nb_words=10)[:128]) plural_name = factory.LazyAttribute(lambda x: faker.word()) description = factory.LazyAttribute(lambda x: faker.sentence(nb_words=10)) space = factory.SubFactory(SpaceFactory) @@ -173,7 +183,8 @@ class UnitFactory(factory.django.DjangoModelFactory): @register class KeywordFactory(factory.django.DjangoModelFactory): """Keyword factory.""" - name = factory.LazyAttribute(lambda x: faker.sentence(nb_words=2, variable_nb_words=False)) + name = factory.LazyAttribute(lambda x: faker.sentence( + nb_words=2, variable_nb_words=False)) # icon = models.CharField(max_length=16, blank=True, null=True) description = factory.LazyAttribute(lambda x: faker.sentence(nb_words=10)) space = factory.SubFactory(SpaceFactory) @@ -184,15 +195,17 @@ class KeywordFactory(factory.django.DjangoModelFactory): class Meta: model = 'cookbook.Keyword' - django_get_or_create = ('name', 'space',) + django_get_or_create = ('name', 'space') exclude = ('num') @register class IngredientFactory(factory.django.DjangoModelFactory): """Ingredient factory.""" - food = factory.SubFactory(FoodFactory, space=factory.SelfAttribute('..space')) - unit = factory.SubFactory(UnitFactory, space=factory.SelfAttribute('..space')) + food = factory.SubFactory( + FoodFactory, space=factory.SelfAttribute('..space')) + unit = factory.SubFactory( + UnitFactory, space=factory.SelfAttribute('..space')) amount = factory.LazyAttribute(lambda x: faker.random_int(min=1, max=10)) note = factory.LazyAttribute(lambda x: faker.sentence(nb_words=8)) is_header = False @@ -210,7 +223,8 @@ class MealTypeFactory(factory.django.DjangoModelFactory): # icon = color = factory.LazyAttribute(lambda x: faker.safe_hex_color()) default = False - created_by = factory.SubFactory(UserFactory, space=factory.SelfAttribute('..space')) + created_by = factory.SubFactory( + UserFactory, space=factory.SelfAttribute('..space')) space = factory.SubFactory(SpaceFactory) class Meta: @@ -220,14 +234,18 @@ class MealTypeFactory(factory.django.DjangoModelFactory): @register class MealPlanFactory(factory.django.DjangoModelFactory): recipe = factory.Maybe( - factory.LazyAttribute(lambda x: x.has_recipe), - yes_declaration=factory.SubFactory('cookbook.tests.factories.RecipeFactory', space=factory.SelfAttribute('..space')), + factory.LazyAttribute(lambda x: x.has_recipe), + yes_declaration=factory.SubFactory( + 'cookbook.tests.factories.RecipeFactory', space=factory.SelfAttribute('..space')), no_declaration=None ) - servings = factory.LazyAttribute(lambda x: Decimal(faker.random_int(min=1, max=1000)/100)) + servings = factory.LazyAttribute( + lambda x: Decimal(faker.random_int(min=1, max=1000) / 100)) title = factory.LazyAttribute(lambda x: faker.sentence(nb_words=5)) - created_by = factory.SubFactory(UserFactory, space=factory.SelfAttribute('..space')) - meal_type = factory.SubFactory(MealTypeFactory, space=factory.SelfAttribute('..space')) + created_by = factory.SubFactory( + UserFactory, space=factory.SelfAttribute('..space')) + meal_type = factory.SubFactory( + MealTypeFactory, space=factory.SelfAttribute('..space')) note = factory.LazyAttribute(lambda x: faker.paragraph()) date = factory.LazyAttribute(lambda x: faker.future_date()) space = factory.SubFactory(SpaceFactory) @@ -243,12 +261,14 @@ class MealPlanFactory(factory.django.DjangoModelFactory): class ShoppingListRecipeFactory(factory.django.DjangoModelFactory): name = factory.LazyAttribute(lambda x: faker.sentence(nb_words=5)) recipe = factory.Maybe( - factory.LazyAttribute(lambda x: x.has_recipe), - yes_declaration=factory.SubFactory('cookbook.tests.factories.RecipeFactory', space=factory.SelfAttribute('..space')), + factory.LazyAttribute(lambda x: x.has_recipe), + yes_declaration=factory.SubFactory( + 'cookbook.tests.factories.RecipeFactory', space=factory.SelfAttribute('..space')), no_declaration=None ) servings = factory.LazyAttribute(lambda x: faker.random_int(min=1, max=10)) - mealplan = factory.SubFactory(MealPlanFactory, space=factory.SelfAttribute('..space')) + mealplan = factory.SubFactory( + MealPlanFactory, space=factory.SelfAttribute('..space')) space = factory.SubFactory(SpaceFactory) class Params: @@ -263,26 +283,33 @@ class ShoppingListEntryFactory(factory.django.DjangoModelFactory): """ShoppingListEntry factory.""" list_recipe = factory.Maybe( - factory.LazyAttribute(lambda x: x.has_mealplan), - yes_declaration=factory.SubFactory(ShoppingListRecipeFactory, space=factory.SelfAttribute('..space')), + factory.LazyAttribute(lambda x: x.has_mealplan), + yes_declaration=factory.SubFactory( + ShoppingListRecipeFactory, space=factory.SelfAttribute('..space')), no_declaration=None ) - food = factory.SubFactory(FoodFactory, space=factory.SelfAttribute('..space')) - unit = factory.SubFactory(UnitFactory, space=factory.SelfAttribute('..space')) + food = factory.SubFactory( + FoodFactory, space=factory.SelfAttribute('..space')) + unit = factory.SubFactory( + UnitFactory, space=factory.SelfAttribute('..space')) # # ingredient = factory.SubFactory(IngredientFactory) - amount = factory.LazyAttribute(lambda x: Decimal(faker.random_int(min=1, max=100))/10) + amount = factory.LazyAttribute( + lambda x: Decimal(faker.random_int(min=1, max=100)) / 10) order = factory.Sequence(int) checked = False - created_by = factory.SubFactory(UserFactory, space=factory.SelfAttribute('..space')) + created_by = factory.SubFactory( + UserFactory, space=factory.SelfAttribute('..space')) created_at = factory.LazyAttribute(lambda x: faker.past_date()) completed_at = None delay_until = None space = factory.SubFactory(SpaceFactory) @classmethod - def _create(cls, target_class, *args, **kwargs): # override create to prevent auto_add_now from changing the created_at date + # override create to prevent auto_add_now from changing the created_at date + def _create(cls, target_class, *args, **kwargs): created_at = kwargs.pop('created_at', None) - obj = super(ShoppingListEntryFactory, cls)._create(target_class, *args, **kwargs) + obj = super(ShoppingListEntryFactory, cls)._create( + target_class, *args, **kwargs) if created_at is not None: obj.created_at = created_at obj.save() @@ -298,7 +325,8 @@ class ShoppingListEntryFactory(factory.django.DjangoModelFactory): @register class StepFactory(factory.django.DjangoModelFactory): name = factory.LazyAttribute(lambda x: faker.sentence(nb_words=5)) - instruction = factory.LazyAttribute(lambda x: ''.join(faker.paragraphs(nb=5))) + instruction = factory.LazyAttribute( + lambda x: ''.join(faker.paragraphs(nb=5))) # TODO add optional recipe food, make dependent on recipe, make number of recipes a Params ingredients__count = 10 # default number of ingredients to add ingredients__header = 0 @@ -330,14 +358,16 @@ class StepFactory(factory.django.DjangoModelFactory): for i in range(num_ing): if num_food_recipe > 0: has_recipe = True - num_food_recipe = num_food_recipe-1 + num_food_recipe = num_food_recipe - 1 else: has_recipe = False - self.ingredients.add(IngredientFactory(space=self.space, food__has_recipe=has_recipe)) + self.ingredients.add(IngredientFactory( + space=self.space, food__has_recipe=has_recipe)) num_header = kwargs.get('header', 0) if num_header > 0: for i in range(num_header): - self.ingredients.add(IngredientFactory(food=None, unit=None, amount=0, is_header=True, space=self.space)) + self.ingredients.add(IngredientFactory( + food=None, unit=None, amount=0, is_header=True, space=self.space)) elif extracted: for ing in extracted: self.ingredients.add(ing) @@ -351,20 +381,27 @@ class RecipeFactory(factory.django.DjangoModelFactory): name = factory.LazyAttribute(lambda x: faker.sentence(nb_words=7)) description = factory.LazyAttribute(lambda x: faker.sentence(nb_words=10)) servings = factory.LazyAttribute(lambda x: faker.random_int(min=1, max=20)) - servings_text = factory.LazyAttribute(lambda x: faker.sentence(nb_words=1)) # TODO generate list of expected servings text that can be iterated through + # TODO generate list of expected servings text that can be iterated through + servings_text = factory.LazyAttribute(lambda x: faker.sentence(nb_words=1)) keywords__count = 5 # default number of keywords to generate steps__count = 1 # default number of steps to create steps__recipe_count = 0 # default number of step recipes to create - steps__food_recipe_count = {} # by default, don't create food recipes, to override {'steps__food_recipe_count': {'step': 0, 'count': 1}} - working_time = factory.LazyAttribute(lambda x: faker.random_int(min=0, max=360)) - waiting_time = factory.LazyAttribute(lambda x: faker.random_int(min=0, max=360)) + # by default, don't create food recipes, to override {'steps__food_recipe_count': {'step': 0, 'count': 1}} + steps__food_recipe_count = {} + working_time = factory.LazyAttribute( + lambda x: faker.random_int(min=0, max=360)) + waiting_time = factory.LazyAttribute( + lambda x: faker.random_int(min=0, max=360)) internal = False - created_by = factory.SubFactory(UserFactory, space=factory.SelfAttribute('..space')) - created_at = factory.LazyAttribute(lambda x: faker.date_between_dates(date_start=date(2000, 1, 1), date_end=date(2020, 12, 31))) + created_by = factory.SubFactory( + UserFactory, space=factory.SelfAttribute('..space')) + created_at = factory.LazyAttribute(lambda x: faker.date_between_dates( + date_start=date(2000, 1, 1), date_end=date(2020, 12, 31))) space = factory.SubFactory(SpaceFactory) @classmethod - def _create(cls, target_class, *args, **kwargs): # override create to prevent auto_add_now from changing the created_at date + # override create to prevent auto_add_now from changing the created_at date + def _create(cls, target_class, *args, **kwargs): created_at = kwargs.pop('created_at', None) # updated_at = kwargs.pop('updated_at', None) obj = super(RecipeFactory, cls)._create(target_class, *args, **kwargs) @@ -401,11 +438,13 @@ class RecipeFactory(factory.django.DjangoModelFactory): ing_recipe_count = 0 if food_recipe_count.get('step', None) == i: ing_recipe_count = food_recipe_count.get('count', 0) - self.steps.add(StepFactory(space=self.space, ingredients__food_recipe_count=ing_recipe_count, ingredients__header=num_ing_headers)) - num_ing_headers+-1 + self.steps.add(StepFactory( + space=self.space, ingredients__food_recipe_count=ing_recipe_count, ingredients__header=num_ing_headers)) + num_ing_headers + - 1 if num_recipe_steps > 0: for j in range(num_recipe_steps): - self.steps.add(StepFactory(space=self.space, step_recipe__has_recipe=True, ingredients__count=0)) + self.steps.add(StepFactory( + space=self.space, step_recipe__has_recipe=True, ingredients__count=0)) if extracted and (num_steps + num_recipe_steps == 0): for step in extracted: self.steps.add(step) @@ -428,15 +467,18 @@ class RecipeFactory(factory.django.DjangoModelFactory): @register class CookLogFactory(factory.django.DjangoModelFactory): """CookLog factory.""" - recipe = factory.SubFactory(RecipeFactory, space=factory.SelfAttribute('..space')) - created_by = factory.SubFactory(UserFactory, space=factory.SelfAttribute('..space')) + recipe = factory.SubFactory( + RecipeFactory, space=factory.SelfAttribute('..space')) + created_by = factory.SubFactory( + UserFactory, space=factory.SelfAttribute('..space')) created_at = factory.LazyAttribute(lambda x: faker.date_this_decade()) rating = factory.LazyAttribute(lambda x: faker.random_int(min=1, max=5)) servings = factory.LazyAttribute(lambda x: faker.random_int(min=1, max=32)) space = factory.SubFactory(SpaceFactory) @classmethod - def _create(cls, target_class, *args, **kwargs): # override create to prevent auto_add_now from changing the created_at date + # override create to prevent auto_add_now from changing the created_at date + def _create(cls, target_class, *args, **kwargs): created_at = kwargs.pop('created_at', None) obj = super(CookLogFactory, cls)._create(target_class, *args, **kwargs) if created_at is not None: @@ -451,13 +493,17 @@ class CookLogFactory(factory.django.DjangoModelFactory): @register class ViewLogFactory(factory.django.DjangoModelFactory): """ViewLog factory.""" - recipe = factory.SubFactory(RecipeFactory, space=factory.SelfAttribute('..space')) - created_by = factory.SubFactory(UserFactory, space=factory.SelfAttribute('..space')) - created_at = factory.LazyAttribute(lambda x: faker.past_datetime(start_date='-365d')) + recipe = factory.SubFactory( + RecipeFactory, space=factory.SelfAttribute('..space')) + created_by = factory.SubFactory( + UserFactory, space=factory.SelfAttribute('..space')) + created_at = factory.LazyAttribute( + lambda x: faker.past_datetime(start_date='-365d')) space = factory.SubFactory(SpaceFactory) @classmethod - def _create(cls, target_class, *args, **kwargs): # override create to prevent auto_add_now from changing the created_at date + # override create to prevent auto_add_now from changing the created_at date + def _create(cls, target_class, *args, **kwargs): created_at = kwargs.pop('created_at', None) obj = super(ViewLogFactory, cls)._create(target_class, *args, **kwargs) if created_at is not None: diff --git a/cookbook/tests/other/test_automations.py b/cookbook/tests/other/test_automations.py new file mode 100644 index 000000000..df908fdb0 --- /dev/null +++ b/cookbook/tests/other/test_automations.py @@ -0,0 +1,50 @@ +import pytest +from django.contrib import auth +from django.urls import reverse +from django_scopes import scopes_disabled + +from cookbook.forms import ImportExportBase +from cookbook.helper.ingredient_parser import IngredientParser +from cookbook.models import ExportLog, Automation +import json +import os + +import pytest +from django.urls import reverse + +from cookbook.tests.conftest import validate_recipe + +IMPORT_SOURCE_URL = 'api_recipe_from_source' + + +# for some reason this tests cant run due to some kind of encoding issue, needs to be fixed +# def test_description_replace_automation(u1_s1, space_1): +# if 'cookbook' in os.getcwd(): +# test_file = os.path.join(os.getcwd(), 'other', 'test_data', 'chefkoch2.html') +# else: +# test_file = os.path.join(os.getcwd(), 'cookbook', 'tests', 'other', 'test_data', 'chefkoch2.html') +# +# # original description +# # Brokkoli - Bratlinge. Über 91 Bewertungen und für vorzüglich befunden. Mit ► Portionsrechner ► Kochbuch ► Video-Tipps! Jetzt entdecken und ausprobieren! +# +# with scopes_disabled(): +# Automation.objects.create( +# name='test1', +# created_by=auth.get_user(u1_s1), +# space=space_1, +# param_1='.*', +# param_2='.*', +# param_3='', +# order=1000, +# ) +# +# with open(test_file, 'r', encoding='UTF-8') as d: +# response = u1_s1.post( +# reverse(IMPORT_SOURCE_URL), +# { +# 'data': d.read(), +# 'url': 'https://www.chefkoch.de/rezepte/804871184310070/Brokkoli-Bratlinge.html', +# }, +# content_type='application/json') +# recipe = json.loads(response.content)['recipe_json'] +# assert recipe['description'] == '' diff --git a/cookbook/tests/other/test_ingredient_parser.py b/cookbook/tests/other/test_ingredient_parser.py index 020d729dc..b64c04565 100644 --- a/cookbook/tests/other/test_ingredient_parser.py +++ b/cookbook/tests/other/test_ingredient_parser.py @@ -75,6 +75,8 @@ def test_ingredient_parser(): # an amount # and it starts with a lowercase letter, then that # is a unit ("etwas", "evtl.") does not apply to English tho + # TODO maybe add/improve support for weired stuff like this https://www.rainbownourishments.com/vegan-lemon-tart/#recipe + ingredient_parser = IngredientParser(None, False, ignore_automations=True) count = 0 diff --git a/cookbook/tests/other/test_makenow_filter.py b/cookbook/tests/other/test_makenow_filter.py index 4da5e092f..9e43df50b 100644 --- a/cookbook/tests/other/test_makenow_filter.py +++ b/cookbook/tests/other/test_makenow_filter.py @@ -11,6 +11,11 @@ from cookbook.tests.factories import FoodFactory, RecipeFactory # TODO returns recipes with all ingredients via child substitute # TODO returns recipes with all ingredients via sibling substitute +if (Food.node_order_by): + node_location = 'sorted-child' +else: + node_location = 'last-child' + @pytest.fixture def recipes(space_1): @@ -19,7 +24,8 @@ def recipes(space_1): @pytest.fixture def makenow_recipe(request, space_1): - onhand_user = auth.get_user(request.getfixturevalue(request.param.get('onhand_users', 'u1_s1'))) + onhand_user = auth.get_user(request.getfixturevalue( + request.param.get('onhand_users', 'u1_s1'))) recipe = RecipeFactory.create(space=space_1) for food in Food.objects.filter(ingredient__step__recipe=recipe.id): @@ -55,13 +61,16 @@ def test_makenow_ignoreshopping(recipes, makenow_recipe, user1, space_1): request = type('', (object,), {'space': space_1, 'user': user1})() search = RecipeSearch(request, makenow='true') with scope(space=space_1): - food = Food.objects.filter(ingredient__step__recipe=makenow_recipe.id).first() + food = Food.objects.filter( + ingredient__step__recipe=makenow_recipe.id).first() food.onhand_users.clear() assert search.get_queryset(Recipe.objects.all()).count() == 0 food.ignore_shopping = True food.save() - assert Food.objects.filter(ingredient__step__recipe=makenow_recipe.id, onhand_users__isnull=False).count() == 9 - assert Food.objects.filter(ingredient__step__recipe=makenow_recipe.id, ignore_shopping=True).count() == 1 + assert Food.objects.filter( + ingredient__step__recipe=makenow_recipe.id, onhand_users__isnull=False).count() == 9 + assert Food.objects.filter( + ingredient__step__recipe=makenow_recipe.id, ignore_shopping=True).count() == 1 search = search.get_queryset(Recipe.objects.all()) assert search.count() == 1 assert search.first().id == makenow_recipe.id @@ -74,13 +83,17 @@ def test_makenow_substitute(recipes, makenow_recipe, user1, space_1): request = type('', (object,), {'space': space_1, 'user': user1})() search = RecipeSearch(request, makenow='true') with scope(space=space_1): - food = Food.objects.filter(ingredient__step__recipe=makenow_recipe.id).first() + food = Food.objects.filter( + ingredient__step__recipe=makenow_recipe.id).first() onhand_user = food.onhand_users.first() food.onhand_users.clear() assert search.get_queryset(Recipe.objects.all()).count() == 0 - food.substitute.add(FoodFactory.create(space=space_1, onhand_users=[onhand_user])) - assert Food.objects.filter(ingredient__step__recipe=makenow_recipe.id, onhand_users__isnull=False).count() == 9 - assert Food.objects.filter(ingredient__step__recipe=makenow_recipe.id, substitute__isnull=False).count() == 1 + food.substitute.add(FoodFactory.create( + space=space_1, onhand_users=[onhand_user])) + assert Food.objects.filter( + ingredient__step__recipe=makenow_recipe.id, onhand_users__isnull=False).count() == 9 + assert Food.objects.filter( + ingredient__step__recipe=makenow_recipe.id, substitute__isnull=False).count() == 1 search = search.get_queryset(Recipe.objects.all()) assert search.count() == 1 @@ -94,16 +107,20 @@ def test_makenow_child_substitute(recipes, makenow_recipe, user1, space_1): request = type('', (object,), {'space': space_1, 'user': user1})() search = RecipeSearch(request, makenow='true') with scope(space=space_1): - food = Food.objects.filter(ingredient__step__recipe=makenow_recipe.id).first() + food = Food.objects.filter( + ingredient__step__recipe=makenow_recipe.id).first() onhand_user = food.onhand_users.first() food.onhand_users.clear() food.substitute_children = True food.save() assert search.get_queryset(Recipe.objects.all()).count() == 0 - new_food = FoodFactory.create(space=space_1, onhand_users=[onhand_user]) - new_food.move(food, 'first-child') - assert Food.objects.filter(ingredient__step__recipe=makenow_recipe.id, onhand_users__isnull=False).count() == 9 - assert Food.objects.filter(ingredient__step__recipe=makenow_recipe.id, numchild__gt=0).count() == 1 + new_food = FoodFactory.create( + space=space_1, onhand_users=[onhand_user]) + new_food.move(food, node_location) + assert Food.objects.filter( + ingredient__step__recipe=makenow_recipe.id, onhand_users__isnull=False).count() == 9 + assert Food.objects.filter( + ingredient__step__recipe=makenow_recipe.id, numchild__gt=0).count() == 1 search = search.get_queryset(Recipe.objects.all()) assert search.count() == 1 assert search.first().id == makenow_recipe.id @@ -116,18 +133,22 @@ def test_makenow_sibling_substitute(recipes, makenow_recipe, user1, space_1): request = type('', (object,), {'space': space_1, 'user': user1})() search = RecipeSearch(request, makenow='true') with scope(space=space_1): - food = Food.objects.filter(ingredient__step__recipe=makenow_recipe.id).first() + food = Food.objects.filter( + ingredient__step__recipe=makenow_recipe.id).first() onhand_user = food.onhand_users.first() food.onhand_users.clear() food.substitute_siblings = True food.save() assert search.get_queryset(Recipe.objects.all()).count() == 0 new_parent = FoodFactory.create(space=space_1) - new_sibling = FoodFactory.create(space=space_1, onhand_users=[onhand_user]) - new_sibling.move(new_parent, 'first-child') - food.move(new_parent, 'first-child') - assert Food.objects.filter(ingredient__step__recipe=makenow_recipe.id, onhand_users__isnull=False).count() == 9 - assert Food.objects.filter(ingredient__step__recipe=makenow_recipe.id, depth=2).count() == 1 + new_sibling = FoodFactory.create( + space=space_1, onhand_users=[onhand_user]) + new_sibling.move(new_parent, node_location) + food.move(new_parent, node_location) + assert Food.objects.filter( + ingredient__step__recipe=makenow_recipe.id, onhand_users__isnull=False).count() == 9 + assert Food.objects.filter( + ingredient__step__recipe=makenow_recipe.id, depth=2).count() == 1 search = search.get_queryset(Recipe.objects.all()) assert search.count() == 1 assert search.first().id == makenow_recipe.id diff --git a/cookbook/tests/other/test_recipe_full_text_search.py b/cookbook/tests/other/test_recipe_full_text_search.py index d2159720b..3e1195853 100644 --- a/cookbook/tests/other/test_recipe_full_text_search.py +++ b/cookbook/tests/other/test_recipe_full_text_search.py @@ -7,9 +7,9 @@ from django.conf import settings from django.contrib import auth from django.urls import reverse from django.utils import timezone -from django_scopes import scope, scopes_disabled +from django_scopes import scope -from cookbook.models import Food, Recipe, SearchFields +from cookbook.models import Recipe, SearchFields from cookbook.tests.conftest import transpose from cookbook.tests.factories import (CookLogFactory, FoodFactory, IngredientFactory, KeywordFactory, RecipeBookEntryFactory, RecipeFactory, @@ -23,7 +23,8 @@ from cookbook.tests.factories import (CookLogFactory, FoodFactory, IngredientFac # TODO makenow with above filters # TODO test search food/keywords including/excluding children LIST_URL = 'api:recipe-list' -sqlite = settings.DATABASES['default']['ENGINE'] not in ['django.db.backends.postgresql_psycopg2', 'django.db.backends.postgresql'] +sqlite = settings.DATABASES['default']['ENGINE'] not in [ + 'django.db.backends.postgresql_psycopg2', 'django.db.backends.postgresql'] @pytest.fixture @@ -50,26 +51,43 @@ def user1(request, space_1, u1_s1, unaccent): if params.get('fuzzy_lookups', False): user.searchpreference.lookup = True misspelled_result = 1 + else: + user.searchpreference.lookup = False + if params.get('fuzzy_search', False): user.searchpreference.trigram.set(SearchFields.objects.all()) misspelled_result = 1 + else: + user.searchpreference.trigram.set([]) if params.get('icontains', False): user.searchpreference.icontains.set(SearchFields.objects.all()) search_term = 'ghijklmn' + else: + user.searchpreference.icontains.set([]) + if params.get('istartswith', False): user.searchpreference.istartswith.set(SearchFields.objects.all()) search_term = 'abcdef' + else: + user.searchpreference.istartswith.set([]) + if params.get('unaccent', False): user.searchpreference.unaccent.set(SearchFields.objects.all()) misspelled_result *= 2 result *= 2 + else: + user.searchpreference.unaccent.set([]) + # full text vectors are hard coded to use unaccent - put this after unaccent to override result if params.get('fulltext', False): user.searchpreference.fulltext.set(SearchFields.objects.all()) # user.searchpreference.search = 'websearch' search_term = 'ghijklmn uvwxyz' result = 2 + else: + user.searchpreference.fulltext.set([]) + user.searchpreference.save() misspelled_term = transpose(search_term, number=3) return (u1_s1, result, misspelled_result, search_term, misspelled_term, params) @@ -104,7 +122,8 @@ def found_recipe(request, space_1, accent, unaccent, u1_s1, u2_s1): obj2 = FoodFactory.create(name=accent, space=space_1) recipe1.steps.first().ingredients.add(IngredientFactory.create(food=obj1)) recipe2.steps.first().ingredients.add(IngredientFactory.create(food=obj2)) - recipe3.steps.first().ingredients.add(IngredientFactory.create(food=obj1), IngredientFactory.create(food=obj2)) + recipe3.steps.first().ingredients.add(IngredientFactory.create( + food=obj1), IngredientFactory.create(food=obj2)) if request.param.get('keyword', None): obj1 = KeywordFactory.create(name=unaccent, space=space_1) obj2 = KeywordFactory.create(name=accent, space=space_1) @@ -125,7 +144,8 @@ def found_recipe(request, space_1, accent, unaccent, u1_s1, u2_s1): obj2 = UnitFactory.create(name=accent, space=space_1) recipe1.steps.first().ingredients.add(IngredientFactory.create(unit=obj1)) recipe2.steps.first().ingredients.add(IngredientFactory.create(unit=obj2)) - recipe3.steps.first().ingredients.add(IngredientFactory.create(unit=obj1), IngredientFactory.create(unit=obj2)) + recipe3.steps.first().ingredients.add(IngredientFactory.create( + unit=obj1), IngredientFactory.create(unit=obj2)) if request.param.get('name', None): recipe1.name = unaccent recipe2.name = accent @@ -145,21 +165,32 @@ def found_recipe(request, space_1, accent, unaccent, u1_s1, u2_s1): i2.save() if request.param.get('viewedon', None): - ViewLogFactory.create(recipe=recipe1, created_by=user1, created_at=days_3, space=space_1) - ViewLogFactory.create(recipe=recipe2, created_by=user1, created_at=days_30, space=space_1) - ViewLogFactory.create(recipe=recipe3, created_by=user2, created_at=days_15, space=space_1) + ViewLogFactory.create(recipe=recipe1, created_by=user1, + created_at=days_3, space=space_1) + ViewLogFactory.create(recipe=recipe2, created_by=user1, + created_at=days_30, space=space_1) + ViewLogFactory.create(recipe=recipe3, created_by=user2, + created_at=days_15, space=space_1) if request.param.get('cookedon', None): - CookLogFactory.create(recipe=recipe1, created_by=user1, created_at=days_3, space=space_1) - CookLogFactory.create(recipe=recipe2, created_by=user1, created_at=days_30, space=space_1) - CookLogFactory.create(recipe=recipe3, created_by=user2, created_at=days_15, space=space_1) + CookLogFactory.create(recipe=recipe1, created_by=user1, + created_at=days_3, space=space_1) + CookLogFactory.create(recipe=recipe2, created_by=user1, + created_at=days_30, space=space_1) + CookLogFactory.create(recipe=recipe3, created_by=user2, + created_at=days_15, space=space_1) if request.param.get('timescooked', None): - CookLogFactory.create_batch(5, recipe=recipe1, created_by=user1, space=space_1) - CookLogFactory.create(recipe=recipe2, created_by=user1, space=space_1) - CookLogFactory.create_batch(3, recipe=recipe3, created_by=user2, space=space_1) + CookLogFactory.create_batch( + 5, recipe=recipe1, created_by=user1, space=space_1) + CookLogFactory.create(recipe=recipe2, created_by=user1, space=space_1) + CookLogFactory.create_batch( + 3, recipe=recipe3, created_by=user2, space=space_1) if request.param.get('rating', None): - CookLogFactory.create(recipe=recipe1, created_by=user1, rating=5.0, space=space_1) - CookLogFactory.create(recipe=recipe2, created_by=user1, rating=1.0, space=space_1) - CookLogFactory.create(recipe=recipe3, created_by=user2, rating=3.0, space=space_1) + CookLogFactory.create( + recipe=recipe1, created_by=user1, rating=5.0, space=space_1) + CookLogFactory.create( + recipe=recipe2, created_by=user1, rating=1.0, space=space_1) + CookLogFactory.create( + recipe=recipe3, created_by=user2, rating=3.0, space=space_1) return (recipe1, recipe2, recipe3, obj1, obj2, request.param) @@ -188,7 +219,8 @@ def test_search_or_and_not(found_recipe, param_type, operator, recipes, u1_s1, s assert found_recipe[1].id in [x['id'] for x in r['results']] assert found_recipe[2].id in [x['id'] for x in r['results']] - r = json.loads(u1_s1.get(reverse(LIST_URL) + f'?{param1}&{param2}').content) + r = json.loads(u1_s1.get(reverse(LIST_URL) + + f'?{param1}&{param2}').content) assert r['count'] == operator[1] assert found_recipe[2].id in [x['id'] for x in r['results']] @@ -203,7 +235,8 @@ def test_search_or_and_not(found_recipe, param_type, operator, recipes, u1_s1, s assert found_recipe[1].id not in [x['id'] for x in r['results']] assert found_recipe[2].id not in [x['id'] for x in r['results']] - r = json.loads(u1_s1.get(reverse(LIST_URL) + f'?{param1_not}&{param2_not}').content) + r = json.loads(u1_s1.get(reverse(LIST_URL) + + f'?{param1_not}&{param2_not}').content) assert r['count'] == 10 + operator[2] assert found_recipe[2].id not in [x['id'] for x in r['results']] @@ -227,13 +260,14 @@ def test_search_units(found_recipe, recipes, u1_s1, space_1): assert found_recipe[1].id in [x['id'] for x in r['results']] assert found_recipe[2].id in [x['id'] for x in r['results']] - r = json.loads(u1_s1.get(reverse(LIST_URL) + f'?{param1}&{param2}').content) + r = json.loads(u1_s1.get(reverse(LIST_URL) + + f'?{param1}&{param2}').content) assert r['count'] == 3 assert found_recipe[2].id in [x['id'] for x in r['results']] @pytest.mark.skipif(sqlite, reason="requires PostgreSQL") -@pytest.mark.parametrize("user1", itertools.product( +@pytest.mark.parametrize("user1", itertools.product( [ ('fuzzy_search', True), ('fuzzy_search', False), ('fuzzy_lookups', True), ('fuzzy_lookups', False) @@ -245,22 +279,26 @@ def test_search_units(found_recipe, recipes, u1_s1, space_1): ({'keyword': True}, 'keyword'), ({'food': True}, 'food'), ], indirect=['found_recipe']) -def test_fuzzy_lookup(found_recipe, recipes, param_type, user1, space_1): +def test_fuzzy_lookup(found_recipe, recipes, param_type, user1, space_1): with scope(space=space_1): list_url = f'api:{param_type}-list' param1 = f"query={user1[3]}" param2 = f"query={user1[4]}" - r = json.loads(user1[0].get(reverse(list_url) + f'?{param1}&limit=2').content) - assert len([x['id'] for x in r['results'] if x['id'] in [found_recipe[3].id, found_recipe[4].id]]) == user1[1] + r = json.loads(user1[0].get(reverse(list_url) + + f'?{param1}&limit=2').content) + assert len([x['id'] for x in r['results'] if x['id'] in [ + found_recipe[3].id, found_recipe[4].id]]) == user1[1] - r = json.loads(user1[0].get(reverse(list_url) + f'?{param2}&limit=10').content) - assert len([x['id'] for x in r['results'] if x['id'] in [found_recipe[3].id, found_recipe[4].id]]) == user1[2] + r = json.loads(user1[0].get(reverse(list_url) + + f'?{param2}&limit=10').content) + assert len([x['id'] for x in r['results'] if x['id'] in [ + found_recipe[3].id, found_recipe[4].id]]) == user1[2] # commenting this out for general use - it is really slow # it should be run on occasion to ensure everything still works # @pytest.mark.skipif(sqlite and True, reason="requires PostgreSQL") -# @pytest.mark.parametrize("user1", itertools.product( +# @pytest.mark.parametrize("user1", itertools.product( # [ # ('fuzzy_search', True), ('fuzzy_search', False), # ('fulltext', True), ('fulltext', False), @@ -276,29 +314,35 @@ def test_fuzzy_lookup(found_recipe, recipes, param_type, user1, space_1): # ({'keyword': True}), # ({'food': True}), # ], indirect=['found_recipe']) -# def test_search_string(found_recipe, recipes, user1, space_1): +# # user array contains: user client, expected count of search, expected count of mispelled search, search string, mispelled search string, user search preferences +# def test_search_string(found_recipe, recipes, user1, space_1): # with scope(space=space_1): # param1 = f"query={user1[3]}" # param2 = f"query={user1[4]}" # r = json.loads(user1[0].get(reverse(LIST_URL) + f'?{param1}').content) -# assert len([x['id'] for x in r['results'] if x['id'] in [found_recipe[0].id, found_recipe[1].id]]) == user1[1] +# assert len([x['id'] for x in r['results'] if x['id'] in [ +# found_recipe[0].id, found_recipe[1].id]]) == user1[1] # r = json.loads(user1[0].get(reverse(LIST_URL) + f'?{param2}').content) -# assert len([x['id'] for x in r['results'] if x['id'] in [found_recipe[0].id, found_recipe[1].id]]) == user1[2] +# assert len([x['id'] for x in r['results'] if x['id'] in [ +# found_recipe[0].id, found_recipe[1].id]]) == user1[2] @pytest.mark.parametrize("found_recipe, param_type, result", [ ({'viewedon': True}, 'viewedon', (1, 1)), ({'cookedon': True}, 'cookedon', (1, 1)), - ({'createdon': True}, 'createdon', (2, 12)), # created dates are not filtered by user - ({'createdon': True}, 'updatedon', (2, 12)), # updated dates are not filtered by user + # created dates are not filtered by user + ({'createdon': True}, 'createdon', (2, 12)), + # updated dates are not filtered by user + ({'createdon': True}, 'updatedon', (2, 12)), ], indirect=['found_recipe']) def test_search_date(found_recipe, recipes, param_type, result, u1_s1, u2_s1, space_1): # force updated_at to equal created_at datetime with scope(space=space_1): for recipe in Recipe.objects.all(): - Recipe.objects.filter(id=recipe.id).update(updated_at=recipe.created_at) + Recipe.objects.filter(id=recipe.id).update( + updated_at=recipe.created_at) date = (timezone.now() - timedelta(days=15)).strftime("%Y-%m-%d") param1 = f"?{param_type}={date}" @@ -321,34 +365,34 @@ def test_search_date(found_recipe, recipes, param_type, result, u1_s1, u2_s1, sp assert found_recipe[2].id in [x['id'] for x in r['results']] -# TODO this is somehow screwed, probably the search itself, dont want to fix it for now -# @pytest.mark.parametrize("found_recipe, param_type", [ -# ({'rating': True}, 'rating'), -# ({'timescooked': True}, 'timescooked'), -# ], indirect=['found_recipe']) -# def test_search_count(found_recipe, recipes, param_type, u1_s1, u2_s1, space_1): -# param1 = f'?{param_type}=3' -# param2 = f'?{param_type}=-3' -# param3 = f'?{param_type}=0' -# -# r = json.loads(u1_s1.get(reverse(LIST_URL) + param1).content) -# assert r['count'] == 1 -# assert found_recipe[0].id in [x['id'] for x in r['results']] -# -# r = json.loads(u1_s1.get(reverse(LIST_URL) + param2).content) -# assert r['count'] == 1 -# assert found_recipe[1].id in [x['id'] for x in r['results']] -# -# # test search for not rated/cooked -# r = json.loads(u1_s1.get(reverse(LIST_URL) + param3).content) -# assert r['count'] == 11 -# assert (found_recipe[0].id or found_recipe[1].id) not in [x['id'] for x in r['results']] -# -# # test matched returns for lte and gte searches -# r = json.loads(u2_s1.get(reverse(LIST_URL) + param1).content) -# assert r['count'] == 1 -# assert found_recipe[2].id in [x['id'] for x in r['results']] -# -# r = json.loads(u2_s1.get(reverse(LIST_URL) + param2).content) -# assert r['count'] == 1 -# assert found_recipe[2].id in [x['id'] for x in r['results']] +@pytest.mark.parametrize("found_recipe, param_type", [ + ({'rating': True}, 'rating'), + ({'timescooked': True}, 'timescooked'), +], indirect=['found_recipe']) +def test_search_count(found_recipe, recipes, param_type, u1_s1, u2_s1, space_1): + param1 = f'?{param_type}=3' + param2 = f'?{param_type}=-3' + param3 = f'?{param_type}=0' + + r = json.loads(u1_s1.get(reverse(LIST_URL) + param1).content) + assert r['count'] == 1 + assert found_recipe[0].id in [x['id'] for x in r['results']] + + r = json.loads(u1_s1.get(reverse(LIST_URL) + param2).content) + assert r['count'] == 1 + assert found_recipe[1].id in [x['id'] for x in r['results']] + + # test search for not rated/cooked + r = json.loads(u1_s1.get(reverse(LIST_URL) + param3).content) + assert r['count'] == 11 + assert (found_recipe[0].id or found_recipe[1].id) not in [ + x['id'] for x in r['results']] + + # test matched returns for lte and gte searches + r = json.loads(u2_s1.get(reverse(LIST_URL) + param1).content) + assert r['count'] == 1 + assert found_recipe[2].id in [x['id'] for x in r['results']] + + r = json.loads(u2_s1.get(reverse(LIST_URL) + param2).content) + assert r['count'] == 1 + assert found_recipe[2].id in [x['id'] for x in r['results']] diff --git a/cookbook/tests/other/test_url_import.py b/cookbook/tests/other/test_url_import.py index ae4677c0f..9f57386a7 100644 --- a/cookbook/tests/other/test_url_import.py +++ b/cookbook/tests/other/test_url_import.py @@ -2,13 +2,16 @@ import json import os import pytest +from django.contrib import auth from django.urls import reverse +from django_scopes import scopes_disabled from cookbook.tests.conftest import validate_recipe from ._recipes import (ALLRECIPES, AMERICAS_TEST_KITCHEN, CHEF_KOCH, CHEF_KOCH2, COOKPAD, COOKS_COUNTRY, DELISH, FOOD_NETWORK, GIALLOZAFFERANO, JOURNAL_DES_FEMMES, MADAME_DESSERT, MARMITON, TASTE_OF_HOME, THE_SPRUCE_EATS, TUDOGOSTOSO) +from ...models import Automation IMPORT_SOURCE_URL = 'api_recipe_from_source' DATA_DIR = "cookbook/tests/other/test_data/" @@ -72,3 +75,5 @@ def test_recipe_import(arg, u1_s1): content_type='application/json') recipe = json.loads(response.content)['recipe_json'] validate_recipe(arg, recipe) + + diff --git a/cookbook/views/api.py b/cookbook/views/api.py index 1be0f0d95..2a604f211 100644 --- a/cookbook/views/api.py +++ b/cookbook/views/api.py @@ -1,6 +1,7 @@ import io import json import mimetypes +import pathlib import re import threading import traceback @@ -56,7 +57,7 @@ from cookbook.helper.permission_helper import (CustomIsAdmin, CustomIsOwner, CustomIsSpaceOwner, CustomIsUser, group_required, is_space_owner, switch_user_active_space, above_space_limit, CustomRecipePermission, CustomUserPermission, CustomTokenHasReadWriteScope, CustomTokenHasScope, has_group_permission) from cookbook.helper.recipe_search import RecipeFacet, RecipeSearch -from cookbook.helper.recipe_url_import import get_from_youtube_scraper, get_images_from_soup +from cookbook.helper.recipe_url_import import get_from_youtube_scraper, get_images_from_soup, clean_dict from cookbook.helper.scrapers.scrapers import text_scraper from cookbook.helper.shopping_helper import RecipeShoppingEditor, shopping_helper from cookbook.models import (Automation, BookmarkletImport, CookLog, CustomFilter, ExportLog, Food, @@ -87,7 +88,7 @@ from cookbook.serializer import (AutomationSerializer, BookmarkletImportListSeri SupermarketCategorySerializer, SupermarketSerializer, SyncLogSerializer, SyncSerializer, UnitSerializer, UserFileSerializer, UserSerializer, UserPreferenceSerializer, - UserSpaceSerializer, ViewLogSerializer, AccessTokenSerializer) + UserSpaceSerializer, ViewLogSerializer, AccessTokenSerializer, FoodSimpleSerializer, RecipeExportSerializer) from cookbook.views.import_export import get_integration from recipes import settings @@ -533,6 +534,11 @@ class FoodViewSet(viewsets.ModelViewSet, TreeMixin): .prefetch_related('onhand_users', 'inherit_fields', 'child_inherit_fields', 'substitute') \ .select_related('recipe', 'supermarket_category') + def get_serializer_class(self): + if self.request and self.request.query_params.get('simple', False): + return FoodSimpleSerializer + return self.serializer_class + @decorators.action(detail=True, methods=['PUT'], serializer_class=FoodShoppingUpdateSerializer, ) # TODO DRF only allows one action in a decorator action without overriding get_operation_id_base() this should be PUT and DELETE probably def shopping(self, request, pk): @@ -655,7 +661,7 @@ class IngredientViewSet(viewsets.ModelViewSet): def get_serializer_class(self): if self.request and self.request.query_params.get('simple', False): return IngredientSimpleSerializer - return IngredientSerializer + return self.serializer_class def get_queryset(self): queryset = self.queryset.filter(step__recipe__space=self.request.space) @@ -852,7 +858,7 @@ class RecipeViewSet(viewsets.ModelViewSet): if image is not None: img = handle_image(request, image, filetype) - obj.image = File(img, name=f'{uuid.uuid4()}_{obj.pk}{filetype}') + obj.image.save(f'{uuid.uuid4()}_{obj.pk}{filetype}', img) obj.save() return Response(serializer.data) else: @@ -1169,6 +1175,18 @@ def recipe_from_source(request): # 'recipe_html': '', 'recipe_images': [], }, status=status.HTTP_200_OK) + if re.match('^(.)*/view/recipe/[0-9]+/[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$', url): + recipe_json = requests.get(url.replace('/view/recipe/', '/api/recipe/').replace(re.split('/view/recipe/[0-9]+', url)[1], '') + '?share=' + re.split('/view/recipe/[0-9]+', url)[1].replace('/', '')).json() + recipe_json = clean_dict(recipe_json, 'id') + serialized_recipe = RecipeExportSerializer(data=recipe_json, context={'request': request}) + if serialized_recipe.is_valid(): + recipe = serialized_recipe.save() + recipe.image = File(handle_image(request, File(io.BytesIO(requests.get(recipe_json['image']).content), name='image'), filetype=pathlib.Path(recipe_json['image']).suffix), + name=f'{uuid.uuid4()}_{recipe.pk}{pathlib.Path(recipe_json["image"]).suffix}') + recipe.save() + return Response({ + 'link': request.build_absolute_uri(reverse('view_recipe', args={recipe.pk})) + }, status=status.HTTP_201_CREATED) else: try: if validators.url(url, public=True): @@ -1306,6 +1324,8 @@ def import_files(request): return Response({'import_id': il.pk}, status=status.HTTP_200_OK) except NotImplementedError: return Response({'error': True, 'msg': _('Importing is not implemented for this provider')}, status=status.HTTP_400_BAD_REQUEST) + else: + return Response({'error': True, 'msg': form.errors}, status=status.HTTP_400_BAD_REQUEST) def get_recipe_provider(recipe): @@ -1381,17 +1401,17 @@ def sync_all(request): return redirect('list_recipe_import') +@api_view(['GET']) +# @schema(AutoSchema()) #TODO add proper schema +@permission_classes([CustomIsUser & CustomTokenHasReadWriteScope]) def share_link(request, pk): - if request.user.is_authenticated: - if request.space.allow_sharing and has_group_permission(request.user, ('user',)): - recipe = get_object_or_404(Recipe, pk=pk, space=request.space) - link = ShareLink.objects.create(recipe=recipe, created_by=request.user, space=request.space) - return JsonResponse({'pk': pk, 'share': link.uuid, - 'link': request.build_absolute_uri(reverse('view_recipe', args=[pk, link.uuid]))}) - else: - return JsonResponse({'error': 'sharing_disabled'}, status=403) - - return JsonResponse({'error': 'not_authenticated'}, status=403) + if request.space.allow_sharing and has_group_permission(request.user, ('user',)): + recipe = get_object_or_404(Recipe, pk=pk, space=request.space) + link = ShareLink.objects.create(recipe=recipe, created_by=request.user, space=request.space) + return JsonResponse({'pk': pk, 'share': link.uuid, + 'link': request.build_absolute_uri(reverse('view_recipe', args=[pk, link.uuid]))}) + else: + return JsonResponse({'error': 'sharing_disabled'}, status=403) @group_required('user') diff --git a/cookbook/views/import_export.py b/cookbook/views/import_export.py index d48859490..4a2059001 100644 --- a/cookbook/views/import_export.py +++ b/cookbook/views/import_export.py @@ -31,6 +31,7 @@ from cookbook.integration.plantoeat import Plantoeat from cookbook.integration.recettetek import RecetteTek from cookbook.integration.recipekeeper import RecipeKeeper from cookbook.integration.recipesage import RecipeSage +from cookbook.integration.rezeptsuitede import Rezeptsuitede from cookbook.integration.rezkonv import RezKonv from cookbook.integration.saffron import Saffron from cookbook.models import ExportLog, ImportLog, Recipe, UserPreference @@ -80,6 +81,8 @@ def get_integration(request, export_type): return MelaRecipes(request, export_type) if export_type == ImportExportBase.COOKMATE: return Cookmate(request, export_type) + if export_type == ImportExportBase.REZEPTSUITEDE: + return Rezeptsuitede(request, export_type) @group_required('user') diff --git a/cookbook/views/views.py b/cookbook/views/views.py index 2907e6391..4a8f61af6 100644 --- a/cookbook/views/views.py +++ b/cookbook/views/views.py @@ -69,25 +69,28 @@ def space_overview(request): if request.POST: create_form = SpaceCreateForm(request.POST, prefix='create') join_form = SpaceJoinForm(request.POST, prefix='join') - if create_form.is_valid(): - created_space = Space.objects.create( - name=create_form.cleaned_data['name'], - created_by=request.user, - max_file_storage_mb=settings.SPACE_DEFAULT_MAX_FILES, - max_recipes=settings.SPACE_DEFAULT_MAX_RECIPES, - max_users=settings.SPACE_DEFAULT_MAX_USERS, - allow_sharing=settings.SPACE_DEFAULT_ALLOW_SHARING, - ) + if settings.HOSTED and request.user.username == 'demo': + messages.add_message(request, messages.WARNING, _('This feature is not available in the demo version!')) + else: + if create_form.is_valid(): + created_space = Space.objects.create( + name=create_form.cleaned_data['name'], + created_by=request.user, + max_file_storage_mb=settings.SPACE_DEFAULT_MAX_FILES, + max_recipes=settings.SPACE_DEFAULT_MAX_RECIPES, + max_users=settings.SPACE_DEFAULT_MAX_USERS, + allow_sharing=settings.SPACE_DEFAULT_ALLOW_SHARING, + ) - user_space = UserSpace.objects.create(space=created_space, user=request.user, active=False) - user_space.groups.add(Group.objects.filter(name='admin').get()) + user_space = UserSpace.objects.create(space=created_space, user=request.user, active=False) + user_space.groups.add(Group.objects.filter(name='admin').get()) - messages.add_message(request, messages.SUCCESS, - _('You have successfully created your own recipe space. Start by adding some recipes or invite other people to join you.')) - return HttpResponseRedirect(reverse('view_switch_space', args=[user_space.space.pk])) + messages.add_message(request, messages.SUCCESS, + _('You have successfully created your own recipe space. Start by adding some recipes or invite other people to join you.')) + return HttpResponseRedirect(reverse('view_switch_space', args=[user_space.space.pk])) - if join_form.is_valid(): - return HttpResponseRedirect(reverse('view_invite', args=[join_form.cleaned_data['token']])) + if join_form.is_valid(): + return HttpResponseRedirect(reverse('view_invite', args=[join_form.cleaned_data['token']])) else: if settings.SOCIAL_DEFAULT_ACCESS and len(request.user.userspace_set.all()) == 0: user_space = UserSpace.objects.create(space=Space.objects.first(), user=request.user, active=False) diff --git a/docs/contribute.md b/docs/contribute.md index 592c3368d..52ff187b7 100644 --- a/docs/contribute.md +++ b/docs/contribute.md @@ -41,7 +41,7 @@ Most new frontend pages are build using [Vue.js](https://vuejs.org/). In order to work on these pages, you will have to install a Javascript package manager of your choice. The following examples use yarn. -Run `yarn install` to install the dependencies. After that you can use `yarn serve` to start the development server, +In the `vue` folder run `yarn install` to install the dependencies. After that you can use `yarn serve` to start the development server, and proceed to test your changes. If you do not wish to work on those pages, but instead want the application to work properly during development, run `yarn build` to build the frontend pages once. diff --git a/docs/faq.md b/docs/faq.md index cc24befce..8a14c6f58 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -1,5 +1,5 @@ -There are several questions and issues that come up from time to time. Here are some answers. -Please note that the existence of some questions is due the application not being perfect in some parts. +There are several questions and issues that come up from time to time, here are some answers: +please note that the existence of some questions is due the application not being perfect in some parts. Many of those shortcomings are planned to be fixed in future release but simply could not be addressed yet due to time limits. ## Is there a Tandoor app? @@ -22,14 +22,14 @@ Open Tandoor, open the menu behind the three vertical dots at the top right, sel Open Tandoor, open the menu behind the three horizontal dots at the top right, select `Apps > Install Tandoor Recipes` ## Why is Tandoor not working correctly? -If you just set up your Tandoor instance and you're having issues like... +If you just set up your Tandoor instance and you're having issues like; - Links not working - CSRF errors - CORS errors - No recipes are loading -... then make sure, that you have set [all required headers](install/docker.md#required-headers) in your reverse proxy correctly. +then make sure you have set [all required headers](install/docker.md#required-headers) in your reverse proxy correctly. If that doesn't fix it, you can also refer to the appropriate sub section in the [reverse proxy documentation](install/docker.md#reverse-proxy) and verify your general webserver configuration. ## Why am I getting CSRF Errors? @@ -49,7 +49,7 @@ If removed, the nginx webserver needs to be replaced by something else that serv `GUNICORN_MEDIA` needs to be enabled to allow media serving by the application container itself. -## Why does the Text/Markdown preview look different than the final recipe ? +## Why does the Text/Markdown preview look different than the final recipe? Tandoor has always rendered the recipe instructions markdown on the server. This also allows tandoor to implement things like ingredient templating and scaling in text. To make editing easier a markdown editor was added to the frontend with integrated preview as a temporary solution. Since the markdown editor uses a different @@ -62,28 +62,28 @@ The markdown renderer follows this markdown specification https://daringfireball Please refer to [here](install/docker.md#setup-issues-on-raspberry-pi). ## How can I create users? -To create a new user click on your name (top right corner) and select 'space settings'. There under invites click create. +To create a new user click on your name (top right corner) and select 'space settings'. Click create listed below invites. It is not possible to create users through the admin because users must be assigned a default group and space. -To change a users space you need to go to the admin and select User Infos. +To change a user's space you need to go to the admin and select User Infos. If you use an external auth provider or proxy authentication make sure to specify a default group and space in the environment configuration. ## What are spaces? -Spaces are a feature used to separate one installation of Tandoor into several parts. -In technical terms it is a multi tenant system. +Spaces are is a type of feature used to separate one installation of Tandoor into several parts. +In technical terms it is a multi-tenant system. You can compare a space to something like google drive or dropbox. There is only one installation of the Dropbox system, but it handles multiple users without them noticing each other. For Tandoor that means all people that work together on one recipe collection can be in one space. -If you want to host the collection of your friends family or your neighbor you can create a separate space for them (through the admin interface). +If you want to host the collection of your friends, family, or neighbor you can create a separate space for them (through the admin interface). Sharing between spaces is currently not possible but is planned for future releases. ## How can I reset passwords? -To reset a lost password if access to the container is lost you need to +To reset a lost password if access to the container is lost you need to: 1. execute into the container using `docker-compose exec web_recipes sh` 2. activate the virtual environment `source venv/bin/activate` @@ -95,3 +95,14 @@ To create a superuser you need to 1. execute into the container using `docker-compose exec web_recipes sh` 2. activate the virtual environment `source venv/bin/activate` 3. run `python manage.py createsuperuser` and follow the steps shown. + + +## Why cant I get support for my manual setup? +Even tough I would love to help everyone get tandoor up and running I have only so much time +that I can spend on this project besides work, family and other life things. +Due to the countless problems that can occur when manually installing I simply do not have +the time to help solving each one. + +You can install Tandoor manually but please do not expect me or anyone to help you with that. +As a general advice: If you do it manually do NOT change anything at first and slowly work yourself +to your dream setup. \ No newline at end of file diff --git a/docs/features/authentication.md b/docs/features/authentication.md index 4dd619e67..f218d6627 100644 --- a/docs/features/authentication.md +++ b/docs/features/authentication.md @@ -96,6 +96,7 @@ AUTH_LDAP_USER_SEARCH_FILTER_STR=(uid=%(user)s) AUTH_LDAP_USER_ATTR_MAP={'first_name': 'givenName', 'last_name': 'sn', 'email': 'mail'} AUTH_LDAP_ALWAYS_UPDATE_USER=1 AUTH_LDAP_CACHE_TIMEOUT=3600 +AUTH_LDAP_START_TLS=1 AUTH_LDAP_TLS_CACERTFILE=/etc/ssl/certs/own-ca.pem ``` diff --git a/docs/features/automation.md b/docs/features/automation.md new file mode 100644 index 000000000..66f9fefdb --- /dev/null +++ b/docs/features/automation.md @@ -0,0 +1,64 @@ +!!! warning + Automations are currently in a beta stage. They work pretty stable but if I encounter any + issues while working on them, I might change how they work breaking existing automations. + I will try to avoid this and am pretty confident it won't happen. + + +Automations allow Tandoor to automatically perform certain tasks, especially when importing recipes, that +would otherwise have to be done manually. Currently, the following automations are supported. + +## Unit, Food, Keyword Alias +Foods, Units and Keywords can have automations that automatically replace them with another object +to allow aliasing them. + +This helps to add consistency to the naming of objects, for example to always use the singular form +for the main name if a plural form is configured. + +These automations are best created by dragging and dropping Foods, Units or Keywords in their respective +views and creating the automation there. + +You can also create them manually by setting the following +- **Parameter 1**: name of food/unit/keyword to match +- **Parameter 2**: name of food/unit/keyword to replace matched food with + +These rules are processed whenever you are importing recipes from websites or other apps +and when using the simple ingredient input (shopping, recipe editor, ...). + +## Description Replace +This automation is a bit more complicated than the alis rules. It is run when importing a recipe +from a website. + +It uses Regular Expressions (RegEx) to determine if a description should be altered, what exactly to remove +and what to replace it with. + +- **Parameter 1**: pattern of which sites to match (e.g. `.*.chefkoch.de.*`, `.*`) +- **Parameter 2**: pattern of what to replace (e.g. `.*`) +- **Parameter 3**: value to replace matched occurrence of parameter 2 with. Only one occurrence of the pattern is replaced. + +To replace the description the python [re.sub](https://docs.python.org/2/library/re.html#re.sub) function is used +like this `re.sub(, , , count=1)` + +To test out your patterns and learn about RegEx you can use [regexr.com](https://regexr.com/) + +!!! info + In order to prevent denial of service attacks on the RegEx engine the number of replace automations + and the length of the inputs that are processed are limited. Those limits should never be reached + during normal usage. + +## Instruction Replace +This works just like the Description Replace automation but runs against all instruction texts +in all steps of a recipe during import. + +Also instead of just replacing a single occurrence of the matched pattern it will replace all. + +# Order +If the Automation type allows for more than one rule to be executed (for example description replace) +the rules are processed in ascending order (ordered by the *order* property of the automation). +The default order is always 1000 to make it easier to add automations before and after other automations. + +Example: +1. Rule ABC (order 1000) replaces `everything` with `abc` +2. Rule DEF (order 2000) replaces `everything` with `def` +3. Rule XYZ (order 500) replaces `everything` with `xyz` + +After processing rules XYZ, then ABC and then DEF the description will have the value `def` \ No newline at end of file diff --git a/docs/features/import_export.md b/docs/features/import_export.md index a64588867..a2fa3040f 100644 --- a/docs/features/import_export.md +++ b/docs/features/import_export.md @@ -31,6 +31,7 @@ Overview of the capabilities of the different integrations. | ChefTap | ✔️ | ❌ | ❌ | | Pepperplate | ✔️ | ⌚ | ❌ | | RecipeSage | ✔️ | ✔️ | ✔️ | +| Rezeptsuite.de | ✔️ | ❌ | ✔️ | | Domestica | ✔️ | ⌚ | ✔️ | | MealMaster | ✔️ | ❌ | ❌ | | RezKonv | ✔️ | ❌ | ❌ | @@ -177,7 +178,7 @@ This zip file can simply be imported into Tandoor. OpenEats does not provide any way to export the data using the interface. Luckily it is relatively easy to export it from the command line. You need to run the command `python manage.py dumpdata recipe ingredient` inside of the application api container. If you followed the default installation method you can use the following command `docker-compose -f docker-prod.yml run --rm --entrypoint 'sh' api ./manage.py dumpdata recipe ingredient`. -This command might also work `docker exec -it openeats_api_1 ./manage.py dumpdata recipe ingredient > recipe_ingredients.json` +This command might also work `docker exec -it openeats_api_1 ./manage.py dumpdata recipe ingredient rating recipe_groups > recipe_ingredients.json` Store the outputted json string in a `.json` file and simply import it using the importer. The file should look something like this ```json @@ -215,6 +216,8 @@ Store the outputted json string in a `.json` file and simply import it using the ``` +To import your images you'll need to create the folder `openeats-import` in your Tandoor's `recipes` media folder (which is usually found inside `/opt/recipes/mediafiles`). After that you'll need to copy the `/code/site-media/upload` folder from the openeats API docker container to the `openeats` folder you created. You should now have the file path `/opt/recipes/mediafiles/recipes/openeats-import/upload/...` in Tandoor. + ## Plantoeat Plan to eat allows you to export a text file containing all your recipes. Simply upload that text file to Tandoor to import all recipes @@ -233,6 +236,9 @@ Cookmate allows you to export a `.mcb` file which you can simply upload to tando ## RecetteTek RecetteTek exports are `.rtk` files which can simply be uploaded to tandoor to import all your recipes. +## Rezeptsuite.de +Rezeptsuite.de exports are `.xml` files which can simply be uploaded to tandoor to import all your recipes. + ## Melarecipes Melarecipes provides multiple export formats but only the `MelaRecipes` format can export the complete collection. diff --git a/docs/install/k8s/50-deployment.yaml b/docs/install/k8s/50-deployment.yaml index f1c34e5db..2e98f6fef 100644 --- a/docs/install/k8s/50-deployment.yaml +++ b/docs/install/k8s/50-deployment.yaml @@ -49,7 +49,7 @@ spec: secretKeyRef: name: recipes key: postgresql-postgres-password - image: vabene1111/recipes:1.0.1 + image: vabene1111/recipes imagePullPolicy: Always resources: requests: @@ -110,7 +110,7 @@ spec: subPath: nginx-config readOnly: true - name: recipes - image: vabene1111/recipes:1.0.1 + image: vabene1111/recipes imagePullPolicy: IfNotPresent command: - /opt/recipes/venv/bin/gunicorn @@ -159,6 +159,8 @@ spec: secretKeyRef: name: recipes key: secret-key + - name: GUNICORN_MEDIA + value: "0" - name: DB_ENGINE value: django.db.backends.postgresql_psycopg2 - name: POSTGRES_HOST diff --git a/docs/install/kubernetes.md b/docs/install/kubernetes.md index 23555c39f..21d09b41f 100644 --- a/docs/install/kubernetes.md +++ b/docs/install/kubernetes.md @@ -61,6 +61,14 @@ The deployment first fires up a init container to do the database migrations and The deployment then runs two containers, the recipes-nginx and the recipes container which runs the gunicorn app. The nginx container gets it's nginx.conf via config map to deliver static content `/static` and `/media`. The guincorn container gets it's secret key and the database password from the secret `recipes`. `gunicorn` runs as user `nobody`. +Currently, this deployment is using the `latest` image. You may want to explicitly set the tag, e.g. + +~~~ +image: vabene1111/recipes:1.4.7 +~~~ + +It is **extremely important** to use the same image in both the initialization `init-chmod-data` and the main `recipes` containers. + ### 60-service.yaml Creating the app service. @@ -91,7 +99,9 @@ I don't know how this check works, but this warning is simply wrong! ;-) Media a ## Updates -These manifests are tested against Release 1.0.1. Newer versions may not work without changes. +These manifests have been tested for several releases. Newer versions may not work without changes. + +If everything works as expected, the `init-chmod-data` initialization container performs the database migration and the update procedure is transparent. However, it is recommended to use specific tags to increase stability and avoid unnecessary migrations. ## Apply the manifets diff --git a/docs/install/manual.md b/docs/install/manual.md index ddaaa1d58..4d4b94cb8 100644 --- a/docs/install/manual.md +++ b/docs/install/manual.md @@ -180,11 +180,11 @@ server { #error_log /var/log/nginx/error.log; # serve media files - location /static { + location /static/ { alias /var/www/recipes/staticfiles; } - location /media { + location /media/ { alias /var/www/recipes/mediafiles; } diff --git a/docs/install/wsl.md b/docs/install/wsl.md new file mode 100644 index 000000000..ad1d0c092 --- /dev/null +++ b/docs/install/wsl.md @@ -0,0 +1,50 @@ +# Ubuntu Installation on Windows (WSL) and Docker Desktop + +Install Docker from https://docs.docker.com/desktop/install/windows-install/ +Be sure to select the Use WSL 2 instead of Hyper-V option on the configuration page when prompted + +Follow the instructions to install Tandoor on Docker. Tandoor installation instructions using Docker is gotten from https://docs.tandoor.dev/install/docker/ + +You may get the error below if you are using Docker Desktop: +/usr/bin/docker-credential-desktop.exe: Invalid argument + +This indicates that Docker Compose is not able to pull authentication credentials that are needed to pull recipe files. + +Run the command: +export DOCKER_CONFIG=/non-existent-directory + +"non-existent-directory" could be an arbitrary directory of your choosing. It could be empty, +we are just giving docker a file to point to. You can create a credentials file at a later date to add security to your application. + +After you run the command docker-compose up -d, you may encounter an error similar to the one below: +fixing permissions on existing directory /var/lib/postgresql/data ... 2023-03-01T15:38:27.140501700Z chmod: /var/lib/postgresql/data: Operation not permitted + +This indicates that the postgresql user 'postgres' does not have the necessary permissions to +change the permissions of the /var/lib/postgresql/data directory. +Note: This issue does not occuer in the Powershell terminal, so it might be easier to install Tandoor in powershell and continue development using WSL. +Steps to fix this error: +Since the permissions have to be changed within the docker container, we will need to create a file that runs as soon as the container starts up. This container will change the permissions of the /var/lib/postgresql/data directory before the db_recipes-1 container is started up. This container sets up the database to accept connections. +Docker allows us to set up an entrypoint in the docker-compose.yml file. This is where we will set the commands to change the permissions of the postgres user. +Steps to set up entry-point file: +1. Create a new file ‘docker-entrypoint.sh’ in the same directory as your docker-compose.yml file. This will be a bash file. +2. Add the following commands to the file +a. #!/bin/sh (This is called a shebang. It tells the OS the shell to use which is the sh shell in this case) +b. chmod 777 /var/lib/postgresql/data (Gives read, write and execute permissions on the directory to all users, you may change these permissions as you wish) +c. exec “@” (Runs the script with the commands above) + +Your folder structure should look like this with docker-compose.yml and docker-entrypoint.sh in the same directory: +![image](https://user-images.githubusercontent.com/100102599/225214709-322417a1-1cab-47a6-83dd-555a4234e72a.png) + + +The docker-entrypoint.sh file should look like this: +![image](https://user-images.githubusercontent.com/100102599/225214795-102c9e53-b790-498a-a6d6-ad0bcc980b2f.png) + +3. Open the docker-compose.yml file +4. Add an entrypoint configuration to the db_recipes service +entrypoint: +- docker-entrypoint.sh +This command makes sure that the docker-entrypoint.sh file is run first before the db_recipes services is started. Using this, we set the database user permission before they are needed, so it gets rid of the error. +Your docker-compose.yml file should look like this: +![image](https://user-images.githubusercontent.com/100102599/225214865-869c9b24-61cf-4069-aa98-a7e18a165105.png) + +5. Run docker-compose up -d, all the containers should run! diff --git a/mkdocs.yml b/mkdocs.yml index 0e153611b..48fcc348b 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -33,6 +33,7 @@ nav: - Synology: install/synology.md - Kubernetes: install/kubernetes.md - KubeSail or PiBox: install/kubesail.md + - WSL: install/wsl.md - Manual: install/manual.md - Other setups: install/other.md - Features: diff --git a/openapitools.json b/openapitools.json index e69de29bb..c871d87b7 100644 --- a/openapitools.json +++ b/openapitools.json @@ -0,0 +1,7 @@ +{ + "$schema": "./node_modules/@openapitools/openapi-generator-cli/config.schema.json", + "spaces": 2, + "generator-cli": { + "version": "6.2.1" + } +} diff --git a/recipes/locale/ca/LC_MESSAGES/django.po b/recipes/locale/ca/LC_MESSAGES/django.po index b49fd7f44..7d991c0db 100644 --- a/recipes/locale/ca/LC_MESSAGES/django.po +++ b/recipes/locale/ca/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 19:20+0200\n" +"POT-Creation-Date: 2023-04-26 07:46+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,62 +18,66 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: .\recipes\settings.py:369 +#: .\recipes\settings.py:436 msgid "Armenian " msgstr "" -#: .\recipes\settings.py:370 +#: .\recipes\settings.py:437 msgid "Bulgarian" msgstr "" -#: .\recipes\settings.py:371 +#: .\recipes\settings.py:438 msgid "Catalan" msgstr "" -#: .\recipes\settings.py:372 +#: .\recipes\settings.py:439 msgid "Czech" msgstr "" -#: .\recipes\settings.py:373 +#: .\recipes\settings.py:440 msgid "Danish" msgstr "" -#: .\recipes\settings.py:374 +#: .\recipes\settings.py:441 msgid "Dutch" msgstr "" -#: .\recipes\settings.py:375 +#: .\recipes\settings.py:442 msgid "English" msgstr "" -#: .\recipes\settings.py:376 +#: .\recipes\settings.py:443 msgid "French" msgstr "" -#: .\recipes\settings.py:377 +#: .\recipes\settings.py:444 msgid "German" msgstr "" -#: .\recipes\settings.py:378 +#: .\recipes\settings.py:445 +msgid "Hungarian" +msgstr "" + +#: .\recipes\settings.py:446 msgid "Italian" msgstr "" -#: .\recipes\settings.py:379 +#: .\recipes\settings.py:447 msgid "Latvian" msgstr "" -#: .\recipes\settings.py:380 +#: .\recipes\settings.py:448 msgid "Polish" msgstr "" -#: .\recipes\settings.py:381 +#: .\recipes\settings.py:449 msgid "Russian" msgstr "" -#: .\recipes\settings.py:382 +#: .\recipes\settings.py:450 msgid "Spanish" msgstr "" -#: .\recipes\settings.py:383 +#: .\recipes\settings.py:451 msgid "Swedish" msgstr "" diff --git a/recipes/locale/de/LC_MESSAGES/django.po b/recipes/locale/de/LC_MESSAGES/django.po index 8aab9743a..e7e46fcd9 100644 --- a/recipes/locale/de/LC_MESSAGES/django.po +++ b/recipes/locale/de/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 19:20+0200\n" +"POT-Creation-Date: 2023-04-26 07:46+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,64 +18,68 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: .\recipes\settings.py:369 +#: .\recipes\settings.py:436 msgid "Armenian " msgstr "" -#: .\recipes\settings.py:370 +#: .\recipes\settings.py:437 msgid "Bulgarian" msgstr "" -#: .\recipes\settings.py:371 +#: .\recipes\settings.py:438 msgid "Catalan" msgstr "" -#: .\recipes\settings.py:372 +#: .\recipes\settings.py:439 msgid "Czech" msgstr "" -#: .\recipes\settings.py:373 +#: .\recipes\settings.py:440 msgid "Danish" msgstr "" -#: .\recipes\settings.py:374 +#: .\recipes\settings.py:441 msgid "Dutch" msgstr "" -#: .\recipes\settings.py:375 +#: .\recipes\settings.py:442 msgid "English" msgstr "Englisch" -#: .\recipes\settings.py:376 +#: .\recipes\settings.py:443 msgid "French" msgstr "" -#: .\recipes\settings.py:377 +#: .\recipes\settings.py:444 msgid "German" msgstr "Deutsch" -#: .\recipes\settings.py:378 +#: .\recipes\settings.py:445 +msgid "Hungarian" +msgstr "" + +#: .\recipes\settings.py:446 msgid "Italian" msgstr "" -#: .\recipes\settings.py:379 +#: .\recipes\settings.py:447 msgid "Latvian" msgstr "" -#: .\recipes\settings.py:380 +#: .\recipes\settings.py:448 #, fuzzy #| msgid "English" msgid "Polish" msgstr "Englisch" -#: .\recipes\settings.py:381 +#: .\recipes\settings.py:449 msgid "Russian" msgstr "" -#: .\recipes\settings.py:382 +#: .\recipes\settings.py:450 msgid "Spanish" msgstr "" -#: .\recipes\settings.py:383 +#: .\recipes\settings.py:451 msgid "Swedish" msgstr "" diff --git a/recipes/locale/en/LC_MESSAGES/django.po b/recipes/locale/en/LC_MESSAGES/django.po index b49fd7f44..7d991c0db 100644 --- a/recipes/locale/en/LC_MESSAGES/django.po +++ b/recipes/locale/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 19:20+0200\n" +"POT-Creation-Date: 2023-04-26 07:46+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,62 +18,66 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: .\recipes\settings.py:369 +#: .\recipes\settings.py:436 msgid "Armenian " msgstr "" -#: .\recipes\settings.py:370 +#: .\recipes\settings.py:437 msgid "Bulgarian" msgstr "" -#: .\recipes\settings.py:371 +#: .\recipes\settings.py:438 msgid "Catalan" msgstr "" -#: .\recipes\settings.py:372 +#: .\recipes\settings.py:439 msgid "Czech" msgstr "" -#: .\recipes\settings.py:373 +#: .\recipes\settings.py:440 msgid "Danish" msgstr "" -#: .\recipes\settings.py:374 +#: .\recipes\settings.py:441 msgid "Dutch" msgstr "" -#: .\recipes\settings.py:375 +#: .\recipes\settings.py:442 msgid "English" msgstr "" -#: .\recipes\settings.py:376 +#: .\recipes\settings.py:443 msgid "French" msgstr "" -#: .\recipes\settings.py:377 +#: .\recipes\settings.py:444 msgid "German" msgstr "" -#: .\recipes\settings.py:378 +#: .\recipes\settings.py:445 +msgid "Hungarian" +msgstr "" + +#: .\recipes\settings.py:446 msgid "Italian" msgstr "" -#: .\recipes\settings.py:379 +#: .\recipes\settings.py:447 msgid "Latvian" msgstr "" -#: .\recipes\settings.py:380 +#: .\recipes\settings.py:448 msgid "Polish" msgstr "" -#: .\recipes\settings.py:381 +#: .\recipes\settings.py:449 msgid "Russian" msgstr "" -#: .\recipes\settings.py:382 +#: .\recipes\settings.py:450 msgid "Spanish" msgstr "" -#: .\recipes\settings.py:383 +#: .\recipes\settings.py:451 msgid "Swedish" msgstr "" diff --git a/recipes/locale/es/LC_MESSAGES/django.po b/recipes/locale/es/LC_MESSAGES/django.po index b49fd7f44..7d991c0db 100644 --- a/recipes/locale/es/LC_MESSAGES/django.po +++ b/recipes/locale/es/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 19:20+0200\n" +"POT-Creation-Date: 2023-04-26 07:46+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,62 +18,66 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: .\recipes\settings.py:369 +#: .\recipes\settings.py:436 msgid "Armenian " msgstr "" -#: .\recipes\settings.py:370 +#: .\recipes\settings.py:437 msgid "Bulgarian" msgstr "" -#: .\recipes\settings.py:371 +#: .\recipes\settings.py:438 msgid "Catalan" msgstr "" -#: .\recipes\settings.py:372 +#: .\recipes\settings.py:439 msgid "Czech" msgstr "" -#: .\recipes\settings.py:373 +#: .\recipes\settings.py:440 msgid "Danish" msgstr "" -#: .\recipes\settings.py:374 +#: .\recipes\settings.py:441 msgid "Dutch" msgstr "" -#: .\recipes\settings.py:375 +#: .\recipes\settings.py:442 msgid "English" msgstr "" -#: .\recipes\settings.py:376 +#: .\recipes\settings.py:443 msgid "French" msgstr "" -#: .\recipes\settings.py:377 +#: .\recipes\settings.py:444 msgid "German" msgstr "" -#: .\recipes\settings.py:378 +#: .\recipes\settings.py:445 +msgid "Hungarian" +msgstr "" + +#: .\recipes\settings.py:446 msgid "Italian" msgstr "" -#: .\recipes\settings.py:379 +#: .\recipes\settings.py:447 msgid "Latvian" msgstr "" -#: .\recipes\settings.py:380 +#: .\recipes\settings.py:448 msgid "Polish" msgstr "" -#: .\recipes\settings.py:381 +#: .\recipes\settings.py:449 msgid "Russian" msgstr "" -#: .\recipes\settings.py:382 +#: .\recipes\settings.py:450 msgid "Spanish" msgstr "" -#: .\recipes\settings.py:383 +#: .\recipes\settings.py:451 msgid "Swedish" msgstr "" diff --git a/recipes/locale/fr/LC_MESSAGES/django.po b/recipes/locale/fr/LC_MESSAGES/django.po index c4023609e..d62555e74 100644 --- a/recipes/locale/fr/LC_MESSAGES/django.po +++ b/recipes/locale/fr/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 19:20+0200\n" +"POT-Creation-Date: 2023-04-26 07:46+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,62 +18,66 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: .\recipes\settings.py:369 +#: .\recipes\settings.py:436 msgid "Armenian " msgstr "" -#: .\recipes\settings.py:370 +#: .\recipes\settings.py:437 msgid "Bulgarian" msgstr "" -#: .\recipes\settings.py:371 +#: .\recipes\settings.py:438 msgid "Catalan" msgstr "" -#: .\recipes\settings.py:372 +#: .\recipes\settings.py:439 msgid "Czech" msgstr "" -#: .\recipes\settings.py:373 +#: .\recipes\settings.py:440 msgid "Danish" msgstr "" -#: .\recipes\settings.py:374 +#: .\recipes\settings.py:441 msgid "Dutch" msgstr "" -#: .\recipes\settings.py:375 +#: .\recipes\settings.py:442 msgid "English" msgstr "" -#: .\recipes\settings.py:376 +#: .\recipes\settings.py:443 msgid "French" msgstr "" -#: .\recipes\settings.py:377 +#: .\recipes\settings.py:444 msgid "German" msgstr "" -#: .\recipes\settings.py:378 +#: .\recipes\settings.py:445 +msgid "Hungarian" +msgstr "" + +#: .\recipes\settings.py:446 msgid "Italian" msgstr "" -#: .\recipes\settings.py:379 +#: .\recipes\settings.py:447 msgid "Latvian" msgstr "" -#: .\recipes\settings.py:380 +#: .\recipes\settings.py:448 msgid "Polish" msgstr "" -#: .\recipes\settings.py:381 +#: .\recipes\settings.py:449 msgid "Russian" msgstr "" -#: .\recipes\settings.py:382 +#: .\recipes\settings.py:450 msgid "Spanish" msgstr "" -#: .\recipes\settings.py:383 +#: .\recipes\settings.py:451 msgid "Swedish" msgstr "" diff --git a/recipes/locale/hu_HU/LC_MESSAGES/django.po b/recipes/locale/hu_HU/LC_MESSAGES/django.po index 40bc1e918..817e91ca8 100644 --- a/recipes/locale/hu_HU/LC_MESSAGES/django.po +++ b/recipes/locale/hu_HU/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 19:20+0200\n" +"POT-Creation-Date: 2023-04-26 07:46+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,62 +17,66 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: .\recipes\settings.py:369 +#: .\recipes\settings.py:436 msgid "Armenian " msgstr "" -#: .\recipes\settings.py:370 +#: .\recipes\settings.py:437 msgid "Bulgarian" msgstr "" -#: .\recipes\settings.py:371 +#: .\recipes\settings.py:438 msgid "Catalan" msgstr "" -#: .\recipes\settings.py:372 +#: .\recipes\settings.py:439 msgid "Czech" msgstr "" -#: .\recipes\settings.py:373 +#: .\recipes\settings.py:440 msgid "Danish" msgstr "" -#: .\recipes\settings.py:374 +#: .\recipes\settings.py:441 msgid "Dutch" msgstr "" -#: .\recipes\settings.py:375 +#: .\recipes\settings.py:442 msgid "English" msgstr "" -#: .\recipes\settings.py:376 +#: .\recipes\settings.py:443 msgid "French" msgstr "" -#: .\recipes\settings.py:377 +#: .\recipes\settings.py:444 msgid "German" msgstr "" -#: .\recipes\settings.py:378 +#: .\recipes\settings.py:445 +msgid "Hungarian" +msgstr "" + +#: .\recipes\settings.py:446 msgid "Italian" msgstr "" -#: .\recipes\settings.py:379 +#: .\recipes\settings.py:447 msgid "Latvian" msgstr "" -#: .\recipes\settings.py:380 +#: .\recipes\settings.py:448 msgid "Polish" msgstr "" -#: .\recipes\settings.py:381 +#: .\recipes\settings.py:449 msgid "Russian" msgstr "" -#: .\recipes\settings.py:382 +#: .\recipes\settings.py:450 msgid "Spanish" msgstr "" -#: .\recipes\settings.py:383 +#: .\recipes\settings.py:451 msgid "Swedish" msgstr "" diff --git a/recipes/locale/it/LC_MESSAGES/django.po b/recipes/locale/it/LC_MESSAGES/django.po index b49fd7f44..7d991c0db 100644 --- a/recipes/locale/it/LC_MESSAGES/django.po +++ b/recipes/locale/it/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 19:20+0200\n" +"POT-Creation-Date: 2023-04-26 07:46+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,62 +18,66 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: .\recipes\settings.py:369 +#: .\recipes\settings.py:436 msgid "Armenian " msgstr "" -#: .\recipes\settings.py:370 +#: .\recipes\settings.py:437 msgid "Bulgarian" msgstr "" -#: .\recipes\settings.py:371 +#: .\recipes\settings.py:438 msgid "Catalan" msgstr "" -#: .\recipes\settings.py:372 +#: .\recipes\settings.py:439 msgid "Czech" msgstr "" -#: .\recipes\settings.py:373 +#: .\recipes\settings.py:440 msgid "Danish" msgstr "" -#: .\recipes\settings.py:374 +#: .\recipes\settings.py:441 msgid "Dutch" msgstr "" -#: .\recipes\settings.py:375 +#: .\recipes\settings.py:442 msgid "English" msgstr "" -#: .\recipes\settings.py:376 +#: .\recipes\settings.py:443 msgid "French" msgstr "" -#: .\recipes\settings.py:377 +#: .\recipes\settings.py:444 msgid "German" msgstr "" -#: .\recipes\settings.py:378 +#: .\recipes\settings.py:445 +msgid "Hungarian" +msgstr "" + +#: .\recipes\settings.py:446 msgid "Italian" msgstr "" -#: .\recipes\settings.py:379 +#: .\recipes\settings.py:447 msgid "Latvian" msgstr "" -#: .\recipes\settings.py:380 +#: .\recipes\settings.py:448 msgid "Polish" msgstr "" -#: .\recipes\settings.py:381 +#: .\recipes\settings.py:449 msgid "Russian" msgstr "" -#: .\recipes\settings.py:382 +#: .\recipes\settings.py:450 msgid "Spanish" msgstr "" -#: .\recipes\settings.py:383 +#: .\recipes\settings.py:451 msgid "Swedish" msgstr "" diff --git a/recipes/locale/lv/LC_MESSAGES/django.po b/recipes/locale/lv/LC_MESSAGES/django.po index 1c63fc381..d8b9c52d9 100644 --- a/recipes/locale/lv/LC_MESSAGES/django.po +++ b/recipes/locale/lv/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 19:20+0200\n" +"POT-Creation-Date: 2023-04-26 07:46+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -19,62 +19,66 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " "2);\n" -#: .\recipes\settings.py:369 +#: .\recipes\settings.py:436 msgid "Armenian " msgstr "" -#: .\recipes\settings.py:370 +#: .\recipes\settings.py:437 msgid "Bulgarian" msgstr "" -#: .\recipes\settings.py:371 +#: .\recipes\settings.py:438 msgid "Catalan" msgstr "" -#: .\recipes\settings.py:372 +#: .\recipes\settings.py:439 msgid "Czech" msgstr "" -#: .\recipes\settings.py:373 +#: .\recipes\settings.py:440 msgid "Danish" msgstr "" -#: .\recipes\settings.py:374 +#: .\recipes\settings.py:441 msgid "Dutch" msgstr "" -#: .\recipes\settings.py:375 +#: .\recipes\settings.py:442 msgid "English" msgstr "" -#: .\recipes\settings.py:376 +#: .\recipes\settings.py:443 msgid "French" msgstr "" -#: .\recipes\settings.py:377 +#: .\recipes\settings.py:444 msgid "German" msgstr "" -#: .\recipes\settings.py:378 +#: .\recipes\settings.py:445 +msgid "Hungarian" +msgstr "" + +#: .\recipes\settings.py:446 msgid "Italian" msgstr "" -#: .\recipes\settings.py:379 +#: .\recipes\settings.py:447 msgid "Latvian" msgstr "" -#: .\recipes\settings.py:380 +#: .\recipes\settings.py:448 msgid "Polish" msgstr "" -#: .\recipes\settings.py:381 +#: .\recipes\settings.py:449 msgid "Russian" msgstr "" -#: .\recipes\settings.py:382 +#: .\recipes\settings.py:450 msgid "Spanish" msgstr "" -#: .\recipes\settings.py:383 +#: .\recipes\settings.py:451 msgid "Swedish" msgstr "" diff --git a/recipes/locale/nl/LC_MESSAGES/django.po b/recipes/locale/nl/LC_MESSAGES/django.po index b49fd7f44..7d991c0db 100644 --- a/recipes/locale/nl/LC_MESSAGES/django.po +++ b/recipes/locale/nl/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 19:20+0200\n" +"POT-Creation-Date: 2023-04-26 07:46+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,62 +18,66 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: .\recipes\settings.py:369 +#: .\recipes\settings.py:436 msgid "Armenian " msgstr "" -#: .\recipes\settings.py:370 +#: .\recipes\settings.py:437 msgid "Bulgarian" msgstr "" -#: .\recipes\settings.py:371 +#: .\recipes\settings.py:438 msgid "Catalan" msgstr "" -#: .\recipes\settings.py:372 +#: .\recipes\settings.py:439 msgid "Czech" msgstr "" -#: .\recipes\settings.py:373 +#: .\recipes\settings.py:440 msgid "Danish" msgstr "" -#: .\recipes\settings.py:374 +#: .\recipes\settings.py:441 msgid "Dutch" msgstr "" -#: .\recipes\settings.py:375 +#: .\recipes\settings.py:442 msgid "English" msgstr "" -#: .\recipes\settings.py:376 +#: .\recipes\settings.py:443 msgid "French" msgstr "" -#: .\recipes\settings.py:377 +#: .\recipes\settings.py:444 msgid "German" msgstr "" -#: .\recipes\settings.py:378 +#: .\recipes\settings.py:445 +msgid "Hungarian" +msgstr "" + +#: .\recipes\settings.py:446 msgid "Italian" msgstr "" -#: .\recipes\settings.py:379 +#: .\recipes\settings.py:447 msgid "Latvian" msgstr "" -#: .\recipes\settings.py:380 +#: .\recipes\settings.py:448 msgid "Polish" msgstr "" -#: .\recipes\settings.py:381 +#: .\recipes\settings.py:449 msgid "Russian" msgstr "" -#: .\recipes\settings.py:382 +#: .\recipes\settings.py:450 msgid "Spanish" msgstr "" -#: .\recipes\settings.py:383 +#: .\recipes\settings.py:451 msgid "Swedish" msgstr "" diff --git a/recipes/locale/pt/LC_MESSAGES/django.po b/recipes/locale/pt/LC_MESSAGES/django.po index b49fd7f44..7d991c0db 100644 --- a/recipes/locale/pt/LC_MESSAGES/django.po +++ b/recipes/locale/pt/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 19:20+0200\n" +"POT-Creation-Date: 2023-04-26 07:46+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,62 +18,66 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: .\recipes\settings.py:369 +#: .\recipes\settings.py:436 msgid "Armenian " msgstr "" -#: .\recipes\settings.py:370 +#: .\recipes\settings.py:437 msgid "Bulgarian" msgstr "" -#: .\recipes\settings.py:371 +#: .\recipes\settings.py:438 msgid "Catalan" msgstr "" -#: .\recipes\settings.py:372 +#: .\recipes\settings.py:439 msgid "Czech" msgstr "" -#: .\recipes\settings.py:373 +#: .\recipes\settings.py:440 msgid "Danish" msgstr "" -#: .\recipes\settings.py:374 +#: .\recipes\settings.py:441 msgid "Dutch" msgstr "" -#: .\recipes\settings.py:375 +#: .\recipes\settings.py:442 msgid "English" msgstr "" -#: .\recipes\settings.py:376 +#: .\recipes\settings.py:443 msgid "French" msgstr "" -#: .\recipes\settings.py:377 +#: .\recipes\settings.py:444 msgid "German" msgstr "" -#: .\recipes\settings.py:378 +#: .\recipes\settings.py:445 +msgid "Hungarian" +msgstr "" + +#: .\recipes\settings.py:446 msgid "Italian" msgstr "" -#: .\recipes\settings.py:379 +#: .\recipes\settings.py:447 msgid "Latvian" msgstr "" -#: .\recipes\settings.py:380 +#: .\recipes\settings.py:448 msgid "Polish" msgstr "" -#: .\recipes\settings.py:381 +#: .\recipes\settings.py:449 msgid "Russian" msgstr "" -#: .\recipes\settings.py:382 +#: .\recipes\settings.py:450 msgid "Spanish" msgstr "" -#: .\recipes\settings.py:383 +#: .\recipes\settings.py:451 msgid "Swedish" msgstr "" diff --git a/recipes/locale/rn/LC_MESSAGES/django.po b/recipes/locale/rn/LC_MESSAGES/django.po index 40bc1e918..817e91ca8 100644 --- a/recipes/locale/rn/LC_MESSAGES/django.po +++ b/recipes/locale/rn/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 19:20+0200\n" +"POT-Creation-Date: 2023-04-26 07:46+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,62 +17,66 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: .\recipes\settings.py:369 +#: .\recipes\settings.py:436 msgid "Armenian " msgstr "" -#: .\recipes\settings.py:370 +#: .\recipes\settings.py:437 msgid "Bulgarian" msgstr "" -#: .\recipes\settings.py:371 +#: .\recipes\settings.py:438 msgid "Catalan" msgstr "" -#: .\recipes\settings.py:372 +#: .\recipes\settings.py:439 msgid "Czech" msgstr "" -#: .\recipes\settings.py:373 +#: .\recipes\settings.py:440 msgid "Danish" msgstr "" -#: .\recipes\settings.py:374 +#: .\recipes\settings.py:441 msgid "Dutch" msgstr "" -#: .\recipes\settings.py:375 +#: .\recipes\settings.py:442 msgid "English" msgstr "" -#: .\recipes\settings.py:376 +#: .\recipes\settings.py:443 msgid "French" msgstr "" -#: .\recipes\settings.py:377 +#: .\recipes\settings.py:444 msgid "German" msgstr "" -#: .\recipes\settings.py:378 +#: .\recipes\settings.py:445 +msgid "Hungarian" +msgstr "" + +#: .\recipes\settings.py:446 msgid "Italian" msgstr "" -#: .\recipes\settings.py:379 +#: .\recipes\settings.py:447 msgid "Latvian" msgstr "" -#: .\recipes\settings.py:380 +#: .\recipes\settings.py:448 msgid "Polish" msgstr "" -#: .\recipes\settings.py:381 +#: .\recipes\settings.py:449 msgid "Russian" msgstr "" -#: .\recipes\settings.py:382 +#: .\recipes\settings.py:450 msgid "Spanish" msgstr "" -#: .\recipes\settings.py:383 +#: .\recipes\settings.py:451 msgid "Swedish" msgstr "" diff --git a/recipes/locale/tr/LC_MESSAGES/django.po b/recipes/locale/tr/LC_MESSAGES/django.po index c4023609e..d62555e74 100644 --- a/recipes/locale/tr/LC_MESSAGES/django.po +++ b/recipes/locale/tr/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 19:20+0200\n" +"POT-Creation-Date: 2023-04-26 07:46+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,62 +18,66 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: .\recipes\settings.py:369 +#: .\recipes\settings.py:436 msgid "Armenian " msgstr "" -#: .\recipes\settings.py:370 +#: .\recipes\settings.py:437 msgid "Bulgarian" msgstr "" -#: .\recipes\settings.py:371 +#: .\recipes\settings.py:438 msgid "Catalan" msgstr "" -#: .\recipes\settings.py:372 +#: .\recipes\settings.py:439 msgid "Czech" msgstr "" -#: .\recipes\settings.py:373 +#: .\recipes\settings.py:440 msgid "Danish" msgstr "" -#: .\recipes\settings.py:374 +#: .\recipes\settings.py:441 msgid "Dutch" msgstr "" -#: .\recipes\settings.py:375 +#: .\recipes\settings.py:442 msgid "English" msgstr "" -#: .\recipes\settings.py:376 +#: .\recipes\settings.py:443 msgid "French" msgstr "" -#: .\recipes\settings.py:377 +#: .\recipes\settings.py:444 msgid "German" msgstr "" -#: .\recipes\settings.py:378 +#: .\recipes\settings.py:445 +msgid "Hungarian" +msgstr "" + +#: .\recipes\settings.py:446 msgid "Italian" msgstr "" -#: .\recipes\settings.py:379 +#: .\recipes\settings.py:447 msgid "Latvian" msgstr "" -#: .\recipes\settings.py:380 +#: .\recipes\settings.py:448 msgid "Polish" msgstr "" -#: .\recipes\settings.py:381 +#: .\recipes\settings.py:449 msgid "Russian" msgstr "" -#: .\recipes\settings.py:382 +#: .\recipes\settings.py:450 msgid "Spanish" msgstr "" -#: .\recipes\settings.py:383 +#: .\recipes\settings.py:451 msgid "Swedish" msgstr "" diff --git a/recipes/locale/zh_CN/LC_MESSAGES/django.po b/recipes/locale/zh_CN/LC_MESSAGES/django.po index 40bc1e918..817e91ca8 100644 --- a/recipes/locale/zh_CN/LC_MESSAGES/django.po +++ b/recipes/locale/zh_CN/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 19:20+0200\n" +"POT-Creation-Date: 2023-04-26 07:46+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,62 +17,66 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: .\recipes\settings.py:369 +#: .\recipes\settings.py:436 msgid "Armenian " msgstr "" -#: .\recipes\settings.py:370 +#: .\recipes\settings.py:437 msgid "Bulgarian" msgstr "" -#: .\recipes\settings.py:371 +#: .\recipes\settings.py:438 msgid "Catalan" msgstr "" -#: .\recipes\settings.py:372 +#: .\recipes\settings.py:439 msgid "Czech" msgstr "" -#: .\recipes\settings.py:373 +#: .\recipes\settings.py:440 msgid "Danish" msgstr "" -#: .\recipes\settings.py:374 +#: .\recipes\settings.py:441 msgid "Dutch" msgstr "" -#: .\recipes\settings.py:375 +#: .\recipes\settings.py:442 msgid "English" msgstr "" -#: .\recipes\settings.py:376 +#: .\recipes\settings.py:443 msgid "French" msgstr "" -#: .\recipes\settings.py:377 +#: .\recipes\settings.py:444 msgid "German" msgstr "" -#: .\recipes\settings.py:378 +#: .\recipes\settings.py:445 +msgid "Hungarian" +msgstr "" + +#: .\recipes\settings.py:446 msgid "Italian" msgstr "" -#: .\recipes\settings.py:379 +#: .\recipes\settings.py:447 msgid "Latvian" msgstr "" -#: .\recipes\settings.py:380 +#: .\recipes\settings.py:448 msgid "Polish" msgstr "" -#: .\recipes\settings.py:381 +#: .\recipes\settings.py:449 msgid "Russian" msgstr "" -#: .\recipes\settings.py:382 +#: .\recipes\settings.py:450 msgid "Spanish" msgstr "" -#: .\recipes\settings.py:383 +#: .\recipes\settings.py:451 msgid "Swedish" msgstr "" diff --git a/recipes/settings.py b/recipes/settings.py index 5676fe0a8..e89dbc6da 100644 --- a/recipes/settings.py +++ b/recipes/settings.py @@ -13,6 +13,8 @@ import ast import json import os import re +import sys +import traceback from django.contrib import messages from django.utils.translation import gettext_lazy as _ @@ -22,9 +24,11 @@ load_dotenv() BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Get vars from .env files -SECRET_KEY = os.getenv('SECRET_KEY') if os.getenv('SECRET_KEY') else 'INSECURE_STANDARD_KEY_SET_IN_ENV' +SECRET_KEY = os.getenv('SECRET_KEY') if os.getenv( + 'SECRET_KEY') else 'INSECURE_STANDARD_KEY_SET_IN_ENV' DEBUG = bool(int(os.getenv('DEBUG', True))) +DEBUG_TOOLBAR = bool(int(os.getenv('DEBUG_TOOLBAR', True))) SOCIAL_DEFAULT_ACCESS = bool(int(os.getenv('SOCIAL_DEFAULT_ACCESS', False))) SOCIAL_DEFAULT_GROUP = os.getenv('SOCIAL_DEFAULT_GROUP', 'guest') @@ -32,9 +36,11 @@ SOCIAL_DEFAULT_GROUP = os.getenv('SOCIAL_DEFAULT_GROUP', 'guest') SPACE_DEFAULT_MAX_RECIPES = int(os.getenv('SPACE_DEFAULT_MAX_RECIPES', 0)) SPACE_DEFAULT_MAX_USERS = int(os.getenv('SPACE_DEFAULT_MAX_USERS', 0)) SPACE_DEFAULT_MAX_FILES = int(os.getenv('SPACE_DEFAULT_MAX_FILES', 0)) -SPACE_DEFAULT_ALLOW_SHARING = bool(int(os.getenv('SPACE_DEFAULT_ALLOW_SHARING', True))) +SPACE_DEFAULT_ALLOW_SHARING = bool( + int(os.getenv('SPACE_DEFAULT_ALLOW_SHARING', True))) -INTERNAL_IPS = os.getenv('INTERNAL_IPS').split(',') if os.getenv('INTERNAL_IPS') else ['127.0.0.1'] +INTERNAL_IPS = os.getenv('INTERNAL_IPS').split( + ',') if os.getenv('INTERNAL_IPS') else ['127.0.0.1'] # allow djangos wsgi server to server mediafiles GUNICORN_MEDIA = bool(int(os.getenv('GUNICORN_MEDIA', True))) @@ -48,9 +54,11 @@ KJ_PREF_DEFAULT = bool(int(os.getenv('KJ_PREF_DEFAULT', False))) STICKY_NAV_PREF_DEFAULT = bool(int(os.getenv('STICKY_NAV_PREF_DEFAULT', True))) # minimum interval that users can set for automatic sync of shopping lists -SHOPPING_MIN_AUTOSYNC_INTERVAL = int(os.getenv('SHOPPING_MIN_AUTOSYNC_INTERVAL', 5)) +SHOPPING_MIN_AUTOSYNC_INTERVAL = int( + os.getenv('SHOPPING_MIN_AUTOSYNC_INTERVAL', 5)) -ALLOWED_HOSTS = os.getenv('ALLOWED_HOSTS').split(',') if os.getenv('ALLOWED_HOSTS') else ['*'] +ALLOWED_HOSTS = os.getenv('ALLOWED_HOSTS').split( + ',') if os.getenv('ALLOWED_HOSTS') else ['*'] if os.getenv('CSRF_TRUSTED_ORIGINS'): CSRF_TRUSTED_ORIGINS = os.getenv('CSRF_TRUSTED_ORIGINS').split(',') @@ -117,7 +125,37 @@ INSTALLED_APPS = [ 'treebeard', ] -SOCIAL_PROVIDERS = os.getenv('SOCIAL_PROVIDERS').split(',') if os.getenv('SOCIAL_PROVIDERS') else [] +PLUGINS = [] +try: + for d in os.listdir(os.path.join(BASE_DIR, 'recipes', 'plugins')): + if d != '__pycache__': + try: + apps_path = f'recipes.plugins.{d}.apps' + __import__(apps_path) + app_config_classname = dir(sys.modules[apps_path])[1] + plugin_module = f'recipes.plugins.{d}.apps.{app_config_classname}' + if plugin_module not in INSTALLED_APPS: + INSTALLED_APPS.append(plugin_module) + plugin_class = getattr( + sys.modules[apps_path], app_config_classname) + plugin_config = { + 'name': plugin_class.verbose_name if hasattr(plugin_class, 'verbose_name') else plugin_class.name, + 'module': f'recipes.plugins.{d}', + 'base_path': os.path.join(BASE_DIR, 'recipes', 'plugins', d), + 'base_url': plugin_class.base_url, + 'bundle_name': plugin_class.bundle_name if hasattr(plugin_class, 'bundle_name') else '', + } + PLUGINS.append(plugin_config) + except Exception: + if DEBUG: + traceback.print_exc() + print(f'ERROR failed to initialize plugin {d}') +except Exception: + if DEBUG: + print('ERROR failed to initialize plugins') + +SOCIAL_PROVIDERS = os.getenv('SOCIAL_PROVIDERS').split( + ',') if os.getenv('SOCIAL_PROVIDERS') else [] SOCIALACCOUNT_EMAIL_VERIFICATION = 'none' INSTALLED_APPS = INSTALLED_APPS + SOCIAL_PROVIDERS @@ -158,12 +196,13 @@ MIDDLEWARE = [ 'cookbook.helper.scope_middleware.ScopeMiddleware', ] -if DEBUG: +if DEBUG_TOOLBAR: MIDDLEWARE += ('debug_toolbar.middleware.DebugToolbarMiddleware',) INSTALLED_APPS += ('debug_toolbar',) SORT_TREE_BY_NAME = bool(int(os.getenv('SORT_TREE_BY_NAME', False))) -DISABLE_TREE_FIX_STARTUP = bool(int(os.getenv('DISABLE_TREE_FIX_STARTUP', False))) +DISABLE_TREE_FIX_STARTUP = bool( + int(os.getenv('DISABLE_TREE_FIX_STARTUP', False))) if bool(int(os.getenv('SQL_DEBUG', False))): MIDDLEWARE += ('recipes.middleware.SqlPrintingMiddleware',) @@ -182,6 +221,7 @@ if LDAP_AUTH: AUTHENTICATION_BACKENDS.append('django_auth_ldap.backend.LDAPBackend') AUTH_LDAP_SERVER_URI = os.getenv('AUTH_LDAP_SERVER_URI') + AUTH_LDAP_START_TLS = bool(int(os.getenv('AUTH_LDAP_START_TLS', False))) AUTH_LDAP_BIND_DN = os.getenv('AUTH_LDAP_BIND_DN') AUTH_LDAP_BIND_PASSWORD = os.getenv('AUTH_LDAP_BIND_PASSWORD') AUTH_LDAP_USER_SEARCH = LDAPSearch( @@ -194,10 +234,12 @@ if LDAP_AUTH: 'last_name': 'sn', 'email': 'mail', } - AUTH_LDAP_ALWAYS_UPDATE_USER = bool(int(os.getenv('AUTH_LDAP_ALWAYS_UPDATE_USER', True))) + AUTH_LDAP_ALWAYS_UPDATE_USER = bool( + int(os.getenv('AUTH_LDAP_ALWAYS_UPDATE_USER', True))) AUTH_LDAP_CACHE_TIMEOUT = int(os.getenv('AUTH_LDAP_CACHE_TIMEOUT', 3600)) if 'AUTH_LDAP_TLS_CACERTFILE' in os.environ: - AUTH_LDAP_GLOBAL_OPTIONS = {ldap.OPT_X_TLS_CACERTFILE: os.getenv('AUTH_LDAP_TLS_CACERTFILE')} + AUTH_LDAP_GLOBAL_OPTIONS = { + ldap.OPT_X_TLS_CACERTFILE: os.getenv('AUTH_LDAP_TLS_CACERTFILE')} if DEBUG: LOGGING = { "version": 1, @@ -218,7 +260,8 @@ ACCOUNT_ADAPTER = 'cookbook.helper.AllAuthCustomAdapter' if REVERSE_PROXY_AUTH: MIDDLEWARE.insert(8, 'recipes.middleware.CustomRemoteUser') - AUTHENTICATION_BACKENDS.append('django.contrib.auth.backends.RemoteUserBackend') + AUTHENTICATION_BACKENDS.append( + 'django.contrib.auth.backends.RemoteUserBackend') # Password validation # https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators @@ -362,9 +405,20 @@ WEBPACK_LOADER = { 'POLL_INTERVAL': 0.1, 'TIMEOUT': None, 'IGNORE': [r'.+\.hot-update.js', r'.+\.map'], - } + }, } +for p in PLUGINS: + if p['bundle_name'] != '': + WEBPACK_LOADER[p['bundle_name']] = { + 'CACHE': not DEBUG, + 'BUNDLE_DIR_NAME': f'{p["base_path"]}/vue/', # must end with slash + 'STATS_FILE': os.path.join(p["base_path"], 'vue', 'webpack-stats.json'), + 'POLL_INTERVAL': 0.1, + 'TIMEOUT': None, + 'IGNORE': [r'.+\.hot-update.js', r'.+\.map'], + } + # Internationalization # https://docs.djangoproject.com/en/2.0/topics/i18n/ @@ -388,6 +442,7 @@ LANGUAGES = [ ('en', _('English')), ('fr', _('French')), ('de', _('German')), + ('hu', _('Hungarian')), ('it', _('Italian')), ('lv', _('Latvian')), ('pl', _('Polish')), @@ -401,7 +456,8 @@ LANGUAGES = [ SCRIPT_NAME = os.getenv('SCRIPT_NAME', '') # path for django_js_reverse to generate the javascript file containing all urls. Only done because the default command (collectstatic_js_reverse) fails to update the manifest -JS_REVERSE_OUTPUT_PATH = os.path.join(BASE_DIR, "cookbook/static/django_js_reverse") +JS_REVERSE_OUTPUT_PATH = os.path.join( + BASE_DIR, "cookbook/static/django_js_reverse") JS_REVERSE_SCRIPT_PREFIX = os.getenv('JS_REVERSE_SCRIPT_PREFIX', SCRIPT_NAME) STATIC_URL = os.getenv('STATIC_URL', '/static/') @@ -456,4 +512,5 @@ EMAIL_HOST_PASSWORD = os.getenv('EMAIL_HOST_PASSWORD', '') EMAIL_USE_TLS = bool(int(os.getenv('EMAIL_USE_TLS', False))) EMAIL_USE_SSL = bool(int(os.getenv('EMAIL_USE_SSL', False))) DEFAULT_FROM_EMAIL = os.getenv('DEFAULT_FROM_EMAIL', 'webmaster@localhost') -ACCOUNT_EMAIL_SUBJECT_PREFIX = os.getenv('ACCOUNT_EMAIL_SUBJECT_PREFIX', '[Tandoor Recipes] ') # allauth sender prefix +ACCOUNT_EMAIL_SUBJECT_PREFIX = os.getenv( + 'ACCOUNT_EMAIL_SUBJECT_PREFIX', '[Tandoor Recipes] ') # allauth sender prefix diff --git a/recipes/urls.py b/recipes/urls.py index ffe02e900..660cbd2eb 100644 --- a/recipes/urls.py +++ b/recipes/urls.py @@ -14,6 +14,8 @@ Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ +import traceback + from django.conf import settings from django.contrib import admin from django.urls import include, path, re_path @@ -42,3 +44,15 @@ if settings.ENABLE_METRICS: if settings.GUNICORN_MEDIA or settings.DEBUG: urlpatterns += re_path(r'^media/(?P.*)$', serve, {'document_root': settings.MEDIA_ROOT}), urlpatterns += re_path(r'^jsreverse.json$', reverse_views.urls_js, name='js_reverse'), + +for p in settings.PLUGINS: + try: + urlpatterns += path(p['base_url'], include(f'{p["module"]}.urls')), + except ModuleNotFoundError as e: + if settings.DEBUG: + print(e.msg) + print(f'ERROR failed loading plugin <{p["name"]}> urls, did you forget creating urls.py in your plugin?') + except Exception as e: + if settings.DEBUG: + print(f'ERROR failed loading urls for plugin <{p["name"]}>') + traceback.format_exc() diff --git a/requirements.txt b/requirements.txt index 608ec47ce..b96fc67f0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,23 +1,23 @@ -Django==4.1.4 -cryptography==38.0.4 +Django==4.1.7 +cryptography==39.0.1 django-annoying==0.10.6 django-autocomplete-light==3.9.4 -django-cleanup==6.0.0 +django-cleanup==7.0.0 django-crispy-forms==1.14.0 -django-tables2==2.4.1 +django-tables2==2.5.3 djangorestframework==3.14.0 drf-writable-nested==0.7.0 django-oauth-toolkit==2.2.0 -django-debug-toolbar==3.7.0 +django-debug-toolbar==3.8.1 bleach==5.0.1 bleach-allowlist==1.0.3 gunicorn==20.1.0 lxml==4.9.2 -Markdown==3.4.1 -Pillow==9.3.0 +Markdown==3.4.3 +Pillow==9.4.0 psycopg2-binary==2.9.5 python-dotenv==0.21.0 -requests==2.28.1 +requests==2.28.2 six==1.16.0 webdavclient3==3.14.6 whitenoise==6.2.0 @@ -27,22 +27,22 @@ uritemplate==4.1.1 beautifulsoup4==4.11.1 microdata==0.8.0 Jinja2==3.1.2 -django-webpack-loader==1.8.0 -git+https://github.com/ierror/django-js-reverse@7cab78c4531780ab4b32033d5104ccd5be1a246a -django-allauth==0.52.0 -recipe-scrapers==14.24.0 +django-webpack-loader==1.8.1 +git+https://github.com/BITSOLVER/django-js-reverse@071e304fd600107bc64bbde6f2491f1fe049ec82 +django-allauth==0.54.0 +recipe-scrapers==14.36.1 django-scopes==1.2.0.post1 -pytest==7.2.0 +pytest==7.3.1 pytest-django==4.5.2 -django-treebeard==4.5.1 +django-treebeard==4.7 django-cors-headers==3.13.0 django-storages==1.13.2 boto3==1.26.41 django-prometheus==2.2.0 django-hCaptcha==0.2.0 python-ldap==3.4.3 -django-auth-ldap==4.1.0 -pytest-factoryboy==2.5.0 +django-auth-ldap==4.2.0 +pytest-factoryboy==2.5.1 pyppeteer==1.0.2 validators==0.20.0 -pytube==12.1.0 \ No newline at end of file +pytube==12.1.0 diff --git a/vue/package.json b/vue/package.json index c843903c9..c91f3e058 100644 --- a/vue/package.json +++ b/vue/package.json @@ -8,21 +8,25 @@ "lint": "vue-cli-service lint" }, "dependencies": { - "@babel/eslint-parser": "^7.19.1", - "@kevinfaguiar/vue-twemoji-picker": "^5.7.4", - "@popperjs/core": "^2.11.6", + "@babel/eslint-parser": "^7.21.3", + "@emoji-mart/data": "^1.1.1", + "@popperjs/core": "^2.11.7", "@riophae/vue-treeselect": "^0.4.0", "@vue/cli": "^5.0.8", + "@vue/composition-api": "1.7.1", "axios": "^1.2.0", "babel": "^6.23.0", "babel-core": "^6.26.3", "babel-loader": "^9.1.0", "bootstrap-vue": "^2.23.1", - "core-js": "^3.27.1", + "core-js": "^3.29.1", + "emoji-mart": "^5.4.0", + "emoji-mart-vue-fast": "^12.0.1", "html2pdf.js": "^0.10.1", "lodash": "^4.17.21", "mavon-editor": "^2.10.4", "moment": "^2.29.4", + "pinia": "^2.0.30", "prismjs": "^1.29.0", "string-similarity": "^4.0.4", "vue": "^2.6.14", @@ -30,23 +34,23 @@ "vue-click-outside": "^1.1.0", "vue-clickaway": "^2.2.2", "vue-clipboard2": "^0.3.3", - "vue-cookies": "^1.8.2", + "vue-cookies": "^1.8.3", "vue-i18n": "^8.28.2", "vue-infinite-loading": "^2.4.5", "vue-multiselect": "^2.1.6", "vue-property-decorator": "^9.1.2", "vue-sanitize": "^0.2.2", - "vue-simple-calendar": "^5.0.0", - "vue-template-compiler": "2.6.14", + "vue-simple-calendar": "TandoorRecipes/vue-simple-calendar#lastvue2", + "vue-template-compiler": "2.7.14", "vue2-touch-events": "^3.2.2", "vuedraggable": "^2.24.3", - "vuex": "^3.6.0", - "workbox-webpack-plugin": "^6.5.4" + "workbox-webpack-plugin": "^6.5.4", + "workbox-window": "^6.5.4" }, "devDependencies": { "@kazupon/vue-i18n-loader": "^0.5.0", - "@typescript-eslint/eslint-plugin": "^4.33.0", - "@typescript-eslint/parser": "^5.47.1", + "@typescript-eslint/eslint-plugin": "^5.56.0", + "@typescript-eslint/parser": "^5.57.0", "@vue/cli-plugin-babel": "^5.0.8", "@vue/cli-plugin-eslint": "~5.0.8", "@vue/cli-plugin-pwa": "^5.0.8", @@ -58,8 +62,9 @@ "eslint": "^7.28.0", "eslint-plugin-vue": "^8.7.1", "typescript": "~4.9.3", - "vue-cli-plugin-i18n": "^2.3.1", - "webpack-bundle-tracker": "1.8.0", + "vue-cli-plugin-i18n": "^2.3.2", + "webpack-bundle-tracker": "1.8.1", + "workbox-background-sync": "^6.5.4", "workbox-expiration": "^6.5.4", "workbox-navigation-preload": "^6.5.4", "workbox-precaching": "^6.5.4", diff --git a/vue/src/apps/CookbookView/CookbookView.vue b/vue/src/apps/CookbookView/CookbookView.vue index 4592d5678..b4b87c93e 100644 --- a/vue/src/apps/CookbookView/CookbookView.vue +++ b/vue/src/apps/CookbookView/CookbookView.vue @@ -18,7 +18,8 @@
    -
    +
    +
    @@ -53,7 +54,21 @@ @reload="openBook(current_book, true)" > +
    +
    + + + + +
    @@ -66,13 +81,14 @@ import { ApiApiFactory } from "@/utils/openapi/api" import CookbookSlider from "@/components/CookbookSlider" import LoadingSpinner from "@/components/LoadingSpinner" import { StandardToasts, ApiMixin } from "@/utils/utils" +import BottomNavigationBar from "@/components/BottomNavigationBar.vue"; Vue.use(BootstrapVue) export default { name: "CookbookView", mixins: [ApiMixin], - components: { LoadingSpinner, CookbookSlider }, + components: { LoadingSpinner, CookbookSlider, BottomNavigationBar }, data() { return { cookbooks: [], diff --git a/vue/src/apps/CookbookView/main.js b/vue/src/apps/CookbookView/main.js index 0fbe7b3b6..2de451d41 100644 --- a/vue/src/apps/CookbookView/main.js +++ b/vue/src/apps/CookbookView/main.js @@ -1,6 +1,7 @@ import Vue from 'vue' import App from './CookbookView.vue' import i18n from '@/i18n' +import {createPinia, PiniaVuePlugin} from "pinia"; Vue.config.productionTip = false @@ -11,8 +12,11 @@ if (process.env.NODE_ENV === 'development') { } export default __webpack_public_path__ = publicPath // eslint-disable-line +Vue.use(PiniaVuePlugin) +const pinia = createPinia() new Vue({ + pinia, i18n, render: h => h(App), }).$mount('#app') diff --git a/vue/src/apps/ExportResponseView/main.js b/vue/src/apps/ExportResponseView/main.js index 220ac3be4..760b00deb 100644 --- a/vue/src/apps/ExportResponseView/main.js +++ b/vue/src/apps/ExportResponseView/main.js @@ -1,6 +1,7 @@ import Vue from 'vue' import App from './ExportResponseView.vue' import i18n from '@/i18n' +import {createPinia, PiniaVuePlugin} from "pinia"; Vue.config.productionTip = false @@ -11,8 +12,11 @@ if (process.env.NODE_ENV === 'development') { } export default __webpack_public_path__ = publicPath // eslint-disable-line +Vue.use(PiniaVuePlugin) +const pinia = createPinia() new Vue({ + pinia, i18n, render: h => h(App), }).$mount('#app') diff --git a/vue/src/apps/ExportView/main.js b/vue/src/apps/ExportView/main.js index 8c8af8e52..4b8a118d3 100644 --- a/vue/src/apps/ExportView/main.js +++ b/vue/src/apps/ExportView/main.js @@ -1,6 +1,7 @@ import Vue from 'vue' import App from './ExportView.vue' import i18n from '@/i18n' +import {createPinia, PiniaVuePlugin} from "pinia"; Vue.config.productionTip = false @@ -11,8 +12,11 @@ if (process.env.NODE_ENV === 'development') { } export default __webpack_public_path__ = publicPath // eslint-disable-line +Vue.use(PiniaVuePlugin) +const pinia = createPinia() new Vue({ + pinia, i18n, render: h => h(App), }).$mount('#app') diff --git a/vue/src/apps/ImportResponseView/main.js b/vue/src/apps/ImportResponseView/main.js index 7efb6f0d5..c8a3cfee1 100644 --- a/vue/src/apps/ImportResponseView/main.js +++ b/vue/src/apps/ImportResponseView/main.js @@ -1,6 +1,7 @@ import Vue from 'vue' import App from './ImportResponseView.vue' import i18n from '@/i18n' +import {createPinia, PiniaVuePlugin} from "pinia"; Vue.config.productionTip = false @@ -11,8 +12,11 @@ if (process.env.NODE_ENV === 'development') { } export default __webpack_public_path__ = publicPath // eslint-disable-line +Vue.use(PiniaVuePlugin) +const pinia = createPinia() new Vue({ + pinia, i18n, render: h => h(App), }).$mount('#app') diff --git a/vue/src/apps/ImportView/ImportView.vue b/vue/src/apps/ImportView/ImportView.vue index b7a339734..3c3b892fe 100644 --- a/vue/src/apps/ImportView/ImportView.vue +++ b/vue/src/apps/ImportView/ImportView.vue @@ -24,8 +24,11 @@
    {{ $t('Multiple') }} {{ $t('Single') }} + v-if="import_multiple"> {{ $t('Multiple') }} {{ $t('Single') }} +
    - - - - - - - - - - - - - + + + + + + + + + + + + + - - - + + +
    @@ -204,7 +207,7 @@ v-if="!import_multiple"> @@ -238,17 +241,22 @@ +
    + +
    - Import & + Import & View Import & Edit + v-if="!import_multiple" :disabled="import_loading">Import & Edit - Import & + Import & Restart - Restart + Restart
    @@ -462,6 +470,7 @@ export default { source_data: '', recipe_json: undefined, use_plural: false, + import_loading: false, // recipe_html: undefined, // recipe_tree: undefined, recipe_images: [], @@ -495,6 +504,13 @@ export default { apiClient.retrieveSpace(window.ACTIVE_SPACE_ID).then(r => { this.use_plural = r.data.use_plural }) + + let urlParams = new URLSearchParams(window.location.search) + + if (urlParams.has("url")) { + this.website_url = urlParams.get('url') + this.loadRecipe(this.website_url) + } }, methods: { /** @@ -504,6 +520,7 @@ export default { * @param silent do not show any messages for imports */ importRecipe: function (action, data, silent) { + this.import_loading = true if (this.recipe_json !== undefined) { this.$set(this.recipe_json, 'keywords', this.recipe_json.keywords.filter(k => k.show)) } @@ -528,12 +545,14 @@ export default { if (recipe_json.source_url !== '') { this.failed_imports.push(recipe_json.source_url) } + this.import_loading = false if (!silent) { StandardToasts.makeStandardToast(this, StandardToasts.FAIL_CREATE) } }) } else { console.log('cant import recipe without data') + this.import_loading = false if (!silent) { StandardToasts.makeStandardToast(this, StandardToasts.FAIL_CREATE) } @@ -563,6 +582,7 @@ export default { this.imported_recipes.push(recipe) break; case 'nothing': + this.import_loading = false break; } }, @@ -614,6 +634,11 @@ export default { } return axios.post(resolveDjangoUrl('api_recipe_from_source'), payload,).then((response) => { + if (response.status === 201 && 'link' in response.data) { + window.location = response.data.link + return + } + this.loading = false this.recipe_json = response.data['recipe_json']; diff --git a/vue/src/apps/ImportView/ImportViewStepEditor.vue b/vue/src/apps/ImportView/ImportViewStepEditor.vue index 37df5f057..5bda6ea9d 100644 --- a/vue/src/apps/ImportView/ImportViewStepEditor.vue +++ b/vue/src/apps/ImportView/ImportViewStepEditor.vue @@ -1,63 +1,101 @@ diff --git a/vue/src/apps/ImportView/main.js b/vue/src/apps/ImportView/main.js index f55808a72..c0bd66afb 100644 --- a/vue/src/apps/ImportView/main.js +++ b/vue/src/apps/ImportView/main.js @@ -1,6 +1,7 @@ import Vue from 'vue' import App from './ImportView.vue' import i18n from '@/i18n' +import {createPinia, PiniaVuePlugin} from "pinia"; Vue.config.productionTip = false @@ -11,8 +12,11 @@ if (process.env.NODE_ENV === 'development') { } export default __webpack_public_path__ = publicPath // eslint-disable-line +Vue.use(PiniaVuePlugin) +const pinia = createPinia() new Vue({ + pinia, i18n, render: h => h(App), }).$mount('#app') diff --git a/vue/src/apps/IngredientEditorView/main.js b/vue/src/apps/IngredientEditorView/main.js index c92257cd2..7304afd91 100644 --- a/vue/src/apps/IngredientEditorView/main.js +++ b/vue/src/apps/IngredientEditorView/main.js @@ -1,6 +1,7 @@ import Vue from 'vue' import App from './IngredientEditorView.vue' import i18n from '@/i18n' +import {createPinia, PiniaVuePlugin} from "pinia"; Vue.config.productionTip = false @@ -11,8 +12,11 @@ if (process.env.NODE_ENV === 'development') { } export default __webpack_public_path__ = publicPath // eslint-disable-line +Vue.use(PiniaVuePlugin) +const pinia = createPinia() new Vue({ + pinia, i18n, render: h => h(App), }).$mount('#app') diff --git a/vue/src/apps/MealPlanView/MealPlanView.vue b/vue/src/apps/MealPlanView/MealPlanView.vue index e4a88470a..7652c4bd7 100644 --- a/vue/src/apps/MealPlanView/MealPlanView.vue +++ b/vue/src/apps/MealPlanView/MealPlanView.vue @@ -2,7 +2,7 @@
    -
    +
    +
    +
    +
    +
    + + + + + + + + + + + + +
    +
    +
    +
    + + +
    +
    {{ day.date_label }}
    + +
    + +
    +
    + +
    + +
    +
    + + +
    +
    + + {{ plan.entry.recipe.name }} + {{ plan.entry.title }}
    +
    + + {{ plan.entry.note }}
    +
    + + + {{ plan.entry.meal_type_name }} + + - {{ plan.entry.recipe.working_time + plan.entry.recipe.waiting_time }} {{ $t('min') }} + + +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    @@ -166,7 +239,7 @@ @@ -175,7 +248,7 @@ @@ -192,7 +265,7 @@ @@ -203,9 +276,7 @@ - -
    -
    - -
    -
    -
    +
    +
    + + + {{ $t("Export_To_ICal") }} + +
    +
    + + + +
    -
    -
    - - - - - - - - - - - - - - -
    - +
    @@ -276,6 +330,8 @@ import VueCookies from "vue-cookies" import {ApiMixin, StandardToasts, ResolveUrlMixin} from "@/utils/utils" import {CalendarView, CalendarMathMixin} from "vue-simple-calendar/src/components/bundle" import {ApiApiFactory} from "@/utils/openapi/api" +import BottomNavigationBar from "@/components/BottomNavigationBar.vue"; +import {useMealPlanStore} from "@/stores/MealPlanStore"; import axios from "axios"; import AutoMealPlanModal from "@/components/AutoMealPlanModal"; @@ -299,6 +355,7 @@ export default { MealPlanCalenderHeader, EmojiInput, draggable, + BottomNavigationBar, }, mixins: [CalendarMathMixin, ApiMixin, ResolveUrlMixin], data: function () { @@ -334,29 +391,18 @@ export default { {text: this.$t("Year"), value: "year"}, ], displayPeriodCount: [1, 2, 3], - entryEditing: { - date: null, - id: -1, - meal_type: null, - note: "", - note_markdown: "", - recipe: null, - servings: 1, - shared: [], - title: "", - title_placeholder: this.$t("Title"), - }, }, shopping_list: [], current_period: null, - entryEditing: {}, - edit_modal_show: false, + entryEditing: null, + mealplan_default_date: null, ical_url: window.ICAL_URL, + image_placeholder: window.IMAGE_PLACEHOLDER, } }, computed: { modal_title: function () { - if (this.entryEditing.id === -1) { + if (this.entryEditing === null || this.entryEditing?.id === -1) { return this.$t("Create_Meal_Plan_Entry") } else { return this.$t("Edit_Meal_Plan_Entry") @@ -364,7 +410,7 @@ export default { }, plan_items: function () { let items = [] - this.plan_entries.forEach((entry) => { + useMealPlanStore().plan_list.forEach((entry) => { items.push(this.buildItem(entry)) }) return items @@ -398,6 +444,22 @@ export default { return "" } }, + mobileSimpleGrid() { + let grid = [] + + if (this.current_period !== null) { + for (const x of Array(7).keys()) { + let moment_date = moment(this.current_period.periodStart).add(x, "d") + grid.push({ + date: moment_date, + create_default_date: moment_date.format("YYYY-MM-DD"), // improve meal plan edit modal to do formatting itself and accept dates + date_label: moment_date.format('ddd DD.MM'), + plan_entries: this.plan_items.filter((m) => moment(m.startDate).isSame(moment_date, 'day')) + }) + } + } + return grid + } }, mounted() { this.$nextTick(function () { @@ -407,6 +469,7 @@ export default { }) this.$root.$on("change", this.updateEmoji) this.$i18n.locale = window.CUSTOM_LOCALE + moment.locale(window.CUSTOM_LOCALE) }, watch: { settings: { @@ -504,33 +567,26 @@ export default { } }) }, - editEntry(edit_entry) { - if (edit_entry.id !== -1) { - this.plan_entries.forEach((entry, index) => { - if (entry.id === edit_entry.id) { - this.$set(this.plan_entries, index, edit_entry) - this.saveEntry(this.plan_entries[index]) - } - }) - } else { - this.createEntry(edit_entry) - } + datePickerChanged(ctx) { + this.setShowDate(ctx.selectedDate) }, setShowDate(d) { this.showDate = d }, createEntryClick(data) { - this.entryEditing = this.options.entryEditing - this.entryEditing.date = moment(data).format("YYYY-MM-DD") - this.$bvModal.show(`edit-modal`) + this.mealplan_default_date = moment(data).format("YYYY-MM-DD") + this.entryEditing = null + this.$nextTick(function () { + this.$bvModal.show(`id_meal_plan_edit_modal`) + }) }, findEntry(id) { - return this.plan_entries.filter((entry) => { + return useMealPlanStore().plan_list.filter((entry) => { return entry.id === id })[0] }, moveEntry(null_object, target_date, drag_event) { - this.plan_entries.forEach((entry) => { + useMealPlanStore().plan_list.forEach((entry) => { if (entry.id === this.dragged_item.id) { if (drag_event.ctrlKey) { let new_entry = Object.assign({}, entry) @@ -544,7 +600,7 @@ export default { }) }, moveEntryLeft(data) { - this.plan_entries.forEach((entry) => { + useMealPlanStore().plan_list.forEach((entry) => { if (entry.id === data.id) { entry.date = moment(entry.date).subtract(1, "d") this.saveEntry(entry) @@ -552,7 +608,7 @@ export default { }) }, moveEntryRight(data) { - this.plan_entries.forEach((entry) => { + useMealPlanStore().plan_list.forEach((entry) => { if (entry.id === data.id) { entry.date = moment(entry.date).add(1, "d") this.saveEntry(entry) @@ -560,20 +616,7 @@ export default { }) }, deleteEntry(data) { - this.plan_entries.forEach((entry, index, list) => { - if (entry.id === data.id) { - let apiClient = new ApiApiFactory() - - apiClient - .destroyMealPlan(entry.id) - .then((e) => { - list.splice(index, 1) - }) - .catch((err) => { - StandardToasts.makeStandardToast(this, StandardToasts.FAIL_UPDATE, err) - }) - } - }) + useMealPlanStore().deleteObject(data) }, entryClick(data) { let entry = this.findEntry(data.id) @@ -583,7 +626,7 @@ export default { this.$refs.menu.open($event, value) }, openEntryEdit(entry) { - this.$bvModal.show(`edit-modal`) + this.$bvModal.show(`id_meal_plan_edit_modal`) this.entryEditing = entry this.entryEditing.date = moment(entry.date).format("YYYY-MM-DD") if (this.entryEditing.recipe != null) { @@ -592,18 +635,9 @@ export default { }, periodChangedCallback(date) { this.current_period = date - let apiClient = new ApiApiFactory() - apiClient - .listMealPlans({ - query: { - from_date: moment(date.periodStart).format("YYYY-MM-DD"), - to_date: moment(date.periodEnd).format("YYYY-MM-DD"), - }, - }) - .then((result) => { - this.plan_entries = result.data - }) + useMealPlanStore().refreshFromAPI(moment(date.periodStart).format("YYYY-MM-DD"), moment(date.periodEnd).format("YYYY-MM-DD")) + this.refreshMealTypes() }, refreshMealTypes() { @@ -619,25 +653,11 @@ export default { saveEntry(entry) { entry.date = moment(entry.date).format("YYYY-MM-DD") - let apiClient = new ApiApiFactory() - - apiClient.updateMealPlan(entry.id, entry).catch((err) => { - StandardToasts.makeStandardToast(this, StandardToasts.FAIL_UPDATE, err) - }) + useMealPlanStore().updateObject(entry) }, createEntry(entry) { entry.date = moment(entry.date).format("YYYY-MM-DD") - - let apiClient = new ApiApiFactory() - - apiClient - .createMealPlan(entry) - .catch((err) => { - StandardToasts.makeStandardToast(this, StandardToasts.FAIL_UPDATE, err) - }) - .then((entry_result) => { - this.plan_entries.push(entry_result.data) - }) + useMealPlanStore().createObject(entry) }, buildItem(plan_entry) { //dirty hack to order items within a day @@ -649,6 +669,15 @@ export default { entry: plan_entry, } }, + showMealPlanEditModal: function (entry, date) { + this.mealplan_default_date = date + this.entryEditing = entry + + this.$nextTick(function () { + this.$bvModal.show(`id_meal_plan_edit_modal`) + }) + + } createAutoPlan() { this.$bvModal.show(`autoplan-modal`) }, @@ -713,6 +742,10 @@ export default { diff --git a/vue/src/apps/RecipeSearchView/main.js b/vue/src/apps/RecipeSearchView/main.js index 93fc04d0b..921abb2fd 100644 --- a/vue/src/apps/RecipeSearchView/main.js +++ b/vue/src/apps/RecipeSearchView/main.js @@ -1,6 +1,7 @@ import Vue from 'vue' import App from './RecipeSearchView' import i18n from '@/i18n' +import {createPinia, PiniaVuePlugin} from "pinia"; Vue.config.productionTip = false @@ -11,8 +12,11 @@ if (process.env.NODE_ENV === 'development') { } export default __webpack_public_path__ = publicPath // eslint-disable-line +Vue.use(PiniaVuePlugin) +const pinia = createPinia() new Vue({ + pinia, i18n, render: h => h(App), }).$mount('#app') diff --git a/vue/src/apps/RecipeView/RecipeView.vue b/vue/src/apps/RecipeView/RecipeView.vue index 53386c084..3333b414f 100644 --- a/vue/src/apps/RecipeView/RecipeView.vue +++ b/vue/src/apps/RecipeView/RecipeView.vue @@ -4,7 +4,7 @@ -
    +
    @@ -90,7 +90,6 @@ :ingredient_factor="ingredient_factor" :servings="servings" :header="true" - :use_plural="use_plural" id="ingredient_container" @checked-state-changed="updateIngredientCheckedState" @change-servings="servings = $event" @@ -124,7 +123,6 @@ :step="s" :ingredient_factor="ingredient_factor" :index="index" - :use_plural="use_plural" :start_time="start_time" @update-start-time="updateStartTime" @checked-state-changed="updateIngredientCheckedState" @@ -149,11 +147,14 @@
    + v-if="share_uid !== 'None' && !loading">
    + +
    @@ -182,6 +183,8 @@ import NutritionComponent from "@/components/NutritionComponent" import RecipeSwitcher from "@/components/Buttons/RecipeSwitcher" import CustomInputSpinButton from "@/components/CustomInputSpinButton" import {ApiApiFactory} from "@/utils/openapi/api"; +import ImportTandoor from "@/components/Modals/ImportTandoor.vue"; +import BottomNavigationBar from "@/components/BottomNavigationBar.vue"; Vue.prototype.moment = moment @@ -191,6 +194,7 @@ export default { name: "RecipeView", mixins: [ResolveUrlMixin, ToastMixin], components: { + ImportTandoor, LastCooked, RecipeRating, PdfViewer, @@ -204,6 +208,7 @@ export default { AddRecipeToBook, RecipeSwitcher, CustomInputSpinButton, + BottomNavigationBar, }, computed: { ingredient_factor: function () { @@ -221,7 +226,6 @@ export default { }, data() { return { - use_plural: false, loading: true, recipe: undefined, rootrecipe: undefined, @@ -244,10 +248,6 @@ export default { this.requestWakeLock() window.addEventListener('resize', this.handleResize); - let apiClient = new ApiApiFactory() - apiClient.retrieveSpace(window.ACTIVE_SPACE_ID).then(r => { - this.use_plural = r.data.use_plural - }) }, beforeUnmount() { this.destroyWakeLock() diff --git a/vue/src/apps/RecipeView/main.js b/vue/src/apps/RecipeView/main.js index b5acd6a29..bbd3ad400 100644 --- a/vue/src/apps/RecipeView/main.js +++ b/vue/src/apps/RecipeView/main.js @@ -1,6 +1,7 @@ import Vue from 'vue' import App from './RecipeView.vue' import i18n from "@/i18n"; +import {createPinia, PiniaVuePlugin} from 'pinia' Vue.config.productionTip = false @@ -11,8 +12,11 @@ if (process.env.NODE_ENV === 'development') { } export default __webpack_public_path__ = publicPath // eslint-disable-line +Vue.use(PiniaVuePlugin) +const pinia = createPinia() new Vue({ + pinia, i18n, render: h => h(App), }).$mount('#app') diff --git a/vue/src/apps/SettingsView/main.js b/vue/src/apps/SettingsView/main.js index 4f2d1dff3..5d3ca9917 100644 --- a/vue/src/apps/SettingsView/main.js +++ b/vue/src/apps/SettingsView/main.js @@ -1,6 +1,7 @@ import Vue from 'vue' import App from './SettingsView.vue' import i18n from '@/i18n' +import {createPinia, PiniaVuePlugin} from "pinia"; Vue.config.productionTip = false @@ -11,7 +12,11 @@ if (process.env.NODE_ENV === 'development') { } export default __webpack_public_path__ = publicPath // eslint-disable-line +Vue.use(PiniaVuePlugin) +const pinia = createPinia() + new Vue({ + pinia, i18n, render: h => h(App), }).$mount('#app') diff --git a/vue/src/apps/ShoppingListView/ShoppingListView.vue b/vue/src/apps/ShoppingListView/ShoppingListView.vue index e49af861a..7dc59d4a7 100644 --- a/vue/src/apps/ShoppingListView/ShoppingListView.vue +++ b/vue/src/apps/ShoppingListView/ShoppingListView.vue @@ -1,6 +1,7 @@ @@ -615,6 +615,8 @@ import ShoppingSettingsComponent from "@/components/Settings/ShoppingSettingsCom Vue.use(BootstrapVue) Vue.use(VueCookies) let SETTINGS_COOKIE_NAME = "shopping_settings" +import {Workbox} from 'workbox-window'; +import BottomNavigationBar from "@/components/BottomNavigationBar.vue"; export default { name: "ShoppingListView", @@ -630,7 +632,8 @@ export default { CopyToClipboard, ShoppingModal, draggable, - ShoppingSettingsComponent + ShoppingSettingsComponent, + BottomNavigationBar, }, data() { @@ -903,9 +906,30 @@ export default { } }) this.$i18n.locale = window.CUSTOM_LOCALE - console.log(window.CUSTOM_LOCALE) }, methods: { + /** + * failed requests to sync entry check events are automatically re-queued by the service worker for sync + * this command allows to manually force replaying those events before re-enabling automatic sync + */ + replaySyncQueue: function () { + const wb = new Workbox('/service-worker.js'); + wb.register(); + wb.messageSW({type: 'BGSYNC_REPLAY_REQUESTS'}).then((r) => { + console.log('Background sync queue replayed!', r); + }) + }, + /** + * get the number of entries left in the sync queue for entry check events + * @returns {Promise} promise resolving to the number of entries left + */ + getSyncQueueLength: function () { + const wb = new Workbox('/service-worker.js'); + wb.register(); + return wb.messageSW({type: 'BGSYNC_COUNT_QUEUE'}).then((r) => { + return r + }) + }, setFocus() { if (this.ui.entry_mode_simple) { this.$refs['amount_input_simple'].focus() @@ -1043,21 +1067,27 @@ export default { } else { this.loading = true } - this.genericAPI(this.Models.SHOPPING_LIST, this.Actions.LIST, params) - .then((results) => { - if (!autosync) { - if (results.data?.length) { - this.items = results.data - } else { - console.log("no data returned") - } - this.loading = false + this.genericAPI(this.Models.SHOPPING_LIST, this.Actions.LIST, params).then((results) => { + if (!autosync) { + if (results.data?.length) { + this.items = results.data } else { - if (!this.auto_sync_blocked) { - this.mergeShoppingList(results.data) - } + console.log("no data returned") } - }) + this.loading = false + } else { + if (!this.auto_sync_blocked) { + this.getSyncQueueLength().then((r) => { + if (r === 0) { + this.mergeShoppingList(results.data) + } else { + this.auto_sync_running = false + this.replaySyncQueue() + } + }) + } + } + }) .catch((err) => { if (!autosync) { StandardToasts.makeStandardToast(this, StandardToasts.FAIL_FETCH, err) @@ -1205,7 +1235,7 @@ export default { let api = new ApiApiFactory() if (field) { // assume if field is changing it should no longer be inherited - food.inherit_fields = food.inherit_fields.filter((x) => x.field !== field) + food.inherit_fields = food.inherit_fields?.filter((x) => x.field !== field) } return api diff --git a/vue/src/apps/ShoppingListView/main.js b/vue/src/apps/ShoppingListView/main.js index 614e3007d..c6b1ac05f 100644 --- a/vue/src/apps/ShoppingListView/main.js +++ b/vue/src/apps/ShoppingListView/main.js @@ -1,6 +1,7 @@ import i18n from "@/i18n" import Vue from "vue" import App from "./ShoppingListView" +import {createPinia, PiniaVuePlugin} from "pinia"; Vue.config.productionTip = false @@ -11,7 +12,11 @@ if (process.env.NODE_ENV === "development") { } export default __webpack_public_path__ = publicPath // eslint-disable-line +Vue.use(PiniaVuePlugin) +const pinia = createPinia() + new Vue({ + pinia, i18n, render: (h) => h(App), }).$mount("#app") diff --git a/vue/src/apps/SpaceManageView/SpaceManageView.vue b/vue/src/apps/SpaceManageView/SpaceManageView.vue index 75167cb09..18f9ad950 100644 --- a/vue/src/apps/SpaceManageView/SpaceManageView.vue +++ b/vue/src/apps/SpaceManageView/SpaceManageView.vue @@ -151,9 +151,6 @@ Facet Count {{ $t('facet_count_info') }}
    - Use Plural form - {{ $t('plural_usage_info') }}
    - h(App), }).$mount('#app') diff --git a/vue/src/apps/SupermarketView/main.js b/vue/src/apps/SupermarketView/main.js index cff8762e5..7a31cecdc 100644 --- a/vue/src/apps/SupermarketView/main.js +++ b/vue/src/apps/SupermarketView/main.js @@ -1,6 +1,7 @@ import Vue from 'vue' import App from './SupermarketView.vue' import i18n from '@/i18n' +import {createPinia, PiniaVuePlugin} from "pinia"; Vue.config.productionTip = false @@ -11,8 +12,11 @@ if (process.env.NODE_ENV === 'development') { } export default __webpack_public_path__ = publicPath // eslint-disable-line +Vue.use(PiniaVuePlugin) +const pinia = createPinia() new Vue({ + pinia, i18n, render: h => h(App), }).$mount('#app') diff --git a/vue/src/apps/TestView/TestView.vue b/vue/src/apps/TestView/TestView.vue new file mode 100644 index 000000000..4f780be6b --- /dev/null +++ b/vue/src/apps/TestView/TestView.vue @@ -0,0 +1,155 @@ + + + + + + diff --git a/vue/src/apps/TestView/main.js b/vue/src/apps/TestView/main.js new file mode 100644 index 000000000..eccb1b8d9 --- /dev/null +++ b/vue/src/apps/TestView/main.js @@ -0,0 +1,22 @@ +import Vue from 'vue' +import App from './TestView.vue' +import i18n from '@/i18n' +import {createPinia, PiniaVuePlugin} from "pinia"; + +Vue.config.productionTip = false + +// TODO move this and other default stuff to centralized JS file (verify nothing breaks) +let publicPath = localStorage.STATIC_URL + 'vue/' +if (process.env.NODE_ENV === 'development') { + publicPath = 'http://localhost:8080/' +} +export default __webpack_public_path__ = publicPath // eslint-disable-line + +Vue.use(PiniaVuePlugin) +const pinia = createPinia() + +new Vue({ + pinia, + i18n, + render: h => h(App), +}).$mount('#app') diff --git a/vue/src/apps/base_app.js b/vue/src/apps/base_app.js new file mode 100644 index 000000000..e69de29bb diff --git a/vue/src/components/BottomNavigationBar.vue b/vue/src/components/BottomNavigationBar.vue new file mode 100644 index 000000000..8fad878b5 --- /dev/null +++ b/vue/src/components/BottomNavigationBar.vue @@ -0,0 +1,100 @@ + + + + + \ No newline at end of file diff --git a/vue/src/components/ContextMenu/ContextMenu.vue b/vue/src/components/ContextMenu/ContextMenu.vue index 12c9efe19..9b2ad4520 100644 --- a/vue/src/components/ContextMenu/ContextMenu.vue +++ b/vue/src/components/ContextMenu/ContextMenu.vue @@ -95,7 +95,7 @@ export default { diff --git a/vue/src/components/KeywordsComponent.vue b/vue/src/components/KeywordsComponent.vue index 294021762..80ce11ae8 100644 --- a/vue/src/components/KeywordsComponent.vue +++ b/vue/src/components/KeywordsComponent.vue @@ -1,6 +1,6 @@