diff --git a/.dockerignore b/.dockerignore index 9370d058..b14fea29 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,4 +1,4 @@ -node_modules +**/node_modules npm-debug.log Dockerfile* docker-compose* @@ -12,6 +12,21 @@ LICENSE .env.template .github .idea +.prettierignore LICENSE.md docs -update.sh \ No newline at end of file +update.sh +.pytest_cache +cookbook/tests +mediafiles +staticfiles +db.sqlite3 +pytest.ini +vue/**/*.vue +vue/**/*.ts +**/.openapi-generator +mkdocs.yml +vue/babel.config* +vue/package.json +vue/tsconfig.json +vue/src/utils/openapi diff --git a/.env.template b/.env.template index 41322118..eb798a1d 100644 --- a/.env.template +++ b/.env.template @@ -1,6 +1,7 @@ # only set this to true when testing/debugging # when unset: 1 (true) - dont unset this, just for development DEBUG=0 +SQL_DEBUG=0 # HTTP port to bind to # TANDOOR_PORT=8080 @@ -9,7 +10,9 @@ DEBUG=0 ALLOWED_HOSTS=* # random secret key, use for example `base64 /dev/urandom | head -c50` to generate one +# ---------------------------- REQUIRED ------------------------- SECRET_KEY= +# --------------------------------------------------------------- # your default timezone See https://timezonedb.com/time-zones for a list of timezones TIMEZONE=Europe/Berlin @@ -20,7 +23,9 @@ DB_ENGINE=django.db.backends.postgresql POSTGRES_HOST=db_recipes POSTGRES_PORT=5432 POSTGRES_USER=djangouser +# ---------------------------- REQUIRED ------------------------- POSTGRES_PASSWORD= +# --------------------------------------------------------------- POSTGRES_DB=djangodb # database connection string, when used overrides other database settings. @@ -43,10 +48,18 @@ SHOPPING_MIN_AUTOSYNC_INTERVAL=5 # Default for user setting sticky navbar # STICKY_NAV_PREF_DEFAULT=1 -# If staticfiles are stored at a different location uncomment and change accordingly +# If base URL is something other than just / (you are serving a subfolder in your proxy for instance http://recipe_app/recipes/) +# Be sure to not have a trailing slash: e.g. '/recipes' instead of '/recipes/' +# SCRIPT_NAME=/recipes + +# If staticfiles are stored at a different location uncomment and change accordingly, MUST END IN / +# this is not required if you are just using a subfolder +# This can either be a relative path from the applications base path or the url of an external host # STATIC_URL=/static/ -# If mediafiles are stored at a different location uncomment and change accordingly +# If mediafiles are stored at a different location uncomment and change accordingly, MUST END IN / +# this is not required if you are just using a subfolder +# This can either be a relative path from the applications base path or the url of an external host # MEDIA_URL=/media/ # Serve mediafiles directly using gunicorn. Basically everyone recommends not doing this. Please use any of the examples @@ -81,8 +94,6 @@ GUNICORN_MEDIA=0 # when unset: 0 (false) REVERSE_PROXY_AUTH=0 -# If base URL is something other than just / (you are serving a subfolder in your proxy for instance http://recipe_app/recipes/) -# SCRIPT_NAME=/recipes # Default settings for spaces, apply per space and can be changed in the admin view # SPACE_DEFAULT_MAX_RECIPES=0 # 0=unlimited recipes # SPACE_DEFAULT_MAX_USERS=0 # 0=unlimited users per space @@ -122,4 +133,28 @@ REVERSE_PROXY_AUTH=0 # Django session cookie settings. Can be changed to allow a single django application to authenticate several applications # when running under the same database # SESSION_COOKIE_DOMAIN=.example.com -# SESSION_COOKIE_NAME=sessionid # use this only to not interfere with non unified django applications under the same top level domain \ No newline at end of file +# SESSION_COOKIE_NAME=sessionid # use this only to not interfere with non unified django applications under the same top level domain + +# by default SORT_TREE_BY_NAME is disabled this will store all Keywords and Food in the order they are created +# enabling this setting makes saving new keywords and foods very slow, which doesn't matter in most usecases. +# however, when doing large imports of recipes that will create new objects, can increase total run time by 10-15x +# Keywords and Food can be manually sorted by name in Admin +# This value can also be temporarily changed in Admin, it will revert the next time the application is started +# This will be fixed/changed in the future by changing the implementation or finding a better workaround for sorting +# SORT_TREE_BY_NAME=0 +# LDAP authentication +# default 0 (false), when 1 (true) list of allowed users will be fetched from LDAP server +#LDAP_AUTH= +#AUTH_LDAP_SERVER_URI= +#AUTH_LDAP_BIND_DN= +#AUTH_LDAP_BIND_PASSWORD= +#AUTH_LDAP_USER_SEARCH_BASE_DN= +#AUTH_LDAP_TLS_CACERTFILE= + +# Enables exporting PDF (see export docs) +# Disabled by default, uncomment to enable +# ENABLE_PDF_EXPORT=1 + +# Recipe exports are cached for a certain time by default, adjust time if needed +# EXPORT_FILE_CACHE_DURATION=600 + diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..25c107ee --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: [vabene1111] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index f6e365af..00000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: '' -assignees: '' - ---- - -### Version -Please provide your current version (can be found on the system page since v0.8.4) -Version: - -### Bug description -A clear and concise description of what the bug is. diff --git a/.github/ISSUE_TEMPLATE/bug_report.md.bak b/.github/ISSUE_TEMPLATE/bug_report.md.bak new file mode 100644 index 00000000..5cb51e29 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md.bak @@ -0,0 +1,81 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +## Version + +**Tandoor-Version:** + +## Setup configuration + + +### Setup +- [ ] Docker / Docker-Compose +- [ ] Unraid +- [ ] Synology +- [ ] Kubernetes +- [ ] Manual setup +- [ ] Others (please state below) + +### Reverse Proxy +- [ ] No reverse proxy +- [ ] jwilder's nginx proxy +- [ ] Nginx proxy manager (NPM) +- [ ] SWAG +- [ ] Caddy +- [ ] Traefik +- [ ] Others (please state below) + + +**Additional information:** + +## Bug description +A clear and concise description of what the bug is. + + + +## Logs + + +
+ Web-Container-Logs + + + + ``` + Replace me with logs + ``` +
+ +
+ DB-Container-Logs + + + + ``` + Replace me with logs + ``` +
+ +
+ Nginx-Container-Logs + + + + ``` + Replace me with logs + ``` +
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 00000000..e5e1c3be --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,64 @@ +name: Bug Report +description: "Create a report to help us improve" +#title: "" +#labels: ["Bug"] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this bug report! + - type: input + id: version + attributes: + label: Tandoor Version + description: "What version of Tandoor are you using? (can be found on the system page since v0.8.4)" + validations: + required: true + - type: dropdown + id: setup + attributes: + label: Setup + description: "How is your Tandoor instance set up?" + options: + - Docker / Docker-Compose + - Unraid + - Synology + - Kubernetes + - Manual Setup + - Others (please state below) + validations: + required: true + - type: dropdown + id: reverse-proxy + attributes: + label: "Reverse Proxy" + description: "What reverse proxy do you use with Tandoor?" + options: + - No reverse proxy + - jwilder's nginx proxy + - Nginx Proxy Manager (NPM) + - SWAG + - Caddy + - Traefik + - Apache2 + - Others (please state below) + validations: + required: true + - type: input + id: other + attributes: + label: Other + description: "In case you chose 'Others' above, please provide more info here." + - type: textarea + id: bug-descr + attributes: + label: Bug description + description: "Please accurately describe the bug you encountered." + validations: + required: true + - type: textarea + id: logs + attributes: + label: Relevant logs + description: Please copy and paste any relevant logs. This will be automatically formatted into code, so no need for backticks. + render: shell diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..f867d5c8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: true +contact_links: + - name: FAQs + url: https://docs.tandoor.dev/faq/ + about: Please take a look at the FAQs before creating a bug ticket. diff --git a/.github/ISSUE_TEMPLATE/doc_issue.yml b/.github/ISSUE_TEMPLATE/doc_issue.yml new file mode 100644 index 00000000..43bbf75a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/doc_issue.yml @@ -0,0 +1,40 @@ +name: Documentation Issue +description: "Create a report to help us improve" +#title: "" +labels: ["documentation"] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this documentation issue report! + - type: input + id: docs-link + attributes: + label: Documentation link + description: "Please provide a link to the corresponding documentation site on docs.tandoor.dev" + - type: dropdown + id: section + attributes: + label: Affected section + description: "What part of the documentation is the issue about?" + options: + - Installation + - Features + - System + - FAQ + - Does not exist yet + - Other (please state below) + validations: + required: true + - type: input + id: other + attributes: + label: Other + description: "In case you chose 'Other' above, please provide more info here." + - type: textarea + id: descr + attributes: + label: Issue description + description: "Please accurately describe the documentation issue you are seeing." + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md.bak similarity index 100% rename from .github/ISSUE_TEMPLATE/feature_request.md rename to .github/ISSUE_TEMPLATE/feature_request.md.bak diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 00000000..ad823cfa --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,39 @@ +name: Feature Request +description: "Suggest an idea for this project" +#title: "" +labels: ["enhancement"] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this feature request! + - type: textarea + id: problem + attributes: + label: "Is your feature request related to a problem? Please describe." + description: "A clear and concise description of what the problem is. Ex. I'm always frustrated when..." + - type: textarea + id: solution + attributes: + label: "Describe the solution you'd like" + description: "A clear and concise description of what you want to happen." + validations: + required: true + - type: textarea + id: alternatives + attributes: + label: "Describe alternatives you've considered" + description: "A clear and concise description of any alternative solutions or features you've considered." + - type: textarea + id: additional + attributes: + label: "Additional context" + description: "Add any other context or screenshots about the feature request here." + - type: checkboxes + attributes: + label: "Contribute" + description: "Are you willing and able to help develop this feature?" + options: + - label: "Yes" + - label: "Partly" + - label: "No" diff --git a/.github/ISSUE_TEMPLATE/help-request.md b/.github/ISSUE_TEMPLATE/help-request.md.bak similarity index 100% rename from .github/ISSUE_TEMPLATE/help-request.md rename to .github/ISSUE_TEMPLATE/help-request.md.bak diff --git a/.github/ISSUE_TEMPLATE/help_request.yml b/.github/ISSUE_TEMPLATE/help_request.yml new file mode 100644 index 00000000..55c904ee --- /dev/null +++ b/.github/ISSUE_TEMPLATE/help_request.yml @@ -0,0 +1,82 @@ +name: Help request +description: "If there is anything wrong with your setup" +#title: "" +labels: ["setup issue"] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this help request! + - type: textarea + id: issue + attributes: + label: Issue + description: "Please describe your problem here." + validations: + required: true + - type: input + id: version + attributes: + label: Tandoor Version + description: "What version of Tandoor are you using? (can be found on the system page since v0.8.4)" + validations: + required: true + - type: input + id: os + attributes: + label: OS Version + description: "E.g. Ubuntu 20.02" + validations: + required: true + - type: dropdown + id: setup + attributes: + label: Setup + description: "How is your Tandoor instance set up?" + options: + - Docker / Docker-Compose + - Unraid + - Synology + - Kubernetes + - Manual Setup + - Others (please state below) + validations: + required: true + - type: dropdown + id: reverse-proxy + attributes: + label: "Reverse Proxy" + description: "What reverse proxy do you use with Tandoor?" + options: + - No reverse proxy + - jwilder's nginx proxy + - Nginx Proxy Manager (NPM) + - SWAG + - Caddy + - Traefik + - Others (please state below) + validations: + required: true + - type: input + id: other + attributes: + label: Other + description: "In case you chose 'Others' above or have more info, please provide additional details here." + - type: textarea + id: env + attributes: + label: Environment file + description: "Please include your `.env` config file (**make sure to remove/replace all secrets**)" + render: shell + - type: textarea + id: docker-compose + attributes: + label: Docker-Compose file + description: "When running with docker compose please provide your `docker-compose.yml`" + render: shell + - type: textarea + id: logs + attributes: + label: Relevant logs + description: "If you feel like there is anything interesting please post the output of `docker-compose logs` at container startup and when the issue happens." + render: shell diff --git a/.github/ISSUE_TEMPLATE/url_import.md b/.github/ISSUE_TEMPLATE/url_import.md.bak similarity index 100% rename from .github/ISSUE_TEMPLATE/url_import.md rename to .github/ISSUE_TEMPLATE/url_import.md.bak diff --git a/.github/ISSUE_TEMPLATE/website_import.yml b/.github/ISSUE_TEMPLATE/website_import.yml new file mode 100644 index 00000000..aeba4fbd --- /dev/null +++ b/.github/ISSUE_TEMPLATE/website_import.yml @@ -0,0 +1,36 @@ +name: Website Import +description: "Anything related to website imports" +#title: "" +#labels: ["enhancement"] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this website import form! + - type: input + id: version + attributes: + label: Tandoor Version + description: "What version of Tandoor are you using? (can be found on the system page since v0.8.4)" + validations: + required: true + - type: input + id: url + attributes: + label: Import URL + description: "Exact URL you are trying to import from." + validations: + required: true + - type: textarea + id: bug-descr + attributes: + label: "When did the issue happen?" + description: "When pressing the search button with the url / when importing after the page has loaded / ..." + validations: + required: true + - type: textarea + id: logs + attributes: + label: Response / message shown + description: Please copy and paste any relevant logs or responses / messages which are shown in Tandoor. This will be automatically formatted into code, so no need for backticks. + render: shell diff --git a/.github/dependabot.yml b/.github/dependabot.yml index cf7a39fb..ac81a766 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,7 +5,12 @@ version: 2 updates: - - package-ecosystem: "pip" # See documentation for possible values - directory: "/" # Location of package manifests + - package-ecosystem: "pip" + directory: "/" schedule: - interval: "daily" + interval: "monthly" + + - package-ecosystem: "npm" + directory: "/vue/" + schedule: + interval: "monthly" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1aa68a27..fc3c578a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,24 +1,35 @@ -name: Continous Integration +name: Continuous Integration on: [push] jobs: build: - + if: github.repository_owner == 'TandoorRecipes' runs-on: ubuntu-latest strategy: max-parallel: 4 matrix: - python-version: [3.9] + python-version: ['3.10'] steps: - uses: actions/checkout@v1 - - name: Set up Python 3.9 + - name: Set up Python 3.10 uses: actions/setup-python@v1 with: - python-version: 3.9 - - name: Install dependencies + python-version: '3.10' + # Build Vue frontend + - uses: actions/setup-node@v2 + with: + node-version: '14' + - name: Install Vue dependencies + working-directory: ./vue + run: yarn install + - name: Build Vue dependencies + working-directory: ./vue + run: yarn build + - name: Install Django dependencies run: | + sudo apt-get install -y libsasl2-dev python-dev libldap2-dev libssl-dev python -m pip install --upgrade pip pip install -r requirements.txt python3 manage.py collectstatic --noinput diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index bd45ab21..e25328d5 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -8,9 +8,8 @@ on: jobs: CodeQL-Build: - + if: github.repository_owner == 'TandoorRecipes' runs-on: ubuntu-latest - steps: - name: Checkout repository uses: actions/checkout@v2 diff --git a/.github/workflows/docker-publish-beta.yml b/.github/workflows/docker-publish-beta.yml index 18387750..380edda2 100644 --- a/.github/workflows/docker-publish-beta.yml +++ b/.github/workflows/docker-publish-beta.yml @@ -5,9 +5,11 @@ on: - '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: @@ -16,6 +18,17 @@ jobs: 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: @@ -23,4 +36,11 @@ jobs: imageName: vabene1111/recipes tag: beta dockerHubUser: ${{ secrets.DOCKER_USERNAME }} - dockerHubPassword: ${{ secrets.DOCKER_PASSWORD }} \ No newline at end of file + dockerHubPassword: ${{ 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 index f6a14c3e..59db59de 100644 --- a/.github/workflows/docker-publish-dev.yml +++ b/.github/workflows/docker-publish-dev.yml @@ -7,9 +7,11 @@ on: - '!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: @@ -18,6 +20,20 @@ jobs: 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: diff --git a/.github/workflows/docker-publish-latest.yml b/.github/workflows/docker-publish-latest.yml index cb320859..cf0de16b 100644 --- a/.github/workflows/docker-publish-latest.yml +++ b/.github/workflows/docker-publish-latest.yml @@ -6,12 +6,14 @@ on: 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: @@ -20,6 +22,17 @@ jobs: 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: diff --git a/.github/workflows/docker-publish-release.yml b/.github/workflows/docker-publish-release.yml index 665625d5..9cf625fa 100644 --- a/.github/workflows/docker-publish-release.yml +++ b/.github/workflows/docker-publish-release.yml @@ -1,12 +1,12 @@ name: publish tagged release docker on: - push: - tags: - - '*' + release: + types: [published] jobs: build: + if: github.repository_owner == 'TandoorRecipes' runs-on: ubuntu-latest name: Build image job steps: @@ -15,6 +15,7 @@ jobs: - 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: @@ -23,6 +24,17 @@ jobs: 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: @@ -31,3 +43,10 @@ jobs: tag: ${{ steps.get_version.outputs.VERSION }} dockerHubUser: ${{ secrets.DOCKER_USERNAME }} dockerHubPassword: ${{ 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 e8a5833b..260a5e3b 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -7,11 +7,12 @@ on: jobs: deploy: + if: github.repository_owner == 'TandoorRecipes' runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions/setup-python@v2 with: python-version: 3.x - - run: pip install mkdocs-material + - run: pip install mkdocs-material mkdocs-include-markdown-plugin - run: mkdocs gh-deploy --force \ No newline at end of file diff --git a/.gitignore b/.gitignore index 9b68f5e5..7f8c9fb1 100644 --- a/.gitignore +++ b/.gitignore @@ -79,5 +79,8 @@ postgresql/ /docker-compose.override.yml vue/node_modules .vscode/ -vue/yarn.lock vetur.config.js +cookbook/static/vue +vue/webpack-stats.json +cookbook/templates/sw.js +.prettierignore diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml deleted file mode 100644 index ea21d86c..00000000 --- a/.pre-commit-config.yaml +++ /dev/null @@ -1,31 +0,0 @@ -# See https://pre-commit.com for more information -# See https://pre-commit.com/hooks.html for more hooks -repos: - - repo: local - hooks: - - id: pre-commit-yarn-build - name: Build javascript files - entry: yarn --cwd ./vue build - always_run: true - language: system - types: [ python ] - pass_filenames: false - -#- id: pre-commit-django-migrations -# name: Check django migrations -# entry: bash -c './venv/bin/activate && ./manage.py makemigrations --check' -# language: system -# types: [ python ] -# pass_filenames: false -# - id: pre-commit-django-make-messages -# name: Make messages if necessary -# entry: ./manage.py makemessages -i venv -a -# language: system -# types: [ python ] -# pass_filenames: false -# - id: pre-commit-django-compile-messages -# name: Compile messages if necessary -# entry: ./manage.py compilemessages -i venv -# language: system -# types: [ python ] -# pass_filenames: false \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 91b2334f..873a74ca 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ -FROM python:3.9-alpine3.12 +FROM python:3.10-alpine3.15 #Install all dependencies. -RUN apk add --no-cache postgresql-libs gettext zlib libjpeg libxml2-dev libxslt-dev py-cryptography +RUN apk add --no-cache postgresql-libs postgresql-client gettext zlib libjpeg libwebp libxml2-dev libxslt-dev py-cryptography #Print all logs without buffering it. ENV PYTHONUNBUFFERED 1 @@ -15,7 +15,8 @@ WORKDIR /opt/recipes COPY requirements.txt ./ -RUN apk add --no-cache --virtual .build-deps gcc musl-dev postgresql-dev zlib-dev jpeg-dev libressl-dev libffi-dev cargo && \ +RUN apk add --no-cache --virtual .build-deps gcc musl-dev postgresql-dev zlib-dev jpeg-dev libwebp-dev libressl-dev libffi-dev cargo openssl-dev openldap-dev && \ + echo -n "INPUT ( libldap.so )" > /usr/lib/libldap_r.so && \ python -m venv venv && \ /opt/recipes/venv/bin/python -m pip install --upgrade pip && \ venv/bin/pip install wheel==0.36.2 && \ @@ -25,4 +26,4 @@ RUN apk add --no-cache --virtual .build-deps gcc musl-dev postgresql-dev zlib-de #Copy project and execute it. COPY . ./ RUN chmod +x boot.sh -ENTRYPOINT ["/opt/recipes/boot.sh"] \ No newline at end of file +ENTRYPOINT ["/opt/recipes/boot.sh"] diff --git a/README.md b/README.md index 3f2c6d58..7af8d879 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@


- +
Tandoor Recipes
@@ -9,53 +9,83 @@

The recipe manager that allows you to manage your ever growing collection of digital recipes.

- + + +

-Installation • -Documentation • -Demo +Website • +Installation • +Docs • +Demo • +Discord

![Preview](docs/preview.png) -# Your Feedback +## Core Features +- 🥗 **Manage your recipes** - Manage your ever growing recipe collection +- 📆 **Plan** - multiple meals for each day +- 🛒 **Shopping lists** - via the meal plan or straight from recipes +- 📚 **Cookbooks** - collect recipes into books +- 👪 **Share and collaborate** on recipes with friends and family -Share some information on how you use Tandoor to help me improve the application [Google Survey](https://forms.gle/qNfLK2tWTeWHe9Qd7) +## Made by and for power users -## Features - -- 📦 **Sync** files with Dropbox and Nextcloud (more can easily be added) -- 🔍 Powerful **search** with Djangos [TrigramSimilarity](https://docs.djangoproject.com/en/3.0/ref/contrib/postgres/search/#trigram-similarity) +- 🔍 Powerful & customizable **search** with fulltext support and [TrigramSimilarity](https://docs.djangoproject.com/en/3.0/ref/contrib/postgres/search/#trigram-similarity) - 🏷️ Create and search for **tags**, assign them in batch to all files matching certain filters -- 📄 **Create recipes** locally within a nice, standardized web interface -- ⬇️ **Import recipes** from thousands of websites supporting [ld+json or microdata](https://schema.org/Recipe) -- 📱 Optimized for use on **mobile** devices like phones and tablets -- 🛒 Generate **shopping** lists from recipes -- 📆 Create a **Plan** on what to eat when -- 👪 **Share** recipes with friends and comment on them to suggest or remember changes you made -- ➗ automatically convert decimal units to **fractions** for those who like this -- 🐳 Easy setup with **Docker** and included examples for Kubernetes, Unraid and Synology +- ↔️ Quickly merge and rename ingredients, tags and units +- 📥️ **Import recipes** from thousands of websites supporting [ld+json or microdata](https://schema.org/Recipe) +- ➗ Support for **fractions** or decimals +- 🐳 Easy setup with **Docker** and included examples for **Kubernetes**, **Unraid** and **Synology** - 🎨 Customize your interface with **themes** -- ✉️ Export and import recipes from other users +- 📦 **Sync** files with Dropbox and Nextcloud + +## All the must haves + +- 📱Optimized for use on **mobile** devices - 🌍 localized in many languages thanks to the awesome community -- ➕ Many more like recipe scaling, image compression, cookbooks, printing views, ... +- 📥️ **Import your collection** from many other [recipe managers](https://docs.tandoor.dev/features/import_export/) +- ➕ Many more like recipe scaling, image compression, printing views and supermarkets This application is meant for people with a collection of recipes they want to share with family and friends or simply store them in a nicely organized way. A basic permission system exists but this application is not meant to be run as a public page. + +## Docs + Documentation can be found [here](https://docs.tandoor.dev/). -While this application has been around for a while and is actively used by many (including myself), it is still considered -**beta** software that has a lot of rough edges and unpolished parts. +## Contributing + +You can help out with the ongoing development by looking for potential bugs in our code base, or by contributing new features. We are always welcoming new pull requests containing bug fixes, refactors and new features. We have a list of tasks and bugs on our issue tracker on Github. Please comment on issues if you want to contribute with, to avoid duplicating effort. + +## Your Feedback + +Share some information on how you use Tandoor to help me improve the application [Google Survey](https://forms.gle/qNfLK2tWTeWHe9Qd7) + +## Get in touch + + + + + + + + + + + +
DiscordWe have a public Discord server that anyone can join. This is where all our developers and contributors hang out and where we make announcements
TwitterYou can follow our Twitter account to get updates on new features or releases
+ ## License -Beginning with version 0.10.0 the code in this repository is licensed under the [GNU AGPL v3](https://www.gnu.org/licenses/agpl-3.0.de.html) license with an +Beginning with version 0.10.0 the code in this repository is licensed under the [GNU AGPL v3](https://www.gnu.org/licenses/agpl-3.0.de.html) license with a [common clause](https://commonsclause.com/) selling exception. See [LICENSE.md](https://github.com/vabene1111/recipes/blob/develop/LICENSE.md) for details. > NOTE: There appears to be a whole range of legal issues with licensing anything else then the standard completely open licenses. @@ -66,8 +96,8 @@ Beginning with version 0.10.0 the code in this repository is licensed under the **This software and *all* its features are and will always be free for everyone to use and enjoy.** The reason for the selling exception is that a significant amount of time was spend over multiple years to develop this software. -A payed hosted version which will be identical in features and code base to the software offered in this repository will +A paid hosted version which will be identical in features and code base to the software offered in this repository will likely be released in the future (including all features needed to sell a hosted version as they might also be useful for personal use). -This will not only benefit me personally but also everyone who self-hosts this software as any profits made trough selling the hosted option +This will not only benefit me personally but also everyone who self-hosts this software as any profits made through selling the hosted option allow me to spend more time developing and improving the software for everyone. Selling exceptions are [approved by Richard Stallman](http://www.gnu.org/philosophy/selling-exceptions.en.html) and the common clause license is very permissive (see the [FAQ](https://commonsclause.com/)). diff --git a/SECURITY.md b/SECURITY.md index f163a7eb..e5558348 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -7,4 +7,4 @@ Since this software is still considered beta/WIP support is always only given fo ## Reporting a Vulnerability Please open a normal public issue if you have any security related concerns. If you feel like the issue should not be discussed in -public just open a generic issue and we will discuss further communitcation there (since GitHub does not allow everyone to create a security advisory :/). +public just open a generic issue and we will discuss further communication there (since GitHub does not allow everyone to create a security advisory :/). diff --git a/boot.sh b/boot.sh index c799e3a3..1a6cdb52 100644 --- a/boot.sh +++ b/boot.sh @@ -1,14 +1,39 @@ #!/bin/sh source venv/bin/activate + TANDOOR_PORT="${TANDOOR_PORT:-8080}" -echo "Updating database" +echo "Waiting for database to be ready..." + +attempt=0 +max_attempts=20 +while pg_isready --host=${POSTGRES_HOST} -q; status=$?; attempt=$((attempt+1)); [ $status -ne 0 ] && [ $attempt -le $max_attempts ]; do + sleep 5 +done + +if [ $attempt -gt $max_attempts ]; then + echo -e "\nDatabase not reachable. Maximum attempts exceeded." + echo "Please check logs above - misconfiguration is very likely." + echo "Make sure the DB container is up and POSTGRES_HOST is set properly." + echo "Shutting down container." + exit 1 # exit with error to make the container stop +fi + +echo "Database is ready" + +echo "Migrating database" + + python manage.py migrate + +echo "Generating static files" + python manage.py collectstatic_js_reverse python manage.py collectstatic --noinput + echo "Done" chmod -R 755 /opt/recipes/mediafiles -exec gunicorn -b :$TANDOOR_PORT --access-logfile - --error-logfile - --log-level INFO recipes.wsgi \ No newline at end of file +exec gunicorn -b :$TANDOOR_PORT --access-logfile - --error-logfile - --log-level INFO recipes.wsgi diff --git a/cookbook/admin.py b/cookbook/admin.py index e3d46fee..5c32c168 100644 --- a/cookbook/admin.py +++ b/cookbook/admin.py @@ -1,23 +1,22 @@ from django.conf import settings from django.contrib import admin +from django.contrib.auth.admin import UserAdmin +from django.contrib.auth.models import Group, User from django.contrib.postgres.search import SearchVector +from django.utils import translation +from django_scopes import scopes_disabled from treebeard.admin import TreeAdmin from treebeard.forms import movenodeform_factory -from django.contrib.auth.admin import UserAdmin -from django.contrib.auth.models import User, Group -from django_scopes import scopes_disabled -from django.utils import translation - -from .models import (Comment, CookLog, Food, Ingredient, InviteLink, Keyword, - MealPlan, MealType, NutritionInformation, Recipe, - RecipeBook, RecipeBookEntry, RecipeImport, ShareLink, - ShoppingList, ShoppingListEntry, ShoppingListRecipe, - Space, Step, Storage, Sync, SyncLog, Unit, UserPreference, - ViewLog, Supermarket, SupermarketCategory, SupermarketCategoryRelation, - ImportLog, TelegramBot, BookmarkletImport, UserFile) from cookbook.managers import DICTIONARY +from .models import (BookmarkletImport, Comment, CookLog, Food, FoodInheritField, ImportLog, + Ingredient, InviteLink, Keyword, MealPlan, MealType, NutritionInformation, + Recipe, RecipeBook, RecipeBookEntry, RecipeImport, SearchPreference, ShareLink, + ShoppingList, ShoppingListEntry, ShoppingListRecipe, Space, Step, Storage, + Supermarket, SupermarketCategory, SupermarketCategoryRelation, Sync, SyncLog, + TelegramBot, Unit, UserFile, UserPreference, ViewLog, Automation) + class CustomUserAdmin(UserAdmin): def has_add_permission(self, request, obj=None): @@ -30,11 +29,52 @@ admin.site.register(User, CustomUserAdmin) admin.site.unregister(Group) +@admin.action(description='Delete all data from a space') +def delete_space_action(modeladmin, request, queryset): + for space in queryset: + CookLog.objects.filter(space=space).delete() + ViewLog.objects.filter(space=space).delete() + ImportLog.objects.filter(space=space).delete() + BookmarkletImport.objects.filter(space=space).delete() + + Comment.objects.filter(recipe__space=space).delete() + Keyword.objects.filter(space=space).delete() + Ingredient.objects.filter(space=space).delete() + Food.objects.filter(space=space).delete() + Unit.objects.filter(space=space).delete() + Step.objects.filter(space=space).delete() + NutritionInformation.objects.filter(space=space).delete() + RecipeBookEntry.objects.filter(book__space=space).delete() + RecipeBook.objects.filter(space=space).delete() + MealType.objects.filter(space=space).delete() + MealPlan.objects.filter(space=space).delete() + ShareLink.objects.filter(space=space).delete() + Recipe.objects.filter(space=space).delete() + + RecipeImport.objects.filter(space=space).delete() + SyncLog.objects.filter(sync__space=space).delete() + Sync.objects.filter(space=space).delete() + Storage.objects.filter(space=space).delete() + + ShoppingListEntry.objects.filter(shoppinglist__space=space).delete() + ShoppingListRecipe.objects.filter(shoppinglist__space=space).delete() + ShoppingList.objects.filter(space=space).delete() + + SupermarketCategoryRelation.objects.filter(supermarket__space=space).delete() + SupermarketCategory.objects.filter(space=space).delete() + Supermarket.objects.filter(space=space).delete() + + InviteLink.objects.filter(space=space).delete() + UserFile.objects.filter(space=space).delete() + Automation.objects.filter(space=space).delete() + + class SpaceAdmin(admin.ModelAdmin): 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' + actions = [delete_space_action] admin.site.register(Space, SpaceAdmin) @@ -54,6 +94,19 @@ class UserPreferenceAdmin(admin.ModelAdmin): admin.site.register(UserPreference, UserPreferenceAdmin) +class SearchPreferenceAdmin(admin.ModelAdmin): + list_display = ('name', 'search', 'trigram_threshold',) + search_fields = ('user__username',) + list_filter = ('search',) + + @staticmethod + def name(obj): + return obj.user.get_user_name() + + +admin.site.register(SearchPreference, SearchPreferenceAdmin) + + class StorageAdmin(admin.ModelAdmin): list_display = ('name', 'method') search_fields = ('name',) @@ -89,28 +142,43 @@ class SyncLogAdmin(admin.ModelAdmin): admin.site.register(SyncLog, SyncLogAdmin) +@admin.action(description='Temporarily ENABLE sorting on Foods and Keywords.') +def enable_tree_sorting(modeladmin, request, queryset): + Food.node_order_by = ['name'] + Keyword.node_order_by = ['name'] + with scopes_disabled(): + Food.fix_tree(fix_paths=True) + Keyword.fix_tree(fix_paths=True) + + +@admin.action(description='Temporarily DISABLE sorting on Foods and Keywords.') +def disable_tree_sorting(modeladmin, request, queryset): + Food.node_order_by = [] + Keyword.node_order_by = [] + + +@admin.action(description='Fix problems and sort tree by name') +def sort_tree(modeladmin, request, queryset): + orginal_value = modeladmin.model.node_order_by[:] + modeladmin.model.node_order_by = ['name'] + with scopes_disabled(): + modeladmin.model.fix_tree(fix_paths=True) + modeladmin.model.node_order_by = orginal_value + + class KeywordAdmin(TreeAdmin): form = movenodeform_factory(Keyword) ordering = ('space', 'path',) - - # removing ability to delete keywords from admin - # to avoid creating orphaned keywords - # def get_actions(self, request): - # actions = super().get_actions(request) - # if 'delete_selected' in actions: - # del actions['delete_selected'] - # return actions - - # def has_delete_permission(self, request, obj=None): - # return False + search_fields = ('name',) + actions = [sort_tree, enable_tree_sorting, disable_tree_sorting] admin.site.register(Keyword, KeywordAdmin) class StepAdmin(admin.ModelAdmin): - list_display = ('name', 'type', 'order') - search_fields = ('name', 'type') + list_display = ('name', 'order',) + search_fields = ('name',) admin.site.register(Step, StepAdmin) @@ -144,7 +212,19 @@ class RecipeAdmin(admin.ModelAdmin): admin.site.register(Recipe, RecipeAdmin) admin.site.register(Unit) -admin.site.register(Food) + + +# admin.site.register(FoodInheritField) + + +class FoodAdmin(TreeAdmin): + form = movenodeform_factory(Keyword) + ordering = ('space', 'path',) + search_fields = ('name',) + actions = [sort_tree, enable_tree_sorting, disable_tree_sorting] + + +admin.site.register(Food, FoodAdmin) class IngredientAdmin(admin.ModelAdmin): @@ -222,7 +302,7 @@ admin.site.register(ViewLog, ViewLogAdmin) class InviteLinkAdmin(admin.ModelAdmin): list_display = ( - 'group', 'valid_until', + 'group', 'valid_until', 'space', 'created_by', 'created_at', 'used_by' ) @@ -245,7 +325,7 @@ admin.site.register(ShoppingListRecipe, ShoppingListRecipeAdmin) class ShoppingListEntryAdmin(admin.ModelAdmin): - list_display = ('id', 'food', 'unit', 'list_recipe', 'checked') + list_display = ('id', 'food', 'unit', 'list_recipe', 'created_by', 'created_at', 'checked') admin.site.register(ShoppingListEntry, ShoppingListEntryAdmin) diff --git a/cookbook/apps.py b/cookbook/apps.py index d133d292..e551319d 100644 --- a/cookbook/apps.py +++ b/cookbook/apps.py @@ -1,11 +1,37 @@ +import traceback + from django.apps import AppConfig from django.conf import settings +from django.db import OperationalError, ProgrammingError +from django_scopes import scopes_disabled + +from recipes.settings import DEBUG class CookbookConfig(AppConfig): name = 'cookbook' def ready(self): - # post_save signal is only necessary if using full-text search on postgres - if settings.DATABASES['default']['ENGINE'] in ['django.db.backends.postgresql_psycopg2', 'django.db.backends.postgresql']: - import cookbook.signals # noqa + import cookbook.signals # noqa + + # if not settings.DISABLE_TREE_FIX_STARTUP: + # # when starting up run fix_tree to: + # # a) make sure that nodes are sorted when switching between sort modes + # # b) fix problems, if any, with tree consistency + # with scopes_disabled(): + # try: + # from cookbook.models import Food, Keyword + # Keyword.fix_tree(fix_paths=True) + # Food.fix_tree(fix_paths=True) + # except OperationalError: + # if DEBUG: + # traceback.print_exc() + # pass # if model does not exist there is no need to fix it + # except ProgrammingError: + # if DEBUG: + # traceback.print_exc() + # pass # if migration has not been run database cannot be fixed yet + # except Exception: + # if DEBUG: + # traceback.print_exc() + # pass # dont break startup just because fix could not run, need to investigate cases when this happens diff --git a/cookbook/filters.py b/cookbook/filters.py index 09b4f7c5..30d42cf7 100644 --- a/cookbook/filters.py +++ b/cookbook/filters.py @@ -1,5 +1,7 @@ import django_filters from django.conf import settings +from django.contrib.postgres.search import TrigramSimilarity +from django.db.models import Q from django.utils.translation import gettext as _ from django_scopes import scopes_disabled @@ -59,12 +61,12 @@ with scopes_disabled(): model = Recipe fields = ['name', 'keywords', 'foods', 'internal'] - class FoodFilter(django_filters.FilterSet): - name = django_filters.CharFilter(lookup_expr='icontains') + # class FoodFilter(django_filters.FilterSet): + # name = django_filters.CharFilter(lookup_expr='icontains') - class Meta: - model = Food - fields = ['name'] + # class Meta: + # model = Food + # fields = ['name'] class ShoppingListFilter(django_filters.FilterSet): diff --git a/cookbook/forms.py b/cookbook/forms.py index 7cb91b9a..60237ac7 100644 --- a/cookbook/forms.py +++ b/cookbook/forms.py @@ -1,18 +1,16 @@ +from datetime import datetime + from django import forms from django.conf import settings from django.core.exceptions import ValidationError -from django.forms import widgets +from django.forms import NumberInput, widgets from django.utils.translation import gettext_lazy as _ from django_scopes import scopes_disabled from django_scopes.forms import SafeModelChoiceField, SafeModelMultipleChoiceField -from emoji_picker.widgets import EmojiPickerTextInput -from treebeard.forms import MoveNodeForm from hcaptcha.fields import hCaptchaField -from .models import (Comment, Food, InviteLink, Keyword, MealPlan, Recipe, - RecipeBook, RecipeBookEntry, Storage, Sync, Unit, User, - UserPreference, SupermarketCategory, MealType, Space, - SearchPreference) +from .models import (Comment, Food, InviteLink, Keyword, MealPlan, MealType, Recipe, RecipeBook, + RecipeBookEntry, SearchPreference, Space, Storage, Sync, User, UserPreference) class SelectWidget(widgets.Select): @@ -38,15 +36,38 @@ class DateWidget(forms.DateInput): class UserPreferenceForm(forms.ModelForm): prefix = 'preference' + def __init__(self, *args, **kwargs): + if x := kwargs.get('instance', None): + space = x.space + else: + space = kwargs.pop('space') + super().__init__(*args, **kwargs) + self.fields['plan_share'].queryset = User.objects.filter(userpreference__space=space).all() + class Meta: model = UserPreference fields = ( - 'default_unit', 'use_fractions', 'theme', 'nav_color', + 'default_unit', 'use_fractions', 'use_kj', 'theme', 'nav_color', 'sticky_navbar', 'default_page', 'show_recent', 'search_style', - 'plan_share', 'ingredient_decimals', 'shopping_auto_sync', - 'comments' + 'plan_share', 'ingredient_decimals', 'comments', ) + labels = { + 'default_unit': _('Default unit'), + 'use_fractions': _('Use fractions'), + 'use_kj': _('Use KJ'), + 'theme': _('Theme'), + 'nav_color': _('Navbar color'), + 'sticky_navbar': _('Sticky navbar'), + 'default_page': _('Default page'), + 'show_recent': _('Show recent recipes'), + 'search_style': _('Search style'), + 'plan_share': _('Plan sharing'), + 'ingredient_decimals': _('Ingredient decimal places'), + 'shopping_auto_sync': _('Shopping list auto sync period'), + 'comments': _('Comments') + } + help_texts = { 'nav_color': _('Color of the top navigation bar. Not all colors work with all themes, just try them out!'), # noqa: E501 @@ -54,8 +75,9 @@ class UserPreferenceForm(forms.ModelForm): 'use_fractions': _( 'Enables support for fractions in ingredient amounts (e.g. convert decimals to fractions automatically)'), # noqa: E501 - 'plan_share': _( - 'Users with whom newly created meal plan/shopping list entries should be shared by default.'), + 'use_kj': _('Display nutritional energy amounts in joules instead of calories'), # noqa: E501 + 'plan_share': _('Users with whom newly created meal plans should be shared by default.'), + 'shopping_share': _('Users with whom to share shopping lists.'), # noqa: E501 'show_recent': _('Show recently viewed recipes on search page.'), # noqa: E501 'ingredient_decimals': _('Number of decimals to round ingredients.'), # noqa: E501 @@ -64,11 +86,14 @@ class UserPreferenceForm(forms.ModelForm): 'Setting to 0 will disable auto sync. When viewing a shopping list the list is updated every set seconds to sync changes someone else might have made. Useful when shopping with multiple people but might use a little bit ' # noqa: E501 'of mobile data. If lower than instance limit it is reset when saving.' # noqa: E501 ), - 'sticky_navbar': _('Makes the navbar stick to the top of the page.') # noqa: E501 + 'sticky_navbar': _('Makes the navbar stick to the top of the page.'), # noqa: E501 + 'mealplan_autoadd_shopping': _('Automatically add meal plan ingredients to shopping list.'), + 'mealplan_autoexclude_onhand': _('Exclude ingredients that are on hand.'), } widgets = { - 'plan_share': MultiSelectWidget + 'plan_share': MultiSelectWidget, + 'shopping_share': MultiSelectWidget, } @@ -120,7 +145,7 @@ class ImportExportBase(forms.Form): NEXTCLOUD = 'NEXTCLOUD' MEALIE = 'MEALIE' CHOWDOWN = 'CHOWDOWN' - SAFRON = 'SAFRON' + SAFFRON = 'SAFFRON' CHEFTAP = 'CHEFTAP' PEPPERPLATE = 'PEPPERPLATE' RECIPEKEEPER = 'RECIPEKEEPER' @@ -130,13 +155,17 @@ class ImportExportBase(forms.Form): MEALMASTER = 'MEALMASTER' REZKONV = 'REZKONV' OPENEATS = 'OPENEATS' + PLANTOEAT = 'PLANTOEAT' + COOKBOOKAPP = 'COOKBOOKAPP' + COPYMETHAT = 'COPYMETHAT' + PDF = 'PDF' type = forms.ChoiceField(choices=( (DEFAULT, _('Default')), (PAPRIKA, 'Paprika'), (NEXTCLOUD, 'Nextcloud Cookbook'), - (MEALIE, 'Mealie'), (CHOWDOWN, 'Chowdown'), (SAFRON, 'Safron'), (CHEFTAP, 'ChefTap'), + (MEALIE, 'Mealie'), (CHOWDOWN, 'Chowdown'), (SAFFRON, 'Saffron'), (CHEFTAP, 'ChefTap'), (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'), )) @@ -148,7 +177,7 @@ class ImportForm(ImportExportBase): class ExportForm(ImportExportBase): - recipes = forms.ModelMultipleChoiceField(widget=MultiSelectWidget, queryset=Recipe.objects.none()) + recipes = forms.ModelMultipleChoiceField(widget=MultiSelectWidget, queryset=Recipe.objects.none(), required=False) all = forms.BooleanField(required=False) def __init__(self, *args, **kwargs): @@ -157,52 +186,6 @@ class ExportForm(ImportExportBase): self.fields['recipes'].queryset = Recipe.objects.filter(space=space).all() -class UnitMergeForm(forms.Form): - prefix = 'unit' - - new_unit = SafeModelChoiceField( - queryset=Unit.objects.none(), - widget=SelectWidget, - label=_('New Unit'), - help_text=_('New unit that other gets replaced by.'), - ) - old_unit = SafeModelChoiceField( - queryset=Unit.objects.none(), - widget=SelectWidget, - label=_('Old Unit'), - help_text=_('Unit that should be replaced.'), - ) - - def __init__(self, *args, **kwargs): - space = kwargs.pop('space') - super().__init__(*args, **kwargs) - self.fields['new_unit'].queryset = Unit.objects.filter(space=space).all() - self.fields['old_unit'].queryset = Unit.objects.filter(space=space).all() - - -class FoodMergeForm(forms.Form): - prefix = 'food' - - new_food = SafeModelChoiceField( - queryset=Food.objects.none(), - widget=SelectWidget, - label=_('New Food'), - help_text=_('New food that other gets replaced by.'), - ) - old_food = SafeModelChoiceField( - queryset=Food.objects.none(), - widget=SelectWidget, - label=_('Old Food'), - help_text=_('Food that should be replaced.'), - ) - - def __init__(self, *args, **kwargs): - space = kwargs.pop('space') - super().__init__(*args, **kwargs) - self.fields['new_food'].queryset = Food.objects.filter(space=space).all() - self.fields['old_food'].queryset = Food.objects.filter(space=space).all() - - class CommentForm(forms.ModelForm): prefix = 'comment' @@ -218,33 +201,6 @@ class CommentForm(forms.ModelForm): } -class KeywordForm(MoveNodeForm): - class Meta: - model = Keyword - fields = ('name', 'icon', 'description') - exclude = ('sib_order', 'parent', 'path', 'depth', 'numchild') - widgets = {'icon': EmojiPickerTextInput} - - -class FoodForm(forms.ModelForm): - - def __init__(self, *args, **kwargs): - space = kwargs.pop('space') - super().__init__(*args, **kwargs) - self.fields['recipe'].queryset = Recipe.objects.filter(space=space).all() - self.fields['supermarket_category'].queryset = SupermarketCategory.objects.filter(space=space).all() - - class Meta: - model = Food - fields = ('name', 'description', 'ignore_shopping', 'recipe', 'supermarket_category') - widgets = {'recipe': SelectWidget} - - field_classes = { - 'recipe': SafeModelChoiceField, - 'supermarket_category': SafeModelChoiceField, - } - - class StorageForm(forms.ModelForm): username = forms.CharField( widget=forms.TextInput(attrs={'autocomplete': 'new-password'}), @@ -273,6 +229,7 @@ class StorageForm(forms.ModelForm): } +# TODO: Deprecate class RecipeBookEntryForm(forms.ModelForm): prefix = 'bookmark' @@ -305,7 +262,14 @@ class SyncForm(forms.ModelForm): 'storage': SafeModelChoiceField, } + labels = { + 'storage': _('Storage'), + 'path': _('Path'), + 'active': _('Active') + } + +# TODO deprecate class BatchEditForm(forms.Form): search = forms.CharField(label=_('Search String')) keywords = forms.ModelMultipleChoiceField( @@ -342,21 +306,7 @@ class ImportRecipeForm(forms.ModelForm): } -class RecipeBookForm(forms.ModelForm): - def __init__(self, *args, **kwargs): - space = kwargs.pop('space') - super().__init__(*args, **kwargs) - self.fields['shared'].queryset = User.objects.filter(userpreference__space=space).all() - - class Meta: - model = RecipeBook - fields = ('name', 'icon', 'description', 'shared') - widgets = {'icon': EmojiPickerTextInput, 'shared': MultiSelectWidget} - field_classes = { - 'shared': SafeModelMultipleChoiceField, - } - - +# TODO deprecate class MealPlanForm(forms.ModelForm): def __init__(self, *args, **kwargs): space = kwargs.pop('space') @@ -408,7 +358,8 @@ class InviteLinkForm(forms.ModelForm): def clean(self): space = self.cleaned_data['space'] - if space.max_users != 0 and (UserPreference.objects.filter(space=space).count() + InviteLink.objects.filter(space=space).count()) >= space.max_users: + if space.max_users != 0 and (UserPreference.objects.filter(space=space).count() + + InviteLink.objects.filter(valid_until__gte=datetime.today(), used_by=None, space=space).count()) >= space.max_users: raise ValidationError(_('Maximum number of users for this space reached.')) def clean_email(self): @@ -423,7 +374,7 @@ class InviteLinkForm(forms.ModelForm): model = InviteLink fields = ('email', 'group', 'valid_until', 'space') help_texts = { - 'email': _('An email address is not required but if present the invite link will be send to the user.'), + 'email': _('An email address is not required but if present the invite link will be sent to the user.'), } field_classes = { 'space': SafeModelChoiceField, @@ -478,19 +429,31 @@ class UserCreateForm(forms.Form): class SearchPreferenceForm(forms.ModelForm): prefix = 'search' + trigram_threshold = forms.DecimalField(min_value=0.01, max_value=1, decimal_places=2, + widget=NumberInput(attrs={'class': "form-control-range", 'type': 'range'}), + help_text=_( + 'Determines how fuzzy a search is if it uses trigram similarity matching (e.g. low values mean more typos are ignored).')) + preset = forms.CharField(widget=forms.HiddenInput(), required=False) class Meta: model = SearchPreference - fields = ('search', 'lookup', 'unaccent', 'icontains', 'istartswith', 'trigram', 'fulltext') + fields = ( + 'search', 'lookup', 'unaccent', 'icontains', 'istartswith', 'trigram', 'fulltext', 'trigram_threshold') help_texts = { - 'search': _('Select type method of search. Click here for full desciption of choices.'), + 'search': _( + 'Select type method of search. Click here for full description of choices.'), 'lookup': _('Use fuzzy matching on units, keywords and ingredients when editing and importing recipes.'), - 'unaccent': _('Fields to search ignoring accents. Selecting this option can improve or degrade search quality depending on language'), - 'icontains': _("Fields to search for partial matches. (e.g. searching for 'Pie' will return 'pie' and 'piece' and 'soapie')"), - 'istartswith': _("Fields to search for beginning of word matches. (e.g. searching for 'sa' will return 'salad' and 'sandwich')"), - 'trigram': _("Fields to 'fuzzy' search. (e.g. searching for 'recpie' will find 'recipe'.) Note: this option will conflict with 'web' and 'raw' methods of search."), - 'fulltext': _("Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods only function with fulltext fields.") + 'unaccent': _( + 'Fields to search ignoring accents. Selecting this option can improve or degrade search quality depending on language'), + 'icontains': _( + "Fields to search for partial matches. (e.g. searching for 'Pie' will return 'pie' and 'piece' and 'soapie')"), + 'istartswith': _( + "Fields to search for beginning of word matches. (e.g. searching for 'sa' will return 'salad' and 'sandwich')"), + 'trigram': _( + "Fields to 'fuzzy' search. (e.g. searching for 'recpie' will find 'recipe'.) Note: this option will conflict with 'web' and 'raw' methods of search."), + 'fulltext': _( + "Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods only function with fulltext fields."), } labels = { @@ -498,7 +461,7 @@ class SearchPreferenceForm(forms.ModelForm): 'lookup': _('Fuzzy Lookups'), 'unaccent': _('Ignore Accent'), 'icontains': _("Partial Match"), - 'istartswith': _("Starts Wtih"), + 'istartswith': _("Starts With"), 'trigram': _("Fuzzy Search"), 'fulltext': _("Full Text") } @@ -511,3 +474,73 @@ class SearchPreferenceForm(forms.ModelForm): 'trigram': MultiSelectWidget, 'fulltext': MultiSelectWidget, } + + +class ShoppingPreferenceForm(forms.ModelForm): + prefix = 'shopping' + + class Meta: + model = UserPreference + + fields = ( + 'shopping_share', 'shopping_auto_sync', 'mealplan_autoadd_shopping', 'mealplan_autoexclude_onhand', + 'mealplan_autoinclude_related', 'shopping_add_onhand', 'default_delay', 'filter_to_supermarket', 'shopping_recent_days', 'csv_delim', 'csv_prefix' + ) + + help_texts = { + 'shopping_share': _('Users will see all items you add to your shopping list. They must add you to see items on their list.'), + 'shopping_auto_sync': _( + 'Setting to 0 will disable auto sync. When viewing a shopping list the list is updated every set seconds to sync changes someone else might have made. Useful when shopping with multiple people but might use a little bit ' # noqa: E501 + 'of mobile data. If lower than instance limit it is reset when saving.' # noqa: E501 + ), + 'mealplan_autoadd_shopping': _('Automatically add meal plan ingredients to shopping list.'), + 'mealplan_autoinclude_related': _('When adding a meal plan to the shopping list (manually or automatically), include all related recipes.'), + 'mealplan_autoexclude_onhand': _('When adding a meal plan to the shopping list (manually or automatically), exclude ingredients that are on hand.'), + 'default_delay': _('Default number of hours to delay a shopping list entry.'), + 'filter_to_supermarket': _('Filter shopping list to only include supermarket categories.'), + 'shopping_recent_days': _('Days of recent shopping list entries to display.'), + 'shopping_add_onhand': _("Mark food 'On Hand' when checked off shopping list."), + 'csv_delim': _('Delimiter to use for CSV exports.'), + 'csv_prefix': _('Prefix to add when copying list to the clipboard.'), + + } + labels = { + 'shopping_share': _('Share Shopping List'), + 'shopping_auto_sync': _('Autosync'), + 'mealplan_autoadd_shopping': _('Auto Add Meal Plan'), + 'mealplan_autoexclude_onhand': _('Exclude On Hand'), + 'mealplan_autoinclude_related': _('Include Related'), + 'default_delay': _('Default Delay Hours'), + 'filter_to_supermarket': _('Filter to Supermarket'), + 'shopping_recent_days': _('Recent Days'), + 'csv_delim': _('CSV Delimiter'), + "csv_prefix_label": _("List Prefix"), + 'shopping_add_onhand': _("Auto On Hand"), + } + + widgets = { + 'shopping_share': MultiSelectWidget + } + + +class SpacePreferenceForm(forms.ModelForm): + prefix = 'space' + reset_food_inherit = forms.BooleanField(label=_("Reset Food Inheritance"), initial=False, required=False, + help_text=_("Reset all food to inherit the fields configured.")) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) # populates the post + self.fields['food_inherit'].queryset = Food.inheritable_fields + + class Meta: + model = Space + + fields = ('food_inherit', 'reset_food_inherit', 'show_facet_count') + + help_texts = { + 'food_inherit': _('Fields on food that should be inherited by default.'), + 'show_facet_count': _('Show recipe counts on search filters'), } + + widgets = { + 'food_inherit': MultiSelectWidget + } diff --git a/cookbook/helper/HelperFunctions.py b/cookbook/helper/HelperFunctions.py new file mode 100644 index 00000000..e2971c2e --- /dev/null +++ b/cookbook/helper/HelperFunctions.py @@ -0,0 +1,13 @@ +from django.db.models import Func + + +class Round(Func): + function = 'ROUND' + template = '%(function)s(%(expressions)s, 0)' + + +def str2bool(v): + if type(v) == bool or v is None: + return v + else: + return v.lower() in ("yes", "true", "1") diff --git a/cookbook/helper/image_processing.py b/cookbook/helper/image_processing.py index 376cf74e..d9a334ac 100644 --- a/cookbook/helper/image_processing.py +++ b/cookbook/helper/image_processing.py @@ -5,7 +5,7 @@ from PIL import Image from io import BytesIO -def rescale_image_jpeg(image_object, base_width=720): +def rescale_image_jpeg(image_object, base_width=1020): img = Image.open(image_object) icc_profile = img.info.get('icc_profile') # remember color profile to not mess up colors width_percent = (base_width / float(img.size[0])) @@ -13,20 +13,20 @@ def rescale_image_jpeg(image_object, base_width=720): img = img.resize((base_width, height), Image.ANTIALIAS) img_bytes = BytesIO() - img.save(img_bytes, 'JPEG', quality=75, optimize=True, icc_profile=icc_profile) + img.save(img_bytes, 'JPEG', quality=90, optimize=True, icc_profile=icc_profile) return img_bytes -def rescale_image_png(image_object, base_width=720): - basewidth = 720 - wpercent = (basewidth / float(image_object.size[0])) +def rescale_image_png(image_object, base_width=1020): + image_object = Image.open(image_object) + wpercent = (base_width / float(image_object.size[0])) hsize = int((float(image_object.size[1]) * float(wpercent))) - img = image_object.resize((basewidth, hsize), Image.ANTIALIAS) + img = image_object.resize((base_width, hsize), Image.ANTIALIAS) im_io = BytesIO() - img.save(im_io, 'PNG', quality=70) - return img + img.save(im_io, 'PNG', quality=90) + return im_io def get_filetype(name): @@ -36,9 +36,11 @@ def get_filetype(name): return '.jpeg' +# TODO this whole file needs proper documentation, refactoring, and testing +# TODO also add env variable to define which images sizes should be compressed def handle_image(request, image_object, filetype='.jpeg'): - if sys.getsizeof(image_object) / 8 > 500: - if filetype == '.jpeg': + if (image_object.size / 1000) > 500: # if larger than 500 kb compress + if filetype == '.jpeg' or filetype == '.jpg': return rescale_image_jpeg(image_object), filetype if filetype == '.png': return rescale_image_png(image_object), filetype diff --git a/cookbook/helper/ingredient_parser.py b/cookbook/helper/ingredient_parser.py index a6172852..b3f4a1c0 100644 --- a/cookbook/helper/ingredient_parser.py +++ b/cookbook/helper/ingredient_parser.py @@ -2,193 +2,273 @@ import re import string import unicodedata -from cookbook.models import Unit, Food +from django.core.cache import caches + +from cookbook.models import Unit, Food, Automation -def parse_fraction(x): - if len(x) == 1 and 'fraction' in unicodedata.decomposition(x): - frac_split = unicodedata.decomposition(x[-1:]).split() - return (float((frac_split[1]).replace('003', '')) - / float((frac_split[3]).replace('003', ''))) - else: - frac_split = x.split('/') - if not len(frac_split) == 2: - raise ValueError - try: - return int(frac_split[0]) / int(frac_split[1]) - except ZeroDivisionError: - raise ValueError +class IngredientParser: + request = None + ignore_rules = False + food_aliases = {} + unit_aliases = {} - -def parse_amount(x): - amount = 0 - unit = '' - note = '' - - did_check_frac = False - end = 0 - while (end < len(x) and (x[end] in string.digits - or ( - (x[end] == '.' or x[end] == ',' or x[end] == '/') - and end + 1 < len(x) - and x[end + 1] in string.digits - ))): - end += 1 - if end > 0: - if "/" in x[:end]: - amount = parse_fraction(x[:end]) - else: - amount = float(x[:end].replace(',', '.')) - else: - amount = parse_fraction(x[0]) - end += 1 - did_check_frac = True - if end < len(x): - if did_check_frac: - unit = x[end:] - else: - try: - amount += parse_fraction(x[end]) - unit = x[end + 1:] - except ValueError: - unit = x[end:] - - if unit.startswith('(') or unit.startswith('-'): # i dont know any unit that starts with ( or - so its likely an alternative like 1L (500ml) Water or 2-3 - unit = '' - note = x - return amount, unit, note - - -def parse_ingredient_with_comma(tokens): - ingredient = '' - note = '' - start = 0 - # search for first occurrence of an argument ending in a comma - while start < len(tokens) and not tokens[start].endswith(','): - start += 1 - if start == len(tokens): - # no token ending in a comma found -> use everything as ingredient - ingredient = ' '.join(tokens) - else: - ingredient = ' '.join(tokens[:start + 1])[:-1] - note = ' '.join(tokens[start + 1:]) - return ingredient, note - - -def parse_ingredient(tokens): - ingredient = '' - note = '' - if tokens[-1].endswith(')'): - # Check if the matching opening bracket is in the same token - if (not tokens[-1].startswith('(')) and ('(' in tokens[-1]): - return parse_ingredient_with_comma(tokens) - # last argument ends with closing bracket -> look for opening bracket - start = len(tokens) - 1 - while not tokens[start].startswith('(') and not start == 0: - start -= 1 - if start == 0: - # the whole list is wrapped in brackets -> assume it is an error (e.g. assumed first argument was the unit) # noqa: E501 - raise ValueError - elif start < 0: - # no opening bracket anywhere -> just ignore the last bracket - ingredient, note = parse_ingredient_with_comma(tokens) - else: - # opening bracket found -> split in ingredient and note, remove brackets from note # noqa: E501 - note = ' '.join(tokens[start:])[1:-1] - ingredient = ' '.join(tokens[:start]) - else: - ingredient, note = parse_ingredient_with_comma(tokens) - return ingredient, note - - -def parse(x): - # initialize default values - amount = 0 - unit = '' - ingredient = '' - note = '' - unit_note = '' - - # if the string contains parenthesis early on remove it and place it at the end - # because its likely some kind of note - if re.match('(.){1,6}\s\((.[^\(\)])+\)\s', x): - match = re.search('\((.[^\(])+\)', x) - x = x[:match.start()] + x[match.end():] + ' ' + x[match.start():match.end()] - - tokens = x.split() - if len(tokens) == 1: - # there only is one argument, that must be the ingredient - ingredient = tokens[0] - else: - try: - # try to parse first argument as amount - amount, unit, unit_note = parse_amount(tokens[0]) - # only try to parse second argument as amount if there are at least - # three arguments if it already has a unit there can't be - # a fraction for the amount - if len(tokens) > 2: - try: - if not unit == '': - # a unit is already found, no need to try the second argument for a fraction - # probably not the best method to do it, but I didn't want to make an if check and paste the exact same thing in the else as already is in the except # noqa: E501 - raise ValueError - # try to parse second argument as amount and add that, in case of '2 1/2' or '2 ½' - amount += parse_fraction(tokens[1]) - # assume that units can't end with a comma - if len(tokens) > 3 and not tokens[2].endswith(','): - # try to use third argument as unit and everything else as ingredient, use everything as ingredient if it fails # noqa: E501 - try: - ingredient, note = parse_ingredient(tokens[3:]) - unit = tokens[2] - except ValueError: - ingredient, note = parse_ingredient(tokens[2:]) - else: - ingredient, note = parse_ingredient(tokens[2:]) - except ValueError: - # assume that units can't end with a comma - if not tokens[1].endswith(','): - # try to use second argument as unit and everything else as ingredient, use everything as ingredient if it fails # noqa: E501 - try: - ingredient, note = parse_ingredient(tokens[2:]) - if unit == '': - unit = tokens[1] - else: - note = tokens[1] - except ValueError: - ingredient, note = parse_ingredient(tokens[1:]) - else: - ingredient, note = parse_ingredient(tokens[1:]) + def __init__(self, request, cache_mode, ignore_automations=False): + """ + Initialize ingredient parser + :param request: request context (to control caching, rule ownership, etc.) + :param cache_mode: defines if all rules should be loaded on initialization (good when parser is used many times) or if they should be retrieved every time (good when parser is not used many times in a row) + :param ignore_automations: ignore automation rules, allows to use ingredient parser without database access/request (request can be None) + """ + self.request = request + self.ignore_rules = ignore_automations + if cache_mode: + FOOD_CACHE_KEY = f'automation_food_alias_{self.request.space.pk}' + if c := caches['default'].get(FOOD_CACHE_KEY, None): + self.food_aliases = c + caches['default'].touch(FOOD_CACHE_KEY, 30) else: - # only two arguments, first one is the amount - # which means this is the ingredient - ingredient = tokens[1] - except ValueError: + for a in Automation.objects.filter(space=self.request.space, disabled=False, type=Automation.FOOD_ALIAS).only('param_1', 'param_2').all(): + self.food_aliases[a.param_1] = a.param_2 + caches['default'].set(FOOD_CACHE_KEY, self.food_aliases, 30) + + UNIT_CACHE_KEY = f'automation_unit_alias_{self.request.space.pk}' + if c := caches['default'].get(UNIT_CACHE_KEY, None): + 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(): + self.unit_aliases[a.param_1] = a.param_2 + caches['default'].set(UNIT_CACHE_KEY, self.unit_aliases, 30) + else: + self.food_aliases = {} + self.unit_aliases = {} + + def apply_food_automation(self, food): + """ + Apply food alias automations to passed foood + :param food: unit as string + :return: food as string (possibly changed by automation) + """ + if self.ignore_rules: + return food + else: + if self.food_aliases: + try: + return self.food_aliases[food] + except KeyError: + return food + else: + if automation := Automation.objects.filter(space=self.request.space, type=Automation.FOOD_ALIAS, param_1=food, disabled=False).first(): + return automation.param_2 + return food + + def apply_unit_automation(self, unit): + """ + Apply unit alias automations to passed unit + :param unit: unit as string + :return: unit as string (possibly changed by automation) + """ + if self.ignore_rules: + return unit + else: + if self.unit_aliases: + try: + return self.unit_aliases[unit] + except KeyError: + return unit + else: + if automation := Automation.objects.filter(space=self.request.space, type=Automation.UNIT_ALIAS, param_1=unit, disabled=False).first(): + return automation.param_2 + return unit + + def get_unit(self, unit): + """ + Get or create a unit for given space respecting possible automations + :param unit: string unit + :return: None if unit passed is invalid, Unit object otherwise + """ + if not unit: + return None + if len(unit) > 0: + u, created = Unit.objects.get_or_create(name=self.apply_unit_automation(unit), space=self.request.space) + return u + return None + + def get_food(self, food): + """ + Get or create a food for given space respecting possible automations + :param food: string food + :return: None if food passed is invalid, Food object otherwise + """ + if not food: + return None + if len(food) > 0: + f, created = Food.objects.get_or_create(name=self.apply_food_automation(food), space=self.request.space) + return f + return None + + def parse_fraction(self, x): + if len(x) == 1 and 'fraction' in unicodedata.decomposition(x): + frac_split = unicodedata.decomposition(x[-1:]).split() + return (float((frac_split[1]).replace('003', '')) + / float((frac_split[3]).replace('003', ''))) + else: + frac_split = x.split('/') + if not len(frac_split) == 2: + raise ValueError try: - # can't parse first argument as amount - # -> no unit -> parse everything as ingredient - ingredient, note = parse_ingredient(tokens) + return int(frac_split[0]) / int(frac_split[1]) + except ZeroDivisionError: + raise ValueError + + def parse_amount(self, x): + amount = 0 + unit = '' + note = '' + + did_check_frac = False + end = 0 + while (end < len(x) and (x[end] in string.digits + or ( + (x[end] == '.' or x[end] == ',' or x[end] == '/') + and end + 1 < len(x) + and x[end + 1] in string.digits + ))): + end += 1 + if end > 0: + if "/" in x[:end]: + amount = self.parse_fraction(x[:end]) + else: + amount = float(x[:end].replace(',', '.')) + else: + amount = self.parse_fraction(x[0]) + end += 1 + did_check_frac = True + if end < len(x): + if did_check_frac: + unit = x[end:] + else: + try: + amount += self.parse_fraction(x[end]) + unit = x[end + 1:] + except ValueError: + unit = x[end:] + + if unit.startswith('(') or unit.startswith('-'): # i dont know any unit that starts with ( or - so its likely an alternative like 1L (500ml) Water or 2-3 + unit = '' + note = x + return amount, unit, note + + def parse_ingredient_with_comma(self, tokens): + ingredient = '' + note = '' + start = 0 + # search for first occurrence of an argument ending in a comma + while start < len(tokens) and not tokens[start].endswith(','): + start += 1 + if start == len(tokens): + # no token ending in a comma found -> use everything as ingredient + ingredient = ' '.join(tokens) + else: + ingredient = ' '.join(tokens[:start + 1])[:-1] + note = ' '.join(tokens[start + 1:]) + return ingredient, note + + def parse_ingredient(self, tokens): + ingredient = '' + note = '' + if tokens[-1].endswith(')'): + # Check if the matching opening bracket is in the same token + if (not tokens[-1].startswith('(')) and ('(' in tokens[-1]): + return self.parse_ingredient_with_comma(tokens) + # last argument ends with closing bracket -> look for opening bracket + start = len(tokens) - 1 + while not tokens[start].startswith('(') and not start == 0: + start -= 1 + if start == 0: + # the whole list is wrapped in brackets -> assume it is an error (e.g. assumed first argument was the unit) # noqa: E501 + raise ValueError + elif start < 0: + # no opening bracket anywhere -> just ignore the last bracket + ingredient, note = self.parse_ingredient_with_comma(tokens) + else: + # opening bracket found -> split in ingredient and note, remove brackets from note # noqa: E501 + note = ' '.join(tokens[start:])[1:-1] + ingredient = ' '.join(tokens[:start]) + else: + ingredient, note = self.parse_ingredient_with_comma(tokens) + return ingredient, note + + def parse(self, x): + # initialize default values + amount = 0 + unit = '' + ingredient = '' + note = '' + unit_note = '' + + # if the string contains parenthesis early on remove it and place it at the end + # because its likely some kind of note + if re.match('(.){1,6}\s\((.[^\(\)])+\)\s', x): + match = re.search('\((.[^\(])+\)', x) + x = x[:match.start()] + x[match.end():] + ' ' + x[match.start():match.end()] + + tokens = x.split() + if len(tokens) == 1: + # there only is one argument, that must be the ingredient + ingredient = tokens[0] + else: + try: + # try to parse first argument as amount + amount, unit, unit_note = self.parse_amount(tokens[0]) + # only try to parse second argument as amount if there are at least + # three arguments if it already has a unit there can't be + # a fraction for the amount + if len(tokens) > 2: + try: + if not unit == '': + # a unit is already found, no need to try the second argument for a fraction + # probably not the best method to do it, but I didn't want to make an if check and paste the exact same thing in the else as already is in the except # noqa: E501 + raise ValueError + # try to parse second argument as amount and add that, in case of '2 1/2' or '2 ½' + amount += self.parse_fraction(tokens[1]) + # assume that units can't end with a comma + if len(tokens) > 3 and not tokens[2].endswith(','): + # try to use third argument as unit and everything else as ingredient, use everything as ingredient if it fails # noqa: E501 + try: + ingredient, note = self.parse_ingredient(tokens[3:]) + unit = tokens[2] + except ValueError: + ingredient, note = self.parse_ingredient(tokens[2:]) + else: + ingredient, note = self.parse_ingredient(tokens[2:]) + except ValueError: + # assume that units can't end with a comma + if not tokens[1].endswith(','): + # try to use second argument as unit and everything else as ingredient, use everything as ingredient if it fails # noqa: E501 + try: + ingredient, note = self.parse_ingredient(tokens[2:]) + if unit == '': + unit = tokens[1] + else: + note = tokens[1] + except ValueError: + ingredient, note = self.parse_ingredient(tokens[1:]) + else: + ingredient, note = self.parse_ingredient(tokens[1:]) + else: + # only two arguments, first one is the amount + # which means this is the ingredient + ingredient = tokens[1] except ValueError: - ingredient = ' '.join(tokens[1:]) + try: + # can't parse first argument as amount + # -> no unit -> parse everything as ingredient + ingredient, note = self.parse_ingredient(tokens) + except ValueError: + ingredient = ' '.join(tokens[1:]) - if unit_note not in note: - note += ' ' + unit_note - return amount, unit.strip(), ingredient.strip(), note.strip() - - -# small utility functions to prevent emtpy unit/food creation -def get_unit(unit, space): - if not unit: - return None - if len(unit) > 0: - u, created = Unit.objects.get_or_create(name=unit, space=space) - return u - return None - - -def get_food(food, space): - if not food: - return None - if len(food) > 0: - f, created = Food.objects.get_or_create(name=food, space=space) - return f - return None + if unit_note not in note: + note += ' ' + unit_note + return amount, self.apply_unit_automation(unit.strip()), self.apply_food_automation(ingredient.strip()), note.strip() diff --git a/cookbook/helper/permission_helper.py b/cookbook/helper/permission_helper.py index cb3f791d..a24483b2 100644 --- a/cookbook/helper/permission_helper.py +++ b/cookbook/helper/permission_helper.py @@ -2,11 +2,9 @@ Source: https://djangosnippets.org/snippets/1703/ """ from django.conf import settings -from django.core.cache import caches - -from cookbook.models import ShareLink from django.contrib import messages from django.contrib.auth.decorators import user_passes_test +from django.core.cache import caches from django.core.exceptions import ValidationError from django.http import HttpResponseRedirect from django.urls import reverse, reverse_lazy @@ -14,6 +12,8 @@ from django.utils.translation import gettext as _ from rest_framework import permissions from rest_framework.permissions import SAFE_METHODS +from cookbook.models import ShareLink + def get_allowed_groups(groups_required): """ @@ -34,7 +34,7 @@ def has_group_permission(user, groups): """ Tests if a given user is member of a certain group (or any higher group) Superusers always bypass permission checks. - Unauthenticated users cant be member of any group thus always return false. + Unauthenticated users can't be member of any group thus always return false. :param user: django auth user object :param groups: list or tuple of groups the user should be checked for :return: True if user is in allowed groups, false otherwise @@ -205,6 +205,9 @@ class CustomIsShared(permissions.BasePermission): return request.user.is_authenticated def has_object_permission(self, request, view, obj): + # # temporary hack to make old shopping list work with new shopping list + # if obj.__class__.__name__ in ['ShoppingList', 'ShoppingListEntry']: + # return is_object_shared(request.user, obj) or obj.created_by in list(request.user.get_shopping_share()) return is_object_shared(request.user, obj) diff --git a/cookbook/helper/recipe_html_import.py b/cookbook/helper/recipe_html_import.py index 3b06dc80..acf72917 100644 --- a/cookbook/helper/recipe_html_import.py +++ b/cookbook/helper/recipe_html_import.py @@ -1,16 +1,17 @@ import json import re +from json import JSONDecodeError +from urllib.parse import unquote from bs4 import BeautifulSoup from bs4.element import Tag +from recipe_scrapers._utils import get_host_name, normalize_string + from cookbook.helper import recipe_url_import as helper from cookbook.helper.scrapers.scrapers import text_scraper -from json import JSONDecodeError -from recipe_scrapers._utils import get_host_name, normalize_string -from urllib.parse import unquote -def get_recipe_from_source(text, url, space): +def get_recipe_from_source(text, url, request): def build_node(k, v): if isinstance(v, dict): node = { @@ -58,7 +59,7 @@ def get_recipe_from_source(text, url, space): return kid_list recipe_json = { - 'name': '', + 'name': '', 'url': '', 'description': '', 'image': '', @@ -103,7 +104,7 @@ def get_recipe_from_source(text, url, space): parse_list.append(el) scrape = text_scraper(text, url=url) - recipe_json = helper.get_from_scraper(scrape, space) + recipe_json = helper.get_from_scraper(scrape, request) for el in parse_list: temp_tree = [] @@ -188,6 +189,6 @@ def remove_graph(el): for x in el['@graph']: if '@type' in x and x['@type'] == 'Recipe': el = x - except TypeError: + except (TypeError, JSONDecodeError): pass return el diff --git a/cookbook/helper/recipe_search.py b/cookbook/helper/recipe_search.py index 6d638657..1e4f72cb 100644 --- a/cookbook/helper/recipe_search.py +++ b/cookbook/helper/recipe_search.py @@ -1,298 +1,960 @@ -from datetime import datetime, timedelta +from collections import Counter +from datetime import timedelta -from recipes import settings -from django.contrib.postgres.search import ( - SearchQuery, SearchRank, TrigramSimilarity -) -from django.db.models import Count, Max, Q, Subquery, Case, When, Value -from django.utils import translation +from django.contrib.postgres.search import SearchQuery, SearchRank, TrigramSimilarity +from django.core.cache import caches +from django.db.models import Avg, Case, Count, F, Func, Max, OuterRef, Q, Subquery, Sum, Value, When +from django.db.models.functions import Coalesce, Lower, Substr +from django.utils import timezone, translation +from django.utils.translation import gettext as _ +from cookbook.filters import RecipeFilter +from cookbook.helper.HelperFunctions import Round, str2bool +from cookbook.helper.permission_helper import has_group_permission from cookbook.managers import DICTIONARY -from cookbook.models import Food, Keyword, Recipe, ViewLog +from cookbook.models import CookLog, Food, Keyword, Recipe, SearchPreference, ViewLog +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 -def search_recipes(request, queryset, params): - search_prefs = request.user.searchpreference - search_string = params.get('query', '') - search_ratings = params.getlist('ratings', []) - search_keywords = params.getlist('keywords', []) - search_foods = params.getlist('foods', []) - search_books = params.getlist('books', []) +class RecipeSearch(): + _postgres = settings.DATABASES['default']['ENGINE'] in ['django.db.backends.postgresql_psycopg2', 'django.db.backends.postgresql'] - # TODO I think default behavior should be 'AND' which is how most sites operate with facet/filters based on results - search_keywords_or = params.get('keywords_or', True) - search_foods_or = params.get('foods_or', True) - search_books_or = params.get('books_or', True) - - search_internal = params.get('internal', None) - search_random = params.get('random', False) - search_new = params.get('new', False) - search_last_viewed = int(params.get('last_viewed', 0)) - orderby = [] - - # TODO update this to concat with full search queryset qs1 | qs2 - if search_last_viewed > 0: - last_viewed_recipes = ViewLog.objects.filter( - created_by=request.user, space=request.space, - created_at__gte=datetime.now() - timedelta(days=14) # TODO make recent days a setting - ).order_by('-pk').values_list('recipe__pk', flat=True) - last_viewed_recipes = list(dict.fromkeys(last_viewed_recipes))[:search_last_viewed] # removes duplicates from list prior to slicing - - # return queryset.annotate(last_view=Max('viewlog__pk')).annotate(new=Case(When(pk__in=last_viewed_recipes, then=('last_view')), default=Value(0))).filter(new__gt=0).order_by('-new') - # queryset that only annotates most recent view (higher pk = lastest view) - queryset = queryset.annotate(last_view=Max('viewlog__pk')).annotate(recent=Case(When(pk__in=last_viewed_recipes, then=('last_view')), default=Value(0))) - orderby += ['-recent'] - - # TODO create setting for default ordering - most cooked, rating, - # TODO create options for live sorting - # TODO make days of new recipe a setting - if search_new == 'true': - queryset = ( - queryset.annotate(new_recipe=Case( - When(created_at__gte=(datetime.now() - timedelta(days=7)), then=('pk')), default=Value(0),)) - ) - orderby += ['-new_recipe'] - - search_type = search_prefs.search or 'plain' - if len(search_string) > 0: - unaccent_include = search_prefs.unaccent.values_list('field', flat=True) - - icontains_include = [x + '__unaccent' if x in unaccent_include else x for x in search_prefs.icontains.values_list('field', flat=True)] - istartswith_include = [x + '__unaccent' if x in unaccent_include else x for x in search_prefs.istartswith.values_list('field', flat=True)] - trigram_include = [x + '__unaccent' if x in unaccent_include else x for x in search_prefs.trigram.values_list('field', flat=True)] - fulltext_include = search_prefs.fulltext.values_list('field', flat=True) # fulltext doesn't use field name directly - - # if no filters are configured use name__icontains as default - if len(icontains_include) + len(istartswith_include) + len(trigram_include) + len(fulltext_include) == 0: - filters = [Q(**{"name__icontains": search_string})] + def __init__(self, request, **params): + self._request = request + self._queryset = None + self._params = {**params} + if self._request.user.is_authenticated: + self._search_prefs = request.user.searchpreference else: - filters = [] + self._search_prefs = SearchPreference() + self._string = params.get('query').strip() if params.get('query', None) else None + self._rating = self._params.get('rating', None) + self._keywords = self._params.get('keywords', None) + self._foods = self._params.get('foods', None) + self._books = self._params.get('books', None) + self._steps = self._params.get('steps', None) + self._units = self._params.get('units', None) + # TODO add created by + # TODO add created before/after + # TODO image exists + self._sort_order = self._params.get('sort_order', None) + # TODO add save - # dynamically build array of filters that will be applied - for f in icontains_include: - filters += [Q(**{"%s__icontains" % f: search_string})] + self._keywords_or = str2bool(self._params.get('keywords_or', True)) + self._foods_or = str2bool(self._params.get('foods_or', True)) + self._books_or = str2bool(self._params.get('books_or', True)) - for f in istartswith_include: - filters += [Q(**{"%s__istartswith" % f: search_string})] + self._internal = str2bool(self._params.get('internal', False)) + self._random = str2bool(self._params.get('random', False)) + self._new = str2bool(self._params.get('new', False)) + self._last_viewed = int(self._params.get('last_viewed', 0)) - if settings.DATABASES['default']['ENGINE'] in ['django.db.backends.postgresql_psycopg2', 'django.db.backends.postgresql']: - language = DICTIONARY.get(translation.get_language(), 'simple') - # django full text search https://docs.djangoproject.com/en/3.2/ref/contrib/postgres/search/#searchquery - # TODO can options install this extension to further enhance search query language https://github.com/caub/pg-tsquery - # trigram breaks full text search 'websearch' and 'raw' capabilities and will be ignored if those methods are chosen - if search_type in ['websearch', 'raw']: - search_trigram = False - else: - search_trigram = True - search_query = SearchQuery( - search_string, - search_type=search_type, - config=language, + self._search_type = self._search_prefs.search or 'plain' + if self._string: + unaccent_include = self._search_prefs.unaccent.values_list('field', flat=True) + self._icontains_include = [x + '__unaccent' if x in unaccent_include else x for x in self._search_prefs.icontains.values_list('field', flat=True)] + self._istartswith_include = [x + '__unaccent' if x in 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 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) + + if self._search_type not in ['websearch', 'raw'] and self._trigram_include: + self._trigram = True + self.search_query = SearchQuery( + self._string, + search_type=self._search_type, + config=self._language, ) + self.search_rank = ( + SearchRank('name_search_vector', self.search_query, cover_density=True) + + SearchRank('desc_search_vector', self.search_query, cover_density=True) + + SearchRank('steps__search_vector', self.search_query, cover_density=True) + ) + self.orderby = [] + self._default_sort = ['-favorite'] # TODO add user setting + self._filters = None + self._fuzzy_match = None - # iterate through fields to use in trigrams generating a single trigram - if search_trigram & len(trigram_include) > 1: - trigram = None - for f in trigram_include: - if trigram: - trigram += TrigramSimilarity(f, search_string) - else: - trigram = TrigramSimilarity(f, search_string) - queryset.annotate(simularity=trigram) - # TODO allow user to play with trigram scores - filters += [Q(simularity__gt=0.5)] + def get_queryset(self, queryset): + self._queryset = queryset + self.recently_viewed_recipes(self._last_viewed) + self._favorite_recipes() + self._new_recipes() + # self._last_viewed() + # self._last_cooked() + self.keyword_filters(keywords=self._keywords, operator=self._keywords_or) + self.food_filters(foods=self._foods, operator=self._foods_or) + self.book_filters(books=self._books, operator=self._books_or) + self.rating_filter(rating=self._rating) + self.internal_filter() + self.step_filters(steps=self._steps) + self.unit_filters(units=self._units) + self.string_filters(string=self._string) + # self._queryset = self._queryset.distinct() # TODO 2x check. maybe add filter of recipe__in after orderby + self._apply_order_by() + return self._queryset.filter(space=self._request.space) - if 'name' in fulltext_include: - filters += [Q(name_search_vector=search_query)] - if 'description' in fulltext_include: - filters += [Q(desc_search_vector=search_query)] - if 'instructions' in fulltext_include: - filters += [Q(steps__search_vector=search_query)] - if 'keywords' in fulltext_include: - filters += [Q(keywords__in=Subquery(Keyword.objects.filter(name__search=search_query).values_list('id', flat=True)))] - if 'foods' in fulltext_include: - filters += [Q(steps__ingredients__food__in=Subquery(Food.objects.filter(name__search=search_query).values_list('id', flat=True)))] + def _apply_order_by(self): + if self._random: + self._queryset = self._queryset.order_by("?") + else: + if self._sort_order: + self._queryset.order_by(*self._sort_order) + return + + order = [] # TODO add user preferences here: name, date cooked, rating, times cooked, date created, date viewed, random + if '-recent' in self.orderby and self._last_viewed: + order += ['-recent'] + if '-new_recipe' in self.orderby and self._new: + order += ['-new_recipe'] + + if '-rank' in self.orderby and '-simularity' in self.orderby: + self._queryset = self._queryset.annotate(score=Sum(F('rank')+F('simularity'))) + order += ['-score'] + elif '-rank' in self.orderby: + self._queryset = self._queryset.annotate(score=F('rank')) + order += ['-score'] + elif '-simularity' in self.orderby: + self._queryset = self._queryset.annotate(score=F('simularity')) + order += ['-score'] + for x in list(set(self.orderby)-set([*order, '-rank', '-simularity'])): + order += [x] + self._queryset = self._queryset.order_by(*order) + + def string_filters(self, string=None): + if not string: + return + + self.build_text_filters(self._string) + if self._postgres: + self.build_fulltext_filters(self._string) + self.build_trigram(self._string) + + if self._filters: query_filter = None - for f in filters: + for f in self._filters: if query_filter: query_filter |= f else: query_filter = f + self._queryset = self._queryset.filter(query_filter).distinct() + # TODO add annotation for simularity + if self._fulltext_include: + self._queryset = self._queryset.annotate(rank=self.search_rank) + self.orderby += ['-rank'] - # TODO add order by user settings - only do search rank and annotation if rank order is configured - search_rank = ( - SearchRank('name_search_vector', search_query, cover_density=True) - + SearchRank('desc_search_vector', search_query, cover_density=True) - + SearchRank('steps__search_vector', search_query, cover_density=True) - ) - queryset = queryset.filter(query_filter).annotate(rank=search_rank) - orderby += ['-rank'] + if self._fuzzy_match is not None: # this annotation is full text, not trigram + simularity = self._fuzzy_match.filter(pk=OuterRef('pk')).values('simularity') + self._queryset = self._queryset.annotate(simularity=Coalesce(Subquery(simularity), 0.0)) + self.orderby += ['-simularity'] else: - queryset = queryset.filter(name__icontains=search_string) + self._queryset = self._queryset.filter(name__icontains=self._string) - if len(search_keywords) > 0: - if search_keywords_or == 'true': - # when performing an 'or' search all descendants are included in the OR condition - # so descendants are appended to filter all at once + def _new_recipes(self, new_days=7): + # TODO make new days a user-setting + if not self._new: + return + self._queryset = ( + self._queryset.annotate(new_recipe=Case( + When(created_at__gte=(timezone.now() - timedelta(days=new_days)), then=('pk')), default=Value(0), )) + ) + self.orderby += ['-new_recipe'] + + def recently_viewed_recipes(self, last_viewed=None): + if not last_viewed: + return + + last_viewed_recipes = ViewLog.objects.filter(created_by=self._request.user, space=self._request.space).values( + 'recipe').annotate(recent=Max('created_at')).order_by('-recent') + last_viewed_recipes = last_viewed_recipes[:last_viewed] + self.orderby += ['-recent'] + self._queryset = self._queryset.annotate(recent=Coalesce(Max(Case(When(pk__in=last_viewed_recipes.values('recipe'), then='viewlog__pk'))), Value(0))) + + def _favorite_recipes(self): + self.orderby += ['-favorite'] # default sort? + 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), 0)) + + def keyword_filters(self, keywords=None, operator=True): + if not keywords: + return + if not isinstance(keywords, list): + keywords = [keywords] + if operator == True: # TODO creating setting to include descendants of keywords a setting - # for kw in Keyword.objects.filter(pk__in=search_keywords): - # search_keywords += list(kw.get_descendants().values_list('pk', flat=True)) - queryset = queryset.filter(keywords__id__in=search_keywords) + self._queryset = self._queryset.filter(keywords__in=Keyword.include_descendants(Keyword.objects.filter(pk__in=keywords))) else: # when performing an 'and' search returned recipes should include a parent OR any of its descedants # AND other keywords selected so filters are appended using keyword__id__in the list of keywords and descendants - for kw in Keyword.objects.filter(pk__in=search_keywords): - queryset = queryset.filter(keywords__id__in=list(kw.get_descendants_and_self().values_list('pk', flat=True))) + for kw in Keyword.objects.filter(pk__in=keywords): + self._queryset = self._queryset.filter(keywords__in=list(kw.get_descendants_and_self())) - if len(search_foods) > 0: - if search_foods_or == 'true': - queryset = queryset.filter(steps__ingredients__food__id__in=search_foods) + def food_filters(self, foods=None, operator=True): + if not foods: + return + if not isinstance(foods, list): + foods = [foods] + if operator == True: + # TODO creating setting to include descendants of food a setting + self._queryset = self._queryset.filter(steps__ingredients__food__in=Food.include_descendants(Food.objects.filter(pk__in=foods))) else: - for k in search_foods: - queryset = queryset.filter(steps__ingredients__food__id=k) + # when performing an 'and' search returned recipes should include a parent OR any of its descedants + # AND other foods selected so filters are appended using steps__ingredients__food__id__in the list of foods and descendants + for fd in Food.objects.filter(pk__in=foods): + self._queryset = self._queryset.filter(steps__ingredients__food__in=list(fd.get_descendants_and_self())) - if len(search_books) > 0: - if search_books_or == 'true': - queryset = queryset.filter(recipebookentry__book__id__in=search_books) + def unit_filters(self, units=None, operator=True): + if operator != True: + raise NotImplementedError + if not units: + return + if not isinstance(units, list): + units = [units] + self._queryset = self._queryset.filter(steps__ingredients__unit__in=units) + + def rating_filter(self, rating=None): + if rating is None: + return + rating = int(rating) + # 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=Value(0))))) + if rating == 0: + self._queryset = self._queryset.filter(rating=0) else: - for k in search_books: - queryset = queryset.filter(recipebookentry__book__id=k) + self._queryset = self._queryset.filter(rating__gte=rating) - if search_internal == 'true': - queryset = queryset.filter(internal=True) + def internal_filter(self): + self._queryset = self._queryset.filter(internal=True) - queryset = queryset.distinct() - - if search_random == 'true': - queryset = queryset.order_by("?") - else: - # TODO add order by user settings - # orderby += ['name'] - queryset = queryset.order_by(*orderby) - return queryset - - -def get_facet(qs, request): - # NOTE facet counts for tree models include self AND descendants - facets = {} - ratings = request.query_params.getlist('ratings', []) - keyword_list = request.query_params.getlist('keywords', []) - food_list = request.query_params.getlist('foods', []) - book_list = request.query_params.getlist('book', []) - search_keywords_or = request.query_params.get('keywords_or', True) - search_foods_or = request.query_params.get('foods_or', True) - search_books_or = request.query_params.get('books_or', True) - - # if using an OR search, will annotate all keywords, otherwise, just those that appear in results - if search_keywords_or: - keywords = Keyword.objects.filter(space=request.space).annotate(recipe_count=Count('recipe')) - else: - keywords = Keyword.objects.filter(recipe__in=qs, space=request.space).annotate(recipe_count=Count('recipe')) - # custom django-tree function annotates a queryset to make building a tree easier. - # see https://django-treebeard.readthedocs.io/en/latest/api.html#treebeard.models.Node.get_annotated_list_qs for details - kw_a = annotated_qs(keywords, root=True, fill=True) - - # TODO add rating facet - facets['Ratings'] = [] - facets['Keywords'] = fill_annotated_parents(kw_a, keyword_list) - # TODO add food facet - facets['Foods'] = [] - # TODO add book facet - facets['Books'] = [] - facets['Recent'] = ViewLog.objects.filter( - created_by=request.user, space=request.space, - created_at__gte=datetime.now() - timedelta(days=14) # TODO make days of recent recipe a setting - ).values_list('recipe__pk', flat=True) - return facets - - -def fill_annotated_parents(annotation, filters): - tree_list = [] - parent = [] - i = 0 - level = -1 - for r in annotation: - expand = False - - annotation[i][1]['id'] = r[0].id - annotation[i][1]['name'] = r[0].name - annotation[i][1]['count'] = getattr(r[0], 'recipe_count', 0) - annotation[i][1]['isDefaultExpanded'] = False - - if str(r[0].id) in filters: - expand = True - if r[1]['level'] < level: - parent = parent[:r[1]['level'] - level] - parent[-1] = i - level = r[1]['level'] - elif r[1]['level'] > level: - parent.extend([i]) - level = r[1]['level'] + def book_filters(self, books=None, operator=True): + if not books: + return + if not isinstance(books, list): + books = [books] + if operator == True: + self._queryset = self._queryset.filter(recipebookentry__book__id__in=books) else: - parent[-1] = i - j = 0 + for k in books: + self._queryset = self._queryset.filter(recipebookentry__book__id=k) - while j < level: - # this causes some double counting when a recipe has both a child and an ancestor - annotation[parent[j]][1]['count'] += getattr(r[0], 'recipe_count', 0) - if expand: - annotation[parent[j]][1]['isDefaultExpanded'] = True - j += 1 - if level == 0: - tree_list.append(annotation[i][1]) - elif level > 0: - annotation[parent[level - 1]][1].setdefault('children', []).append(annotation[i][1]) - i += 1 - return tree_list + def step_filters(self, steps=None, operator=True): + if operator != True: + raise NotImplementedError + if not steps: + return + if not isinstance(steps, list): + steps = [unistepsts] + self._queryset = self._queryset.filter(steps__id__in=steps) + + def build_fulltext_filters(self, string=None): + if not string: + return + if self._fulltext_include: + if not self._filters: + self._filters = [] + if 'name' in self._fulltext_include: + self._filters += [Q(name_search_vector=self.search_query)] + if 'description' in self._fulltext_include: + self._filters += [Q(desc_search_vector=self.search_query)] + if 'steps__instruction' in self._fulltext_include: + self._filters += [Q(steps__search_vector=self.search_query)] + if 'keywords__name' in self._fulltext_include: + self._filters += [Q(keywords__in=Keyword.objects.filter(name__search=self.search_query))] + if 'steps__ingredients__food__name' in self._fulltext_include: + self._filters += [Q(steps__ingredients__food__in=Food.objects.filter(name__search=self.search_query))] + + def build_text_filters(self, string=None): + if not string: + return + + if not self._filters: + self._filters = [] + # dynamically build array of filters that will be applied + for f in self._icontains_include: + self._filters += [Q(**{"%s__icontains" % f: self._string})] + + for f in self._istartswith_include: + self._filters += [Q(**{"%s__istartswith" % f: self._string})] + + def build_trigram(self, string=None): + if not string: + return + if self._trigram: + trigram = None + for f in self._trigram_include: + if trigram: + trigram += TrigramSimilarity(f, self._string) + else: + trigram = TrigramSimilarity(f, self._string) + self._fuzzy_match = Recipe.objects.annotate(trigram=trigram).distinct( + ).annotate(simularity=Max('trigram')).values('id', 'simularity').filter(simularity__gt=self._search_prefs.trigram_threshold) + self._filters += [Q(pk__in=self._fuzzy_match.values('pk'))] -def annotated_qs(qs, root=False, fill=False): - """ - Gets an annotated list from a queryset. +# def search_recipes(request, queryset, params): +# if request.user.is_authenticated: +# search_prefs = request.user.searchpreference +# else: +# search_prefs = SearchPreference() +# search_string = params.get('query', '').strip() +# search_rating = int(params.get('rating', 0)) +# search_keywords = params.getlist('keywords', []) +# search_foods = params.getlist('foods', []) +# search_books = params.getlist('books', []) +# search_steps = params.getlist('steps', []) +# search_units = params.get('units', None) - :param root: +# search_keywords_or = str2bool(params.get('keywords_or', True)) +# search_foods_or = str2bool(params.get('foods_or', True)) +# search_books_or = str2bool(params.get('books_or', True)) - Will backfill in annotation to include all parents to root node. +# search_internal = str2bool(params.get('internal', False)) +# search_random = str2bool(params.get('random', False)) +# search_new = str2bool(params.get('new', False)) +# search_last_viewed = int(params.get('last_viewed', 0)) # not included in schema currently? +# orderby = [] - :param fill: +# # only sort by recent not otherwise filtering/sorting +# if search_last_viewed > 0: +# last_viewed_recipes = ViewLog.objects.filter(created_by=request.user, space=request.space).values('recipe').annotate(recent=Max('created_at')).order_by('-recent')[:search_last_viewed] +# queryset = queryset.annotate(recent=Coalesce(Max(Case(When(pk__in=last_viewed_recipes.values('recipe'), then='viewlog__pk'))), Value(0))).order_by('-recent') +# orderby += ['-recent'] +# # TODO add sort by favorite +# favorite_recipes = CookLog.objects.filter(created_by=request.user, space=request.space, recipe=OuterRef('pk')).values('recipe').annotate(count=Count('pk', distinct=True)).values('count') +# # TODO add to serialization and RecipeCard and RecipeView +# queryset = queryset.annotate(favorite=Coalesce(Subquery(favorite_recipes), 0)) - Will fill in gaps in annotation where nodes between children - and ancestors are not included in the queryset. - """ +# # TODO create setting for default ordering - most cooked, rating, +# # TODO create options for live sorting +# # TODO make days of new recipe a setting +# if search_new: +# queryset = ( +# queryset.annotate(new_recipe=Case( +# When(created_at__gte=(timezone.now() - timedelta(days=7)), then=('pk')), default=Value(0), )) +# ) +# # TODO create setting for 'new' recipes +# # only sort by new recipes if not otherwise filtering/sorting +# orderby += ['-new_recipe'] +# orderby += ['-favorite'] - result, info = [], {} - start_depth, prev_depth = (None, None) - nodes_list = list(qs.values_list('pk', flat=True)) - for node in qs.order_by('path'): - node_queue = [node] - while len(node_queue) > 0: - dirty = False - current_node = node_queue[-1] - depth = current_node.get_depth() - parent_id = current_node.parent - if root and depth > 1 and parent_id not in nodes_list: - parent_id = current_node.parent - nodes_list.append(parent_id) - node_queue.append(current_node.__class__.objects.get(pk=parent_id)) - dirty = True +# search_type = search_prefs.search or 'plain' +# if len(search_string) > 0: +# unaccent_include = search_prefs.unaccent.values_list('field', flat=True) - if fill and depth > 1 and prev_depth and depth > prev_depth and parent_id not in nodes_list: - nodes_list.append(parent_id) - node_queue.append(current_node.__class__.objects.get(pk=parent_id)) - dirty = True +# icontains_include = [x + '__unaccent' if x in unaccent_include else x for x in search_prefs.icontains.values_list('field', flat=True)] +# istartswith_include = [x + '__unaccent' if x in unaccent_include else x for x in search_prefs.istartswith.values_list('field', flat=True)] +# trigram_include = [x + '__unaccent' if x in unaccent_include else x for x in search_prefs.trigram.values_list('field', flat=True)] +# fulltext_include = search_prefs.fulltext.values_list('field', flat=True) # fulltext doesn't use field name directly - if not dirty: - working_node = node_queue.pop() - if start_depth is None: - start_depth = depth - open = (depth and (prev_depth is None or depth > prev_depth)) - if prev_depth is not None and depth < prev_depth: - info['close'] = list(range(0, prev_depth - depth)) - info = {'open': open, 'close': [], 'level': depth - start_depth} - result.append((working_node, info,)) - prev_depth = depth - if start_depth and start_depth > 0: - info['close'] = list(range(0, prev_depth - start_depth + 1)) - return result +# # if no filters are configured use name__icontains as default +# if icontains_include or istartswith_include or trigram_include or fulltext_include: +# filters = [Q(**{"name__icontains": search_string})] +# else: +# filters = [] + +# # dynamically build array of filters that will be applied +# for f in icontains_include: +# filters += [Q(**{"%s__icontains" % f: search_string})] + +# for f in istartswith_include: +# filters += [Q(**{"%s__istartswith" % f: search_string})] + +# if settings.DATABASES['default']['ENGINE'] in ['django.db.backends.postgresql_psycopg2', 'django.db.backends.postgresql']: +# language = DICTIONARY.get(translation.get_language(), 'simple') +# # django full text search https://docs.djangoproject.com/en/3.2/ref/contrib/postgres/search/#searchquery +# # TODO can options install this extension to further enhance search query language https://github.com/caub/pg-tsquery +# # trigram breaks full text search 'websearch' and 'raw' capabilities and will be ignored if those methods are chosen +# if search_type in ['websearch', 'raw']: +# search_trigram = False +# else: +# search_trigram = True +# search_query = SearchQuery( +# search_string, +# search_type=search_type, +# config=language, +# ) + +# # iterate through fields to use in trigrams generating a single trigram +# if search_trigram and len(trigram_include) > 0: +# trigram = None +# for f in trigram_include: +# if trigram: +# trigram += TrigramSimilarity(f, search_string) +# else: +# trigram = TrigramSimilarity(f, search_string) +# queryset = queryset.annotate(similarity=trigram) +# filters += [Q(similarity__gt=search_prefs.trigram_threshold)] + +# if 'name' in fulltext_include: +# filters += [Q(name_search_vector=search_query)] +# if 'description' in fulltext_include: +# filters += [Q(desc_search_vector=search_query)] +# if 'instructions' in fulltext_include: +# filters += [Q(steps__search_vector=search_query)] +# if 'keywords' in fulltext_include: +# filters += [Q(keywords__in=Subquery(Keyword.objects.filter(name__search=search_query).values_list('id', flat=True)))] +# if 'foods' in fulltext_include: +# filters += [Q(steps__ingredients__food__in=Subquery(Food.objects.filter(name__search=search_query).values_list('id', flat=True)))] +# query_filter = None +# for f in filters: +# if query_filter: +# query_filter |= f +# else: +# query_filter = f + +# # TODO add order by user settings - only do search rank and annotation if rank order is configured +# search_rank = ( +# SearchRank('name_search_vector', search_query, cover_density=True) +# + SearchRank('desc_search_vector', search_query, cover_density=True) +# + SearchRank('steps__search_vector', search_query, cover_density=True) +# ) +# queryset = queryset.filter(query_filter).annotate(rank=search_rank) +# orderby += ['-rank'] +# else: +# queryset = queryset.filter(name__icontains=search_string) + +# if len(search_keywords) > 0: +# if search_keywords_or: +# # TODO creating setting to include descendants of keywords a setting +# # for kw in Keyword.objects.filter(pk__in=search_keywords): +# # search_keywords += list(kw.get_descendants().values_list('pk', flat=True)) +# queryset = queryset.filter(keywords__in=Keyword.include_descendants(Keyword.objects.filter(pk__in=search_keywords))) +# else: +# # when performing an 'and' search returned recipes should include a parent OR any of its descedants +# # AND other keywords selected so filters are appended using keyword__id__in the list of keywords and descendants +# for kw in Keyword.objects.filter(pk__in=search_keywords): +# queryset = queryset.filter(keywords__in=list(kw.get_descendants_and_self())) + +# if len(search_foods) > 0: +# if search_foods_or: +# # TODO creating setting to include descendants of food a setting +# queryset = queryset.filter(steps__ingredients__food__in=Food.include_descendants(Food.objects.filter(pk__in=search_foods))) +# else: +# # when performing an 'and' search returned recipes should include a parent OR any of its descedants +# # AND other foods selected so filters are appended using steps__ingredients__food__id__in the list of foods and descendants +# for fd in Food.objects.filter(pk__in=search_foods): +# queryset = queryset.filter(steps__ingredients__food__in=list(fd.get_descendants_and_self())) + +# if len(search_books) > 0: +# if search_books_or: +# queryset = queryset.filter(recipebookentry__book__id__in=search_books) +# else: +# for k in search_books: +# queryset = queryset.filter(recipebookentry__book__id=k) + +# if search_rating: +# # TODO make ratings a settings user-only vs all-users +# queryset = queryset.annotate(rating=Round(Avg(Case(When(cooklog__created_by=request.user, then='cooklog__rating'), default=Value(0))))) +# if search_rating == -1: +# queryset = queryset.filter(rating=0) +# else: +# queryset = queryset.filter(rating__gte=search_rating) + +# # probably only useful in Unit list view, so keeping it simple +# if search_units: +# queryset = queryset.filter(steps__ingredients__unit__id=search_units) + +# # probably only useful in Unit list view, so keeping it simple +# if search_steps: +# queryset = queryset.filter(steps__id__in=search_steps) + +# if search_internal: +# queryset = queryset.filter(internal=True) + +# queryset = queryset.distinct() + +# if search_random: +# queryset = queryset.order_by("?") +# else: +# queryset = queryset.order_by(*orderby) +# return queryset + + +class RecipeFacet(): + class CacheEmpty(Exception): + pass + + def __init__(self, request, queryset=None, hash_key=None, cache_timeout=3600): + if hash_key is None and queryset is None: + raise ValueError(_("One of queryset or hash_key must be provided")) + + self._request = request + self._queryset = queryset + self.hash_key = hash_key or str(hash(frozenset(self._queryset.values_list('pk')))) + self._SEARCH_CACHE_KEY = f"recipes_filter_{self.hash_key}" + self._cache_timeout = cache_timeout + self._cache = caches['default'].get(self._SEARCH_CACHE_KEY, {}) + if self._cache is None and self._queryset is None: + raise self.CacheEmpty("No queryset provided and cache empty") + + self.Keywords = self._cache.get('Keywords', None) + self.Foods = self._cache.get('Foods', None) + self.Books = self._cache.get('Books', None) + self.Ratings = self._cache.get('Ratings', None) + # TODO Move Recent to recipe annotation/serializer: requrires change in RecipeSearch(), RecipeSearchView.vue and serializer + 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._search_params = { + 'keyword_list': self._request.query_params.getlist('keywords', []), + 'food_list': self._request.query_params.getlist('foods', []), + 'book_list': self._request.query_params.getlist('book', []), + 'search_keywords_or': str2bool(self._request.query_params.get('keywords_or', True)), + 'search_foods_or': str2bool(self._request.query_params.get('foods_or', True)), + 'search_books_or': str2bool(self._request.query_params.get('books_or', True)), + 'space': self._request.space, + } + elif self.hash_key is not None: + self._recipe_list = self._cache.get('recipe_list', []) + self._search_params = { + 'keyword_list': self._cache.get('keyword_list', None), + 'food_list': self._cache.get('food_list', None), + 'book_list': self._cache.get('book_list', None), + 'search_keywords_or': self._cache.get('search_keywords_or', None), + 'search_foods_or': self._cache.get('search_foods_or', None), + 'search_books_or': self._cache.get('search_books_or', None), + 'space': self._cache.get('space', None), + } + + self._cache = { + **self._search_params, + 'recipe_list': self._recipe_list, + 'Ratings': self.Ratings, + 'Recent': self.Recent, + 'Keywords': self.Keywords, + 'Foods': self.Foods, + 'Books': self.Books + + } + caches['default'].set(self._SEARCH_CACHE_KEY, self._cache, self._cache_timeout) + + def get_facets(self, from_cache=False): + if from_cache: + return { + 'cache_key': self.hash_key or '', + 'Ratings': self.Ratings or {}, + 'Recent': self.Recent or [], + 'Keywords': self.Keywords or [], + 'Foods': self.Foods or [], + 'Books': self.Books or [] + } + return { + 'cache_key': self.hash_key, + 'Ratings': self.get_ratings(), + 'Recent': self.get_recent(), + 'Keywords': self.get_keywords(), + 'Foods': self.get_foods(), + 'Books': self.get_books() + } + + def set_cache(self, key, value): + self._cache = {**self._cache, key: value} + caches['default'].set( + self._SEARCH_CACHE_KEY, + self._cache, + self._cache_timeout + ) + + def get_books(self): + if self.Books is None: + self.Books = [] + return self.Books + + 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() + else: + 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.set_cache('Keywords', self.Keywords) + return self.Keywords + + def get_foods(self): + 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() + else: + 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.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.Ratings = dict(Counter(r.rating for r in rating_qs)) + else: + self.Rating = {} + self.set_cache('Ratings', self.Ratings) + return self.Ratings + + def get_recent(self): + if self.Recent is None: + # TODO make days of recent recipe a setting + recent_recipes = ViewLog.objects.filter(created_by=self._request.user, space=self._request.space, created_at__gte=timezone.now() - timedelta(days=14) + ).values_list('recipe__pk', flat=True) + self.Recent = list(recent_recipes) + self.set_cache('Recent', self.Recent) + return self.Recent + + def add_food_children(self, id): + try: + food = Food.objects.get(id=id) + nodes = food.get_ancestors() + except Food.DoesNotExist: + return self.get_facets() + foods = self._food_queryset(Food.objects.filter(path__startswith=food.path, depth=food.depth+1), 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) + 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)] + self.set_cache('Foods', self.Foods) + return self.get_facets() + + def add_keyword_children(self, id): + try: + keyword = Keyword.objects.get(id=id) + nodes = keyword.get_ancestors() + except Keyword.DoesNotExist: + return self.get_facets() + keywords = self._keyword_queryset(Keyword.objects.filter(path__startswith=keyword.path, depth=keyword.depth+1), 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) + 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)] + self.set_cache('Keywords', self.Keywords) + return self.get_facets() + + def _recipe_count_queryset(self, field, depth=1, steplen=4): + return Recipe.objects.filter(**{f'{field}__path__startswith': OuterRef('path')}, id__in=self._recipe_list, space=self._request.space + ).values(child=Substr(f'{field}__path', 1, steplen) + ).annotate(count=Count('pk', distinct=True)).values('count') + + def _keyword_queryset(self, queryset, keyword=None): + depth = getattr(keyword, 'depth', 0) + 1 + steplen = depth * Keyword.steplen + + if not self._request.space.demo and self._request.space.show_facet_count: + return queryset.annotate(count=Coalesce(Subquery(self._recipe_count_queryset('keywords', depth, steplen)), 0) + ).filter(depth=depth, count__gt=0 + ).values('id', 'name', 'count', 'numchild').order_by(Lower('name').asc())[:200] + else: + return queryset.filter(depth=depth).values('id', 'name', 'numchild').order_by(Lower('name').asc()) + + def _food_queryset(self, queryset, food=None): + depth = getattr(food, 'depth', 0) + 1 + steplen = depth * Food.steplen + + if not self._request.space.demo and self._request.space.show_facet_count: + return queryset.annotate(count=Coalesce(Subquery(self._recipe_count_queryset('steps__ingredients__food', depth, steplen)), 0) + ).filter(depth__lte=depth, count__gt=0 + ).values('id', 'name', 'count', 'numchild').order_by(Lower('name').asc())[:200] + else: + return queryset.filter(depth__lte=depth).values('id', 'name', 'numchild').order_by(Lower('name').asc()) + + +# # TODO: This might be faster https://github.com/django-treebeard/django-treebeard/issues/115 +# def get_facet(qs=None, request=None, use_cache=True, hash_key=None, food=None, keyword=None): +# """ +# Gets an annotated list from a queryset. +# :param qs: +# recipe queryset to build facets from +# :param request: +# the web request that contains the necessary query parameters +# :param use_cache: +# will find results in cache, if any, and return them or empty list. +# will save the list of recipes IDs in the cache for future processing +# :param hash_key: +# the cache key of the recipe list to process +# only evaluated if the use_cache parameter is false +# :param food: +# return children facets of food +# only evaluated if the use_cache parameter is false +# :param keyword: +# return children facets of keyword +# only evaluated if the use_cache parameter is false +# """ +# facets = {} +# recipe_list = [] +# cache_timeout = 600 + +# # return cached values +# if use_cache: +# qs_hash = hash(frozenset(qs.values_list('pk'))) +# facets['cache_key'] = str(qs_hash) +# SEARCH_CACHE_KEY = f"recipes_filter_{qs_hash}" +# if c := caches['default'].get(SEARCH_CACHE_KEY, None): +# facets['Keywords'] = c['Keywords'] or [] +# facets['Foods'] = c['Foods'] or [] +# facets['Books'] = c['Books'] or [] +# facets['Ratings'] = c['Ratings'] or [] +# facets['Recent'] = c['Recent'] or [] +# else: +# facets['Keywords'] = [] +# facets['Foods'] = [] +# facets['Books'] = [] +# # TODO make ratings a settings user-only vs all-users +# rating_qs = qs.annotate(rating=Round(Avg(Case(When(cooklog__created_by=request.user, then='cooklog__rating'), default=Value(0))))) +# facets['Ratings'] = dict(Counter(r.rating for r in rating_qs)) +# facets['Recent'] = ViewLog.objects.filter( +# created_by=request.user, space=request.space, +# created_at__gte=timezone.now() - timedelta(days=14) # TODO make days of recent recipe a setting +# ).values_list('recipe__pk', flat=True) + +# cached_search = { +# 'recipe_list': list(qs.values_list('id', flat=True)), +# 'keyword_list': request.query_params.getlist('keywords', []), +# 'food_list': request.query_params.getlist('foods', []), +# 'book_list': request.query_params.getlist('book', []), +# 'search_keywords_or': str2bool(request.query_params.get('keywords_or', True)), +# 'search_foods_or': str2bool(request.query_params.get('foods_or', True)), +# 'search_books_or': str2bool(request.query_params.get('books_or', True)), +# 'space': request.space, +# 'Ratings': facets['Ratings'], +# 'Recent': facets['Recent'], +# 'Keywords': facets['Keywords'], +# 'Foods': facets['Foods'], +# 'Books': facets['Books'] +# } +# caches['default'].set(SEARCH_CACHE_KEY, cached_search, cache_timeout) +# return facets + +# # construct and cache new values by retrieving search parameters from the cache +# SEARCH_CACHE_KEY = f'recipes_filter_{hash_key}' +# if c := caches['default'].get(SEARCH_CACHE_KEY, None): +# recipe_list = c['recipe_list'] +# keyword_list = c['keyword_list'] +# food_list = c['food_list'] +# book_list = c['book_list'] +# search_keywords_or = c['search_keywords_or'] +# search_foods_or = c['search_foods_or'] +# search_books_or = c['search_books_or'] +# else: +# return {} + +# # if using an OR search, will annotate all keywords, otherwise, just those that appear in results +# if search_keywords_or: +# keywords = Keyword.objects.filter(space=request.space).distinct() +# else: +# keywords = Keyword.objects.filter(Q(recipe__in=recipe_list) | Q(depth=1)).filter(space=request.space).distinct() + +# # Subquery that counts recipes for keyword including children +# kw_recipe_count = Recipe.objects.filter(**{'keywords__path__startswith': OuterRef('path')}, id__in=recipe_list, space=request.space +# ).values(kw=Substr('keywords__path', 1, Keyword.steplen) +# ).annotate(count=Count('pk', distinct=True)).values('count') + +# # set keywords to root objects only +# keywords = keywords.annotate(count=Coalesce(Subquery(kw_recipe_count), 0) +# ).filter(depth=1, count__gt=0 +# ).values('id', 'name', 'count', 'numchild' +# ).order_by('name') +# if keyword: +# facets['Keywords'] = list(keywords) +# return facets + +# # custom django-tree function annotates a queryset to make building a tree easier. +# # see https://django-treebeard.readthedocs.io/en/latest/api.html#treebeard.models.Node.get_annotated_list_qs for details +# # kw_a = annotated_qs(keywords, root=True, fill=True) + +# # # if using an OR search, will annotate all keywords, otherwise, just those that appear in results +# if search_foods_or: +# foods = Food.objects.filter(space=request.space).distinct() +# else: +# foods = Food.objects.filter(Q(ingredient__step__recipe__in=recipe_list) | Q(depth=1)).filter(space=request.space).distinct() + +# food_recipe_count = Recipe.objects.filter(**{'steps__ingredients__food__path__startswith': OuterRef('path')}, id__in=recipe_list, space=request.space +# ).values(kw=Substr('steps__ingredients__food__path', 1, Food.steplen * (1+getattr(food, 'depth', 0))) +# ).annotate(count=Count('pk', distinct=True)).values('count') + +# # set keywords to root objects only +# foods = foods.annotate(count=Coalesce(Subquery(food_recipe_count), 0) +# ).filter(depth=(1+getattr(food, 'depth', 0)), count__gt=0 +# ).values('id', 'name', 'count', 'numchild' +# ).order_by('name') +# if food: +# facets['Foods'] = list(foods) +# return facets + +# # food_a = annotated_qs(foods, root=True, fill=True) + +# # c['Keywords'] = facets['Keywords'] = fill_annotated_parents(kw_a, keyword_list) +# c['Keywords'] = facets['Keywords'] = list(keywords) +# # c['Foods'] = facets['Foods'] = fill_annotated_parents(food_a, food_list) +# c['Foods'] = facets['Foods'] = list(foods) +# # TODO add book facet +# c['Books'] = facets['Books'] = [] +# caches['default'].set(SEARCH_CACHE_KEY, c, cache_timeout) +# return facets + + +# def fill_annotated_parents(annotation, filters): +# tree_list = [] +# parent = [] +# i = 0 +# level = -1 +# for r in annotation: +# expand = False + +# annotation[i][1]['id'] = r[0].id +# annotation[i][1]['name'] = r[0].name +# annotation[i][1]['count'] = getattr(r[0], 'recipe_count', 0) +# annotation[i][1]['isDefaultExpanded'] = False + +# if str(r[0].id) in filters: +# expand = True +# if r[1]['level'] < level: +# parent = parent[:r[1]['level'] - level] +# parent[-1] = i +# level = r[1]['level'] +# elif r[1]['level'] > level: +# parent.extend([i]) +# level = r[1]['level'] +# else: +# parent[-1] = i +# j = 0 + +# while j < level: +# # this causes some double counting when a recipe has both a child and an ancestor +# annotation[parent[j]][1]['count'] += getattr(r[0], 'recipe_count', 0) +# if expand: +# annotation[parent[j]][1]['isDefaultExpanded'] = True +# j += 1 +# if level == 0: +# tree_list.append(annotation[i][1]) +# elif level > 0: +# annotation[parent[level - 1]][1].setdefault('children', []).append(annotation[i][1]) +# i += 1 +# return tree_list + + +# def annotated_qs(qs, root=False, fill=False): +# """ +# Gets an annotated list from a queryset. +# :param root: + +# Will backfill in annotation to include all parents to root node. + +# :param fill: +# Will fill in gaps in annotation where nodes between children +# and ancestors are not included in the queryset. +# """ + +# result, info = [], {} +# start_depth, prev_depth = (None, None) +# nodes_list = list(qs.values_list('pk', flat=True)) +# for node in qs.order_by('path'): +# node_queue = [node] +# while len(node_queue) > 0: +# dirty = False +# current_node = node_queue[-1] +# depth = current_node.get_depth() +# parent_id = current_node.parent +# if root and depth > 1 and parent_id not in nodes_list: +# parent_id = current_node.parent +# nodes_list.append(parent_id) +# node_queue.append(current_node.__class__.objects.get(pk=parent_id)) +# dirty = True + +# if fill and depth > 1 and prev_depth and depth > prev_depth and parent_id not in nodes_list: +# nodes_list.append(parent_id) +# node_queue.append(current_node.__class__.objects.get(pk=parent_id)) +# dirty = True + +# if not dirty: +# working_node = node_queue.pop() +# if start_depth is None: +# start_depth = depth +# open = (depth and (prev_depth is None or depth > prev_depth)) +# if prev_depth is not None and depth < prev_depth: +# info['close'] = list(range(0, prev_depth - depth)) +# info = {'open': open, 'close': [], 'level': depth - start_depth} +# result.append((working_node, info,)) +# prev_depth = depth +# if start_depth and start_depth > 0: +# info['close'] = list(range(0, prev_depth - start_depth + 1)) +# return result + + +def old_search(request): + if has_group_permission(request.user, ('guest',)): + params = dict(request.GET) + params['internal'] = None + f = RecipeFilter(params, + queryset=Recipe.objects.filter(space=request.user.userpreference.space).all().order_by(Lower('name').asc()), + space=request.space) + return f.qs + + +# from django.db.models import fields +# from cookbook.models import Food, Recipe, Keyword, RecipeBook, Unit +# many_to_many = {} +# one_to_many = {} +# many_to_one = {} +# char = {} +# boolean = {} +# number = {} +# other = {} +# image = {} +# date = {} +# for model in [Food, Recipe, Keyword, RecipeBook, Unit]: +# print(name:=model.__name__, ":") +# for x in model._meta.get_fields(): + +# if x.name in ['space', 'id']: +# continue +# elif x.many_to_many: +# many_to_many[name]=[*many_to_many.get(name, []), x.name] +# elif x.one_to_many: +# one_to_many[name] = [*one_to_many.get(name, []), x.name] +# elif x.many_to_one: +# many_to_one[name] = [*many_to_one.get(name, []), x.name] +# elif isinstance(x, fields.CharField): +# char[name] = [*char.get(name, []), x.name] +# elif isinstance(x, fields.BooleanField): +# boolean[name] = [*boolean.get(name, []), x.name] +# elif isinstance(x, fields.IntegerField) or isinstance(x, fields.DecimalField): +# number[name] = [*number.get(name, []), x.name] +# elif isinstance(x, fields.DateField): +# date[name] = [*date.get(name, []), x.name] +# elif isinstance(x, fields.files.ImageField): +# image[name] = [*image.get(name, []), x.name] +# else: +# other[name] = [*other.get(name, []), x.name] +# if x.hidden: +# hidden[name] = [*hidden.get(name, []), x.name] +# print('---', x.name, ' - ', x.db_type) +# for field_type in [(char, 'char'), (number, 'number'), (other, 'other'), (date, 'date'), (image, 'image'), (one_to_many, 'one_to_many'), (many_to_one, 'many_to_one'), (many_to_many, 'many_to_many')]: +# print(f"{field_type[1]}:") +# for model in field_type[0]: +# print(f"--{model}") +# for field in field_type[0][model]: +# print(f" --{field}") diff --git a/cookbook/helper/recipe_url_import.py b/cookbook/helper/recipe_url_import.py index df24409a..283979fb 100644 --- a/cookbook/helper/recipe_url_import.py +++ b/cookbook/helper/recipe_url_import.py @@ -1,16 +1,18 @@ import random import re +from html import unescape + +from django.utils.dateparse import parse_duration from isodate import parse_duration as iso_parse_duration from isodate.isoerror import ISO8601Error - -from cookbook.helper.ingredient_parser import parse as parse_single_ingredient -from cookbook.models import Keyword -from django.utils.dateparse import parse_duration -from html import unescape from recipe_scrapers._utils import get_minutes +from cookbook.helper import recipe_url_import as helper +from cookbook.helper.ingredient_parser import IngredientParser +from cookbook.models import Keyword -def get_from_scraper(scrape, space): + +def get_from_scraper(scrape, request): # converting the scrape_me object to the existing json format based on ld+json recipe_json = {} try: @@ -91,15 +93,17 @@ def get_from_scraper(scrape, space): except Exception: pass try: - recipe_json['keywords'] = parse_keywords(list(set(map(str.casefold, keywords))), space) + recipe_json['keywords'] = parse_keywords(list(set(map(str.casefold, keywords))), request.space) except AttributeError: recipe_json['keywords'] = keywords + ingredient_parser = IngredientParser(request, True) + + ingredients = [] try: - ingredients = [] for x in scrape.ingredients(): try: - amount, unit, ingredient, note = parse_single_ingredient(x) + amount, unit, ingredient, note = ingredient_parser.parse(x) ingredients.append( { 'amount': amount, @@ -245,7 +249,10 @@ def parse_instructions(instructions): instruction_text += str(i) instructions = instruction_text - return normalize_string(instructions) + normalized_string = normalize_string(instructions) + normalized_string = normalized_string.replace('\n', ' \n') + normalized_string = normalized_string.replace(' \n \n', '\n\n') + return normalized_string def parse_image(image): diff --git a/cookbook/helper/scope_middleware.py b/cookbook/helper/scope_middleware.py index 8e1f7740..f5179bcb 100644 --- a/cookbook/helper/scope_middleware.py +++ b/cookbook/helper/scope_middleware.py @@ -1,7 +1,11 @@ from django.urls import reverse from django_scopes import scope, scopes_disabled +from rest_framework.authentication import TokenAuthentication +from rest_framework.authtoken.models import Token +from rest_framework.exceptions import AuthenticationFailed from cookbook.views import views +from recipes import settings class ScopeMiddleware: @@ -9,16 +13,17 @@ class ScopeMiddleware: self.get_response = get_response def __call__(self, request): + prefix = settings.JS_REVERSE_SCRIPT_PREFIX or '' if request.user.is_authenticated: - if request.path.startswith('/admin/'): + if request.path.startswith(prefix + '/admin/'): with scopes_disabled(): return self.get_response(request) - if request.path.startswith('/signup/') or request.path.startswith('/invite/'): + if request.path.startswith(prefix + '/signup/') or request.path.startswith(prefix + '/invite/'): return self.get_response(request) - if request.path.startswith('/accounts/'): + if request.path.startswith(prefix + '/accounts/'): return self.get_response(request) with scopes_disabled(): @@ -33,6 +38,15 @@ class ScopeMiddleware: with scope(space=request.space): return self.get_response(request) else: + if request.path.startswith(prefix + '/api/'): + try: + if auth := TokenAuthentication().authenticate(request): + request.space = auth[0].userpreference.space + with scope(space=request.space): + return self.get_response(request) + except AuthenticationFailed: + pass + with scopes_disabled(): request.space = None return self.get_response(request) diff --git a/cookbook/helper/shopping_helper.py b/cookbook/helper/shopping_helper.py new file mode 100644 index 00000000..d8e8046e --- /dev/null +++ b/cookbook/helper/shopping_helper.py @@ -0,0 +1,313 @@ +from datetime import timedelta +from decimal import Decimal + +from django.contrib.postgres.aggregates import ArrayAgg +from django.db.models import F, OuterRef, Q, Subquery, Value +from django.db.models.functions import Coalesce +from django.utils import timezone +from django.utils.translation import gettext as _ + +from cookbook.helper.HelperFunctions import Round, str2bool +from cookbook.models import (Ingredient, MealPlan, Recipe, ShoppingListEntry, ShoppingListRecipe, + SupermarketCategoryRelation) +from recipes import settings + + +def shopping_helper(qs, request): + supermarket = request.query_params.get('supermarket', None) + checked = request.query_params.get('checked', 'recent') + user = request.user + supermarket_order = [F('food__supermarket_category__name').asc(nulls_first=True), 'food__name'] + + # TODO created either scheduled task or startup task to delete very old shopping list entries + # TODO create user preference to define 'very old' + if supermarket: + supermarket_categories = SupermarketCategoryRelation.objects.filter(supermarket=supermarket, category=OuterRef('food__supermarket_category')) + qs = qs.annotate(supermarket_order=Coalesce(Subquery(supermarket_categories.values('order')), Value(9999))) + supermarket_order = ['supermarket_order'] + supermarket_order + if checked in ['false', 0, '0']: + qs = qs.filter(checked=False) + elif checked in ['true', 1, '1']: + qs = qs.filter(checked=True) + elif checked in ['recent']: + today_start = timezone.now().replace(hour=0, minute=0, second=0) + week_ago = today_start - timedelta(days=user.userpreference.shopping_recent_days) + qs = qs.filter(Q(checked=False) | Q(completed_at__gte=week_ago)) + supermarket_order = ['checked'] + supermarket_order + + return qs.order_by(*supermarket_order).select_related('unit', 'food', 'ingredient', 'created_by', 'list_recipe', 'list_recipe__mealplan', 'list_recipe__recipe') + + +class RecipeShoppingEditor(): + def __init__(self, user, space, **kwargs): + self.created_by = user + self.space = space + self._kwargs = {**kwargs} + + 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) + self.id = self._kwargs.get('id', None) + + self._shopping_list_recipe = self.get_shopping_list_recipe(self.id, self.created_by, self.space) + + if self._shopping_list_recipe: + # created_by needs to be sticky to original creator as it is 'their' shopping list + # changing shopping list created_by can shift some items to new owner which may not share in the other direction + self.created_by = getattr(self._shopping_list_recipe.entries.first(), 'created_by', self.created_by) + + self.recipe = getattr(self._shopping_list_recipe, 'recipe', None) or self._kwargs.get('recipe', None) or getattr(self.mealplan, 'recipe', None) + if type(self.recipe) in [int, float]: + self.recipe = Recipe.objects.filter(id=self.recipe, space=self.space) + + try: + self.servings = float(self._kwargs.get('servings', None)) + except (ValueError, TypeError): + self.servings = getattr(self._shopping_list_recipe, 'servings', None) or getattr(self.mealplan, 'servings', None) or getattr(self.recipe, 'servings', None) + + @property + def _recipe_servings(self): + return getattr(self.recipe, 'servings', None) or getattr(getattr(self.mealplan, 'recipe', None), 'servings', None) or getattr(getattr(self._shopping_list_recipe, 'recipe', None), 'servings', None) + + @property + def _servings_factor(self): + return Decimal(self.servings)/Decimal(self._recipe_servings) + + @property + def _shared_users(self): + return [*list(self.created_by.get_shopping_share()), self.created_by] + + @staticmethod + def get_shopping_list_recipe(id, user, space): + return ShoppingListRecipe.objects.filter(id=id).filter(Q(shoppinglist__space=space) | Q(entries__space=space)).filter( + Q(shoppinglist__created_by=user) + | Q(shoppinglist__shared=user) + | Q(entries__created_by=user) + | Q(entries__created_by__in=list(user.get_shopping_share())) + ).prefetch_related('entries').first() + + def get_recipe_ingredients(self, id, exclude_onhand=False): + if exclude_onhand: + return Ingredient.objects.filter(step__recipe__id=id, food__ignore_shopping=False, space=self.space).exclude(food__onhand_users__id__in=[x.id for x in self._shared_users]) + else: + return Ingredient.objects.filter(step__recipe__id=id, food__ignore_shopping=False, space=self.space) + + @property + def _include_related(self): + return self.created_by.userpreference.mealplan_autoinclude_related + + @property + def _exclude_onhand(self): + return self.created_by.userpreference.mealplan_autoexclude_onhand + + def create(self, **kwargs): + ingredients = kwargs.get('ingredients', None) + exclude_onhand = not ingredients and self._exclude_onhand + if servings := kwargs.get('servings', None): + self.servings = float(servings) + + if mealplan := kwargs.get('mealplan', None): + self.mealplan = mealplan + self.recipe = mealplan.recipe + elif recipe := kwargs.get('recipe', None): + self.recipe = recipe + + if not self.servings: + self.servings = getattr(self.mealplan, 'servings', None) or getattr(self.recipe, 'servings', 1.0) + + self._shopping_list_recipe = ShoppingListRecipe.objects.create(recipe=self.recipe, mealplan=self.mealplan, servings=self.servings) + + if ingredients: + self._add_ingredients(ingredients=ingredients) + else: + if self._include_related: + related = self.recipe.get_related_recipes() + self._add_ingredients(self.get_recipe_ingredients(self.recipe.id, exclude_onhand=exclude_onhand).exclude(food__recipe__in=related)) + for r in related: + self._add_ingredients(self.get_recipe_ingredients(r.id, exclude_onhand=exclude_onhand).exclude(food__recipe__in=related)) + else: + self._add_ingredients(self.get_recipe_ingredients(self.recipe.id, exclude_onhand=exclude_onhand)) + + return True + + def add(self, **kwargs): + return + + def edit(self, servings=None, ingredients=None, **kwargs): + if servings: + self.servings = servings + + self._delete_ingredients(ingredients=ingredients) + if self.servings != self._shopping_list_recipe.servings: + self.edit_servings() + self._add_ingredients(ingredients=ingredients) + return True + + def edit_servings(self, servings=None, **kwargs): + if servings: + self.servings = servings + if id := kwargs.get('id', None): + self._shopping_list_recipe = self.get_shopping_list_recipe(id, self.created_by, self.space) + if not self.servings: + raise ValueError(_("You must supply a servings size")) + + if self._shopping_list_recipe.servings == self.servings: + return True + + for sle in ShoppingListEntry.objects.filter(list_recipe=self._shopping_list_recipe): + sle.amount = sle.ingredient.amount * Decimal(self._servings_factor) + sle.save() + self._shopping_list_recipe.servings = self.servings + self._shopping_list_recipe.save() + return True + + def delete(self, **kwargs): + try: + self._shopping_list_recipe.delete() + return True + except: + return False + + def _add_ingredients(self, ingredients=None): + if not ingredients: + return + elif type(ingredients) == list: + ingredients = Ingredient.objects.filter(id__in=ingredients) + existing = self._shopping_list_recipe.entries.filter(ingredient__in=ingredients).values_list('ingredient__pk', flat=True) + add_ingredients = ingredients.exclude(id__in=existing) + + for i in [x for x in add_ingredients if x.food]: + ShoppingListEntry.objects.create( + list_recipe=self._shopping_list_recipe, + food=i.food, + unit=i.unit, + ingredient=i, + amount=i.amount * Decimal(self._servings_factor), + created_by=self.created_by, + space=self.space, + ) + + # deletes shopping list entries not in ingredients list + def _delete_ingredients(self, ingredients=None): + if not ingredients: + return + to_delete = self._shopping_list_recipe.entries.exclude(ingredient__in=ingredients) + ShoppingListEntry.objects.filter(id__in=to_delete).delete() + self._shopping_list_recipe = self.get_shopping_list_recipe(self.id, self.created_by, self.space) + + +# # TODO refactor as class +# def list_from_recipe(list_recipe=None, recipe=None, mealplan=None, servings=None, ingredients=None, created_by=None, space=None, append=False): +# """ +# Creates ShoppingListRecipe and associated ShoppingListEntrys from a recipe or a meal plan with a recipe +# :param list_recipe: Modify an existing ShoppingListRecipe +# :param recipe: Recipe to use as list of ingredients. One of [recipe, mealplan] are required +# :param mealplan: alternatively use a mealplan recipe as source of ingredients +# :param servings: Optional: Number of servings to use to scale shoppinglist. If servings = 0 an existing recipe list will be deleted +# :param ingredients: Ingredients, list of ingredient IDs to include on the shopping list. When not provided all ingredients will be used +# :param append: If False will remove any entries not included with ingredients, when True will append ingredients to the shopping list +# """ +# r = recipe or getattr(mealplan, 'recipe', None) or getattr(list_recipe, 'recipe', None) +# if not r: +# raise ValueError(_("You must supply a recipe or mealplan")) + +# created_by = created_by or getattr(ShoppingListEntry.objects.filter(list_recipe=list_recipe).first(), 'created_by', None) +# if not created_by: +# raise ValueError(_("You must supply a created_by")) + +# try: +# servings = float(servings) +# except (ValueError, TypeError): +# servings = getattr(mealplan, 'servings', 1.0) + +# servings_factor = servings / r.servings + +# shared_users = list(created_by.get_shopping_share()) +# shared_users.append(created_by) +# if list_recipe: +# created = False +# else: +# list_recipe = ShoppingListRecipe.objects.create(recipe=r, mealplan=mealplan, servings=servings) +# created = True + +# related_step_ing = [] +# if servings == 0 and not created: +# list_recipe.delete() +# return [] +# elif ingredients: +# ingredients = Ingredient.objects.filter(pk__in=ingredients, space=space) +# else: +# ingredients = Ingredient.objects.filter(step__recipe=r, food__ignore_shopping=False, space=space) + +# if exclude_onhand := created_by.userpreference.mealplan_autoexclude_onhand: +# ingredients = ingredients.exclude(food__onhand_users__id__in=[x.id for x in shared_users]) + +# if related := created_by.userpreference.mealplan_autoinclude_related: +# # TODO: add levels of related recipes (related recipes of related recipes) to use when auto-adding mealplans +# related_recipes = r.get_related_recipes() + +# for x in related_recipes: +# # related recipe is a Step serving size is driven by recipe serving size +# # TODO once/if Steps can have a serving size this needs to be refactored +# if exclude_onhand: +# # if steps are used more than once in a recipe or subrecipe - I don' think this results in the desired behavior +# related_step_ing += Ingredient.objects.filter(step__recipe=x, space=space).exclude(food__onhand_users__id__in=[x.id for x in shared_users]).values_list('id', flat=True) +# else: +# related_step_ing += Ingredient.objects.filter(step__recipe=x, space=space).values_list('id', flat=True) + +# x_ing = [] +# if ingredients.filter(food__recipe=x).exists(): +# for ing in ingredients.filter(food__recipe=x): +# if exclude_onhand: +# x_ing = Ingredient.objects.filter(step__recipe=x, food__ignore_shopping=False, space=space).exclude(food__onhand_users__id__in=[x.id for x in shared_users]) +# else: +# x_ing = Ingredient.objects.filter(step__recipe=x, food__ignore_shopping=False, space=space).exclude(food__ignore_shopping=True) +# for i in [x for x in x_ing]: +# ShoppingListEntry.objects.create( +# list_recipe=list_recipe, +# food=i.food, +# unit=i.unit, +# ingredient=i, +# amount=i.amount * Decimal(servings_factor), +# created_by=created_by, +# space=space, +# ) +# # dont' add food to the shopping list that are actually recipes that will be added as ingredients +# ingredients = ingredients.exclude(food__recipe=x) + +# add_ingredients = list(ingredients.values_list('id', flat=True)) + related_step_ing +# if not append: +# existing_list = ShoppingListEntry.objects.filter(list_recipe=list_recipe) +# # delete shopping list entries not included in ingredients +# existing_list.exclude(ingredient__in=ingredients).delete() +# # add shopping list entries that did not previously exist +# add_ingredients = set(add_ingredients) - set(existing_list.values_list('ingredient__id', flat=True)) +# add_ingredients = Ingredient.objects.filter(id__in=add_ingredients, space=space) + +# # if servings have changed, update the ShoppingListRecipe and existing Entries +# if servings <= 0: +# servings = 1 + +# if not created and list_recipe.servings != servings: +# update_ingredients = set(ingredients.values_list('id', flat=True)) - set(add_ingredients.values_list('id', flat=True)) +# list_recipe.servings = servings +# list_recipe.save() +# for sle in ShoppingListEntry.objects.filter(list_recipe=list_recipe, ingredient__id__in=update_ingredients): +# sle.amount = sle.ingredient.amount * Decimal(servings_factor) +# sle.save() + +# # add any missing Entries +# for i in [x for x in add_ingredients if x.food]: + +# ShoppingListEntry.objects.create( +# list_recipe=list_recipe, +# food=i.food, +# unit=i.unit, +# ingredient=i, +# amount=i.amount * Decimal(servings_factor), +# created_by=created_by, +# space=space, +# ) + +# # return all shopping list items +# return list_recipe diff --git a/cookbook/helper/template_helper.py b/cookbook/helper/template_helper.py index 63c2921c..6ab9d344 100644 --- a/cookbook/helper/template_helper.py +++ b/cookbook/helper/template_helper.py @@ -5,7 +5,7 @@ from cookbook.helper.mdx_attributes import MarkdownFormatExtension from cookbook.helper.mdx_urlize import UrlizeExtension from jinja2 import Template, TemplateSyntaxError, UndefinedError from gettext import gettext as _ - +from markdown.extensions.tables import TableExtension class IngredientObject(object): amount = "" @@ -41,7 +41,7 @@ def render_instructions(step): # TODO deduplicate markdown cleanup code parsed_md = md.markdown( instructions, extensions=[ - 'markdown.extensions.fenced_code', 'tables', + 'markdown.extensions.fenced_code', TableExtension(), UrlizeExtension(), MarkdownFormatExtension() ] ) diff --git a/cookbook/integration/cheftap.py b/cookbook/integration/cheftap.py index c4330628..f83203dc 100644 --- a/cookbook/integration/cheftap.py +++ b/cookbook/integration/cheftap.py @@ -1,6 +1,6 @@ import re -from cookbook.helper.ingredient_parser import parse, get_food, get_unit +from cookbook.helper.ingredient_parser import IngredientParser from cookbook.integration.integration import Integration from cookbook.models import Recipe, Step, Ingredient @@ -42,11 +42,12 @@ class ChefTap(Integration): step.instruction += '\n' + source_url step.save() + ingredient_parser = IngredientParser(self.request, True) for ingredient in ingredients: if len(ingredient.strip()) > 0: - amount, unit, ingredient, note = parse(ingredient) - f = get_food(ingredient, self.request.space) - u = get_unit(unit, self.request.space) + amount, unit, ingredient, note = ingredient_parser.parse(ingredient) + f = ingredient_parser.get_food(ingredient) + u = ingredient_parser.get_unit(unit) step.ingredients.add(Ingredient.objects.create( food=f, unit=u, amount=amount, note=note, space=self.request.space, )) diff --git a/cookbook/integration/chowdown.py b/cookbook/integration/chowdown.py index 331a2ed8..8a16ae0e 100644 --- a/cookbook/integration/chowdown.py +++ b/cookbook/integration/chowdown.py @@ -3,7 +3,7 @@ from io import BytesIO from zipfile import ZipFile from cookbook.helper.image_processing import get_filetype -from cookbook.helper.ingredient_parser import parse, get_food, get_unit +from cookbook.helper.ingredient_parser import IngredientParser from cookbook.integration.integration import Integration from cookbook.models import Recipe, Step, Ingredient, Keyword @@ -58,10 +58,11 @@ class Chowdown(Integration): instruction='\n'.join(directions) + '\n\n' + '\n'.join(descriptions), space=self.request.space, ) + ingredient_parser = IngredientParser(self.request, True) for ingredient in ingredients: - amount, unit, ingredient, note = parse(ingredient) - f = get_food(ingredient, self.request.space) - u = get_unit(unit, self.request.space) + amount, unit, ingredient, note = ingredient_parser.parse(ingredient) + f = ingredient_parser.get_food(ingredient) + u = ingredient_parser.get_unit(unit) step.ingredients.add(Ingredient.objects.create( food=f, unit=u, amount=amount, note=note, space=self.request.space, )) diff --git a/cookbook/integration/cookbookapp.py b/cookbook/integration/cookbookapp.py new file mode 100644 index 00000000..a89ff35f --- /dev/null +++ b/cookbook/integration/cookbookapp.py @@ -0,0 +1,68 @@ +import base64 +import gzip +import json +import re +from io import BytesIO + +import requests +import yaml + +from cookbook.helper.ingredient_parser import IngredientParser +from cookbook.helper.recipe_html_import import get_recipe_from_source +from cookbook.helper.recipe_url_import import iso_duration_to_minutes +from cookbook.integration.integration import Integration +from cookbook.models import Recipe, Step, Ingredient, Keyword +from gettext import gettext as _ + + +class CookBookApp(Integration): + + def import_file_name_filter(self, zip_info_object): + return zip_info_object.filename.endswith('.html') + + def get_recipe_from_file(self, file): + recipe_html = file.getvalue().decode("utf-8") + + recipe_json, recipe_tree, html_data, images = get_recipe_from_source(recipe_html, 'CookBookApp', self.request) + + recipe = Recipe.objects.create( + name=recipe_json['name'].strip(), + created_by=self.request.user, internal=True, + space=self.request.space) + + try: + recipe.servings = re.findall('([0-9])+', recipe_json['recipeYield'])[0] + except Exception as e: + pass + + try: + recipe.working_time = iso_duration_to_minutes(recipe_json['prepTime']) + recipe.waiting_time = iso_duration_to_minutes(recipe_json['cookTime']) + except Exception: + pass + + step = Step.objects.create(instruction=recipe_json['recipeInstructions'], space=self.request.space, ) + + if 'nutrition' in recipe_json: + step.instruction = step.instruction + '\n\n' + recipe_json['nutrition'] + + step.save() + recipe.steps.add(step) + + ingredient_parser = IngredientParser(self.request, True) + for ingredient in recipe_json['recipeIngredient']: + f = ingredient_parser.get_food(ingredient['ingredient']['text']) + u = ingredient_parser.get_unit(ingredient['unit']['text']) + step.ingredients.add(Ingredient.objects.create( + food=f, unit=u, amount=ingredient['amount'], note=ingredient['note'], space=self.request.space, + )) + + if len(images) > 0: + try: + response = requests.get(images[0]) + self.import_recipe_image(recipe, BytesIO(response.content)) + except Exception as e: + print('failed to import image ', str(e)) + + recipe.save() + return recipe diff --git a/cookbook/integration/copymethat.py b/cookbook/integration/copymethat.py new file mode 100644 index 00000000..4f4a217e --- /dev/null +++ b/cookbook/integration/copymethat.py @@ -0,0 +1,84 @@ +import re +from io import BytesIO +from zipfile import ZipFile + +from bs4 import BeautifulSoup + +from cookbook.helper.ingredient_parser import IngredientParser +from cookbook.helper.recipe_html_import import get_recipe_from_source +from cookbook.helper.recipe_url_import import iso_duration_to_minutes, parse_servings +from cookbook.integration.integration import Integration +from cookbook.models import Recipe, Step, Ingredient, Keyword +from recipes.settings import DEBUG + + +class CopyMeThat(Integration): + + def import_file_name_filter(self, zip_info_object): + if DEBUG: + print("testing", zip_info_object.filename, zip_info_object.filename == 'recipes.html') + return zip_info_object.filename == 'recipes.html' + + def get_recipe_from_file(self, file): + # 'file' comes is as a beautifulsoup object + recipe = Recipe.objects.create(name=file.find("div", {"id": "name"}).text.strip(), created_by=self.request.user, internal=True, space=self.request.space, ) + + for category in file.find_all("span", {"class": "recipeCategory"}): + keyword, created = Keyword.objects.get_or_create(name=category.text, space=self.request.space) + recipe.keywords.add(keyword) + + try: + recipe.servings = parse_servings(file.find("a", {"id": "recipeYield"}).text.strip()) + recipe.working_time = iso_duration_to_minutes(file.find("span", {"meta": "prepTime"}).text.strip()) + recipe.waiting_time = iso_duration_to_minutes(file.find("span", {"meta": "cookTime"}).text.strip()) + recipe.save() + except AttributeError: + pass + + step = Step.objects.create(instruction='', space=self.request.space, ) + + ingredient_parser = IngredientParser(self.request, True) + for ingredient in file.find_all("li", {"class": "recipeIngredient"}): + if ingredient.text == "": + continue + amount, unit, ingredient, note = ingredient_parser.parse(ingredient.text.strip()) + f = ingredient_parser.get_food(ingredient) + u = ingredient_parser.get_unit(unit) + step.ingredients.add(Ingredient.objects.create( + food=f, unit=u, amount=amount, note=note, space=self.request.space, + )) + + for s in file.find_all("li", {"class": "instruction"}): + if s.text == "": + continue + step.instruction += s.text.strip() + ' \n\n' + + for s in file.find_all("li", {"class": "recipeNote"}): + if s.text == "": + continue + step.instruction += s.text.strip() + ' \n\n' + + try: + if file.find("a", {"id": "original_link"}).text != '': + step.instruction += "\n\nImported from: " + file.find("a", {"id": "original_link"}).text + step.save() + except AttributeError: + pass + + recipe.steps.add(step) + + # import the Primary recipe image that is stored in the Zip + try: + for f in self.files: + if '.zip' in f['name']: + import_zip = ZipFile(f['file']) + self.import_recipe_image(recipe, BytesIO(import_zip.read(file.find("img", class_="recipeImage").get("src"))), filetype='.jpeg') + except Exception as e: + print(recipe.name, ': failed to import image ', str(e)) + + recipe.save() + return recipe + + def split_recipe_file(self, file): + soup = BeautifulSoup(file, "html.parser") + return soup.find_all("div", {"class": "recipe"}) diff --git a/cookbook/integration/default.py b/cookbook/integration/default.py index 1fb16e7f..951a5312 100644 --- a/cookbook/integration/default.py +++ b/cookbook/integration/default.py @@ -1,5 +1,5 @@ import json -from io import BytesIO +from io import BytesIO, StringIO from re import match from zipfile import ZipFile @@ -32,6 +32,39 @@ class Default(Integration): return None def get_file_from_recipe(self, recipe): + export = RecipeExportSerializer(recipe).data return 'recipe.json', JSONRenderer().render(export).decode("utf-8") + + def get_files_from_recipes(self, recipes, el, cookie): + export_zip_stream = BytesIO() + export_zip_obj = ZipFile(export_zip_stream, 'w') + + for r in recipes: + if r.internal and r.space == self.request.space: + recipe_zip_stream = BytesIO() + recipe_zip_obj = ZipFile(recipe_zip_stream, 'w') + + recipe_stream = StringIO() + filename, data = self.get_file_from_recipe(r) + recipe_stream.write(data) + recipe_zip_obj.writestr(filename, recipe_stream.getvalue()) + recipe_stream.close() + + try: + recipe_zip_obj.writestr(f'image{get_filetype(r.image.file.name)}', r.image.file.read()) + except ValueError: + pass + + recipe_zip_obj.close() + + export_zip_obj.writestr(str(r.pk) + '.zip', recipe_zip_stream.getvalue()) + + el.exported_recipes += 1 + el.msg += self.get_recipe_processed_msg(r) + el.save() + + export_zip_obj.close() + + return [[ self.get_export_file_name(), export_zip_stream.getvalue() ]] \ No newline at end of file diff --git a/cookbook/integration/domestica.py b/cookbook/integration/domestica.py index da55e7c3..f580063d 100644 --- a/cookbook/integration/domestica.py +++ b/cookbook/integration/domestica.py @@ -2,7 +2,7 @@ import base64 import json from io import BytesIO -from cookbook.helper.ingredient_parser import parse, get_food, get_unit +from cookbook.helper.ingredient_parser import IngredientParser from cookbook.integration.integration import Integration from cookbook.models import Recipe, Step, Ingredient @@ -34,11 +34,12 @@ class Domestica(Integration): if file['source'] != '': step.instruction += '\n' + file['source'] + ingredient_parser = IngredientParser(self.request, True) for ingredient in file['ingredients'].split('\n'): if len(ingredient.strip()) > 0: - amount, unit, ingredient, note = parse(ingredient) - f = get_food(ingredient, self.request.space) - u = get_unit(unit, self.request.space) + amount, unit, ingredient, note = ingredient_parser.parse(ingredient) + f = ingredient_parser.get_food(ingredient) + u = ingredient_parser.get_unit(unit) step.ingredients.add(Ingredient.objects.create( food=f, unit=u, amount=amount, note=note, space=self.request.space, )) diff --git a/cookbook/integration/integration.py b/cookbook/integration/integration.py index f3d8dfeb..48899d36 100644 --- a/cookbook/integration/integration.py +++ b/cookbook/integration/integration.py @@ -1,20 +1,27 @@ +import time import datetime import json import traceback import uuid from io import BytesIO, StringIO -from zipfile import ZipFile, BadZipFile +from zipfile import BadZipFile, ZipFile +from django.core.cache import cache +import datetime +from bs4 import Tag +from django.core.exceptions import ObjectDoesNotExist from django.core.files import File +from django.db import IntegrityError from django.http import HttpResponse from django.utils.formats import date_format from django.utils.translation import gettext as _ from django_scopes import scope from cookbook.forms import ImportExportBase -from cookbook.helper.image_processing import get_filetype +from cookbook.helper.image_processing import get_filetype, handle_image from cookbook.models import Keyword, Recipe -from recipes.settings import DATABASES, DEBUG +from recipes.settings import DEBUG +from recipes.settings import EXPORT_FILE_CACHE_DURATION class Integration: @@ -31,71 +38,70 @@ class Integration: """ self.request = request self.export_type = export_type + self.ignored_recipes = [] description = f'Imported by {request.user.get_user_name()} at {date_format(datetime.datetime.now(), "DATETIME_FORMAT")}. Type: {export_type}' icon = '📥' - count = Keyword.objects.filter(name__icontains='Import', space=request.space).count() - name = f'Import {count + 1}' - if DATABASES['default']['ENGINE'] in ['django.db.backends.postgresql_psycopg2', 'django.db.backends.postgresql']: - parent, created = Keyword.objects.get_or_create(name='Import', space=request.space) + try: + last_kw = Keyword.objects.filter(name__regex=r'^(Import [0-9]+)', space=request.space).latest('created_at') + name = f'Import {int(last_kw.name.replace("Import ", "")) + 1}' + except (ObjectDoesNotExist, ValueError): + name = 'Import 1' + + parent, created = Keyword.objects.get_or_create(name='Import', space=request.space) + try: self.keyword = parent.add_child( name=name, description=description, icon=icon, space=request.space ) - else: - self.keyword, created = Keyword.objects.get_or_create( - name=name, + except (IntegrityError, ValueError): # in case, for whatever reason, the name does exist append UUID to it. Not nice but works for now. + self.keyword = parent.add_child( + name=f'{name} {str(uuid.uuid4())[0:8]}', description=description, icon=icon, space=request.space ) - def do_export(self, recipes): - """ - Perform the export based on a list of recipes - :param recipes: list of recipe objects - :return: HttpResponse with a ZIP file that is directly downloaded - """ - # TODO this is temporary, find a better solution for different export formats when doing other exporters - if self.export_type != ImportExportBase.RECIPESAGE: - export_zip_stream = BytesIO() - export_zip_obj = ZipFile(export_zip_stream, 'w') - for r in recipes: - if r.internal and r.space == self.request.space: - recipe_zip_stream = BytesIO() - recipe_zip_obj = ZipFile(recipe_zip_stream, 'w') + def do_export(self, recipes, el): - recipe_stream = StringIO() - filename, data = self.get_file_from_recipe(r) - recipe_stream.write(data) - recipe_zip_obj.writestr(filename, recipe_stream.getvalue()) - recipe_stream.close() - try: - recipe_zip_obj.writestr(f'image{get_filetype(r.image.file.name)}', r.image.file.read()) - except ValueError: - pass + with scope(space=self.request.space): + el.total_recipes = len(recipes) + el.cache_duration = EXPORT_FILE_CACHE_DURATION + el.save() - recipe_zip_obj.close() - export_zip_obj.writestr(str(r.pk) + '.zip', recipe_zip_stream.getvalue()) + files = self.get_files_from_recipes(recipes, el, self.request.COOKIES) - export_zip_obj.close() + if len(files) == 1: + filename, file = files[0] + export_filename = filename + export_file = file - response = HttpResponse(export_zip_stream.getvalue(), content_type='application/force-download') - response['Content-Disposition'] = 'attachment; filename="export.zip"' - return response - else: - json_list = [] - for r in recipes: - json_list.append(self.get_file_from_recipe(r)) + else: + #zip the files if there is more then one file + export_filename = self.get_export_file_name() + export_stream = BytesIO() + export_obj = ZipFile(export_stream, 'w') + + for filename, file in files: + export_obj.writestr(filename, file) + + export_obj.close() + export_file = export_stream.getvalue() + + + cache.set('export_file_'+str(el.pk), {'filename': export_filename, 'file': export_file}, EXPORT_FILE_CACHE_DURATION) + el.running = False + el.save() + + response = HttpResponse(export_file, content_type='application/force-download') + response['Content-Disposition'] = 'attachment; filename="' + export_filename + '"' + return response - response = HttpResponse(json.dumps(json_list), content_type='application/force-download') - response['Content-Disposition'] = 'attachment; filename="recipes.json"' - return response def import_file_name_filter(self, zip_info_object): """ @@ -116,8 +122,6 @@ class Integration: :return: HttpResponseRedirect to the recipe search showing all imported recipes """ with scope(space=self.request.space): - self.keyword.name = _('Import') + ' ' + str(il.pk) - self.keyword.save() try: self.files = files @@ -135,7 +139,7 @@ class Integration: for d in data_list: recipe = self.get_recipe_from_file(d) recipe.keywords.add(self.keyword) - il.msg += f'{recipe.pk} - {recipe.name} \n' + il.msg += self.get_recipe_processed_msg(recipe) self.handle_duplicates(recipe, import_duplicates) il.imported_recipes += 1 il.save() @@ -148,25 +152,34 @@ class Integration: file_list.append(z) il.total_recipes += len(file_list) + import cookbook + if isinstance(self, cookbook.integration.copymethat.CopyMeThat): + file_list = self.split_recipe_file(BytesIO(import_zip.read('recipes.html'))) + il.total_recipes += len(file_list) + for z in file_list: try: - recipe = self.get_recipe_from_file(BytesIO(import_zip.read(z.filename))) + if isinstance(z, Tag): + recipe = self.get_recipe_from_file(z) + else: + recipe = self.get_recipe_from_file(BytesIO(import_zip.read(z.filename))) recipe.keywords.add(self.keyword) - il.msg += f'{recipe.pk} - {recipe.name} \n' + il.msg += self.get_recipe_processed_msg(recipe) self.handle_duplicates(recipe, import_duplicates) il.imported_recipes += 1 il.save() except Exception as e: + 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']: + elif '.json' in f['name'] or '.txt' in f['name'] or '.mmf' in f['name']: data_list = self.split_recipe_file(f['file']) il.total_recipes += len(data_list) for d in data_list: try: recipe = self.get_recipe_from_file(d) recipe.keywords.add(self.keyword) - il.msg += f'{recipe.pk} - {recipe.name} \n' + il.msg += self.get_recipe_processed_msg(recipe) self.handle_duplicates(recipe, import_duplicates) il.imported_recipes += 1 il.save() @@ -183,7 +196,7 @@ class Integration: try: recipe = self.get_recipe_from_file(d) recipe.keywords.add(self.keyword) - il.msg += f'{recipe.pk} - {recipe.name} \n' + il.msg += self.get_recipe_processed_msg(recipe) self.handle_duplicates(recipe, import_duplicates) il.imported_recipes += 1 il.save() @@ -193,7 +206,7 @@ class Integration: else: recipe = self.get_recipe_from_file(f['file']) recipe.keywords.add(self.keyword) - il.msg += f'{recipe.pk} - {recipe.name} \n' + il.msg += self.get_recipe_processed_msg(recipe) self.handle_duplicates(recipe, import_duplicates) except BadZipFile: il.msg += 'ERROR ' + _( @@ -223,15 +236,14 @@ class Integration: self.ignored_recipes.append(recipe.name) recipe.delete() - @staticmethod - def import_recipe_image(recipe, image_file, filetype='.jpeg'): + def import_recipe_image(self, recipe, image_file, filetype='.jpeg'): """ Adds an image to a recipe naming it correctly :param recipe: Recipe object :param image_file: ByteIO stream containing the image :param filetype: type of file to write bytes to, default to .jpeg if unknown """ - recipe.image = File(image_file, name=f'{uuid.uuid4()}_{recipe.pk}{filetype}') + recipe.image = File(handle_image(self.request, File(image_file, name='image'), filetype=filetype)[0], name=f'{uuid.uuid4()}_{recipe.pk}{filetype}') recipe.save() def get_recipe_from_file(self, file): @@ -261,7 +273,18 @@ class Integration: """ raise NotImplementedError('Method not implemented in integration') - def handle_exception(self, exception, log=None, message=''): + def get_files_from_recipes(self, recipes, el, cookie): + """ + Takes a list of recipe object and converts it to a array containing each file. + Each file is represented as an array [filename, data] where data is a string of the content of the file. + :param recipe: Recipe object that should be converted + :returns: + [[filename, data], ...] + """ + raise NotImplementedError('Method not implemented in integration') + + @staticmethod + def handle_exception(exception, log=None, message=''): if log: if message: log.msg += message @@ -269,3 +292,10 @@ class Integration: log.msg += exception.msg if DEBUG: traceback.print_exc() + + + def get_export_file_name(self, format='zip'): + return "export_{}.{}".format(datetime.datetime.now().strftime("%Y-%m-%d"), format) + + def get_recipe_processed_msg(self, recipe): + return f'{recipe.pk} - {recipe.name} \n' diff --git a/cookbook/integration/mealie.py b/cookbook/integration/mealie.py index 4d9d51aa..15117595 100644 --- a/cookbook/integration/mealie.py +++ b/cookbook/integration/mealie.py @@ -4,7 +4,7 @@ from io import BytesIO from zipfile import ZipFile from cookbook.helper.image_processing import get_filetype -from cookbook.helper.ingredient_parser import parse, get_food, get_unit +from cookbook.helper.ingredient_parser import IngredientParser from cookbook.integration.integration import Integration from cookbook.models import Recipe, Step, Ingredient @@ -23,7 +23,7 @@ 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 ) + # 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 @@ -37,17 +37,18 @@ class Mealie(Integration): 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 = get_food(ingredient['food'], self.request.space) - u = get_unit(ingredient['unit'], self.request.space) + f = ingredient_parser.get_food(ingredient['food']) + u = ingredient_parser.get_unit(ingredient['unit']) amount = ingredient['quantity'] note = ingredient['note'] else: - amount, unit, ingredient, note = parse(ingredient['note']) - f = get_food(ingredient, self.request.space) - u = get_unit(unit, self.request.space) + amount, unit, ingredient, note = ingredient_parser.parse(ingredient['note']) + f = ingredient_parser.get_food(ingredient) + u = ingredient_parser.get_unit(unit) step.ingredients.add(Ingredient.objects.create( food=f, unit=u, amount=amount, note=note, space=self.request.space, )) diff --git a/cookbook/integration/mealmaster.py b/cookbook/integration/mealmaster.py index 6ad2fca2..f9a98cb3 100644 --- a/cookbook/integration/mealmaster.py +++ b/cookbook/integration/mealmaster.py @@ -1,6 +1,6 @@ import re -from cookbook.helper.ingredient_parser import parse, get_food, get_unit +from cookbook.helper.ingredient_parser import IngredientParser from cookbook.integration.integration import Integration from cookbook.models import Recipe, Step, Ingredient, Keyword @@ -8,12 +8,10 @@ from cookbook.models import Recipe, Step, Ingredient, Keyword class MealMaster(Integration): def get_recipe_from_file(self, file): - print('------------ getting recipe') servings = 1 ingredients = [] directions = [] for line in file.replace('\r', '').split('\n'): - print('testing line') if not line.startswith('MMMMM') and line.strip != '': if 'Title:' in line: title = line.replace('Title:', '').strip() @@ -44,11 +42,12 @@ class MealMaster(Integration): instruction='\n'.join(directions) + '\n\n', space=self.request.space, ) + ingredient_parser = IngredientParser(self.request, True) for ingredient in ingredients: if len(ingredient.strip()) > 0: - amount, unit, ingredient, note = parse(ingredient) - f = get_food(ingredient, self.request.space) - u = get_unit(unit, self.request.space) + amount, unit, ingredient, note = ingredient_parser.parse(ingredient) + f = ingredient_parser.get_food(ingredient) + u = ingredient_parser.get_unit(unit) step.ingredients.add(Ingredient.objects.create( food=f, unit=u, amount=amount, note=note, space=self.request.space, )) @@ -64,7 +63,7 @@ class MealMaster(Integration): current_recipe = '' for fl in file.readlines(): - line = fl.decode("ANSI") + line = fl.decode("windows-1250") if (line.startswith('MMMMM') or line.startswith('-----')) and 'meal-master' in line.lower(): if current_recipe != '': recipe_list.append(current_recipe) diff --git a/cookbook/integration/nextcloud_cookbook.py b/cookbook/integration/nextcloud_cookbook.py index 00a379d4..6b0d1288 100644 --- a/cookbook/integration/nextcloud_cookbook.py +++ b/cookbook/integration/nextcloud_cookbook.py @@ -4,9 +4,10 @@ from io import BytesIO from zipfile import ZipFile from cookbook.helper.image_processing import get_filetype -from cookbook.helper.ingredient_parser import parse, get_food, get_unit +from cookbook.helper.ingredient_parser import IngredientParser +from cookbook.helper.recipe_url_import import iso_duration_to_minutes from cookbook.integration.integration import Integration -from cookbook.models import Recipe, Step, Ingredient +from cookbook.models import Recipe, Step, Ingredient, Keyword class NextcloudCookbook(Integration): @@ -24,9 +25,24 @@ class NextcloudCookbook(Integration): created_by=self.request.user, internal=True, servings=recipe_json['recipeYield'], 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 - # TODO parse keywords + try: + recipe.working_time = iso_duration_to_minutes(recipe_json['prepTime']) + recipe.waiting_time = iso_duration_to_minutes(recipe_json['cookTime']) + except Exception: + pass + + if 'recipeCategory' in recipe_json: + try: + recipe.keywords.add(Keyword.objects.get_or_create(space=self.request.space, name=recipe_json['recipeCategory'])[0]) + except Exception: + pass + + if 'keywords' in recipe_json: + try: + for x in recipe_json['keywords'].split(','): + recipe.keywords.add(Keyword.objects.get_or_create(space=self.request.space, name=x)[0]) + except Exception: + pass ingredients_added = False for s in recipe_json['recipeInstructions']: @@ -39,20 +55,30 @@ class NextcloudCookbook(Integration): ingredients_added = True + ingredient_parser = IngredientParser(self.request, True) for ingredient in recipe_json['recipeIngredient']: - amount, unit, ingredient, note = parse(ingredient) - f = get_food(ingredient, self.request.space) - u = get_unit(unit, self.request.space) + amount, unit, ingredient, note = ingredient_parser.parse(ingredient) + f = ingredient_parser.get_food(ingredient) + u = ingredient_parser.get_unit(unit) step.ingredients.add(Ingredient.objects.create( food=f, unit=u, amount=amount, note=note, space=self.request.space, )) recipe.steps.add(step) + if 'nutrition' in recipe_json: + try: + recipe.nutrition.calories = recipe_json['nutrition']['calories'].replace(' kcal', '').replace(' ', '') + recipe.nutrition.proteins = recipe_json['nutrition']['calories'].replace(' g', '').replace(',', '.').replace(' ', '') + recipe.nutrition.fats = recipe_json['nutrition']['calories'].replace(' g', '').replace(',', '.').replace(' ', '') + recipe.nutrition.carbohydrates = recipe_json['nutrition']['calories'].replace(' g', '').replace(',', '.').replace(' ', '') + except Exception: + pass + for f in self.files: if '.zip' in f['name']: import_zip = ZipFile(f['file']) for z in import_zip.filelist: - if re.match(f'^Recipes/{recipe.name}/full.jpg$', z.filename): + if re.match(f'^(.)+{recipe.name}/full.jpg$', z.filename): self.import_recipe_image(recipe, BytesIO(import_zip.read(z.filename)), filetype=get_filetype(z.filename)) return recipe diff --git a/cookbook/integration/openeats.py b/cookbook/integration/openeats.py index 02751110..d948d90a 100644 --- a/cookbook/integration/openeats.py +++ b/cookbook/integration/openeats.py @@ -1,6 +1,6 @@ import json -from cookbook.helper.ingredient_parser import get_food, get_unit +from cookbook.helper.ingredient_parser import IngredientParser from cookbook.integration.integration import Integration from cookbook.models import Recipe, Step, Ingredient @@ -23,9 +23,10 @@ class OpenEats(Integration): step = Step.objects.create(instruction=instructions, space=self.request.space,) + ingredient_parser = IngredientParser(self.request, True) for ingredient in file['ingredients']: - f = get_food(ingredient['food'], self.request.space) - u = get_unit(ingredient['unit'], self.request.space) + f = ingredient_parser.get_food(ingredient['food']) + u = ingredient_parser.get_unit(ingredient['unit']) step.ingredients.add(Ingredient.objects.create( food=f, unit=u, amount=ingredient['amount'], space=self.request.space, )) diff --git a/cookbook/integration/paprika.py b/cookbook/integration/paprika.py index b006bdd6..dcd5bfbe 100644 --- a/cookbook/integration/paprika.py +++ b/cookbook/integration/paprika.py @@ -4,7 +4,7 @@ import json import re from io import BytesIO -from cookbook.helper.ingredient_parser import parse, get_food, get_unit +from cookbook.helper.ingredient_parser import IngredientParser from cookbook.integration.integration import Integration from cookbook.models import Recipe, Step, Ingredient, Keyword from gettext import gettext as _ @@ -58,7 +58,7 @@ class Paprika(Integration): instruction=instructions, space=self.request.space, ) - if len(recipe_json['description'].strip()) > 500: + if 'description' in recipe_json and len(recipe_json['description'].strip()) > 500: step.instruction = recipe_json['description'].strip() + '\n\n' + step.instruction if 'categories' in recipe_json: @@ -66,12 +66,13 @@ class Paprika(Integration): keyword, created = Keyword.objects.get_or_create(name=c.strip(), space=self.request.space) recipe.keywords.add(keyword) + ingredient_parser = IngredientParser(self.request, True) try: for ingredient in recipe_json['ingredients'].split('\n'): if len(ingredient.strip()) > 0: - amount, unit, ingredient, note = parse(ingredient) - f = get_food(ingredient, self.request.space) - u = get_unit(unit, self.request.space) + amount, unit, ingredient, note = ingredient_parser.parse(ingredient) + f = ingredient_parser.get_food(ingredient) + u = ingredient_parser.get_unit(unit) step.ingredients.add(Ingredient.objects.create( food=f, unit=u, amount=amount, note=note, space=self.request.space, )) diff --git a/cookbook/integration/pdfexport.py b/cookbook/integration/pdfexport.py new file mode 100644 index 00000000..fca78247 --- /dev/null +++ b/cookbook/integration/pdfexport.py @@ -0,0 +1,69 @@ +import json +from io import BytesIO +from re import match +from zipfile import ZipFile +import asyncio +from pyppeteer import launch + +from rest_framework.renderers import JSONRenderer + +from cookbook.helper.image_processing import get_filetype +from cookbook.integration.integration import Integration +from cookbook.serializer import RecipeExportSerializer + +from cookbook.models import ExportLog +from asgiref.sync import sync_to_async + +import django.core.management.commands.runserver as runserver +import logging + +class PDFexport(Integration): + + def get_recipe_from_file(self, file): + raise NotImplementedError('Method not implemented in storage integration') + + async def get_files_from_recipes_async(self, recipes, el, cookie): + cmd = runserver.Command() + + browser = await launch( + handleSIGINT=False, + handleSIGTERM=False, + handleSIGHUP=False, + ignoreHTTPSErrors=True, + ) + + cookies = {'domain': cmd.default_addr, 'name': 'sessionid', 'value': cookie['sessionid'], } + options = {'format': 'letter', + 'margin': { + 'top': '0.75in', + 'bottom': '0.75in', + 'left': '0.75in', + 'right': '0.75in', + } + } + + + files = [] + for recipe in recipes: + + page = await browser.newPage() + await page.emulateMedia('print') + await page.setCookie(cookies) + + await page.goto('http://'+cmd.default_addr+':'+cmd.default_port+'/view/recipe/'+str(recipe.id), {'waitUntil': 'domcontentloaded'}) + await page.waitForSelector('#printReady'); + + files.append([recipe.name + '.pdf', await page.pdf(options)]) + await page.close(); + + el.exported_recipes += 1 + el.msg += self.get_recipe_processed_msg(recipe) + await sync_to_async(el.save, thread_sensitive=True)() + + + await browser.close() + return files + + + def get_files_from_recipes(self, recipes, el, cookie): + return asyncio.run(self.get_files_from_recipes_async(recipes, el, cookie)) diff --git a/cookbook/integration/Pepperplate.py b/cookbook/integration/pepperplate.py similarity index 85% rename from cookbook/integration/Pepperplate.py rename to cookbook/integration/pepperplate.py index f9ae868a..4acc2d7b 100644 --- a/cookbook/integration/Pepperplate.py +++ b/cookbook/integration/pepperplate.py @@ -1,4 +1,4 @@ -from cookbook.helper.ingredient_parser import parse, get_food, get_unit +from cookbook.helper.ingredient_parser import IngredientParser from cookbook.integration.integration import Integration from cookbook.models import Recipe, Step, Ingredient @@ -38,11 +38,12 @@ class Pepperplate(Integration): instruction='\n'.join(directions) + '\n\n', space=self.request.space, ) + ingredient_parser = IngredientParser(self.request, True) for ingredient in ingredients: if len(ingredient.strip()) > 0: - amount, unit, ingredient, note = parse(ingredient) - f = get_food(ingredient, self.request.space) - u = get_unit(unit, self.request.space) + amount, unit, ingredient, note = ingredient_parser.parse(ingredient) + f = ingredient_parser.get_food(ingredient) + u = ingredient_parser.get_unit(unit) step.ingredients.add(Ingredient.objects.create( food=f, unit=u, amount=amount, note=note, space=self.request.space, )) diff --git a/cookbook/integration/plantoeat.py b/cookbook/integration/plantoeat.py new file mode 100644 index 00000000..9644c12a --- /dev/null +++ b/cookbook/integration/plantoeat.py @@ -0,0 +1,94 @@ +from io import BytesIO + +import requests + +from cookbook.helper.ingredient_parser import IngredientParser +from cookbook.integration.integration import Integration +from cookbook.models import Recipe, Step, Ingredient, Keyword + + +class Plantoeat(Integration): + + def get_recipe_from_file(self, file): + ingredient_mode = False + direction_mode = False + + image_url = None + tags = None + ingredients = [] + directions = [] + description = '' + for line in file.replace('\r', '').split('\n'): + if line.strip() != '': + if 'Title:' in line: + title = line.replace('Title:', '').replace('"', '').strip() + if 'Description:' in line: + description = line.replace('Description:', '').strip() + if 'Source:' in line or 'Serves:' in line or 'Prep Time:' in line or 'Cook Time:' in line: + directions.append(line.strip() + '\n') + if 'Photo Url:' in line: + image_url = line.replace('Photo Url:', '').strip() + if 'Tags:' in line: + tags = line.replace('Tags:', '').strip() + if ingredient_mode: + if len(line) > 2 and 'Instructions:' not in line: + ingredients.append(line.strip()) + if direction_mode: + if len(line) > 2: + directions.append(line.strip() + '\n') + if 'Ingredients:' in line: + ingredient_mode = True + if 'Directions:' in line: + ingredient_mode = False + direction_mode = True + + recipe = Recipe.objects.create(name=title, description=description, created_by=self.request.user, internal=True, space=self.request.space) + + step = Step.objects.create( + instruction='\n'.join(directions) + '\n\n', space=self.request.space, + ) + + if tags: + for k in tags.split(','): + keyword, created = Keyword.objects.get_or_create(name=k.strip(), space=self.request.space) + recipe.keywords.add(keyword) + + ingredient_parser = IngredientParser(self.request, True) + for ingredient in ingredients: + if len(ingredient.strip()) > 0: + amount, unit, ingredient, note = ingredient_parser.parse(ingredient) + f = ingredient_parser.get_food(ingredient) + u = ingredient_parser.get_unit(unit) + step.ingredients.add(Ingredient.objects.create( + food=f, unit=u, amount=amount, note=note, space=self.request.space, + )) + recipe.steps.add(step) + + if image_url: + try: + response = requests.get(image_url) + self.import_recipe_image(recipe, BytesIO(response.content)) + except Exception as e: + print('failed to import image ', str(e)) + + return recipe + + def split_recipe_file(self, file): + recipe_list = [] + current_recipe = '' + + for fl in file.readlines(): + line = fl.decode("windows-1250") + if line.startswith('--------------'): + if current_recipe != '': + recipe_list.append(current_recipe) + current_recipe = '' + else: + current_recipe = '' + else: + current_recipe += line + '\n' + + if current_recipe != '': + recipe_list.append(current_recipe) + + return recipe_list diff --git a/cookbook/integration/recettetek.py b/cookbook/integration/recettetek.py index 92cf7a61..7ae4115b 100644 --- a/cookbook/integration/recettetek.py +++ b/cookbook/integration/recettetek.py @@ -6,7 +6,7 @@ from zipfile import ZipFile import imghdr from cookbook.helper.image_processing import get_filetype -from cookbook.helper.ingredient_parser import parse, get_food, get_unit +from cookbook.helper.ingredient_parser import IngredientParser from cookbook.integration.integration import Integration from cookbook.models import Recipe, Step, Ingredient, Keyword @@ -27,10 +27,10 @@ class RecetteTek(Integration): def get_recipe_from_file(self, file): - # Create initial recipe with just a title and a decription + # Create initial recipe with just a title and a description recipe = Recipe.objects.create(name=file['title'], created_by=self.request.user, internal=True, space=self.request.space, ) - # set the description as an empty string for later use for the source URL, incase there is no description text. + # set the description as an empty string for later use for the source URL, in case there is no description text. recipe.description = '' try: @@ -55,11 +55,12 @@ class RecetteTek(Integration): try: # Process the ingredients. Assumes 1 ingredient per line. + ingredient_parser = IngredientParser(self.request, True) for ingredient in file['ingredients'].split('\n'): if len(ingredient.strip()) > 0: - amount, unit, ingredient, note = parse(ingredient) - f = get_food(ingredient, self.request.space) - u = get_unit(unit, self.request.space) + amount, unit, ingredient, note = ingredient_parser.parse(ingredient) + f = ingredient_parser.get_food(ingredient) + u = ingredient_parser.get_unit(unit) step.ingredients.add(Ingredient.objects.create( food=f, unit=u, amount=amount, note=note, space=self.request.space, )) diff --git a/cookbook/integration/recipekeeper.py b/cookbook/integration/recipekeeper.py index 746fc435..0de2ff8e 100644 --- a/cookbook/integration/recipekeeper.py +++ b/cookbook/integration/recipekeeper.py @@ -3,7 +3,7 @@ from bs4 import BeautifulSoup from io import BytesIO from zipfile import ZipFile -from cookbook.helper.ingredient_parser import parse, get_food, get_unit +from cookbook.helper.ingredient_parser import IngredientParser from cookbook.helper.recipe_url_import import parse_servings, iso_duration_to_minutes from cookbook.integration.integration import Integration from cookbook.models import Recipe, Step, Ingredient, Keyword @@ -41,12 +41,13 @@ class RecipeKeeper(Integration): step = Step.objects.create(instruction='', space=self.request.space,) + ingredient_parser = IngredientParser(self.request, True) for ingredient in file.find("div", {"itemprop": "recipeIngredients"}).findChildren("p"): if ingredient.text == "": continue - amount, unit, ingredient, note = parse(ingredient.text.strip()) - f = get_food(ingredient, self.request.space) - u = get_unit(unit, self.request.space) + amount, unit, ingredient, note = ingredient_parser.parse(ingredient.text.strip()) + f = ingredient_parser.get_food(ingredient) + u = ingredient_parser.get_unit(unit) step.ingredients.add(Ingredient.objects.create( food=f, unit=u, amount=amount, note=note, space=self.request.space, )) diff --git a/cookbook/integration/recipesage.py b/cookbook/integration/recipesage.py index 3490d88e..0bc6704b 100644 --- a/cookbook/integration/recipesage.py +++ b/cookbook/integration/recipesage.py @@ -3,7 +3,7 @@ from io import BytesIO import requests -from cookbook.helper.ingredient_parser import parse, get_food, get_unit +from cookbook.helper.ingredient_parser import IngredientParser from cookbook.integration.integration import Integration from cookbook.models import Recipe, Step, Ingredient @@ -31,6 +31,7 @@ class RecipeSage(Integration): except Exception as e: print('failed to parse yield or time ', str(e)) + ingredient_parser = IngredientParser(self.request,True) ingredients_added = False for s in file['recipeInstructions']: step = Step.objects.create( @@ -40,9 +41,9 @@ class RecipeSage(Integration): ingredients_added = True for ingredient in file['recipeIngredient']: - amount, unit, ingredient, note = parse(ingredient) - f = get_food(ingredient, self.request.space) - u = get_unit(unit, self.request.space) + amount, unit, ingredient, note = ingredient_parser.parse(ingredient) + f = ingredient_parser.get_food(ingredient) + u = ingredient_parser.get_unit(unit) step.ingredients.add(Ingredient.objects.create( food=f, unit=u, amount=amount, note=note, space=self.request.space, )) @@ -87,5 +88,16 @@ class RecipeSage(Integration): return data + def get_files_from_recipes(self, recipes, el, cookie): + json_list = [] + for r in recipes: + json_list.append(self.get_file_from_recipe(r)) + + el.exported_recipes += 1 + el.msg += self.get_recipe_processed_msg(r) + el.save() + + return [[self.get_export_file_name('json'), json.dumps(json_list)]] + def split_recipe_file(self, file): return json.loads(file.read().decode("utf-8")) diff --git a/cookbook/integration/rezkonv.py b/cookbook/integration/rezkonv.py index d4fcbd43..f75db229 100644 --- a/cookbook/integration/rezkonv.py +++ b/cookbook/integration/rezkonv.py @@ -1,4 +1,4 @@ -from cookbook.helper.ingredient_parser import parse, get_food, get_unit +from cookbook.helper.ingredient_parser import IngredientParser from cookbook.integration.integration import Integration from cookbook.models import Recipe, Step, Ingredient, Keyword @@ -41,11 +41,12 @@ class RezKonv(Integration): instruction='\n'.join(directions) + '\n\n', space=self.request.space, ) + ingredient_parser = IngredientParser(self.request, True) for ingredient in ingredients: if len(ingredient.strip()) > 0: - amount, unit, ingredient, note = parse(ingredient) - f = get_food(ingredient, self.request.space) - u = get_unit(unit, self.request.space) + amount, unit, ingredient, note = ingredient_parser.parse(ingredient) + f = ingredient_parser.get_food(ingredient) + u = ingredient_parser.get_unit(unit) step.ingredients.add(Ingredient.objects.create( food=f, unit=u, amount=amount, note=note, space=self.request.space, )) @@ -61,7 +62,7 @@ class RezKonv(Integration): current_recipe = '' for fl in file.readlines(): - line = fl.decode("ANSI") + line = fl.decode("windows-1250") if line.startswith('=====') and 'rezkonv' in line.lower(): if current_recipe != '': recipe_list.append(current_recipe) diff --git a/cookbook/integration/safron.py b/cookbook/integration/saffron.py similarity index 57% rename from cookbook/integration/safron.py rename to cookbook/integration/saffron.py index 5a5e4332..058f2a8f 100644 --- a/cookbook/integration/safron.py +++ b/cookbook/integration/saffron.py @@ -1,11 +1,11 @@ from django.utils.translation import gettext as _ -from cookbook.helper.ingredient_parser import parse, get_food, get_unit +from cookbook.helper.ingredient_parser import IngredientParser from cookbook.integration.integration import Integration from cookbook.models import Recipe, Step, Ingredient -class Safron(Integration): +class Saffron(Integration): def get_recipe_from_file(self, file): ingredient_mode = False @@ -43,12 +43,13 @@ class Safron(Integration): recipe = Recipe.objects.create(name=title, description=description, created_by=self.request.user, internal=True, space=self.request.space, ) - step = Step.objects.create(instruction='\n'.join(directions), space=self.request.space,) + step = Step.objects.create(instruction='\n'.join(directions), space=self.request.space, ) + ingredient_parser = IngredientParser(self.request, True) for ingredient in ingredients: - amount, unit, ingredient, note = parse(ingredient) - f = get_food(ingredient, self.request.space) - u = get_unit(unit, self.request.space) + amount, unit, ingredient, note = ingredient_parser.parse(ingredient) + f = ingredient_parser.get_food(ingredient) + u = ingredient_parser.get_unit(unit) step.ingredients.add(Ingredient.objects.create( food=f, unit=u, amount=amount, note=note, space=self.request.space, )) @@ -57,4 +58,43 @@ class Safron(Integration): return recipe def get_file_from_recipe(self, recipe): - raise NotImplementedError('Method not implemented in storage integration') + + data = "Title: "+recipe.name if recipe.name else ""+"\n" + data += "Description: "+recipe.description if recipe.description else ""+"\n" + data += "Source: \n" + data += "Original URL: \n" + data += "Yield: "+str(recipe.servings)+"\n" + data += "Cookbook: \n" + data += "Section: \n" + data += "Image: \n" + + recipeInstructions = [] + recipeIngredient = [] + for s in recipe.steps.all(): + if s.type != Step.TIME: + recipeInstructions.append(s.instruction) + + for i in s.ingredients.all(): + recipeIngredient.append(f'{float(i.amount)} {i.unit} {i.food}') + + data += "Ingredients: \n" + for ingredient in recipeIngredient: + data += ingredient+"\n" + + data += "Instructions: \n" + for instruction in recipeInstructions: + data += instruction+"\n" + + return recipe.name+'.txt', data + + def get_files_from_recipes(self, recipes, el, cookie): + files = [] + for r in recipes: + filename, data = self.get_file_from_recipe(r) + files.append([ filename, data ]) + + el.exported_recipes += 1 + el.msg += self.get_recipe_processed_msg(r) + el.save() + + return files \ No newline at end of file diff --git a/cookbook/locale/ca/LC_MESSAGES/django.mo b/cookbook/locale/ca/LC_MESSAGES/django.mo index 19d0f6ba..701d6bda 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 45ee88c6..b8b88d77 100644 --- a/cookbook/locale/ca/LC_MESSAGES/django.po +++ b/cookbook/locale/ca/LC_MESSAGES/django.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-08-17 08:44+0200\n" +"POT-Creation-Date: 2022-01-18 14:52+0100\n" "PO-Revision-Date: 2020-06-02 19:28+0000\n" "Last-Translator: Miguel Canteras , 2021\n" "Language-Team: Catalan (https://www.transifex.com/django-recipes/" @@ -24,15 +24,80 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: .\cookbook\filters.py:23 .\cookbook\templates\base.html:98 -#: .\cookbook\templates\forms\edit_internal_recipe.html:269 -#: .\cookbook\templates\forms\ingredients.html:34 -#: .\cookbook\templates\space.html:43 .\cookbook\templates\stats.html:28 -#: .\cookbook\templates\url_import.html:270 .\cookbook\views\lists.py:67 +#: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 +#: .\cookbook\templates\space.html:50 .\cookbook\templates\stats.html:28 +#: .\cookbook\templates\url_import.html:277 msgid "Ingredients" msgstr "Ingredients" -#: .\cookbook\forms.py:49 +#: .\cookbook\forms.py:56 +#, fuzzy +#| msgid "Default" +msgid "Default unit" +msgstr "Per defecte" + +#: .\cookbook\forms.py:57 +#, fuzzy +#| msgid "System Information" +msgid "Use fractions" +msgstr "Informació de Sistema" + +#: .\cookbook\forms.py:58 +msgid "Use KJ" +msgstr "" + +#: .\cookbook\forms.py:59 +msgid "Theme" +msgstr "" + +#: .\cookbook\forms.py:60 +msgid "Navbar color" +msgstr "" + +#: .\cookbook\forms.py:61 +msgid "Sticky navbar" +msgstr "" + +#: .\cookbook\forms.py:62 +#, fuzzy +#| msgid "Default" +msgid "Default page" +msgstr "Per defecte" + +#: .\cookbook\forms.py:63 +#, fuzzy +#| msgid "Shopping Recipes" +msgid "Show recent recipes" +msgstr "Llista de Compra de Receptes" + +#: .\cookbook\forms.py:64 +#, fuzzy +#| msgid "Search" +msgid "Search style" +msgstr "Cerca" + +#: .\cookbook\forms.py:65 +msgid "Plan sharing" +msgstr "" + +#: .\cookbook\forms.py:66 +#, fuzzy +#| msgid "Ingredients" +msgid "Ingredient decimal places" +msgstr "Ingredients" + +#: .\cookbook\forms.py:67 +#, fuzzy +#| msgid "Shopping list currently empty" +msgid "Shopping list auto sync period" +msgstr "La llista de la compra està buida actualment" + +#: .\cookbook\forms.py:68 .\cookbook\templates\recipe_view.html:21 +#: .\cookbook\templates\space.html:77 .\cookbook\templates\stats.html:47 +msgid "Comments" +msgstr "Comentaris" + +#: .\cookbook\forms.py:72 msgid "" "Color of the top navigation bar. Not all colors work with all themes, just " "try them out!" @@ -40,13 +105,13 @@ msgstr "" "Color de la barra de navegació superior. No tots els colors funcionen amb " "tots els temes, només cal provar-los." -#: .\cookbook\forms.py:51 +#: .\cookbook\forms.py:74 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:53 +#: .\cookbook\forms.py:76 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" @@ -54,27 +119,39 @@ msgstr "" "Permet l'ús de fraccions de quantitats d'ingredients (p.ex.: converteix els " "decimals a fraccions automàticament)" -#: .\cookbook\forms.py:56 -msgid "" -"Users with whom newly created meal plan/shopping list entries should be " -"shared by default." +#: .\cookbook\forms.py:78 +msgid "Display nutritional energy amounts in joules instead of calories" +msgstr "" + +#: .\cookbook\forms.py:79 +#, fuzzy +#| msgid "" +#| "Users with whom newly created meal plan/shopping list entries should be " +#| "shared by default." +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/llistat de compra " "s'haurien de compartir per defecte." -#: .\cookbook\forms.py:58 +#: .\cookbook\forms.py:80 +#, fuzzy +#| msgid "Open Shopping List" +msgid "Users with whom to share shopping lists." +msgstr "Llista de la Compra Oberta" + +#: .\cookbook\forms.py:82 msgid "Show recently viewed recipes on search page." msgstr "Mostra les receptes vistes recentment a la pàgina de cerca." -#: .\cookbook\forms.py:59 +#: .\cookbook\forms.py:83 msgid "Number of decimals to round ingredients." msgstr "Nombre de decimals dels ingredients." -#: .\cookbook\forms.py:60 +#: .\cookbook\forms.py:84 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:62 +#: .\cookbook\forms.py:86 .\cookbook\forms.py:493 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. " @@ -87,11 +164,19 @@ 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:65 +#: .\cookbook\forms.py:89 msgid "Makes the navbar stick to the top of the page." msgstr "" -#: .\cookbook\forms.py:81 +#: .\cookbook\forms.py:90 .\cookbook\forms.py:496 +msgid "Automatically add meal plan ingredients to shopping list." +msgstr "" + +#: .\cookbook\forms.py:91 +msgid "Exclude ingredients that are on hand." +msgstr "" + +#: .\cookbook\forms.py:108 msgid "" "Both fields are optional. If none are given the username will be displayed " "instead" @@ -99,94 +184,59 @@ msgstr "" "Tots dos camps són opcionals. Si no se'n dóna cap, es mostrarà el nom " "d'usuari" -#: .\cookbook\forms.py:102 .\cookbook\forms.py:331 -#: .\cookbook\templates\forms\edit_internal_recipe.html:49 -#: .\cookbook\templates\url_import.html:154 +#: .\cookbook\forms.py:129 .\cookbook\forms.py:298 +#: .\cookbook\templates\url_import.html:161 msgid "Name" msgstr "Nom" -#: .\cookbook\forms.py:103 .\cookbook\forms.py:332 -#: .\cookbook\templates\base.html:108 .\cookbook\templates\base.html:169 -#: .\cookbook\templates\forms\edit_internal_recipe.html:85 -#: .\cookbook\templates\space.html:39 .\cookbook\templates\stats.html:24 -#: .\cookbook\templates\url_import.html:188 -#: .\cookbook\templates\url_import.html:573 +#: .\cookbook\forms.py:130 .\cookbook\forms.py:299 +#: .\cookbook\templates\space.html:44 .\cookbook\templates\stats.html:24 +#: .\cookbook\templates\url_import.html:195 +#: .\cookbook\templates\url_import.html:585 .\cookbook\views\lists.py:97 msgid "Keywords" msgstr "Paraules clau" -#: .\cookbook\forms.py:104 +#: .\cookbook\forms.py:131 msgid "Preparation time in minutes" msgstr "Temps de preparació en minuts" -#: .\cookbook\forms.py:105 +#: .\cookbook\forms.py:132 msgid "Waiting time (cooking/baking) in minutes" msgstr "Temps d'espera (cocció/fornejat) en minuts" -#: .\cookbook\forms.py:106 .\cookbook\forms.py:333 +#: .\cookbook\forms.py:133 .\cookbook\forms.py:267 .\cookbook\forms.py:300 msgid "Path" msgstr "Ruta" -#: .\cookbook\forms.py:107 +#: .\cookbook\forms.py:134 msgid "Storage UID" msgstr "UID Emmagatzematge" -#: .\cookbook\forms.py:133 +#: .\cookbook\forms.py:164 msgid "Default" msgstr "Per defecte" -#: .\cookbook\forms.py:144 .\cookbook\templates\url_import.html:90 +#: .\cookbook\forms.py:175 .\cookbook\templates\url_import.html:97 msgid "" "To prevent duplicates recipes with the same name as existing ones are " "ignored. Check this box to import everything." msgstr "" -#: .\cookbook\forms.py:164 -msgid "New Unit" -msgstr "Nova Unitat" - -#: .\cookbook\forms.py:165 -msgid "New unit that other gets replaced by." -msgstr "Nova unitat per la qual se substitueix una altra." - -#: .\cookbook\forms.py:170 -msgid "Old Unit" -msgstr "Unitat Antiga" - -#: .\cookbook\forms.py:171 -msgid "Unit that should be replaced." -msgstr "Unitat que s’hauria de substituir." - -#: .\cookbook\forms.py:187 -msgid "New Food" -msgstr "Menjar Nou" - -#: .\cookbook\forms.py:188 -msgid "New food that other gets replaced by." -msgstr "Nou menjar que altres substitueixen." - -#: .\cookbook\forms.py:193 -msgid "Old Food" -msgstr "Antic Menjar" - -#: .\cookbook\forms.py:194 -msgid "Food that should be replaced." -msgstr "Menjar que s’hauria de substituir." - -#: .\cookbook\forms.py:212 +#: .\cookbook\forms.py:197 msgid "Add your comment: " msgstr "Afegir el teu comentari:" -#: .\cookbook\forms.py:253 +#: .\cookbook\forms.py:212 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:260 +#: .\cookbook\forms.py:219 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:269 +#: .\cookbook\forms.py:228 msgid "" "Leave empty for dropbox and enter only base url for nextcloud (/remote." "php/webdav/ is added automatically)" @@ -194,26 +244,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:307 +#: .\cookbook\forms.py:266 .\cookbook\views\edit.py:166 +msgid "Storage" +msgstr "Emmagatzematge" + +#: .\cookbook\forms.py:268 +msgid "Active" +msgstr "" + +#: .\cookbook\forms.py:274 msgid "Search String" msgstr "Cerca Cadena" -#: .\cookbook\forms.py:334 +#: .\cookbook\forms.py:301 msgid "File ID" msgstr "ID d'Arxiu" -#: .\cookbook\forms.py:370 +#: .\cookbook\forms.py:323 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:383 +#: .\cookbook\forms.py:336 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:384 -#: .\cookbook\templates\forms\edit_internal_recipe.html:427 +#: .\cookbook\forms.py:337 msgid "" "You can use markdown to format this field. See the docs here" @@ -221,93 +278,286 @@ msgstr "" "Podeu utilitzar el marcador per donar format a aquest camp. Consulteu els documents aquí " -#: .\cookbook\forms.py:409 +#: .\cookbook\forms.py:363 msgid "Maximum number of users for this space reached." msgstr "" -#: .\cookbook\forms.py:415 +#: .\cookbook\forms.py:369 msgid "Email address already taken!" msgstr "" -#: .\cookbook\forms.py:423 +#: .\cookbook\forms.py:377 msgid "" -"An email address is not required but if present the invite link will be send " +"An email address is not required but if present the invite link will be sent " "to the user." msgstr "" -#: .\cookbook\forms.py:438 +#: .\cookbook\forms.py:392 msgid "Name already taken." msgstr "" -#: .\cookbook\forms.py:449 +#: .\cookbook\forms.py:403 msgid "Accept Terms and Privacy" msgstr "" +#: .\cookbook\forms.py:435 +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:445 +msgid "" +"Select type method of search. Click here for " +"full desciption of choices." +msgstr "" + +#: .\cookbook\forms.py:446 +msgid "" +"Use fuzzy matching on units, keywords and ingredients when editing and " +"importing recipes." +msgstr "" + +#: .\cookbook\forms.py:448 +msgid "" +"Fields to search ignoring accents. Selecting this option can improve or " +"degrade search quality depending on language" +msgstr "" + +#: .\cookbook\forms.py:450 +msgid "" +"Fields to search for partial matches. (e.g. searching for 'Pie' will return " +"'pie' and 'piece' and 'soapie')" +msgstr "" + +#: .\cookbook\forms.py:452 +msgid "" +"Fields to search for beginning of word matches. (e.g. searching for 'sa' " +"will return 'salad' and 'sandwich')" +msgstr "" + +#: .\cookbook\forms.py:454 +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:456 +msgid "" +"Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " +"only function with fulltext fields." +msgstr "" + +#: .\cookbook\forms.py:460 +#, fuzzy +#| msgid "Search" +msgid "Search Method" +msgstr "Cerca" + +#: .\cookbook\forms.py:461 +msgid "Fuzzy Lookups" +msgstr "" + +#: .\cookbook\forms.py:462 +msgid "Ignore Accent" +msgstr "" + +#: .\cookbook\forms.py:463 +msgid "Partial Match" +msgstr "" + +#: .\cookbook\forms.py:464 +msgid "Starts Wtih" +msgstr "" + +#: .\cookbook\forms.py:465 +#, fuzzy +#| msgid "Search" +msgid "Fuzzy Search" +msgstr "Cerca" + +#: .\cookbook\forms.py:466 +#, fuzzy +#| msgid "Text" +msgid "Full Text" +msgstr "Text" + +#: .\cookbook\forms.py:491 +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:497 +msgid "" +"When adding a meal plan to the shopping list (manually or automatically), " +"include all related recipes." +msgstr "" + +#: .\cookbook\forms.py:498 +msgid "" +"When adding a meal plan to the shopping list (manually or automatically), " +"exclude ingredients that are on hand." +msgstr "" + +#: .\cookbook\forms.py:499 +msgid "Default number of hours to delay a shopping list entry." +msgstr "" + +#: .\cookbook\forms.py:500 +msgid "Filter shopping list to only include supermarket categories." +msgstr "" + +#: .\cookbook\forms.py:501 +msgid "Days of recent shopping list entries to display." +msgstr "" + +#: .\cookbook\forms.py:502 +msgid "Mark food 'On Hand' when checked off shopping list." +msgstr "" + +#: .\cookbook\forms.py:503 +msgid "Delimiter to use for CSV exports." +msgstr "" + +#: .\cookbook\forms.py:504 +msgid "Prefix to add when copying list to the clipboard." +msgstr "" + +#: .\cookbook\forms.py:508 +#, fuzzy +#| msgid "Shopping List" +msgid "Share Shopping List" +msgstr "Llista de la Compra" + +#: .\cookbook\forms.py:509 +msgid "Autosync" +msgstr "" + +#: .\cookbook\forms.py:510 +msgid "Auto Add Meal Plan" +msgstr "" + +#: .\cookbook\forms.py:511 +msgid "Exclude On Hand" +msgstr "" + +#: .\cookbook\forms.py:512 +msgid "Include Related" +msgstr "" + +#: .\cookbook\forms.py:513 +msgid "Default Delay Hours" +msgstr "" + +#: .\cookbook\forms.py:514 +#, fuzzy +#| msgid "Select Supermarket" +msgid "Filter to Supermarket" +msgstr "Seleccioni supermercat" + +#: .\cookbook\forms.py:515 +msgid "Recent Days" +msgstr "" + +#: .\cookbook\forms.py:516 +msgid "CSV Delimiter" +msgstr "" + +#: .\cookbook\forms.py:517 .\cookbook\templates\shopping_list.html:322 +msgid "List Prefix" +msgstr "Prefix de Llista" + +#: .\cookbook\forms.py:518 +msgid "Auto On Hand" +msgstr "" + +#: .\cookbook\forms.py:528 +msgid "Reset Food Inheritance" +msgstr "" + +#: .\cookbook\forms.py:529 +msgid "Reset all food to inherit the fields configured." +msgstr "" + +#: .\cookbook\forms.py:541 +#, fuzzy +#| msgid "Food that should be replaced." +msgid "Fields on food that should be inherited by default." +msgstr "Menjar que s’hauria de substituir." + +#: .\cookbook\forms.py:542 +#, fuzzy +#| msgid "Show recently viewed recipes on search page." +msgid "Show recipe counts on search filters" +msgstr "Mostra les receptes vistes recentment a la pàgina de cerca." + #: .\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 "" -#: .\cookbook\helper\permission_helper.py:138 -#: .\cookbook\helper\permission_helper.py:161 .\cookbook\views\views.py:151 +#: .\cookbook\helper\permission_helper.py:136 +#: .\cookbook\helper\permission_helper.py:159 .\cookbook\views\views.py:148 msgid "You are not logged in and therefore cannot view this page!" msgstr "No heu iniciat la sessió i, per tant, no podeu veure aquesta pàgina." -#: .\cookbook\helper\permission_helper.py:142 -#: .\cookbook\helper\permission_helper.py:148 -#: .\cookbook\helper\permission_helper.py:173 -#: .\cookbook\helper\permission_helper.py:218 -#: .\cookbook\helper\permission_helper.py:232 -#: .\cookbook\helper\permission_helper.py:243 -#: .\cookbook\helper\permission_helper.py:254 .\cookbook\views\data.py:40 -#: .\cookbook\views\views.py:162 .\cookbook\views\views.py:169 -#: .\cookbook\views\views.py:259 +#: .\cookbook\helper\permission_helper.py:140 +#: .\cookbook\helper\permission_helper.py:146 +#: .\cookbook\helper\permission_helper.py:171 +#: .\cookbook\helper\permission_helper.py:219 +#: .\cookbook\helper\permission_helper.py:233 +#: .\cookbook\helper\permission_helper.py:244 +#: .\cookbook\helper\permission_helper.py:255 .\cookbook\views\data.py:47 +#: .\cookbook\views\views.py:159 .\cookbook\views\views.py:166 +#: .\cookbook\views\views.py:232 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:166 -#: .\cookbook\helper\permission_helper.py:189 -#: .\cookbook\helper\permission_helper.py:204 +#: .\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 "" "No pots interaccionar amb aquest objecte ja que no és de la teva propietat!" -#: .\cookbook\helper\template_helper.py:60 -#: .\cookbook\helper\template_helper.py:62 +#: .\cookbook\helper\recipe_search.py:473 +msgid "One of queryset or hash_key must be provided" +msgstr "" + +#: .\cookbook\helper\shopping_helper.py:54 +#, fuzzy +#| msgid "You must provide at least a recipe or a title." +msgid "You must supply a recipe or mealplan" +msgstr "Has de proporcionar com a mínim una recepta o un títol." + +#: .\cookbook\helper\shopping_helper.py:58 +msgid "You must supply a created_by" +msgstr "" + +#: .\cookbook\helper\template_helper.py:61 +#: .\cookbook\helper\template_helper.py:63 msgid "Could not parse template code." msgstr "" -#: .\cookbook\integration\integration.py:104 -#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 -#: .\cookbook\templates\import_response.html:7 -#: .\cookbook\templates\test.html:14 .\cookbook\templates\test.html:20 -#: .\cookbook\templates\url_import.html:27 -#: .\cookbook\templates\url_import.html:101 -#: .\cookbook\templates\url_import.html:123 -#: .\cookbook\templates\url_import.html:317 -#: .\cookbook\templates\url_import.html:604 .\cookbook\views\delete.py:60 -#: .\cookbook\views\edit.py:199 -msgid "Import" -msgstr "Importar" - -#: .\cookbook\integration\integration.py:185 +#: .\cookbook\integration\integration.py:200 msgid "" "Importer expected a .zip file. Did you choose the correct importer type for " "your data ?" msgstr "" -#: .\cookbook\integration\integration.py:188 +#: .\cookbook\integration\integration.py:203 msgid "" "An unexpected error occurred during the import. Please make sure you have " "uploaded a valid file." msgstr "" -#: .\cookbook\integration\integration.py:192 +#: .\cookbook\integration\integration.py:208 msgid "The following recipes were ignored because they already existed:" msgstr "" -#: .\cookbook\integration\integration.py:196 +#: .\cookbook\integration\integration.py:212 #, fuzzy, python-format #| msgid "Imported new recipe!" msgid "Imported %s recipes." @@ -325,37 +575,51 @@ msgstr "Nota" msgid "Nutritional Information" msgstr "Informació" -#: .\cookbook\integration\paprika.py:53 +#: .\cookbook\integration\paprika.py:53 .\cookbook\templates\url_import.html:42 msgid "Source" msgstr "" -#: .\cookbook\integration\safron.py:23 -#: .\cookbook\templates\forms\edit_internal_recipe.html:79 -#: .\cookbook\templates\include\log_cooking.html:16 -#: .\cookbook\templates\url_import.html:224 -#: .\cookbook\templates\url_import.html:455 +#: .\cookbook\integration\saffron.py:23 +#: .\cookbook\templates\include\log_cooking.html:18 +#: .\cookbook\templates\url_import.html:231 +#: .\cookbook\templates\url_import.html:462 msgid "Servings" msgstr "Racions" -#: .\cookbook\integration\safron.py:25 +#: .\cookbook\integration\saffron.py:25 msgid "Waiting time" msgstr "Temps d'espera" -#: .\cookbook\integration\safron.py:27 -#: .\cookbook\templates\forms\edit_internal_recipe.html:73 +#: .\cookbook\integration\saffron.py:27 msgid "Preparation Time" msgstr "Temps de preparació" -#: .\cookbook\integration\safron.py:29 .\cookbook\templates\base.html:78 +#: .\cookbook\integration\saffron.py:29 .\cookbook\templates\base.html:78 #: .\cookbook\templates\forms\ingredients.html:7 #: .\cookbook\templates\index.html:7 msgid "Cookbook" msgstr "Receptari" -#: .\cookbook\integration\safron.py:31 +#: .\cookbook\integration\saffron.py:31 msgid "Section" msgstr "Secció" +#: .\cookbook\management\commands\rebuildindex.py:14 +msgid "Rebuilds full text search index on Recipe" +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:18 +msgid "Only Postgress databases use full text search, no index to rebuild" +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:29 +msgid "Recipe index rebuild complete." +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:31 +msgid "Recipe index rebuild failed." +msgstr "" + #: .\cookbook\migrations\0047_auto_20200602_1133.py:14 msgid "Breakfast" msgstr "Esmorzar" @@ -372,92 +636,151 @@ msgstr "Sopar" msgid "Other" msgstr "Un altre" -#: .\cookbook\models.py:72 +#: .\cookbook\models.py:246 msgid "" "Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " "upload." msgstr "" -#: .\cookbook\models.py:123 .\cookbook\templates\search.html:7 -#: .\cookbook\templates\shopping_list.html:52 +#: .\cookbook\models.py:300 .\cookbook\templates\search.html:7 +#: .\cookbook\templates\shopping_list.html:53 msgid "Search" msgstr "Cerca" -#: .\cookbook\models.py:124 .\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 +#: .\cookbook\models.py:301 .\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 "Plans de Menjar" -#: .\cookbook\models.py:125 .\cookbook\templates\base.html:89 +#: .\cookbook\models.py:302 .\cookbook\templates\base.html:90 msgid "Books" msgstr "Receptes" -#: .\cookbook\models.py:133 +#: .\cookbook\models.py:310 msgid "Small" msgstr "Petit" -#: .\cookbook\models.py:133 +#: .\cookbook\models.py:310 msgid "Large" msgstr "Gran" -#: .\cookbook\models.py:133 .\cookbook\templates\generic\new_template.html:6 +#: .\cookbook\models.py:310 .\cookbook\templates\generic\new_template.html:6 #: .\cookbook\templates\generic\new_template.html:14 -#: .\cookbook\templates\meal_plan.html:323 msgid "New" msgstr "Nova" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:202 +#: .\cookbook\models.py:512 +msgid " is part of a recipe step and cannot be deleted" +msgstr "" + +#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:44 msgid "Text" msgstr "Text" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:203 +#: .\cookbook\models.py:586 msgid "Time" msgstr "Temps" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:204 -#: .\cookbook\templates\forms\edit_internal_recipe.html:219 +#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:46 #, fuzzy #| msgid "File ID" msgid "File" msgstr "ID d'Arxiu" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:205 -#: .\cookbook\templates\forms\edit_internal_recipe.html:241 +#: .\cookbook\models.py:586 #: .\cookbook\templates\include\recipe_open_modal.html:7 -#: .\cookbook\templates\meal_plan.html:247 .\cookbook\views\delete.py:28 -#: .\cookbook\views\edit.py:273 .\cookbook\views\new.py:52 +#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260 +#: .\cookbook\views\new.py:53 msgid "Recipe" msgstr "Recepta" -#: .\cookbook\serializer.py:109 +#: .\cookbook\models.py:1041 .\cookbook\templates\search_info.html:28 +msgid "Simple" +msgstr "" + +#: .\cookbook\models.py:1042 .\cookbook\templates\search_info.html:33 +msgid "Phrase" +msgstr "" + +#: .\cookbook\models.py:1043 .\cookbook\templates\search_info.html:38 +msgid "Web" +msgstr "" + +#: .\cookbook\models.py:1044 .\cookbook\templates\search_info.html:47 +msgid "Raw" +msgstr "" + +#: .\cookbook\models.py:1082 +#, fuzzy +#| msgid "Food" +msgid "Food Alias" +msgstr "Menjar" + +#: .\cookbook\models.py:1082 +#, fuzzy +#| msgid "Units" +msgid "Unit Alias" +msgstr "Unitats" + +#: .\cookbook\models.py:1082 +#, fuzzy +#| msgid "Keywords" +msgid "Keyword Alias" +msgstr "Paraules clau" + +#: .\cookbook\serializer.py:175 +msgid "A user is required" +msgstr "" + +#: .\cookbook\serializer.py:195 msgid "File uploads are not enabled for this Space." msgstr "" -#: .\cookbook\serializer.py:117 +#: .\cookbook\serializer.py:206 msgid "You have reached your file upload limit." msgstr "" -#: .\cookbook\tables.py:35 .\cookbook\templates\books.html:36 -#: .\cookbook\templates\generic\edit_template.html:6 +#: .\cookbook\serializer.py:962 +msgid "Existing shopping list to update" +msgstr "" + +#: .\cookbook\serializer.py:964 +msgid "" +"List of ingredient IDs from the recipe to add, if not provided all " +"ingredients will be added." +msgstr "" + +#: .\cookbook\serializer.py:965 +msgid "" +"Providing a list_recipe ID and servings of 0 will delete that shopping list." +msgstr "" + +#: .\cookbook\serializer.py:973 +msgid "Amount of food to add to the shopping list" +msgstr "" + +#: .\cookbook\serializer.py:974 +msgid "ID of unit to use for the shopping list" +msgstr "" + +#: .\cookbook\serializer.py:975 +msgid "When set to true will delete all food from active shopping lists." +msgstr "" + +#: .\cookbook\tables.py:35 .\cookbook\templates\generic\edit_template.html:6 #: .\cookbook\templates\generic\edit_template.html:14 -#: .\cookbook\templates\meal_plan.html:281 #: .\cookbook\templates\recipes_table.html:82 -#: .\cookbook\templates\shopping_list.html:33 -#: .\cookbook\templates\space.html:90 +#: .\cookbook\templates\shopping_list.html:37 +#: .\cookbook\templates\space.html:109 msgid "Edit" msgstr "Edita" -#: .\cookbook\tables.py:124 .\cookbook\tables.py:147 -#: .\cookbook\templates\books.html:38 -#: .\cookbook\templates\generic\delete_template.html:5 -#: .\cookbook\templates\generic\delete_template.html:13 -#: .\cookbook\templates\generic\edit_template.html:27 -#: .\cookbook\templates\meal_plan.html:277 +#: .\cookbook\tables.py:115 .\cookbook\tables.py:138 +#: .\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" @@ -486,7 +809,7 @@ 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:154 .\cookbook\templates\settings.html:6 +#: .\cookbook\templates\base.html:257 .\cookbook\templates\settings.html:6 #: .\cookbook\templates\settings.html:17 #: .\cookbook\templates\socialaccount\connections.html:10 msgid "Settings" @@ -523,6 +846,7 @@ msgid "Re-send Verification" msgstr "" #: .\cookbook\templates\account\email.html:50 +#: .\cookbook\templates\generic\delete_template.html:56 #: .\cookbook\templates\socialaccount\connections.html:44 msgid "Remove" msgstr "Eliminar" @@ -566,7 +890,7 @@ msgid "" msgstr "" #: .\cookbook\templates\account\email_confirm.html:22 -#: .\cookbook\templates\generic\delete_template.html:21 +#: .\cookbook\templates\generic\delete_template.html:71 msgid "Confirm" msgstr "Confirma" @@ -578,7 +902,7 @@ msgid "" "request." msgstr "" -#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:189 +#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:289 msgid "Login" msgstr "Iniciar Sessió" @@ -589,27 +913,27 @@ msgstr "Iniciar Sessió" msgid "Sign In" msgstr "" -#: .\cookbook\templates\account\login.html:32 +#: .\cookbook\templates\account\login.html:34 #: .\cookbook\templates\socialaccount\signup.html:8 #: .\cookbook\templates\socialaccount\signup.html:57 msgid "Sign Up" msgstr "" -#: .\cookbook\templates\account\login.html:36 -#: .\cookbook\templates\account\login.html:37 +#: .\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:37 +#: .\cookbook\templates\account\login.html:40 msgid "Lost your password?" msgstr "" -#: .\cookbook\templates\account\login.html:48 +#: .\cookbook\templates\account\login.html:52 msgid "Social Login" msgstr "" -#: .\cookbook\templates\account\login.html:49 +#: .\cookbook\templates\account\login.html:53 msgid "You can use any of the following providers to sign in." msgstr "" @@ -626,6 +950,10 @@ msgstr "" #: .\cookbook\templates\account\password_change.html:6 #: .\cookbook\templates\account\password_change.html:16 #: .\cookbook\templates\account\password_change.html:21 +#: .\cookbook\templates\account\password_reset_from_key.html:7 +#: .\cookbook\templates\account\password_reset_from_key.html:13 +#: .\cookbook\templates\account\password_reset_from_key_done.html:7 +#: .\cookbook\templates\account\password_reset_from_key_done.html:13 #, fuzzy #| msgid "Changes saved!" msgid "Change Password" @@ -633,7 +961,7 @@ msgstr "Canvis desats!" #: .\cookbook\templates\account\password_change.html:12 #: .\cookbook\templates\account\password_set.html:12 -#: .\cookbook\templates\settings.html:52 +#: .\cookbook\templates\settings.html:76 #, fuzzy #| msgid "Settings" msgid "Password" @@ -666,6 +994,32 @@ msgid "" "within a few minutes." msgstr "" +#: .\cookbook\templates\account\password_reset_from_key.html:13 +#, fuzzy +#| msgid "API Token" +msgid "Bad Token" +msgstr "Token API" + +#: .\cookbook\templates\account\password_reset_from_key.html:25 +#, python-format +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used.\n" +" Please request a new " +"password reset." +msgstr "" + +#: .\cookbook\templates\account\password_reset_from_key.html:33 +#, fuzzy +#| msgid "Changes saved!" +msgid "change password" +msgstr "Canvis desats!" + +#: .\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 "" + #: .\cookbook\templates\account\password_set.html:6 #: .\cookbook\templates\account\password_set.html:16 #: .\cookbook\templates\account\password_set.html:21 @@ -719,100 +1073,120 @@ msgstr "" msgid "We are sorry, but the sign up is currently closed." msgstr "" -#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:179 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:279 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "Documentació API " -#: .\cookbook\templates\base.html:85 -msgid "Utensils" -msgstr "Estris" - -#: .\cookbook\templates\base.html:95 +#: .\cookbook\templates\base.html:86 msgid "Shopping" msgstr "Compres" -#: .\cookbook\templates\base.html:101 -#: .\cookbook\templates\shopping_list.html:230 +#: .\cookbook\templates\base.html:113 +msgid "Keyword" +msgstr "Paraula Clau" + +#: .\cookbook\templates\base.html:125 .\cookbook\views\lists.py:114 +#, fuzzy +#| msgid "Food" +msgid "Foods" +msgstr "Menjar" + +#: .\cookbook\templates\base.html:137 +#: .\cookbook\templates\forms\ingredients.html:24 +#: .\cookbook\templates\space.html:47 .\cookbook\templates\stats.html:26 +#: .\cookbook\views\lists.py:131 +msgid "Units" +msgstr "Unitats" + +#: .\cookbook\templates\base.html:151 +#: .\cookbook\templates\shopping_list.html:208 #: .\cookbook\templates\supermarket.html:7 msgid "Supermarket" msgstr "Supermercat" -#: .\cookbook\templates\base.html:112 .\cookbook\views\delete.py:84 -#: .\cookbook\views\edit.py:102 .\cookbook\views\lists.py:26 -#: .\cookbook\views\new.py:78 -msgid "Keyword" -msgstr "Paraula Clau" +#: .\cookbook\templates\base.html:163 +#, fuzzy +#| msgid "Supermarket" +msgid "Supermarket Category" +msgstr "Supermercat" -#: .\cookbook\templates\base.html:114 +#: .\cookbook\templates\base.html:175 .\cookbook\views\lists.py:180 +#, fuzzy +#| msgid "Information" +msgid "Automations" +msgstr "Informació" + +#: .\cookbook\templates\base.html:189 .\cookbook\views\lists.py:200 +#, fuzzy +#| msgid "File ID" +msgid "Files" +msgstr "ID d'Arxiu" + +#: .\cookbook\templates\base.html:201 msgid "Batch Edit" msgstr "Edició per lots" -#: .\cookbook\templates\base.html:119 -msgid "Storage Data" -msgstr "Emmagatzematge de dades" - -#: .\cookbook\templates\base.html:123 -msgid "Storage Backends" -msgstr "Backends d'emmagatzematge" - -#: .\cookbook\templates\base.html:125 -msgid "Configure Sync" -msgstr "Configurar Sync" - -#: .\cookbook\templates\base.html:127 -msgid "Discovered Recipes" -msgstr "Receptes Descobertes" - -#: .\cookbook\templates\base.html:129 -msgid "Discovery Log" -msgstr "Registre de descobriment" - -#: .\cookbook\templates\base.html:131 .\cookbook\templates\stats.html:10 -msgid "Statistics" -msgstr "Estadístiques" - -#: .\cookbook\templates\base.html:133 -msgid "Units & Ingredients" -msgstr "Unitats i ingredients" - -#: .\cookbook\templates\base.html:135 .\cookbook\templates\index.html:47 -msgid "Import Recipe" -msgstr "Importa recepta" - -#: .\cookbook\templates\base.html:156 .\cookbook\templates\history.html:6 +#: .\cookbook\templates\base.html:213 .\cookbook\templates\history.html:6 #: .\cookbook\templates\history.html:14 msgid "History" msgstr "Historial" -#: .\cookbook\templates\base.html:159 .\cookbook\templates\space.html:7 -#: .\cookbook\templates\space.html:19 +#: .\cookbook\templates\base.html:228 .\cookbook\templates\export.html:14 +#: .\cookbook\templates\export.html:20 +#: .\cookbook\templates\shopping_list.html:310 +#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 +msgid "Export" +msgstr "Exporta" + +#: .\cookbook\templates\base.html:244 .\cookbook\templates\index.html:47 +msgid "Import Recipe" +msgstr "Importa recepta" + +#: .\cookbook\templates\base.html:246 +#: .\cookbook\templates\shopping_list.html:165 +#: .\cookbook\templates\shopping_list.html:188 +msgid "Create" +msgstr "Crea" + +#: .\cookbook\templates\base.html:259 +#: .\cookbook\templates\generic\list_template.html:14 +#: .\cookbook\templates\space.html:69 .\cookbook\templates\stats.html:43 +msgid "External Recipes" +msgstr "Receptes Externes" + +#: .\cookbook\templates\base.html:262 .\cookbook\templates\space.html:8 +#: .\cookbook\templates\space.html:20 .\cookbook\templates\space.html:150 #, fuzzy #| msgid "Settings" msgid "Space Settings" msgstr "Opcions" -#: .\cookbook\templates\base.html:163 .\cookbook\templates\system.html:13 +#: .\cookbook\templates\base.html:267 .\cookbook\templates\system.html:13 msgid "System" msgstr "Sistema" -#: .\cookbook\templates\base.html:165 .\cookbook\templates\base.html:171 +#: .\cookbook\templates\base.html:269 msgid "Admin" msgstr "Admin" -#: .\cookbook\templates\base.html:175 +#: .\cookbook\templates\base.html:273 msgid "Markdown Guide" msgstr "Guia Markdown" -#: .\cookbook\templates\base.html:177 +#: .\cookbook\templates\base.html:275 msgid "GitHub" msgstr "GitHub" -#: .\cookbook\templates\base.html:181 +#: .\cookbook\templates\base.html:277 +msgid "Translate Tandoor" +msgstr "" + +#: .\cookbook\templates\base.html:281 msgid "API Browser" msgstr "Navegador API" -#: .\cookbook\templates\base.html:184 +#: .\cookbook\templates\base.html:284 msgid "Log out" msgstr "" @@ -830,7 +1204,7 @@ msgstr "" "Afegiu les paraules clau especificades a totes les receptes que continguin " "la paraula" -#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:85 +#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:82 msgid "Sync" msgstr "Sync" @@ -850,10 +1224,40 @@ msgstr "" msgid "The path must be in the following format" msgstr "El camí ha de tenir el format següent" -#: .\cookbook\templates\batch\monitor.html:27 +#: .\cookbook\templates\batch\monitor.html:20 +#: .\cookbook\templates\forms\edit_import_recipe.html:14 +#: .\cookbook\templates\generic\edit_template.html:23 +#: .\cookbook\templates\generic\new_template.html:23 +#: .\cookbook\templates\include\log_cooking.html:30 +#: .\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\shopping_list.html:311 +#: .\cookbook\templates\space.html:155 +msgid "Save" +msgstr "Desa" + +#: .\cookbook\templates\batch\monitor.html:21 +msgid "Manage External Storage" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:28 msgid "Sync Now!" msgstr "Sincronitza Ara!" +#: .\cookbook\templates\batch\monitor.html:29 +#, fuzzy +#| msgid "Shopping Recipes" +msgid "Show Recipes" +msgstr "Llista de Compra de Receptes" + +#: .\cookbook\templates\batch\monitor.html:30 +#, fuzzy +#| msgid "Show Links" +msgid "Show Log" +msgstr "Mostra Enllaços" + #: .\cookbook\templates\batch\waiting.html:4 #: .\cookbook\templates\batch\waiting.html:10 msgid "Importing Recipes" @@ -867,265 +1271,23 @@ msgstr "" "Això pot trigar uns minuts, en funció del nombre de receptes sincronitzades, " "espereu." -#: .\cookbook\templates\books.html:5 .\cookbook\templates\books.html:11 +#: .\cookbook\templates\books.html:7 msgid "Recipe Books" msgstr "Llibres de Receptes" -#: .\cookbook\templates\books.html:15 -msgid "New Book" -msgstr "Nou Llibre" - -#: .\cookbook\templates\books.html:27 .\cookbook\templates\recipe_view.html:26 -msgid "by" -msgstr "per" - -#: .\cookbook\templates\books.html:34 -msgid "Toggle Recipes" -msgstr "Commuta Receptes" - -#: .\cookbook\templates\books.html:54 -#: .\cookbook\templates\meal_plan_entry.html:48 -#: .\cookbook\templates\recipes_table.html:64 -msgid "Last cooked" -msgstr "Darrera cocció" - -#: .\cookbook\templates\books.html:71 -msgid "There are no recipes in this book yet." -msgstr "Encara no hi ha receptes en aquest llibre." - #: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6 msgid "Export Recipes" msgstr "Exporta Receptes" -#: .\cookbook\templates\export.html:14 .\cookbook\templates\export.html:20 -#: .\cookbook\templates\shopping_list.html:351 -#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 -msgid "Export" -msgstr "Exporta" - -#: .\cookbook\templates\files.html:7 -#, fuzzy -#| msgid "File ID" -msgid "Files" -msgstr "ID d'Arxiu" - #: .\cookbook\templates\forms\edit_import_recipe.html:5 #: .\cookbook\templates\forms\edit_import_recipe.html:9 msgid "Import new Recipe" msgstr "Importa nova Recepta" -#: .\cookbook\templates\forms\edit_import_recipe.html:14 -#: .\cookbook\templates\forms\edit_internal_recipe.html:439 -#: .\cookbook\templates\forms\edit_internal_recipe.html:471 -#: .\cookbook\templates\generic\edit_template.html:23 -#: .\cookbook\templates\generic\new_template.html:23 -#: .\cookbook\templates\include\log_cooking.html:28 -#: .\cookbook\templates\meal_plan.html:325 -#: .\cookbook\templates\settings.html:46 .\cookbook\templates\settings.html:87 -#: .\cookbook\templates\settings.html:105 -#: .\cookbook\templates\shopping_list.html:353 -msgid "Save" -msgstr "Desa" - #: .\cookbook\templates\forms\edit_internal_recipe.html:7 -#: .\cookbook\templates\forms\edit_internal_recipe.html:34 msgid "Edit Recipe" msgstr "Edita Recepta" -#: .\cookbook\templates\forms\edit_internal_recipe.html:56 -#: .\cookbook\templates\url_import.html:171 -msgid "Description" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:76 -msgid "Waiting Time" -msgstr "Temps d'Espera" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:82 -msgid "Servings Text" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:93 -msgid "Select Keywords" -msgstr "Selecciona Paraules clau" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:94 -#: .\cookbook\templates\url_import.html:583 -#, fuzzy -#| msgid "All Keywords" -msgid "Add Keyword" -msgstr "Totes les paraules clau" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:112 -msgid "Nutrition" -msgstr "Nutrició" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:116 -#: .\cookbook\templates\forms\edit_internal_recipe.html:166 -msgid "Delete Step" -msgstr "Esborra Pas" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:120 -msgid "Calories" -msgstr "Calories" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:123 -msgid "Carbohydrates" -msgstr "Hidrats de carboni" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:126 -msgid "Fats" -msgstr "Greixos" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:128 -msgid "Proteins" -msgstr "Proteïnes" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:150 -#: .\cookbook\templates\forms\edit_internal_recipe.html:504 -msgid "Step" -msgstr "Pas" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:171 -msgid "Show as header" -msgstr "Mostra com a capçalera" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:177 -msgid "Hide as header" -msgstr "Amaga com a capçalera" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:182 -msgid "Move Up" -msgstr "Mou Amunt" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:187 -msgid "Move Down" -msgstr "Mou Avall" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:196 -msgid "Step Name" -msgstr "Nom del Pas" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:200 -msgid "Step Type" -msgstr "Tipus de Pas" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:213 -msgid "Step time in Minutes" -msgstr "Temps de pas en Minuts" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:229 -#, fuzzy -#| msgid "Select one" -msgid "Select File" -msgstr "Sel·lecciona un" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:230 -#: .\cookbook\templates\forms\edit_internal_recipe.html:252 -#: .\cookbook\templates\forms\edit_internal_recipe.html:313 -#: .\cookbook\templates\forms\edit_internal_recipe.html:337 -#: .\cookbook\templates\shopping_list.html:189 -#: .\cookbook\templates\shopping_list.html:211 -#: .\cookbook\templates\shopping_list.html:241 -#: .\cookbook\templates\shopping_list.html:265 -#: .\cookbook\templates\url_import.html:495 -#: .\cookbook\templates\url_import.html:527 -msgid "Select" -msgstr "Selecciona" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:251 -#, fuzzy -#| msgid "Delete Recipe" -msgid "Select Recipe" -msgstr "Esborra Recepta" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:311 -#: .\cookbook\templates\shopping_list.html:187 -msgid "Select Unit" -msgstr "Selecciona Unitat" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:312 -#: .\cookbook\templates\forms\edit_internal_recipe.html:336 -#: .\cookbook\templates\shopping_list.html:188 -#: .\cookbook\templates\shopping_list.html:210 -msgid "Create" -msgstr "Crea" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:335 -#: .\cookbook\templates\shopping_list.html:209 -msgid "Select Food" -msgstr "Selecciona Menjar" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:352 -#: .\cookbook\templates\meal_plan.html:256 -#: .\cookbook\templates\url_import.html:542 -msgid "Note" -msgstr "Nota" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:369 -msgid "Delete Ingredient" -msgstr "Esborra Ingredient" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:375 -msgid "Make Header" -msgstr "Crea Capçalera" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:381 -msgid "Make Ingredient" -msgstr "Crea Ingredient" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:387 -msgid "Disable Amount" -msgstr "Deshabilita Quantitat" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:393 -msgid "Enable Amount" -msgstr "Habilita Quantitat" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:398 -msgid "Copy Template Reference" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:424 -#: .\cookbook\templates\url_import.html:297 -#: .\cookbook\templates\url_import.html:567 -msgid "Instructions" -msgstr "Instruccions" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:437 -#: .\cookbook\templates\forms\edit_internal_recipe.html:468 -msgid "Save & View" -msgstr "Desa i Comprova" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:441 -#: .\cookbook\templates\forms\edit_internal_recipe.html:474 -msgid "Add Step" -msgstr "Afegir Pas" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:444 -#: .\cookbook\templates\forms\edit_internal_recipe.html:478 -msgid "Add Nutrition" -msgstr "Afegeix nutrients" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:446 -#: .\cookbook\templates\forms\edit_internal_recipe.html:480 -msgid "Remove Nutrition" -msgstr "Elimina nutrients" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:448 -#: .\cookbook\templates\forms\edit_internal_recipe.html:483 -msgid "View Recipe" -msgstr "Veure Recepta" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:450 -#: .\cookbook\templates\forms\edit_internal_recipe.html:485 -msgid "Delete Recipe" -msgstr "Esborra Recepta" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:491 -msgid "Steps" -msgstr "Passos" - #: .\cookbook\templates\forms\ingredients.html:15 msgid "Edit Ingredients" msgstr "Edita Ingredients" @@ -1145,11 +1307,6 @@ msgstr "" "unitats o ingredients es van crear hi haurien de ser el mateix.\n" "Combina dues unitats o ingredients i actualitza totes les receptes amb ells" -#: .\cookbook\templates\forms\ingredients.html:24 -#: .\cookbook\templates\space.html:41 .\cookbook\templates\stats.html:26 -msgid "Units" -msgstr "Unitats" - #: .\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?" @@ -1163,29 +1320,48 @@ msgstr "Combina" 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:18 +#: .\cookbook\templates\generic\delete_template.html:21 #, python-format msgid "Are you sure you want to delete the %(title)s: %(object)s " msgstr "Segur que vols esborrar el %(title)s:%(object)s" -#: .\cookbook\templates\generic\edit_template.html:30 +#: .\cookbook\templates\generic\delete_template.html:26 +msgid "Protected" +msgstr "" + +#: .\cookbook\templates\generic\delete_template.html:41 +msgid "Cascade" +msgstr "" + +#: .\cookbook\templates\generic\delete_template.html:72 +msgid "Cancel" +msgstr "" + +#: .\cookbook\templates\generic\edit_template.html:32 msgid "View" msgstr "Veure" -#: .\cookbook\templates\generic\edit_template.html:34 +#: .\cookbook\templates\generic\edit_template.html:36 msgid "Delete original file" msgstr "Esborra arxiu original" #: .\cookbook\templates\generic\list_template.html:6 -#: .\cookbook\templates\generic\list_template.html:12 +#: .\cookbook\templates\generic\list_template.html:22 msgid "List" msgstr "Llista" -#: .\cookbook\templates\generic\list_template.html:25 +#: .\cookbook\templates\generic\list_template.html:33 +#: .\cookbook\templates\shopping_list.html:33 +#, fuzzy +#| msgid "Open Shopping List" +msgid "Try the new shopping list" +msgstr "Llista de la Compra Oberta" + +#: .\cookbook\templates\generic\list_template.html:45 msgid "Filter" msgstr "Filtre" -#: .\cookbook\templates\generic\list_template.html:30 +#: .\cookbook\templates\generic\list_template.html:50 msgid "Import all" msgstr "Importa tot" @@ -1211,23 +1387,32 @@ msgstr "Registre de Receptes" msgid "Import Recipes" msgstr "Importar Receptes" -#: .\cookbook\templates\include\log_cooking.html:7 +#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 +#: .\cookbook\templates\import_response.html:7 +#: .\cookbook\templates\test.html:14 .\cookbook\templates\test.html:20 +#: .\cookbook\templates\url_import.html:29 +#: .\cookbook\templates\url_import.html:108 +#: .\cookbook\templates\url_import.html:130 +#: .\cookbook\templates\url_import.html:324 +#: .\cookbook\templates\url_import.html:618 .\cookbook\views\delete.py:89 +#: .\cookbook\views\edit.py:200 +msgid "Import" +msgstr "Importar" + +#: .\cookbook\templates\include\log_cooking.html:9 msgid "Log Recipe Cooking" msgstr "Registre de Receptes de Cuina" -#: .\cookbook\templates\include\log_cooking.html:13 +#: .\cookbook\templates\include\log_cooking.html:15 msgid "All fields are optional and can be left empty." msgstr "Tots els camps són opcionals i es poden deixar buits." -#: .\cookbook\templates\include\log_cooking.html:19 +#: .\cookbook\templates\include\log_cooking.html:21 msgid "Rating" msgstr "Valoració" -#: .\cookbook\templates\include\log_cooking.html:27 +#: .\cookbook\templates\include\log_cooking.html:29 #: .\cookbook\templates\include\recipe_open_modal.html:18 -#: .\cookbook\templates\meal_plan.html:283 -#: .\cookbook\templates\meal_plan.html:327 -#: .\cookbook\templates\meal_plan.html:366 msgid "Close" msgstr "Tanca" @@ -1279,8 +1464,8 @@ msgstr "Restableix la cerca" msgid "Last viewed" msgstr "Darrera visualització" -#: .\cookbook\templates\index.html:87 .\cookbook\templates\meal_plan.html:178 -#: .\cookbook\templates\space.html:35 .\cookbook\templates\stats.html:22 +#: .\cookbook\templates\index.html:87 .\cookbook\templates\space.html:37 +#: .\cookbook\templates\stats.html:22 msgid "Recipes" msgstr "Receptes" @@ -1439,151 +1624,23 @@ msgstr "Capçalera" msgid "Cell" msgstr "Cel·la" -#: .\cookbook\templates\meal_plan.html:101 -msgid "New Entry" -msgstr "Nova Entrada" +#: .\cookbook\templates\meal_plan_entry.html:6 +msgid "Meal Plan View" +msgstr "Vista del pla de menjars" -#: .\cookbook\templates\meal_plan.html:113 -#: .\cookbook\templates\shopping_list.html:56 -msgid "Search Recipe" -msgstr "Cerca Recepta" - -#: .\cookbook\templates\meal_plan.html:139 -msgid "Title" -msgstr "Títol" - -#: .\cookbook\templates\meal_plan.html:141 -msgid "Note (optional)" -msgstr "Nota (opcional)" - -#: .\cookbook\templates\meal_plan.html:143 -msgid "" -"You can use markdown to format this field. See the docs here" -msgstr "" -"Pots utilitzar marcadors per donar format a aquest camp. Consulteu els " -"documents aquí" - -#: .\cookbook\templates\meal_plan.html:147 -#: .\cookbook\templates\meal_plan.html:251 -msgid "Serving Count" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:153 -msgid "Create only note" -msgstr "Crear només nota" - -#: .\cookbook\templates\meal_plan.html:168 -#: .\cookbook\templates\shopping_list.html:7 -#: .\cookbook\templates\shopping_list.html:29 -#: .\cookbook\templates\shopping_list.html:714 -msgid "Shopping List" -msgstr "Llista de la Compra" - -#: .\cookbook\templates\meal_plan.html:172 -msgid "Shopping list currently empty" -msgstr "La llista de la compra està buida actualment" - -#: .\cookbook\templates\meal_plan.html:175 -msgid "Open Shopping List" -msgstr "Llista de la Compra Oberta" - -#: .\cookbook\templates\meal_plan.html:189 -msgid "Plan" -msgstr "Pla" - -#: .\cookbook\templates\meal_plan.html:196 -msgid "Number of Days" -msgstr "Nombre de dies" - -#: .\cookbook\templates\meal_plan.html:206 -msgid "Weekday offset" -msgstr "Desplaçament entre setmana" - -#: .\cookbook\templates\meal_plan.html:209 -msgid "" -"Number of days starting from the first day of the week to offset the default " -"view." -msgstr "" -"Nombre de dies començant pel primer dia de la setmana per a desplaçar la " -"vista actual" - -#: .\cookbook\templates\meal_plan.html:217 -#: .\cookbook\templates\meal_plan.html:294 -msgid "Edit plan types" -msgstr "Edita el tipus de pla" - -#: .\cookbook\templates\meal_plan.html:219 -msgid "Show help" -msgstr "Mostra ajuda" - -#: .\cookbook\templates\meal_plan.html:220 -msgid "Week iCal export" -msgstr "Exportació iCal setmanal" - -#: .\cookbook\templates\meal_plan.html:264 #: .\cookbook\templates\meal_plan_entry.html:18 msgid "Created by" msgstr "Creat per" -#: .\cookbook\templates\meal_plan.html:270 #: .\cookbook\templates\meal_plan_entry.html:20 -#: .\cookbook\templates\shopping_list.html:254 +#: .\cookbook\templates\shopping_list.html:232 msgid "Shared with" msgstr "Compartit per" -#: .\cookbook\templates\meal_plan.html:280 -msgid "Add to Shopping" -msgstr "Afegir a la compra" - -#: .\cookbook\templates\meal_plan.html:323 -msgid "New meal type" -msgstr "nou tipus de menú" - -#: .\cookbook\templates\meal_plan.html:338 -msgid "Meal Plan Help" -msgstr "Ajuda del pla de menjars" - -#: .\cookbook\templates\meal_plan.html:344 -msgid "" -"\n" -"

The meal plan module allows planning of meals " -"both with recipes and notes.

\n" -"

Simply select a recipe from the list of " -"recently viewed recipes or search the one you\n" -" want and drag it to the desired plan " -"position. You can also add a note and a title and\n" -" then drag the recipe to create a plan entry " -"with a custom title and note. Creating only\n" -" Notes is possible by dragging the create " -"note box into the plan.

\n" -"

Click on a recipe in order to open the " -"detailed view. There you can also add it to the\n" -" shopping list. You can also add all recipes " -"of a day to the shopping list by\n" -" clicking the shopping cart at the top of the " -"table.

\n" -"

Since a common use case is to plan meals " -"together you can define\n" -" users you want to share your plan with in " -"the settings.\n" -"

\n" -"

You can also edit the types of meals you want " -"to plan. If you share your plan with\n" -" someone with\n" -" different meals, their meal types will " -"appear in your list as well. To prevent\n" -" duplicates (e.g. Other and Misc.)\n" -" name your meal types the same as the users " -"you share your meals with and they will be\n" -" merged.

\n" -" " -msgstr "" - -#: .\cookbook\templates\meal_plan_entry.html:6 -msgid "Meal Plan View" -msgstr "Vista del pla de menjars" +#: .\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." @@ -1682,29 +1739,28 @@ msgid "" "recently viewed them. Keep in mind that data might be outdated." msgstr "" -#: .\cookbook\templates\recipe_view.html:21 .\cookbook\templates\space.html:62 -#: .\cookbook\templates\stats.html:47 -msgid "Comments" -msgstr "Comentaris" +#: .\cookbook\templates\recipe_view.html:26 +msgid "by" +msgstr "per" -#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:118 -#: .\cookbook\views\edit.py:179 +#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:147 +#: .\cookbook\views\edit.py:180 msgid "Comment" msgstr "Comentari" #: .\cookbook\templates\recipes_table.html:19 #: .\cookbook\templates\recipes_table.html:23 -#: .\cookbook\templates\url_import.html:440 +#: .\cookbook\templates\url_import.html:447 msgid "Recipe Image" msgstr "Imatge de la Recepta" #: .\cookbook\templates\recipes_table.html:51 -#: .\cookbook\templates\url_import.html:445 +#: .\cookbook\templates\url_import.html:452 msgid "Preparation time ca." msgstr "Temps de Preparació ca." #: .\cookbook\templates\recipes_table.html:57 -#: .\cookbook\templates\url_import.html:450 +#: .\cookbook\templates\url_import.html:457 msgid "Waiting time ca." msgstr "Temps d'Espera ca." @@ -1720,56 +1776,233 @@ msgstr "Registre de Cuines" msgid "Recipe Home" msgstr "Receptes" -#: .\cookbook\templates\settings.html:25 +#: .\cookbook\templates\search_info.html:5 +#: .\cookbook\templates\search_info.html:9 +#: .\cookbook\templates\settings.html:172 +#, fuzzy +#| msgid "Search String" +msgid "Search Settings" +msgstr "Cerca Cadena" + +#: .\cookbook\templates\search_info.html:10 +msgid "" +"\n" +" Creating the best search experience is complicated and weighs " +"heavily on your personal configuration. \n" +" Changing any of the search settings can have significant impact on " +"the speed and quality of the results.\n" +" Search Methods, Trigrams and Full Text Search configurations are " +"only available if you are using Postgres for your database.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:19 +#, fuzzy +#| msgid "Search" +msgid "Search Methods" +msgstr "Cerca" + +#: .\cookbook\templates\search_info.html:23 +msgid "" +" \n" +" Full text searches attempt to normalize the words provided to " +"match common variants. For example: 'forked', 'forking', 'forks' will all " +"normalize to 'fork'.\n" +" There are several methods available, described below, that will " +"control how the search behavior should react when multiple words are " +"searched.\n" +" Full technical details on how these operate can be viewed on Postgresql's website.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:29 +msgid "" +" \n" +" Simple searches ignore punctuation and common words such as " +"'the', 'a', 'and'. And will treat seperate words as required.\n" +" Searching for 'apple or flour' will return any recipe that " +"includes both 'apple' and 'flour' anywhere in the fields that have been " +"selected for a full text search.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:34 +msgid "" +" \n" +" Phrase searches ignore punctuation, but will search for all of " +"the words in the exact order provided.\n" +" Searching for 'apple or flour' will only return a recipe that " +"includes the exact phrase 'apple or flour' in any of the fields that have " +"been selected for a full text search.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:39 +msgid "" +" \n" +" Web searches simulate functionality found on many web search " +"sites supporting special syntax.\n" +" Placing quotes around several words will convert those words " +"into a phrase.\n" +" 'or' is recongized as searching for the word (or phrase) " +"immediately before 'or' OR the word (or phrase) directly after.\n" +" '-' is recognized as searching for recipes that do not include " +"the word (or phrase) that comes immediately after. \n" +" For example searching for 'apple pie' or cherry -butter will " +"return any recipe that includes the phrase 'apple pie' or the word " +"'cherry' \n" +" in any field included in the full text search but exclude any " +"recipe that has the word 'butter' in any field included.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:48 +msgid "" +" \n" +" Raw search is similar to Web except will take puncuation " +"operators such as '|', '&' and '()'\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:59 +msgid "" +" \n" +" Another approach to searching that also requires Postgresql is " +"fuzzy search or trigram similarity. A trigram is a group of three " +"consecutive characters.\n" +" For example searching for 'apple' will create x trigrams 'app', " +"'ppl', 'ple' and will create a score of how closely words match the " +"generated trigrams.\n" +" One benefit of searching trigams is that a search for 'sandwich' " +"will find mispelled words such as 'sandwhich' that would be missed by other " +"methods.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:69 +#, fuzzy +#| msgid "Search Recipe" +msgid "Search Fields" +msgstr "Cerca Recepta" + +#: .\cookbook\templates\search_info.html:73 +msgid "" +" \n" +" Unaccent is a special case in that it enables searching a field " +"'unaccented' for each search style attempting to ignore accented values. \n" +" For example when you enable unaccent for 'Name' any search " +"(starts with, contains, trigram) will attempt the search ignoring accented " +"characters.\n" +" \n" +" For the other options, you can enable search on any or all " +"fields and they will be combined together with an assumed 'OR'.\n" +" For example enabling 'Name' for Starts With, 'Name' and " +"'Description' for Partial Match and 'Ingredients' and 'Keywords' for Full " +"Search\n" +" and searching for 'apple' will generate a search that will " +"return recipes that have:\n" +" - A recipe name that starts with 'apple'\n" +" - OR a recipe name that contains 'apple'\n" +" - OR a recipe description that contains 'apple'\n" +" - OR a recipe that will have a full text search match ('apple' " +"or 'apples') in ingredients\n" +" - OR a recipe that will have a full text search match in " +"Keywords\n" +"\n" +" Combining too many fields in too many types of search can have a " +"negative impact on performance, create duplicate results or return " +"unexpected results.\n" +" For example, enabling fuzzy search or partial matches will " +"interfere with web search methods. \n" +" Searching for 'apple -pie' with fuzzy search and full text " +"search will return the recipe Apple Pie. Though it is not included in the " +"full text results, it does match the trigram results.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:95 +#, fuzzy +#| msgid "Search" +msgid "Search Index" +msgstr "Cerca" + +#: .\cookbook\templates\search_info.html:99 +msgid "" +" \n" +" Trigram search and Full Text Search both rely on database " +"indexes to perform effectively. \n" +" You can rebuild the indexes on all fields in the Admin page for " +"Recipes and selecting all recipes and running 'rebuild index for selected " +"recipes'\n" +" You can also rebuild indexes at the command line by executing " +"the management command 'python manage.py rebuildindex'\n" +" " +msgstr "" + +#: .\cookbook\templates\settings.html:28 msgid "Account" msgstr "Compte" -#: .\cookbook\templates\settings.html:29 +#: .\cookbook\templates\settings.html:35 msgid "Preferences" msgstr "" -#: .\cookbook\templates\settings.html:33 +#: .\cookbook\templates\settings.html:42 #, fuzzy #| msgid "Settings" msgid "API-Settings" msgstr "Opcions" -#: .\cookbook\templates\settings.html:41 +#: .\cookbook\templates\settings.html:49 +#, fuzzy +#| msgid "Search String" +msgid "Search-Settings" +msgstr "Cerca Cadena" + +#: .\cookbook\templates\settings.html:56 +#, fuzzy +#| msgid "Search String" +msgid "Shopping-Settings" +msgstr "Cerca Cadena" + +#: .\cookbook\templates\settings.html:65 #, fuzzy #| msgid "Settings" msgid "Name Settings" msgstr "Opcions" -#: .\cookbook\templates\settings.html:49 +#: .\cookbook\templates\settings.html:73 #, fuzzy #| msgid "Settings" msgid "Account Settings" msgstr "Opcions" -#: .\cookbook\templates\settings.html:51 +#: .\cookbook\templates\settings.html:75 #, fuzzy #| msgid "Settings" msgid "Emails" msgstr "Opcions" -#: .\cookbook\templates\settings.html:54 +#: .\cookbook\templates\settings.html:78 #: .\cookbook\templates\socialaccount\connections.html:11 msgid "Social" msgstr "" -#: .\cookbook\templates\settings.html:66 +#: .\cookbook\templates\settings.html:91 msgid "Language" msgstr "Idioma" -#: .\cookbook\templates\settings.html:96 +#: .\cookbook\templates\settings.html:121 msgid "Style" msgstr "Estil" -#: .\cookbook\templates\settings.html:116 +#: .\cookbook\templates\settings.html:142 msgid "API Token" msgstr "Token API" -#: .\cookbook\templates\settings.html:117 +#: .\cookbook\templates\settings.html:143 msgid "" "You can use both basic authentication and token based authentication to " "access the REST API." @@ -1777,7 +2010,7 @@ msgstr "" "Podeu utilitzar tant l’autenticació bàsica com l’autenticació basada en " "token per accedir a l’API REST." -#: .\cookbook\templates\settings.html:134 +#: .\cookbook\templates\settings.html:160 msgid "" "Use the token as an Authorization header prefixed by the word token as shown " "in the following examples:" @@ -1785,10 +2018,68 @@ 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:136 +#: .\cookbook\templates\settings.html:162 msgid "or" msgstr "o" +#: .\cookbook\templates\settings.html:173 +msgid "" +"There are many options to configure the search depending on your personal " +"preferences." +msgstr "" + +#: .\cookbook\templates\settings.html:174 +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 +msgid "" +"If you do want to configure the search you can read about the different " +"options here." +msgstr "" + +#: .\cookbook\templates\settings.html:180 +msgid "Fuzzy" +msgstr "" + +#: .\cookbook\templates\settings.html:181 +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 +msgid "This is the default behavior" +msgstr "" + +#: .\cookbook\templates\settings.html:183 +#: .\cookbook\templates\settings.html:191 +msgid "Apply" +msgstr "" + +#: .\cookbook\templates\settings.html:188 +msgid "Precise" +msgstr "" + +#: .\cookbook\templates\settings.html:189 +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 +msgid "Perfect for large Databases" +msgstr "" + +#: .\cookbook\templates\settings.html:207 +#, fuzzy +#| msgid "Shopping List" +msgid "Shopping Settings" +msgstr "Llista de la Compra" + #: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5 msgid "Cookbook Setup" msgstr "Opcions del Cookbook" @@ -1808,51 +2099,74 @@ msgstr "" msgid "Create Superuser account" msgstr "Crear compte de superusuari" -#: .\cookbook\templates\shopping_list.html:79 +#: .\cookbook\templates\shopping_list.html:8 +#: .\cookbook\templates\shopping_list.html:29 +#: .\cookbook\templates\shopping_list.html:663 +msgid "Shopping List" +msgstr "Llista de la Compra" + +#: .\cookbook\templates\shopping_list.html:55 +msgid "Search Recipe" +msgstr "Cerca Recepta" + +#: .\cookbook\templates\shopping_list.html:72 msgid "Shopping Recipes" msgstr "Llista de Compra de Receptes" -#: .\cookbook\templates\shopping_list.html:83 +#: .\cookbook\templates\shopping_list.html:74 msgid "No recipes selected" msgstr "Recepta no sel·leccionada" -#: .\cookbook\templates\shopping_list.html:150 +#: .\cookbook\templates\shopping_list.html:131 msgid "Entry Mode" msgstr "" -#: .\cookbook\templates\shopping_list.html:158 +#: .\cookbook\templates\shopping_list.html:139 msgid "Add Entry" msgstr "" -#: .\cookbook\templates\shopping_list.html:174 +#: .\cookbook\templates\shopping_list.html:152 msgid "Amount" msgstr "Quantitat" -#: .\cookbook\templates\shopping_list.html:240 +#: .\cookbook\templates\shopping_list.html:164 +msgid "Select Unit" +msgstr "Selecciona Unitat" + +#: .\cookbook\templates\shopping_list.html:166 +#: .\cookbook\templates\shopping_list.html:189 +#: .\cookbook\templates\shopping_list.html:219 +#: .\cookbook\templates\shopping_list.html:243 +#: .\cookbook\templates\url_import.html:505 +#: .\cookbook\templates\url_import.html:537 +msgid "Select" +msgstr "Selecciona" + +#: .\cookbook\templates\shopping_list.html:187 +msgid "Select Food" +msgstr "Selecciona Menjar" + +#: .\cookbook\templates\shopping_list.html:218 msgid "Select Supermarket" msgstr "Seleccioni supermercat" -#: .\cookbook\templates\shopping_list.html:264 +#: .\cookbook\templates\shopping_list.html:242 msgid "Select User" msgstr "Selecciona usuari" -#: .\cookbook\templates\shopping_list.html:283 +#: .\cookbook\templates\shopping_list.html:258 msgid "Finished" msgstr "Acabat" -#: .\cookbook\templates\shopping_list.html:296 +#: .\cookbook\templates\shopping_list.html:267 msgid "You are offline, shopping list might not syncronize." msgstr "" "Estàs fora de línia, és possible que la llista de compra no es sincronitzi." -#: .\cookbook\templates\shopping_list.html:361 +#: .\cookbook\templates\shopping_list.html:318 msgid "Copy/Export" msgstr "Copia/Exporta" -#: .\cookbook\templates\shopping_list.html:365 -msgid "List Prefix" -msgstr "Prefix de Llista" - #: .\cookbook\templates\socialaccount\connections.html:4 #: .\cookbook\templates\socialaccount\connections.html:15 msgid "Account Connections" @@ -1902,94 +2216,90 @@ msgstr "" msgid "Sign in using" msgstr "" -#: .\cookbook\templates\space.html:23 +#: .\cookbook\templates\space.html:25 msgid "Space:" msgstr "" -#: .\cookbook\templates\space.html:24 +#: .\cookbook\templates\space.html:26 msgid "Manage Subscription" msgstr "" -#: .\cookbook\templates\space.html:32 .\cookbook\templates\stats.html:19 +#: .\cookbook\templates\space.html:34 .\cookbook\templates\stats.html:19 msgid "Number of objects" msgstr "Nombre d'objectes" -#: .\cookbook\templates\space.html:45 .\cookbook\templates\stats.html:30 +#: .\cookbook\templates\space.html:54 .\cookbook\templates\stats.html:30 msgid "Recipe Imports" msgstr "Importacions de receptes" -#: .\cookbook\templates\space.html:53 .\cookbook\templates\stats.html:38 +#: .\cookbook\templates\space.html:62 .\cookbook\templates\stats.html:38 msgid "Objects stats" msgstr "Estadístiques d'objectes" -#: .\cookbook\templates\space.html:56 .\cookbook\templates\stats.html:41 +#: .\cookbook\templates\space.html:65 .\cookbook\templates\stats.html:41 msgid "Recipes without Keywords" msgstr "Receptes sense paraules clau" -#: .\cookbook\templates\space.html:58 .\cookbook\templates\stats.html:43 -msgid "External Recipes" -msgstr "Receptes Externes" - -#: .\cookbook\templates\space.html:60 .\cookbook\templates\stats.html:45 +#: .\cookbook\templates\space.html:73 .\cookbook\templates\stats.html:45 msgid "Internal Recipes" msgstr "Receptes Internes" -#: .\cookbook\templates\space.html:73 +#: .\cookbook\templates\space.html:89 msgid "Members" msgstr "" -#: .\cookbook\templates\space.html:77 +#: .\cookbook\templates\space.html:95 #, fuzzy #| msgid "Invite Links" msgid "Invite User" msgstr "Enllaços Invitació" -#: .\cookbook\templates\space.html:88 +#: .\cookbook\templates\space.html:107 msgid "User" msgstr "" -#: .\cookbook\templates\space.html:89 +#: .\cookbook\templates\space.html:108 msgid "Groups" msgstr "" -#: .\cookbook\templates\space.html:105 +#: .\cookbook\templates\space.html:119 #, fuzzy #| msgid "Admin" msgid "admin" msgstr "Admin" -#: .\cookbook\templates\space.html:106 +#: .\cookbook\templates\space.html:120 msgid "user" msgstr "" -#: .\cookbook\templates\space.html:107 +#: .\cookbook\templates\space.html:121 msgid "guest" msgstr "" -#: .\cookbook\templates\space.html:108 +#: .\cookbook\templates\space.html:122 #, fuzzy #| msgid "Remove" msgid "remove" msgstr "Eliminar" -#: .\cookbook\templates\space.html:112 +#: .\cookbook\templates\space.html:126 msgid "Update" msgstr "" -#: .\cookbook\templates\space.html:116 +#: .\cookbook\templates\space.html:130 #, fuzzy #| msgid "You cannot edit this storage!" msgid "You cannot edit yourself." msgstr "No podeu editar aquest emmagatzematge." -#: .\cookbook\templates\space.html:123 +#: .\cookbook\templates\space.html:136 #, fuzzy #| msgid "There are no recipes in this book yet." msgid "There are no members in your space yet!" msgstr "Encara no hi ha receptes en aquest llibre." -#: .\cookbook\templates\space.html:130 .\cookbook\templates\system.html:21 -#: .\cookbook\views\lists.py:115 +#: .\cookbook\templates\space.html:143 .\cookbook\templates\system.html:21 +#: .\cookbook\views\lists.py:85 msgid "Invite Links" msgstr "Enllaços Invitació" @@ -1997,6 +2307,10 @@ msgstr "Enllaços Invitació" msgid "Stats" msgstr "Estadístiques" +#: .\cookbook\templates\stats.html:10 +msgid "Statistics" +msgstr "Estadístiques" + #: .\cookbook\templates\system.html:22 msgid "Show Links" msgstr "Mostra Enllaços" @@ -2122,159 +2436,186 @@ msgstr "" "Això està bé, però no es recomana com alguns\n" "les funcions només funcionen amb bases de dades postgres." -#: .\cookbook\templates\url_import.html:6 +#: .\cookbook\templates\url_import.html:8 msgid "URL Import" msgstr "Importació d’URL" -#: .\cookbook\templates\url_import.html:31 +#: .\cookbook\templates\url_import.html:33 msgid "Drag me to your bookmarks to import recipes from anywhere" msgstr "" -#: .\cookbook\templates\url_import.html:32 +#: .\cookbook\templates\url_import.html:34 #, fuzzy #| msgid "Bookmark saved!" msgid "Bookmark Me!" msgstr "Marcador desat!" -#: .\cookbook\templates\url_import.html:61 +#: .\cookbook\templates\url_import.html:38 +msgid "URL" +msgstr "" + +#: .\cookbook\templates\url_import.html:40 +msgid "App" +msgstr "" + +#: .\cookbook\templates\url_import.html:64 msgid "Enter website URL" msgstr "Introduïu l'URL del lloc web" -#: .\cookbook\templates\url_import.html:97 +#: .\cookbook\templates\url_import.html:104 msgid "Select recipe files to import or drop them here..." msgstr "" -#: .\cookbook\templates\url_import.html:118 +#: .\cookbook\templates\url_import.html:125 msgid "Paste json or html source here to load recipe." msgstr "" -#: .\cookbook\templates\url_import.html:146 +#: .\cookbook\templates\url_import.html:153 #, fuzzy #| msgid "View Recipe" msgid "Preview Recipe Data" msgstr "Veure Recepta" -#: .\cookbook\templates\url_import.html:147 +#: .\cookbook\templates\url_import.html:154 msgid "Drag recipe attributes from the right into the appropriate box below." msgstr "" -#: .\cookbook\templates\url_import.html:156 -#: .\cookbook\templates\url_import.html:173 -#: .\cookbook\templates\url_import.html:190 -#: .\cookbook\templates\url_import.html:209 -#: .\cookbook\templates\url_import.html:227 -#: .\cookbook\templates\url_import.html:242 -#: .\cookbook\templates\url_import.html:257 -#: .\cookbook\templates\url_import.html:273 -#: .\cookbook\templates\url_import.html:300 -#: .\cookbook\templates\url_import.html:351 +#: .\cookbook\templates\url_import.html:163 +#: .\cookbook\templates\url_import.html:180 +#: .\cookbook\templates\url_import.html:197 +#: .\cookbook\templates\url_import.html:216 +#: .\cookbook\templates\url_import.html:234 +#: .\cookbook\templates\url_import.html:249 +#: .\cookbook\templates\url_import.html:264 +#: .\cookbook\templates\url_import.html:280 +#: .\cookbook\templates\url_import.html:307 +#: .\cookbook\templates\url_import.html:358 msgid "Clear Contents" msgstr "" -#: .\cookbook\templates\url_import.html:158 +#: .\cookbook\templates\url_import.html:165 msgid "Text dragged here will be appended to the name." msgstr "" -#: .\cookbook\templates\url_import.html:175 +#: .\cookbook\templates\url_import.html:178 +msgid "Description" +msgstr "" + +#: .\cookbook\templates\url_import.html:182 msgid "Text dragged here will be appended to the description." msgstr "" -#: .\cookbook\templates\url_import.html:192 +#: .\cookbook\templates\url_import.html:199 msgid "Keywords dragged here will be appended to current list" msgstr "" -#: .\cookbook\templates\url_import.html:207 +#: .\cookbook\templates\url_import.html:214 msgid "Image" msgstr "" -#: .\cookbook\templates\url_import.html:239 +#: .\cookbook\templates\url_import.html:246 #, fuzzy #| msgid "Preparation Time" msgid "Prep Time" msgstr "Temps de preparació" -#: .\cookbook\templates\url_import.html:254 +#: .\cookbook\templates\url_import.html:261 #, fuzzy #| msgid "Time" msgid "Cook Time" msgstr "Temps" -#: .\cookbook\templates\url_import.html:275 +#: .\cookbook\templates\url_import.html:282 msgid "Ingredients dragged here will be appended to current list." msgstr "" -#: .\cookbook\templates\url_import.html:302 +#: .\cookbook\templates\url_import.html:304 +#: .\cookbook\templates\url_import.html:579 +msgid "Instructions" +msgstr "Instruccions" + +#: .\cookbook\templates\url_import.html:309 msgid "" "Recipe instructions dragged here will be appended to current instructions." msgstr "" -#: .\cookbook\templates\url_import.html:325 +#: .\cookbook\templates\url_import.html:332 #, fuzzy #| msgid "Discovered Recipes" msgid "Discovered Attributes" msgstr "Receptes Descobertes" -#: .\cookbook\templates\url_import.html:327 +#: .\cookbook\templates\url_import.html:334 msgid "" "Drag recipe attributes from below into the appropriate box on the left. " "Click any node to display its full properties." msgstr "" -#: .\cookbook\templates\url_import.html:344 +#: .\cookbook\templates\url_import.html:351 #, fuzzy #| msgid "Show as header" msgid "Show Blank Field" msgstr "Mostra com a capçalera" -#: .\cookbook\templates\url_import.html:349 +#: .\cookbook\templates\url_import.html:356 msgid "Blank Field" msgstr "" -#: .\cookbook\templates\url_import.html:353 +#: .\cookbook\templates\url_import.html:360 msgid "Items dragged to Blank Field will be appended." msgstr "" -#: .\cookbook\templates\url_import.html:400 +#: .\cookbook\templates\url_import.html:407 #, fuzzy #| msgid "Delete Step" msgid "Delete Text" msgstr "Esborra Pas" -#: .\cookbook\templates\url_import.html:413 +#: .\cookbook\templates\url_import.html:420 #, fuzzy #| msgid "Delete Recipe" msgid "Delete image" msgstr "Esborra Recepta" -#: .\cookbook\templates\url_import.html:429 +#: .\cookbook\templates\url_import.html:436 msgid "Recipe Name" msgstr "Nom de la Recepta" -#: .\cookbook\templates\url_import.html:433 +#: .\cookbook\templates\url_import.html:440 #, fuzzy #| msgid "Recipe Markup Specification" msgid "Recipe Description" msgstr "Especificació de marcatge de receptes" -#: .\cookbook\templates\url_import.html:494 -#: .\cookbook\templates\url_import.html:526 -#: .\cookbook\templates\url_import.html:582 +#: .\cookbook\templates\url_import.html:504 +#: .\cookbook\templates\url_import.html:536 +#: .\cookbook\templates\url_import.html:596 msgid "Select one" msgstr "Sel·lecciona un" -#: .\cookbook\templates\url_import.html:596 +#: .\cookbook\templates\url_import.html:554 +msgid "Note" +msgstr "Nota" + +#: .\cookbook\templates\url_import.html:597 +#, fuzzy +#| msgid "All Keywords" +msgid "Add Keyword" +msgstr "Totes les paraules clau" + +#: .\cookbook\templates\url_import.html:610 msgid "All Keywords" msgstr "Totes les paraules clau" -#: .\cookbook\templates\url_import.html:599 +#: .\cookbook\templates\url_import.html:613 msgid "Import all keywords, not only the ones already existing." msgstr "Importa totes les paraules clau, no només les ja existents." -#: .\cookbook\templates\url_import.html:626 +#: .\cookbook\templates\url_import.html:640 msgid "Information" msgstr "Informació" -#: .\cookbook\templates\url_import.html:628 +#: .\cookbook\templates\url_import.html:642 msgid "" " Only websites containing ld+json or microdata information can currently\n" " be imported. Most big recipe pages " @@ -2293,50 +2634,192 @@ msgstr "" "un exemple a\n" "problemes de github." -#: .\cookbook\templates\url_import.html:636 +#: .\cookbook\templates\url_import.html:650 msgid "Google ld+json Info" msgstr "Google ld+json Info" -#: .\cookbook\templates\url_import.html:639 +#: .\cookbook\templates\url_import.html:653 msgid "GitHub Issues" msgstr "Problemes de GitHub" -#: .\cookbook\templates\url_import.html:641 +#: .\cookbook\templates\url_import.html:655 msgid "Recipe Markup Specification" msgstr "Especificació de marcatge de receptes" -#: .\cookbook\views\api.py:79 +#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:170 #, fuzzy #| msgid "Parameter filter_list incorrectly formatted" msgid "Parameter updated_at incorrectly formatted" msgstr "El paràmetre filter_list té un format incorrecte" -#: .\cookbook\views\api.py:580 .\cookbook\views\views.py:303 -msgid "This feature is not available in the demo version!" +#: .\cookbook\views\api.py:190 .\cookbook\views\api.py:291 +#, python-brace-format +msgid "No {self.basename} with id {pk} exists" msgstr "" -#: .\cookbook\views\api.py:603 +#: .\cookbook\views\api.py:194 +msgid "Cannot merge with the same object!" +msgstr "" + +#: .\cookbook\views\api.py:201 +#, python-brace-format +msgid "No {self.basename} with id {target} exists" +msgstr "" + +#: .\cookbook\views\api.py:206 +msgid "Cannot merge with child object!" +msgstr "" + +#: .\cookbook\views\api.py:239 +#, python-brace-format +msgid "{source.name} was merged successfully with {target.name}" +msgstr "" + +#: .\cookbook\views\api.py:244 +#, python-brace-format +msgid "An error occurred attempting to merge {source.name} with {target.name}" +msgstr "" + +#: .\cookbook\views\api.py:300 +#, python-brace-format +msgid "{child.name} was moved successfully to the root." +msgstr "" + +#: .\cookbook\views\api.py:303 .\cookbook\views\api.py:321 +msgid "An error occurred attempting to move " +msgstr "" + +#: .\cookbook\views\api.py:306 +msgid "Cannot move an object to itself!" +msgstr "" + +#: .\cookbook\views\api.py:312 +#, python-brace-format +msgid "No {self.basename} with id {parent} exists" +msgstr "" + +#: .\cookbook\views\api.py:318 +#, python-brace-format +msgid "{child.name} was moved successfully to parent {parent.name}" +msgstr "" + +#: .\cookbook\views\api.py:470 +#, python-brace-format +msgid "{obj.name} was removed from the shopping list." +msgstr "" + +#: .\cookbook\views\api.py:475 .\cookbook\views\api.py:726 +#, python-brace-format +msgid "{obj.name} was added to the shopping list." +msgstr "" + +#: .\cookbook\views\api.py:587 +msgid "ID of recipe a step is part of. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:588 +msgid "Query string matched (fuzzy) against object name." +msgstr "" + +#: .\cookbook\views\api.py:631 +msgid "" +"Query string matched (fuzzy) against recipe name. In the future also " +"fulltext search." +msgstr "" + +#: .\cookbook\views\api.py:632 +msgid "ID of keyword a recipe should have. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:633 +msgid "ID of food a recipe should have. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:634 +msgid "ID of unit a recipe should have." +msgstr "" + +#: .\cookbook\views\api.py:635 +msgid "Rating a recipe should have. [0 - 5]" +msgstr "" + +#: .\cookbook\views\api.py:636 +msgid "ID of book a recipe should be in. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:637 +msgid "" +"If recipe should have all (AND=false) or any (OR=true) of the " +"provided keywords." +msgstr "" + +#: .\cookbook\views\api.py:638 +msgid "" +"If recipe should have all (AND=false) or any (OR=true) of the " +"provided foods." +msgstr "" + +#: .\cookbook\views\api.py:639 +msgid "" +"If recipe should be in all (AND=false) or any (OR=true) of the " +"provided books." +msgstr "" + +#: .\cookbook\views\api.py:640 +msgid "If only internal recipes should be returned. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:641 +msgid "Returns the results in randomized order. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:642 +msgid "Returns new results first in search results. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:768 +msgid "" +"Returns the shopping list entry with a primary key of id. Multiple values " +"allowed." +msgstr "" + +#: .\cookbook\views\api.py:771 +msgid "" +"Filter shopping list entries on checked. [true, false, both, recent]
- recent includes unchecked items and recently completed items." +msgstr "" + +#: .\cookbook\views\api.py:773 +msgid "Returns the shopping list entries sorted by supermarket category order." +msgstr "" + +#: .\cookbook\views\api.py:922 .\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 "" + +#: .\cookbook\views\api.py:944 msgid "Sync successful!" msgstr "Sincronització correcte" -#: .\cookbook\views\api.py:608 +#: .\cookbook\views\api.py:949 msgid "Error synchronizing with Storage" msgstr "Error de sincronització amb emmagatzematge" -#: .\cookbook\views\api.py:686 +#: .\cookbook\views\api.py:1028 msgid "Nothing to do." msgstr "" -#: .\cookbook\views\api.py:701 +#: .\cookbook\views\api.py:1043 msgid "The requested site provided malformed data and cannot be read." msgstr "" "El lloc sol·licitat proporcionava dades malformades i no es pot llegir." -#: .\cookbook\views\api.py:708 +#: .\cookbook\views\api.py:1050 msgid "The requested page could not be found." msgstr "No s'ha pogut trobar la pàgina sol·licitada." -#: .\cookbook\views\api.py:717 +#: .\cookbook\views\api.py:1068 msgid "" "The requested site does not provide any recognized data format to import the " "recipe from." @@ -2344,29 +2827,33 @@ msgstr "" "El lloc sol·licitat no proporciona cap format de dades reconegut des d’on " "importar la recepta." -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:1082 +msgid "Connection Refused." +msgstr "" + +#: .\cookbook\views\api.py:1091 #, fuzzy #| msgid "The requested page could not be found." msgid "No useable data could be found." msgstr "No s'ha pogut trobar la pàgina sol·licitada." -#: .\cookbook\views\api.py:747 +#: .\cookbook\views\api.py:1107 msgid "I couldn't find anything to do." msgstr "" -#: .\cookbook\views\data.py:31 .\cookbook\views\data.py:122 -#: .\cookbook\views\edit.py:50 .\cookbook\views\import_export.py:67 -#: .\cookbook\views\new.py:32 +#: .\cookbook\views\data.py:34 .\cookbook\views\data.py:129 +#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:80 +#: .\cookbook\views\new.py:33 msgid "You have reached the maximum number of recipes for your space." msgstr "" -#: .\cookbook\views\data.py:35 .\cookbook\views\data.py:126 -#: .\cookbook\views\edit.py:54 .\cookbook\views\import_export.py:71 -#: .\cookbook\views\new.py:36 +#: .\cookbook\views\data.py:38 .\cookbook\views\data.py:133 +#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:84 +#: .\cookbook\views\new.py:37 msgid "You have more users than allowed in your space." msgstr "" -#: .\cookbook\views\data.py:104 +#: .\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." @@ -2374,166 +2861,191 @@ msgstr[0] "Edició per lots Completada. %(count)d La Recepta s’ha actualitzat. msgstr[1] "" "Edició per lots Completada. %(count)d Les receptes s’han actualitzat." -#: .\cookbook\views\delete.py:72 +#: .\cookbook\views\delete.py:101 msgid "Monitor" msgstr "Monitoratge" -#: .\cookbook\views\delete.py:96 .\cookbook\views\lists.py:102 -#: .\cookbook\views\new.py:98 +#: .\cookbook\views\delete.py:125 .\cookbook\views\lists.py:71 +#: .\cookbook\views\new.py:101 msgid "Storage Backend" msgstr "Backend d'emmagatzematge" -#: .\cookbook\views\delete.py:106 +#: .\cookbook\views\delete.py:135 msgid "" "Could not delete this storage backend as it is used in at least one monitor." msgstr "" "No s'ha pogut suprimir aquest fons d'emmagatzematge, ja que s'utilitza en " "almenys un monitor." -#: .\cookbook\views\delete.py:129 .\cookbook\views\edit.py:213 -#: .\cookbook\views\new.py:156 +#: .\cookbook\views\delete.py:158 msgid "Recipe Book" msgstr "Llibre de Receptes" -#: .\cookbook\views\delete.py:141 +#: .\cookbook\views\delete.py:170 msgid "Bookmarks" msgstr "Marcadors" -#: .\cookbook\views\delete.py:163 .\cookbook\views\new.py:252 +#: .\cookbook\views\delete.py:192 .\cookbook\views\new.py:238 msgid "Invite Link" msgstr "Enllaç de invitació" -#: .\cookbook\views\edit.py:119 -msgid "Food" -msgstr "Menjar" - -#: .\cookbook\views\edit.py:128 +#: .\cookbook\views\edit.py:125 msgid "You cannot edit this storage!" msgstr "No podeu editar aquest emmagatzematge." -#: .\cookbook\views\edit.py:148 +#: .\cookbook\views\edit.py:149 msgid "Storage saved!" msgstr "Emmagatzematge desat." -#: .\cookbook\views\edit.py:154 +#: .\cookbook\views\edit.py:155 msgid "There was an error updating this storage backend!" msgstr "S'ha produït un error en actualitzar aquest backend d'emmagatzematge." -#: .\cookbook\views\edit.py:165 -msgid "Storage" -msgstr "Emmagatzematge" - -#: .\cookbook\views\edit.py:261 +#: .\cookbook\views\edit.py:248 msgid "Changes saved!" msgstr "Canvis desats!" -#: .\cookbook\views\edit.py:265 +#: .\cookbook\views\edit.py:252 msgid "Error saving changes!" msgstr "Error al desar canvis!" -#: .\cookbook\views\edit.py:299 -msgid "Units merged!" -msgstr "Unitats fusionades!" - -#: .\cookbook\views\edit.py:301 .\cookbook\views\edit.py:317 -msgid "Cannot merge with the same object!" -msgstr "" - -#: .\cookbook\views\edit.py:315 -msgid "Foods merged!" -msgstr "Menjars Fusionats!" - -#: .\cookbook\views\import_export.py:93 +#: .\cookbook\views\import_export.py:106 msgid "Importing is not implemented for this provider" msgstr "" -#: .\cookbook\views\import_export.py:115 +#: .\cookbook\views\import_export.py:127 +msgid "" +"The PDF Exporter is not enabled on this instance as it is still in an " +"experimental state." +msgstr "" + +#: .\cookbook\views\import_export.py:132 msgid "Exporting is not implemented for this provider" msgstr "" -#: .\cookbook\views\lists.py:40 +#: .\cookbook\views\lists.py:25 msgid "Import Log" msgstr "Importa Registre" -#: .\cookbook\views\lists.py:53 +#: .\cookbook\views\lists.py:38 msgid "Discovery" msgstr "Descobriment" -#: .\cookbook\views\lists.py:85 +#: .\cookbook\views\lists.py:54 msgid "Shopping Lists" msgstr "Llistes de Compra" -#: .\cookbook\views\new.py:123 +#: .\cookbook\views\lists.py:148 +#, fuzzy +#| msgid "Supermarket" +msgid "Supermarkets" +msgstr "Supermercat" + +#: .\cookbook\views\lists.py:164 +#, fuzzy +#| msgid "Shopping Recipes" +msgid "Shopping Categories" +msgstr "Llista de Compra de Receptes" + +#: .\cookbook\views\lists.py:217 +msgid "Steps" +msgstr "Passos" + +#: .\cookbook\views\lists.py:232 +#, fuzzy +#| msgid "Shopping List" +msgid "New Shopping List" +msgstr "Llista de la Compra" + +#: .\cookbook\views\new.py:126 msgid "Imported new recipe!" msgstr "Nova Recepta importada!" -#: .\cookbook\views\new.py:126 +#: .\cookbook\views\new.py:129 msgid "There was an error importing this recipe!" msgstr "S'ha produït un error en importar la recepta!" -#: .\cookbook\views\new.py:226 +#: .\cookbook\views\new.py:212 msgid "Hello" msgstr "" -#: .\cookbook\views\new.py:226 +#: .\cookbook\views\new.py:212 msgid "You have been invited by " msgstr "" -#: .\cookbook\views\new.py:227 +#: .\cookbook\views\new.py:213 msgid " to join their Tandoor Recipes space " msgstr "" -#: .\cookbook\views\new.py:228 +#: .\cookbook\views\new.py:214 msgid "Click the following link to activate your account: " msgstr "" -#: .\cookbook\views\new.py:229 +#: .\cookbook\views\new.py:215 msgid "" "If the link does not work use the following code to manually join the space: " msgstr "" -#: .\cookbook\views\new.py:230 +#: .\cookbook\views\new.py:216 msgid "The invitation is valid until " msgstr "" -#: .\cookbook\views\new.py:231 +#: .\cookbook\views\new.py:217 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " msgstr "" -#: .\cookbook\views\new.py:234 +#: .\cookbook\views\new.py:220 msgid "Tandoor Recipes Invite" msgstr "" -#: .\cookbook\views\new.py:241 +#: .\cookbook\views\new.py:227 msgid "Invite link successfully send to user." msgstr "" -#: .\cookbook\views\new.py:244 +#: .\cookbook\views\new.py:230 msgid "" "You have send to many emails, please share the link manually or wait a few " "hours." msgstr "" -#: .\cookbook\views\new.py:246 +#: .\cookbook\views\new.py:232 msgid "Email to user could not be send, please share link manually." msgstr "" -#: .\cookbook\views\views.py:129 +#: .\cookbook\views\views.py:126 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:177 +#: .\cookbook\views\views.py:174 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:188 +#: .\cookbook\views\views.py:185 msgid "Comment saved!" msgstr "Comentari Desat!" -#: .\cookbook\views\views.py:395 +#: .\cookbook\views\views.py:276 +msgid "This feature is not available in the demo version!" +msgstr "" + +#: .\cookbook\views\views.py:335 +msgid "You must select at least one field to search!" +msgstr "" + +#: .\cookbook\views\views.py:340 +msgid "" +"To use this search method you must select at least one full text search " +"field!" +msgstr "" + +#: .\cookbook\views\views.py:344 +msgid "Fuzzy search is not compatible with this search method!" +msgstr "" + +#: .\cookbook\views\views.py:470 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 " @@ -2543,44 +3055,246 @@ msgstr "" "Si heu oblidat les vostres credencials de superusuari, consulteu la " "documentació de django sobre com restablir les contrasenyes." -#: .\cookbook\views\views.py:402 +#: .\cookbook\views\views.py:477 msgid "Passwords dont match!" msgstr "Les contrasenyes no coincideixen!" -#: .\cookbook\views\views.py:418 +#: .\cookbook\views\views.py:493 msgid "User has been created, please login!" msgstr "L'usuari s'ha creat, si us plau inicieu la sessió!" -#: .\cookbook\views\views.py:434 +#: .\cookbook\views\views.py:509 msgid "Malformed Invite Link supplied!" msgstr "S'ha proporcionat un enllaç d'invitació mal format." -#: .\cookbook\views\views.py:441 +#: .\cookbook\views\views.py:516 #, fuzzy #| msgid "You are not logged in and therefore cannot view this page!" msgid "You are already member of a space and therefore cannot join this one." msgstr "No heu iniciat la sessió i, per tant, no podeu veure aquesta pàgina." -#: .\cookbook\views\views.py:452 +#: .\cookbook\views\views.py:527 msgid "Successfully joined space." msgstr "" -#: .\cookbook\views\views.py:458 +#: .\cookbook\views\views.py:533 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:522 +#: .\cookbook\views\views.py:614 msgid "" "Reporting share links is not enabled for this instance. Please notify the " "page administrator to report problems." msgstr "" -#: .\cookbook\views\views.py:528 +#: .\cookbook\views\views.py:620 msgid "" "Recipe sharing link has been disabled! For additional information please " "contact the page administrator." msgstr "" +#~ msgid "New Unit" +#~ msgstr "Nova Unitat" + +#~ msgid "New unit that other gets replaced by." +#~ msgstr "Nova unitat per la qual se substitueix una altra." + +#~ msgid "Old Unit" +#~ msgstr "Unitat Antiga" + +#~ msgid "Unit that should be replaced." +#~ msgstr "Unitat que s’hauria de substituir." + +#~ msgid "New Food" +#~ msgstr "Menjar Nou" + +#~ msgid "New food that other gets replaced by." +#~ msgstr "Nou menjar que altres substitueixen." + +#~ msgid "Old Food" +#~ msgstr "Antic Menjar" + +#~ msgid "New Entry" +#~ msgstr "Nova Entrada" + +#~ msgid "Title" +#~ msgstr "Títol" + +#~ msgid "Note (optional)" +#~ msgstr "Nota (opcional)" + +#~ msgid "" +#~ "You can use markdown to format this field. See the docs here" +#~ msgstr "" +#~ "Pots utilitzar marcadors per donar format a aquest camp. Consulteu els documents aquí" + +#~ msgid "Create only note" +#~ msgstr "Crear només nota" + +#~ msgid "Plan" +#~ msgstr "Pla" + +#~ msgid "Number of Days" +#~ msgstr "Nombre de dies" + +#~ msgid "Weekday offset" +#~ msgstr "Desplaçament entre setmana" + +#~ msgid "" +#~ "Number of days starting from the first day of the week to offset the " +#~ "default view." +#~ msgstr "" +#~ "Nombre de dies començant pel primer dia de la setmana per a desplaçar la " +#~ "vista actual" + +#~ msgid "Edit plan types" +#~ msgstr "Edita el tipus de pla" + +#~ msgid "Show help" +#~ msgstr "Mostra ajuda" + +#~ msgid "Week iCal export" +#~ msgstr "Exportació iCal setmanal" + +#~ msgid "Add to Shopping" +#~ msgstr "Afegir a la compra" + +#~ msgid "New meal type" +#~ msgstr "nou tipus de menú" + +#~ msgid "Meal Plan Help" +#~ msgstr "Ajuda del pla de menjars" + +#~ msgid "Units merged!" +#~ msgstr "Unitats fusionades!" + +#~ msgid "Foods merged!" +#~ msgstr "Menjars Fusionats!" + +#~ msgid "Utensils" +#~ msgstr "Estris" + +#~ msgid "Storage Data" +#~ msgstr "Emmagatzematge de dades" + +#~ msgid "Storage Backends" +#~ msgstr "Backends d'emmagatzematge" + +#~ msgid "Configure Sync" +#~ msgstr "Configurar Sync" + +#~ msgid "Discovered Recipes" +#~ msgstr "Receptes Descobertes" + +#~ msgid "Discovery Log" +#~ msgstr "Registre de descobriment" + +#~ msgid "Units & Ingredients" +#~ msgstr "Unitats i ingredients" + +#~ msgid "New Book" +#~ msgstr "Nou Llibre" + +#~ msgid "Toggle Recipes" +#~ msgstr "Commuta Receptes" + +#~ msgid "There are no recipes in this book yet." +#~ msgstr "Encara no hi ha receptes en aquest llibre." + +#~ msgid "Waiting Time" +#~ msgstr "Temps d'Espera" + +#~ msgid "Select Keywords" +#~ msgstr "Selecciona Paraules clau" + +#~ msgid "Nutrition" +#~ msgstr "Nutrició" + +#~ msgid "Delete Step" +#~ msgstr "Esborra Pas" + +#~ msgid "Calories" +#~ msgstr "Calories" + +#~ msgid "Carbohydrates" +#~ msgstr "Hidrats de carboni" + +#~ msgid "Fats" +#~ msgstr "Greixos" + +#~ msgid "Proteins" +#~ msgstr "Proteïnes" + +#~ msgid "Step" +#~ msgstr "Pas" + +#~ msgid "Show as header" +#~ msgstr "Mostra com a capçalera" + +#~ msgid "Hide as header" +#~ msgstr "Amaga com a capçalera" + +#~ msgid "Move Up" +#~ msgstr "Mou Amunt" + +#~ msgid "Move Down" +#~ msgstr "Mou Avall" + +#~ msgid "Step Name" +#~ msgstr "Nom del Pas" + +#~ msgid "Step Type" +#~ msgstr "Tipus de Pas" + +#~ msgid "Step time in Minutes" +#~ msgstr "Temps de pas en Minuts" + +#, fuzzy +#~| msgid "Select one" +#~ msgid "Select File" +#~ msgstr "Sel·lecciona un" + +#, fuzzy +#~| msgid "Delete Recipe" +#~ msgid "Select Recipe" +#~ msgstr "Esborra Recepta" + +#~ msgid "Delete Ingredient" +#~ msgstr "Esborra Ingredient" + +#~ msgid "Make Header" +#~ msgstr "Crea Capçalera" + +#~ msgid "Make Ingredient" +#~ msgstr "Crea Ingredient" + +#~ msgid "Disable Amount" +#~ msgstr "Deshabilita Quantitat" + +#~ msgid "Enable Amount" +#~ msgstr "Habilita Quantitat" + +#~ msgid "Save & View" +#~ msgstr "Desa i Comprova" + +#~ msgid "Add Step" +#~ msgstr "Afegir Pas" + +#~ msgid "Add Nutrition" +#~ msgstr "Afegeix nutrients" + +#~ msgid "Remove Nutrition" +#~ msgstr "Elimina nutrients" + +#~ msgid "View Recipe" +#~ msgstr "Veure Recepta" + +#~ msgid "Delete Recipe" +#~ msgstr "Esborra Recepta" + #~ msgid "" #~ "A username is not required, if left blank the new user can choose one." #~ msgstr "" diff --git a/cookbook/locale/de/LC_MESSAGES/django.mo b/cookbook/locale/de/LC_MESSAGES/django.mo index 675ff110..21547256 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 c03b22cb..92205ee1 100644 --- a/cookbook/locale/de/LC_MESSAGES/django.po +++ b/cookbook/locale/de/LC_MESSAGES/django.po @@ -14,27 +14,78 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-08-17 08:44+0200\n" -"PO-Revision-Date: 2021-06-24 15:49+0000\n" -"Last-Translator: Maximilian J \n" -"Language-Team: German \n" +"POT-Creation-Date: 2022-01-18 14:52+0100\n" +"PO-Revision-Date: 2022-02-06 21:31+0000\n" +"Last-Translator: David Laukamp \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.7\n" +"X-Generator: Weblate 4.10.1\n" -#: .\cookbook\filters.py:23 .\cookbook\templates\base.html:98 -#: .\cookbook\templates\forms\edit_internal_recipe.html:269 -#: .\cookbook\templates\forms\ingredients.html:34 -#: .\cookbook\templates\space.html:43 .\cookbook\templates\stats.html:28 -#: .\cookbook\templates\url_import.html:270 .\cookbook\views\lists.py:67 +#: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 +#: .\cookbook\templates\space.html:50 .\cookbook\templates\stats.html:28 +#: .\cookbook\templates\url_import.html:277 msgid "Ingredients" msgstr "Zutaten" -#: .\cookbook\forms.py:49 +#: .\cookbook\forms.py:56 +msgid "Default unit" +msgstr "Standardeinheit" + +#: .\cookbook\forms.py:57 +msgid "Use fractions" +msgstr "Brüche verwenden" + +#: .\cookbook\forms.py:58 +msgid "Use KJ" +msgstr "Kilojoule verwenden" + +#: .\cookbook\forms.py:59 +msgid "Theme" +msgstr "Theme" + +#: .\cookbook\forms.py:60 +msgid "Navbar color" +msgstr "Farbe der Navigationsleiste" + +#: .\cookbook\forms.py:61 +msgid "Sticky navbar" +msgstr "Navigationsleiste anheften" + +#: .\cookbook\forms.py:62 +msgid "Default page" +msgstr "Standardseite" + +#: .\cookbook\forms.py:63 +msgid "Show recent recipes" +msgstr "Zuletzt betrachtete Rezepte anzeigen" + +#: .\cookbook\forms.py:64 +msgid "Search style" +msgstr "Suchmethode" + +#: .\cookbook\forms.py:65 +msgid "Plan sharing" +msgstr "Essensplan teilen" + +#: .\cookbook\forms.py:66 +msgid "Ingredient decimal places" +msgstr "Nachkommastellen für Zutaten" + +#: .\cookbook\forms.py:67 +msgid "Shopping list auto sync period" +msgstr "Synchronisierungshäufigkeit der Einkaufsliste" + +#: .\cookbook\forms.py:68 .\cookbook\templates\recipe_view.html:21 +#: .\cookbook\templates\space.html:77 .\cookbook\templates\stats.html:47 +msgid "Comments" +msgstr "Kommentare" + +#: .\cookbook\forms.py:72 msgid "" "Color of the top navigation bar. Not all colors work with all themes, just " "try them out!" @@ -42,43 +93,47 @@ msgstr "" "Farbe der oberen Navigationsleiste. Nicht alle Farben passen, daher einfach " "mal ausprobieren!" -#: .\cookbook\forms.py:51 +#: .\cookbook\forms.py:74 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:53 +#: .\cookbook\forms.py:76 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" msgstr "" -"Unterstützung für Brüche in Zutaten aktivieren. Dadurch werden Dezimalzahlen " -"mit Brüchen ersetzt, z.B. 0.5 mit ½." +"Unterstützung für Brüche in Zutaten aktivieren (dadurch werden Dezimalzahlen " +"automatisch mit Brüchen ersetzt)" -#: .\cookbook\forms.py:56 -msgid "" -"Users with whom newly created meal plan/shopping list entries should be " -"shared by default." -msgstr "" -"Nutzer, mit denen neue Pläne und Einkaufslisten standardmäßig geteilt werden " -"sollen." +#: .\cookbook\forms.py:78 +msgid "Display nutritional energy amounts in joules instead of calories" +msgstr "Nährwerte in Joule statt Kalorien anzeigen" -#: .\cookbook\forms.py:58 +#: .\cookbook\forms.py:79 +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:80 +msgid "Users with whom to share shopping lists." +msgstr "Benutzer, mit denen Einkaufslisten geteilt werden sollen." + +#: .\cookbook\forms.py:82 msgid "Show recently viewed recipes on search page." msgstr "Zuletzt angeschaute Rezepte bei der Suche anzeigen." -#: .\cookbook\forms.py:59 +#: .\cookbook\forms.py:83 msgid "Number of decimals to round ingredients." msgstr "Anzahl an Dezimalstellen, auf die gerundet werden soll." -#: .\cookbook\forms.py:60 +#: .\cookbook\forms.py:84 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:62 +#: .\cookbook\forms.py:86 .\cookbook\forms.py:493 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. " @@ -86,15 +141,23 @@ msgid "" "mobile data. If lower than instance limit it is reset when saving." msgstr "" "0 deaktiviert automatische Synchronisation. Wird eine Einkaufsliste " -"betrachtet, dann wird wird sie gemäß der Einstellung alle paar Sekunden " +"betrachtet, dann wird sie gemäß der Einstellung alle paar Sekunden " "aktualisiert. Dies ist nützlich, wenn mehrere Personen eine Liste beim " "Einkaufen verwenden, benötigt jedoch etwas Datenvolumen." -#: .\cookbook\forms.py:65 +#: .\cookbook\forms.py:89 msgid "Makes the navbar stick to the top of the page." msgstr "Navigationsleiste wird oben angeheftet." -#: .\cookbook\forms.py:81 +#: .\cookbook\forms.py:90 .\cookbook\forms.py:496 +msgid "Automatically add meal plan ingredients to shopping list." +msgstr "Fügt die Zutaten des Speiseplans automatisch zur Einkaufsliste hinzu." + +#: .\cookbook\forms.py:91 +msgid "Exclude ingredients that are on hand." +msgstr "Zutaten, die vorrätig sind, ausschließen." + +#: .\cookbook\forms.py:108 msgid "" "Both fields are optional. If none are given the username will be displayed " "instead" @@ -102,42 +165,39 @@ msgstr "" "Beide Felder sind optional. Wenn keins von beiden gegeben ist, wird der " "Nutzername angezeigt" -#: .\cookbook\forms.py:102 .\cookbook\forms.py:331 -#: .\cookbook\templates\forms\edit_internal_recipe.html:49 -#: .\cookbook\templates\url_import.html:154 +#: .\cookbook\forms.py:129 .\cookbook\forms.py:298 +#: .\cookbook\templates\url_import.html:161 msgid "Name" msgstr "Name" -#: .\cookbook\forms.py:103 .\cookbook\forms.py:332 -#: .\cookbook\templates\base.html:108 .\cookbook\templates\base.html:169 -#: .\cookbook\templates\forms\edit_internal_recipe.html:85 -#: .\cookbook\templates\space.html:39 .\cookbook\templates\stats.html:24 -#: .\cookbook\templates\url_import.html:188 -#: .\cookbook\templates\url_import.html:573 +#: .\cookbook\forms.py:130 .\cookbook\forms.py:299 +#: .\cookbook\templates\space.html:44 .\cookbook\templates\stats.html:24 +#: .\cookbook\templates\url_import.html:195 +#: .\cookbook\templates\url_import.html:585 .\cookbook\views\lists.py:97 msgid "Keywords" msgstr "Stichwörter" -#: .\cookbook\forms.py:104 +#: .\cookbook\forms.py:131 msgid "Preparation time in minutes" msgstr "Zubereitungszeit in Minuten" -#: .\cookbook\forms.py:105 +#: .\cookbook\forms.py:132 msgid "Waiting time (cooking/baking) in minutes" msgstr "Wartezeit (kochen/backen) in Minuten" -#: .\cookbook\forms.py:106 .\cookbook\forms.py:333 +#: .\cookbook\forms.py:133 .\cookbook\forms.py:267 .\cookbook\forms.py:300 msgid "Path" msgstr "Pfad" -#: .\cookbook\forms.py:107 +#: .\cookbook\forms.py:134 msgid "Storage UID" msgstr "Speicher-UID" -#: .\cookbook\forms.py:133 +#: .\cookbook\forms.py:164 msgid "Default" msgstr "Standard" -#: .\cookbook\forms.py:144 .\cookbook\templates\url_import.html:90 +#: .\cookbook\forms.py:175 .\cookbook\templates\url_import.html:97 msgid "" "To prevent duplicates recipes with the same name as existing ones are " "ignored. Check this box to import everything." @@ -145,51 +205,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:164 -msgid "New Unit" -msgstr "Neue Einheit" - -#: .\cookbook\forms.py:165 -msgid "New unit that other gets replaced by." -msgstr "Neue Einheit, die die alte ersetzt." - -#: .\cookbook\forms.py:170 -msgid "Old Unit" -msgstr "Alte Einheit" - -#: .\cookbook\forms.py:171 -msgid "Unit that should be replaced." -msgstr "Einheit, die ersetzt werden soll." - -#: .\cookbook\forms.py:187 -msgid "New Food" -msgstr "Neue Zutat" - -#: .\cookbook\forms.py:188 -msgid "New food that other gets replaced by." -msgstr "Neue Zutat, die die alte ersetzt." - -#: .\cookbook\forms.py:193 -msgid "Old Food" -msgstr "Alte Zutat" - -#: .\cookbook\forms.py:194 -msgid "Food that should be replaced." -msgstr "Zutat, die ersetzt werden soll." - -#: .\cookbook\forms.py:212 +#: .\cookbook\forms.py:197 msgid "Add your comment: " msgstr "Schreibe einen Kommentar: " -#: .\cookbook\forms.py:253 +#: .\cookbook\forms.py:212 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:260 +#: .\cookbook\forms.py:219 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:269 +#: .\cookbook\forms.py:228 msgid "" "Leave empty for dropbox and enter only base url for nextcloud (/remote." "php/webdav/ is added automatically)" @@ -197,26 +225,33 @@ msgstr "" "Für Dropbox leer lassen, für Nextcloud Server-URL angeben (/remote.php/" "webdav/ wird automatisch hinzugefügt)" -#: .\cookbook\forms.py:307 +#: .\cookbook\forms.py:266 .\cookbook\views\edit.py:166 +msgid "Storage" +msgstr "Speicher" + +#: .\cookbook\forms.py:268 +msgid "Active" +msgstr "Aktiv" + +#: .\cookbook\forms.py:274 msgid "Search String" msgstr "Suchwort" -#: .\cookbook\forms.py:334 +#: .\cookbook\forms.py:301 msgid "File ID" msgstr "Datei-ID" -#: .\cookbook\forms.py:370 +#: .\cookbook\forms.py:323 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:383 +#: .\cookbook\forms.py:336 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:384 -#: .\cookbook\templates\forms\edit_internal_recipe.html:427 +#: .\cookbook\forms.py:337 msgid "" "You can use markdown to format this field. See the docs here" @@ -224,29 +259,240 @@ msgstr "" "Markdown kann genutzt werden, um dieses Feld zu formatieren. Siehe hier für weitere Information" -#: .\cookbook\forms.py:409 +#: .\cookbook\forms.py:363 msgid "Maximum number of users for this space reached." msgstr "Maximale Nutzer-Anzahl wurde für diesen Space erreicht." -#: .\cookbook\forms.py:415 +#: .\cookbook\forms.py:369 msgid "Email address already taken!" msgstr "Email-Adresse ist bereits vergeben!" -#: .\cookbook\forms.py:423 +#: .\cookbook\forms.py:377 msgid "" -"An email address is not required but if present the invite link will be send " +"An email address is not required but if present the invite link will be sent " "to the user." msgstr "" "Eine Email-Adresse wird nicht benötigt, aber falls vorhanden, wird der " "Einladungslink zum Benutzer geschickt." -#: .\cookbook\forms.py:438 +#: .\cookbook\forms.py:392 msgid "Name already taken." msgstr "Name wird bereits verwendet." -#: .\cookbook\forms.py:449 +#: .\cookbook\forms.py:403 msgid "Accept Terms and Privacy" -msgstr "AGBs und Datenschutz akzeptieren" +msgstr "AGB und Datenschutzerklärung akzeptieren" + +#: .\cookbook\forms.py:435 +msgid "" +"Determines how fuzzy a search is if it uses trigram similarity matching (e." +"g. low values mean more typos are ignored)." +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:445 +msgid "" +"Select type method of search. Click here for " +"full desciption of choices." +msgstr "" +"Suchmethode auswählen. Klicke hier für eine " +"Auflistung der Optionen." + +#: .\cookbook\forms.py:446 +msgid "" +"Use fuzzy matching on units, keywords and ingredients when editing and " +"importing recipes." +msgstr "" +"Benutze die unscharfe Suche für Einheiten, Schlüsselwörter und Zutaten beim " +"ändern und importieren von Rezepten." + +#: .\cookbook\forms.py:448 +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 " +"kann die Suchqualität je nach Sprache verbessern oder verschlechtern" + +#: .\cookbook\forms.py:450 +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.)" + +#: .\cookbook\forms.py:452 +msgid "" +"Fields to search for beginning of word matches. (e.g. searching for 'sa' " +"will return 'salad' and 'sandwich')" +msgstr "" +"Felder welche auf übereinstimmenden Wortbeginn durchsucht werden. (z.B. eine " +"Suche nach \"Spa\" wird \"Spaghetti\" und \"Spargel\" liefern.)" + +#: .\cookbook\forms.py:454 +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 "" +"Felder welche \"ungenau\" durchsucht werden sollen. (z.B. eine Suche nach " +"\"Kuhcen\" wird \"Kuchen\" liefern.) Tipp: Diese Option konfligiert mit den " +"\"web\" und \"raw\" Suchtypen." + +#: .\cookbook\forms.py:456 +msgid "" +"Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " +"only function with fulltext fields." +msgstr "" +"Felder welche im Volltext durchsucht werden sollen. Tipp: Die Suchtypen \"web" +"\", \"raw\" und \"phrase\" funktionieren nur mit Volltext-Feldern." + +#: .\cookbook\forms.py:460 +msgid "Search Method" +msgstr "Suchmethode" + +#: .\cookbook\forms.py:461 +msgid "Fuzzy Lookups" +msgstr "Unscharfe Suche" + +#: .\cookbook\forms.py:462 +msgid "Ignore Accent" +msgstr "Akzente ignorieren" + +#: .\cookbook\forms.py:463 +msgid "Partial Match" +msgstr "Teilweise Übereinstimmung" + +#: .\cookbook\forms.py:464 +msgid "Starts Wtih" +msgstr "Beginnt mit" + +#: .\cookbook\forms.py:465 +msgid "Fuzzy Search" +msgstr "Unpräzise Suche" + +#: .\cookbook\forms.py:466 +msgid "Full Text" +msgstr "Volltext" + +#: .\cookbook\forms.py:491 +msgid "" +"Users will see all items you add to your shopping list. They must add you " +"to see items on their list." +msgstr "" +"Die Benutzer sehen alle Artikel, die Sie auf Ihre Einkaufsliste setzen. Die " +"Benutzer müssen Sie hinzufügen, damit Sie Artikel auf der Liste der Benutzer " +"sehen können." + +#: .\cookbook\forms.py:497 +msgid "" +"When adding a meal plan to the shopping list (manually or automatically), " +"include all related recipes." +msgstr "" +"Wenn Sie einen Essensplan zur Einkaufsliste hinzufügen (manuell oder " +"automatisch), fügen Sie alle zugehörigen Rezepte hinzu." + +#: .\cookbook\forms.py:498 +msgid "" +"When adding a meal plan to the shopping list (manually or automatically), " +"exclude ingredients that are on hand." +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:499 +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:500 +msgid "Filter shopping list to only include supermarket categories." +msgstr "" +"Nur für den Supermarkt konfigurierte Kategorien in Einkaufsliste anzeigen." + +#: .\cookbook\forms.py:501 +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:502 +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:503 +msgid "Delimiter to use for CSV exports." +msgstr "Separator für CSV-Export." + +#: .\cookbook\forms.py:504 +msgid "Prefix to add when copying list to the clipboard." +msgstr "Zusatz wird der in die Zwischenablage kopierten Liste vorangestellt." + +#: .\cookbook\forms.py:508 +msgid "Share Shopping List" +msgstr "Einkaufsliste teilen" + +#: .\cookbook\forms.py:509 +msgid "Autosync" +msgstr "Automatischer Abgleich" + +#: .\cookbook\forms.py:510 +msgid "Auto Add Meal Plan" +msgstr "automatisch dem Menüplan hinzufügen" + +#: .\cookbook\forms.py:511 +msgid "Exclude On Hand" +msgstr "Ausgenommen Vorrätiges" + +#: .\cookbook\forms.py:512 +msgid "Include Related" +msgstr "dazugehörend" + +#: .\cookbook\forms.py:513 +msgid "Default Delay Hours" +msgstr "Standardmäßige Verzögerung in Stunden" + +#: .\cookbook\forms.py:514 +#, fuzzy +#| msgid "Select Supermarket" +msgid "Filter to Supermarket" +msgstr "Supermarkt filtern" + +#: .\cookbook\forms.py:515 +msgid "Recent Days" +msgstr "Vergangene Tage" + +#: .\cookbook\forms.py:516 +msgid "CSV Delimiter" +msgstr "CSV Trennzeichen" + +#: .\cookbook\forms.py:517 .\cookbook\templates\shopping_list.html:322 +msgid "List Prefix" +msgstr "Listenpräfix" + +#: .\cookbook\forms.py:518 +msgid "Auto On Hand" +msgstr "Automatisch als vorrätig markieren" + +#: .\cookbook\forms.py:528 +msgid "Reset Food Inheritance" +msgstr "Lebensmittelvererbung zurücksetzen" + +#: .\cookbook\forms.py:529 +msgid "Reset all food to inherit the fields configured." +msgstr "" +"Alle Lebensmittel zurücksetzen, um die konfigurierten Felder zu übernehmen." + +#: .\cookbook\forms.py:541 +msgid "Fields on food that should be inherited by default." +msgstr "Zutaten, die standardmäßig übernommen werden sollen." + +#: .\cookbook\forms.py:542 +msgid "Show recipe counts on search filters" +msgstr "Rezeptanzahl im Suchfiltern anzeigen" #: .\cookbook\helper\AllAuthCustomAdapter.py:36 msgid "" @@ -256,49 +502,48 @@ 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:138 -#: .\cookbook\helper\permission_helper.py:161 .\cookbook\views\views.py:151 +#: .\cookbook\helper\permission_helper.py:136 +#: .\cookbook\helper\permission_helper.py:159 .\cookbook\views\views.py:148 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:142 -#: .\cookbook\helper\permission_helper.py:148 -#: .\cookbook\helper\permission_helper.py:173 -#: .\cookbook\helper\permission_helper.py:218 -#: .\cookbook\helper\permission_helper.py:232 -#: .\cookbook\helper\permission_helper.py:243 -#: .\cookbook\helper\permission_helper.py:254 .\cookbook\views\data.py:40 -#: .\cookbook\views\views.py:162 .\cookbook\views\views.py:169 -#: .\cookbook\views\views.py:259 +#: .\cookbook\helper\permission_helper.py:140 +#: .\cookbook\helper\permission_helper.py:146 +#: .\cookbook\helper\permission_helper.py:171 +#: .\cookbook\helper\permission_helper.py:219 +#: .\cookbook\helper\permission_helper.py:233 +#: .\cookbook\helper\permission_helper.py:244 +#: .\cookbook\helper\permission_helper.py:255 .\cookbook\views\data.py:47 +#: .\cookbook\views\views.py:159 .\cookbook\views\views.py:166 +#: .\cookbook\views\views.py:232 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:166 -#: .\cookbook\helper\permission_helper.py:189 -#: .\cookbook\helper\permission_helper.py:204 +#: .\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 "" "Du kannst mit diesem Objekt nicht interagieren, da es dir nicht gehört!" -#: .\cookbook\helper\template_helper.py:60 -#: .\cookbook\helper\template_helper.py:62 +#: .\cookbook\helper\recipe_search.py:473 +msgid "One of queryset or hash_key must be provided" +msgstr "Es muss die Abfrage oder der Hash_Key angeben werden" + +#: .\cookbook\helper\shopping_helper.py:54 +msgid "You must supply a recipe or mealplan" +msgstr "Mindestens ein Rezept oder ein Essensplan müssen angegeben werden" + +#: .\cookbook\helper\shopping_helper.py:58 +msgid "You must supply a created_by" +msgstr "Die Angabe der Verfassers ist notwendig" + +#: .\cookbook\helper\template_helper.py:61 +#: .\cookbook\helper\template_helper.py:63 msgid "Could not parse template code." msgstr "Konnte den Template code nicht verarbeiten." -#: .\cookbook\integration\integration.py:104 -#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 -#: .\cookbook\templates\import_response.html:7 -#: .\cookbook\templates\test.html:14 .\cookbook\templates\test.html:20 -#: .\cookbook\templates\url_import.html:27 -#: .\cookbook\templates\url_import.html:101 -#: .\cookbook\templates\url_import.html:123 -#: .\cookbook\templates\url_import.html:317 -#: .\cookbook\templates\url_import.html:604 .\cookbook\views\delete.py:60 -#: .\cookbook\views\edit.py:199 -msgid "Import" -msgstr "Importieren" - -#: .\cookbook\integration\integration.py:185 +#: .\cookbook\integration\integration.py:200 msgid "" "Importer expected a .zip file. Did you choose the correct importer type for " "your data ?" @@ -306,7 +551,7 @@ msgstr "" "Importer erwartet eine .zip Datei. Hast du den richtigen Importer-Typ für " "deine Daten ausgewählt?" -#: .\cookbook\integration\integration.py:188 +#: .\cookbook\integration\integration.py:203 msgid "" "An unexpected error occurred during the import. Please make sure you have " "uploaded a valid file." @@ -314,11 +559,11 @@ msgstr "" "Ein unerwarteter Fehler trat beim Importieren auf. Bitte stelle sicher, dass " "die hochgeladene Datei gültig ist." -#: .\cookbook\integration\integration.py:192 +#: .\cookbook\integration\integration.py:208 msgid "The following recipes were ignored because they already existed:" msgstr "Die folgenden Rezepte wurden ignoriert da sie bereits existieren:" -#: .\cookbook\integration\integration.py:196 +#: .\cookbook\integration\integration.py:212 #, python-format msgid "Imported %s recipes." msgstr "%s Rezepte importiert." @@ -331,38 +576,53 @@ msgstr "Notizen" msgid "Nutritional Information" msgstr "Nährwert Informationen" -#: .\cookbook\integration\paprika.py:53 +#: .\cookbook\integration\paprika.py:53 .\cookbook\templates\url_import.html:42 msgid "Source" msgstr "Quelle" -#: .\cookbook\integration\safron.py:23 -#: .\cookbook\templates\forms\edit_internal_recipe.html:79 -#: .\cookbook\templates\include\log_cooking.html:16 -#: .\cookbook\templates\url_import.html:224 -#: .\cookbook\templates\url_import.html:455 -#, fuzzy +#: .\cookbook\integration\saffron.py:23 +#: .\cookbook\templates\include\log_cooking.html:18 +#: .\cookbook\templates\url_import.html:231 +#: .\cookbook\templates\url_import.html:462 msgid "Servings" msgstr "Portionen" -#: .\cookbook\integration\safron.py:25 +#: .\cookbook\integration\saffron.py:25 msgid "Waiting time" msgstr "Wartezeit" -#: .\cookbook\integration\safron.py:27 -#: .\cookbook\templates\forms\edit_internal_recipe.html:73 +#: .\cookbook\integration\saffron.py:27 msgid "Preparation Time" msgstr "Vorbereitungszeit" -#: .\cookbook\integration\safron.py:29 .\cookbook\templates\base.html:78 +#: .\cookbook\integration\saffron.py:29 .\cookbook\templates\base.html:78 #: .\cookbook\templates\forms\ingredients.html:7 #: .\cookbook\templates\index.html:7 msgid "Cookbook" msgstr "Kochbuch" -#: .\cookbook\integration\safron.py:31 +#: .\cookbook\integration\saffron.py:31 msgid "Section" msgstr "Sektion" +#: .\cookbook\management\commands\rebuildindex.py:14 +msgid "Rebuilds full text search index on Recipe" +msgstr "Generiert den Index für die Rezept-Volltextsuche neu" + +#: .\cookbook\management\commands\rebuildindex.py:18 +msgid "Only Postgress databases use full text search, no index to rebuild" +msgstr "" +"Nur PostgreSQL Datenbanken verwenden Volltextsuche, kein Index muss neu " +"generiert werden" + +#: .\cookbook\management\commands\rebuildindex.py:29 +msgid "Recipe index rebuild complete." +msgstr "Generierung des Indizes abgeschlossen." + +#: .\cookbook\management\commands\rebuildindex.py:31 +msgid "Recipe index rebuild failed." +msgstr "Generierung des Indizes fehlgeschlagen." + #: .\cookbook\migrations\0047_auto_20200602_1133.py:14 msgid "Breakfast" msgstr "Frühstück" @@ -379,7 +639,7 @@ msgstr "Abendessen" msgid "Other" msgstr "Andere" -#: .\cookbook\models.py:72 +#: .\cookbook\models.py:246 msgid "" "Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " "upload." @@ -387,86 +647,138 @@ msgstr "" "Maximale Datei-Speichergröße in MB. 0 für unbegrenzt, -1 um den Datei-Upload " "zu deaktivieren." -#: .\cookbook\models.py:123 .\cookbook\templates\search.html:7 -#: .\cookbook\templates\shopping_list.html:52 +#: .\cookbook\models.py:300 .\cookbook\templates\search.html:7 +#: .\cookbook\templates\shopping_list.html:53 msgid "Search" -msgstr "Suche" +msgstr "Suchen" -#: .\cookbook\models.py:124 .\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 +#: .\cookbook\models.py:301 .\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 "Essensplan" -#: .\cookbook\models.py:125 .\cookbook\templates\base.html:89 +#: .\cookbook\models.py:302 .\cookbook\templates\base.html:90 msgid "Books" msgstr "Bücher" -#: .\cookbook\models.py:133 +#: .\cookbook\models.py:310 msgid "Small" msgstr "Klein" -#: .\cookbook\models.py:133 +#: .\cookbook\models.py:310 msgid "Large" msgstr "Groß" -#: .\cookbook\models.py:133 .\cookbook\templates\generic\new_template.html:6 +#: .\cookbook\models.py:310 .\cookbook\templates\generic\new_template.html:6 #: .\cookbook\templates\generic\new_template.html:14 -#: .\cookbook\templates\meal_plan.html:323 msgid "New" msgstr "Neu" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:202 +#: .\cookbook\models.py:512 +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:586 .\cookbook\templates\url_import.html:44 msgid "Text" msgstr "Text" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:203 +#: .\cookbook\models.py:586 msgid "Time" msgstr "Zeit" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:204 -#: .\cookbook\templates\forms\edit_internal_recipe.html:219 -#, fuzzy -#| msgid "File ID" +#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:46 msgid "File" -msgstr "Datei-ID" +msgstr "Datei" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:205 -#: .\cookbook\templates\forms\edit_internal_recipe.html:241 +#: .\cookbook\models.py:586 #: .\cookbook\templates\include\recipe_open_modal.html:7 -#: .\cookbook\templates\meal_plan.html:247 .\cookbook\views\delete.py:28 -#: .\cookbook\views\edit.py:273 .\cookbook\views\new.py:52 +#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260 +#: .\cookbook\views\new.py:53 msgid "Recipe" msgstr "Rezept" -#: .\cookbook\serializer.py:109 +#: .\cookbook\models.py:1041 .\cookbook\templates\search_info.html:28 +msgid "Simple" +msgstr "Einfach" + +#: .\cookbook\models.py:1042 .\cookbook\templates\search_info.html:33 +msgid "Phrase" +msgstr "Satz" + +#: .\cookbook\models.py:1043 .\cookbook\templates\search_info.html:38 +msgid "Web" +msgstr "Web" + +#: .\cookbook\models.py:1044 .\cookbook\templates\search_info.html:47 +msgid "Raw" +msgstr "Rohdaten" + +#: .\cookbook\models.py:1082 +msgid "Food Alias" +msgstr "Lebensmittel Alias" + +#: .\cookbook\models.py:1082 +msgid "Unit Alias" +msgstr "Einheiten Alias" + +#: .\cookbook\models.py:1082 +msgid "Keyword Alias" +msgstr "Stichwort Alias" + +#: .\cookbook\serializer.py:175 +msgid "A user is required" +msgstr "Ein Benutzername ist notwendig" + +#: .\cookbook\serializer.py:195 msgid "File uploads are not enabled for this Space." msgstr "Datei-Uploads sind in diesem Space nicht aktiviert." -#: .\cookbook\serializer.py:117 +#: .\cookbook\serializer.py:206 msgid "You have reached your file upload limit." msgstr "Du hast Dein Datei-Uploadlimit erreicht." -#: .\cookbook\tables.py:35 .\cookbook\templates\books.html:36 -#: .\cookbook\templates\generic\edit_template.html:6 +#: .\cookbook\serializer.py:962 +msgid "Existing shopping list to update" +msgstr "Bestehende Einkaufliste, die aktualisiert werden soll" + +#: .\cookbook\serializer.py:964 +msgid "" +"List of ingredient IDs from the recipe to add, if not provided all " +"ingredients will be added." +msgstr "" + +#: .\cookbook\serializer.py:965 +msgid "" +"Providing a list_recipe ID and servings of 0 will delete that shopping list." +msgstr "" + +#: .\cookbook\serializer.py:973 +msgid "Amount of food to add to the shopping list" +msgstr "" +"Menge des Lebensmittels, welches der Einkaufsliste hinzugefügt werden soll" + +#: .\cookbook\serializer.py:974 +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:975 +msgid "When set to true will delete all food from active shopping lists." +msgstr "" + +#: .\cookbook\tables.py:35 .\cookbook\templates\generic\edit_template.html:6 #: .\cookbook\templates\generic\edit_template.html:14 -#: .\cookbook\templates\meal_plan.html:281 #: .\cookbook\templates\recipes_table.html:82 -#: .\cookbook\templates\shopping_list.html:33 -#: .\cookbook\templates\space.html:90 +#: .\cookbook\templates\shopping_list.html:37 +#: .\cookbook\templates\space.html:109 msgid "Edit" msgstr "Bearbeiten" -#: .\cookbook\tables.py:124 .\cookbook\tables.py:147 -#: .\cookbook\templates\books.html:38 -#: .\cookbook\templates\generic\delete_template.html:5 -#: .\cookbook\templates\generic\delete_template.html:13 -#: .\cookbook\templates\generic\edit_template.html:27 -#: .\cookbook\templates\meal_plan.html:277 +#: .\cookbook\tables.py:115 .\cookbook\tables.py:138 +#: .\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" @@ -495,17 +807,15 @@ 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:154 .\cookbook\templates\settings.html:6 +#: .\cookbook\templates\base.html:257 .\cookbook\templates\settings.html:6 #: .\cookbook\templates\settings.html:17 #: .\cookbook\templates\socialaccount\connections.html:10 msgid "Settings" msgstr "Einstellungen" #: .\cookbook\templates\account\email.html:13 -#, fuzzy -#| msgid "Add E-mail" msgid "Email" -msgstr "Email hinzufügen" +msgstr "E-Mail" #: .\cookbook\templates\account\email.html:19 msgid "The following e-mail addresses are associated with your account:" @@ -521,19 +831,18 @@ msgstr "Unverfiziert" #: .\cookbook\templates\account\email.html:40 msgid "Primary" -msgstr "" +msgstr "Primär" #: .\cookbook\templates\account\email.html:47 -#, fuzzy -#| msgid "Make Header" msgid "Make Primary" -msgstr "Überschrift erstellen" +msgstr "Als Hauptadresse verwenden" #: .\cookbook\templates\account\email.html:49 msgid "Re-send Verification" msgstr "Verifikation erneut senden" #: .\cookbook\templates\account\email.html:50 +#: .\cookbook\templates\generic\delete_template.html:56 #: .\cookbook\templates\socialaccount\connections.html:44 msgid "Remove" msgstr "Entfernen" @@ -582,7 +891,7 @@ msgstr "" " ist." #: .\cookbook\templates\account\email_confirm.html:22 -#: .\cookbook\templates\generic\delete_template.html:21 +#: .\cookbook\templates\generic\delete_template.html:71 msgid "Confirm" msgstr "Bestätigen" @@ -597,7 +906,7 @@ msgstr "" " beantrage einen neuen Email-" "Bestätigungslink." -#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:189 +#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:289 msgid "Login" msgstr "Anmelden" @@ -608,27 +917,27 @@ msgstr "Anmelden" msgid "Sign In" msgstr "Einloggen" -#: .\cookbook\templates\account\login.html:32 +#: .\cookbook\templates\account\login.html:34 #: .\cookbook\templates\socialaccount\signup.html:8 #: .\cookbook\templates\socialaccount\signup.html:57 msgid "Sign Up" msgstr "Registrieren" -#: .\cookbook\templates\account\login.html:36 -#: .\cookbook\templates\account\login.html:37 +#: .\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:37 +#: .\cookbook\templates\account\login.html:40 msgid "Lost your password?" msgstr "Passwort vergessen?" -#: .\cookbook\templates\account\login.html:48 +#: .\cookbook\templates\account\login.html:52 msgid "Social Login" msgstr "Social Login" -#: .\cookbook\templates\account\login.html:49 +#: .\cookbook\templates\account\login.html:53 msgid "You can use any of the following providers to sign in." msgstr "Du kannst jeden der folgenden Anbieter zum Einloggen verwenden." @@ -645,22 +954,20 @@ msgstr "Willst du dich wirklich ausloggen?" #: .\cookbook\templates\account\password_change.html:6 #: .\cookbook\templates\account\password_change.html:16 #: .\cookbook\templates\account\password_change.html:21 -#, fuzzy -#| msgid "Reset My Password" +#: .\cookbook\templates\account\password_reset_from_key.html:7 +#: .\cookbook\templates\account\password_reset_from_key.html:13 +#: .\cookbook\templates\account\password_reset_from_key_done.html:7 +#: .\cookbook\templates\account\password_reset_from_key_done.html:13 msgid "Change Password" -msgstr "Passwort zurücksetzen" +msgstr "Passwort ändern" #: .\cookbook\templates\account\password_change.html:12 #: .\cookbook\templates\account\password_set.html:12 -#: .\cookbook\templates\settings.html:52 -#, fuzzy -#| msgid "Password Reset" +#: .\cookbook\templates\settings.html:76 msgid "Password" -msgstr "Passwort Reset" +msgstr "Passwort" #: .\cookbook\templates\account\password_change.html:22 -#, fuzzy -#| msgid "Lost your password?" msgid "Forgot Password?" msgstr "Passwort vergessen?" @@ -691,13 +998,36 @@ msgstr "" "Wir haben Dir eine Email gesendet. Bitte kontaktiere uns, falls du sie nicht " "innerhalb der nächsten Minuten erhältst." +#: .\cookbook\templates\account\password_reset_from_key.html:13 +msgid "Bad Token" +msgstr "Ungültiger Token" + +#: .\cookbook\templates\account\password_reset_from_key.html:25 +#, python-format +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used.\n" +" Please request a new " +"password reset." +msgstr "" +"Der Link wurde bereits benutzt oder deaktiviert.\n" +" Bitte fordern Sie hier einen neuen Link an ." + +#: .\cookbook\templates\account\password_reset_from_key.html:33 +msgid "change password" +msgstr "Passwort ändern" + +#: .\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 "Passwort wurde geändert." + #: .\cookbook\templates\account\password_set.html:6 #: .\cookbook\templates\account\password_set.html:16 #: .\cookbook\templates\account\password_set.html:21 -#, fuzzy -#| msgid "Reset My Password" msgid "Set Password" -msgstr "Passwort zurücksetzen" +msgstr "Passwort setzen" #: .\cookbook\templates\account\signup.html:6 msgid "Register" @@ -744,98 +1074,110 @@ 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:179 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:279 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "API-Dokumentation" -#: .\cookbook\templates\base.html:85 -msgid "Utensils" -msgstr "Utensilien" - -#: .\cookbook\templates\base.html:95 +#: .\cookbook\templates\base.html:86 msgid "Shopping" msgstr "Einkaufsliste" -#: .\cookbook\templates\base.html:101 -#: .\cookbook\templates\shopping_list.html:230 +#: .\cookbook\templates\base.html:113 +msgid "Keyword" +msgstr "Schlagwort" + +#: .\cookbook\templates\base.html:125 .\cookbook\views\lists.py:114 +msgid "Foods" +msgstr "Lebensmittel" + +#: .\cookbook\templates\base.html:137 +#: .\cookbook\templates\forms\ingredients.html:24 +#: .\cookbook\templates\space.html:47 .\cookbook\templates\stats.html:26 +#: .\cookbook\views\lists.py:131 +msgid "Units" +msgstr "Einheiten" + +#: .\cookbook\templates\base.html:151 +#: .\cookbook\templates\shopping_list.html:208 #: .\cookbook\templates\supermarket.html:7 msgid "Supermarket" msgstr "Supermarkt" -#: .\cookbook\templates\base.html:112 .\cookbook\views\delete.py:84 -#: .\cookbook\views\edit.py:102 .\cookbook\views\lists.py:26 -#: .\cookbook\views\new.py:78 -msgid "Keyword" -msgstr "Schlagwort" +#: .\cookbook\templates\base.html:163 +msgid "Supermarket Category" +msgstr "Supermarkt-Kategorie" -#: .\cookbook\templates\base.html:114 +#: .\cookbook\templates\base.html:175 .\cookbook\views\lists.py:180 +msgid "Automations" +msgstr "Automatisierungen" + +#: .\cookbook\templates\base.html:189 .\cookbook\views\lists.py:200 +msgid "Files" +msgstr "Dateien" + +#: .\cookbook\templates\base.html:201 msgid "Batch Edit" msgstr "Massenbearbeitung" -#: .\cookbook\templates\base.html:119 -msgid "Storage Data" -msgstr "Datenquellen" - -#: .\cookbook\templates\base.html:123 -msgid "Storage Backends" -msgstr "Speicherquellen" - -#: .\cookbook\templates\base.html:125 -msgid "Configure Sync" -msgstr "Synchronisation einstellen" - -#: .\cookbook\templates\base.html:127 -msgid "Discovered Recipes" -msgstr "Entdeckte Rezepte" - -#: .\cookbook\templates\base.html:129 -msgid "Discovery Log" -msgstr "Entdeckungsverlauf" - -#: .\cookbook\templates\base.html:131 .\cookbook\templates\stats.html:10 -msgid "Statistics" -msgstr "Statistiken" - -#: .\cookbook\templates\base.html:133 -msgid "Units & Ingredients" -msgstr "Einheiten & Zutaten" - -#: .\cookbook\templates\base.html:135 .\cookbook\templates\index.html:47 -msgid "Import Recipe" -msgstr "Rezept importieren" - -#: .\cookbook\templates\base.html:156 .\cookbook\templates\history.html:6 +#: .\cookbook\templates\base.html:213 .\cookbook\templates\history.html:6 #: .\cookbook\templates\history.html:14 msgid "History" msgstr "Verlauf" -#: .\cookbook\templates\base.html:159 .\cookbook\templates\space.html:7 -#: .\cookbook\templates\space.html:19 +#: .\cookbook\templates\base.html:228 .\cookbook\templates\export.html:14 +#: .\cookbook\templates\export.html:20 +#: .\cookbook\templates\shopping_list.html:310 +#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 +msgid "Export" +msgstr "Exportieren" + +#: .\cookbook\templates\base.html:244 .\cookbook\templates\index.html:47 +msgid "Import Recipe" +msgstr "Rezept importieren" + +#: .\cookbook\templates\base.html:246 +#: .\cookbook\templates\shopping_list.html:165 +#: .\cookbook\templates\shopping_list.html:188 +msgid "Create" +msgstr "Erstellen" + +#: .\cookbook\templates\base.html:259 +#: .\cookbook\templates\generic\list_template.html:14 +#: .\cookbook\templates\space.html:69 .\cookbook\templates\stats.html:43 +msgid "External Recipes" +msgstr "Externe Rezepte" + +#: .\cookbook\templates\base.html:262 .\cookbook\templates\space.html:8 +#: .\cookbook\templates\space.html:20 .\cookbook\templates\space.html:150 msgid "Space Settings" msgstr "Space Einstellungen" -#: .\cookbook\templates\base.html:163 .\cookbook\templates\system.html:13 +#: .\cookbook\templates\base.html:267 .\cookbook\templates\system.html:13 msgid "System" msgstr "System" -#: .\cookbook\templates\base.html:165 .\cookbook\templates\base.html:171 +#: .\cookbook\templates\base.html:269 msgid "Admin" msgstr "Admin" -#: .\cookbook\templates\base.html:175 +#: .\cookbook\templates\base.html:273 msgid "Markdown Guide" msgstr "Markdown-Anleitung" -#: .\cookbook\templates\base.html:177 +#: .\cookbook\templates\base.html:275 msgid "GitHub" msgstr "GitHub" -#: .\cookbook\templates\base.html:181 +#: .\cookbook\templates\base.html:277 +msgid "Translate Tandoor" +msgstr "Tandoor übersetzen" + +#: .\cookbook\templates\base.html:281 msgid "API Browser" msgstr "API Browser" -#: .\cookbook\templates\base.html:184 +#: .\cookbook\templates\base.html:284 msgid "Log out" msgstr "Ausloggen" @@ -853,7 +1195,7 @@ msgstr "" "Ausgewählte Schlagwörter zu allen Rezepten, die das Suchwort enthalten, " "hinzufügen" -#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:85 +#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:82 msgid "Sync" msgstr "Synchronisieren" @@ -873,10 +1215,36 @@ msgstr "" msgid "The path must be in the following format" msgstr "Der Pfad muss folgendes Format haben" -#: .\cookbook\templates\batch\monitor.html:27 +#: .\cookbook\templates\batch\monitor.html:20 +#: .\cookbook\templates\forms\edit_import_recipe.html:14 +#: .\cookbook\templates\generic\edit_template.html:23 +#: .\cookbook\templates\generic\new_template.html:23 +#: .\cookbook\templates\include\log_cooking.html:30 +#: .\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\shopping_list.html:311 +#: .\cookbook\templates\space.html:155 +msgid "Save" +msgstr "Speichern" + +#: .\cookbook\templates\batch\monitor.html:21 +msgid "Manage External Storage" +msgstr "Externe Speicherquellen verwalten" + +#: .\cookbook\templates\batch\monitor.html:28 msgid "Sync Now!" msgstr "Jetzt Synchronisieren!" +#: .\cookbook\templates\batch\monitor.html:29 +msgid "Show Recipes" +msgstr "Rezepte anzeigen" + +#: .\cookbook\templates\batch\monitor.html:30 +msgid "Show Log" +msgstr "Log anzeigen" + #: .\cookbook\templates\batch\waiting.html:4 #: .\cookbook\templates\batch\waiting.html:10 msgid "Importing Recipes" @@ -890,259 +1258,23 @@ msgstr "" "Abhängig von der Anzahl der Rezepte kann dieser Vorgang einige Minuten " "dauern, bitte gedulde dich ein wenig." -#: .\cookbook\templates\books.html:5 .\cookbook\templates\books.html:11 +#: .\cookbook\templates\books.html:7 msgid "Recipe Books" msgstr "Rezeptbuch" -#: .\cookbook\templates\books.html:15 -msgid "New Book" -msgstr "Neues Buch" - -#: .\cookbook\templates\books.html:27 .\cookbook\templates\recipe_view.html:26 -msgid "by" -msgstr "von" - -#: .\cookbook\templates\books.html:34 -msgid "Toggle Recipes" -msgstr "Rezepte umschalten" - -#: .\cookbook\templates\books.html:54 -#: .\cookbook\templates\meal_plan_entry.html:48 -#: .\cookbook\templates\recipes_table.html:64 -msgid "Last cooked" -msgstr "Zuletzt gekocht" - -#: .\cookbook\templates\books.html:71 -msgid "There are no recipes in this book yet." -msgstr "In diesem Buch sind bisher noch keine Rezepte." - #: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6 msgid "Export Recipes" msgstr "Rezepte exportieren" -#: .\cookbook\templates\export.html:14 .\cookbook\templates\export.html:20 -#: .\cookbook\templates\shopping_list.html:351 -#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 -msgid "Export" -msgstr "Exportieren" - -#: .\cookbook\templates\files.html:7 -msgid "Files" -msgstr "Dateien" - #: .\cookbook\templates\forms\edit_import_recipe.html:5 #: .\cookbook\templates\forms\edit_import_recipe.html:9 msgid "Import new Recipe" msgstr "Rezept importieren" -#: .\cookbook\templates\forms\edit_import_recipe.html:14 -#: .\cookbook\templates\forms\edit_internal_recipe.html:439 -#: .\cookbook\templates\forms\edit_internal_recipe.html:471 -#: .\cookbook\templates\generic\edit_template.html:23 -#: .\cookbook\templates\generic\new_template.html:23 -#: .\cookbook\templates\include\log_cooking.html:28 -#: .\cookbook\templates\meal_plan.html:325 -#: .\cookbook\templates\settings.html:46 .\cookbook\templates\settings.html:87 -#: .\cookbook\templates\settings.html:105 -#: .\cookbook\templates\shopping_list.html:353 -msgid "Save" -msgstr "Speichern" - #: .\cookbook\templates\forms\edit_internal_recipe.html:7 -#: .\cookbook\templates\forms\edit_internal_recipe.html:34 msgid "Edit Recipe" msgstr "Rezept bearbeiten" -#: .\cookbook\templates\forms\edit_internal_recipe.html:56 -#: .\cookbook\templates\url_import.html:171 -msgid "Description" -msgstr "Beschreibung" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:76 -msgid "Waiting Time" -msgstr "Wartezeit" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:82 -msgid "Servings Text" -msgstr "Portionen-Text" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:93 -msgid "Select Keywords" -msgstr "Schlagwörter wählen" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:94 -#: .\cookbook\templates\url_import.html:583 -msgid "Add Keyword" -msgstr "Schlagwort hinzufügen" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:112 -msgid "Nutrition" -msgstr "Nährwerte" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:116 -#: .\cookbook\templates\forms\edit_internal_recipe.html:166 -msgid "Delete Step" -msgstr "Schritt löschen" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:120 -msgid "Calories" -msgstr "Kalorien" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:123 -msgid "Carbohydrates" -msgstr "Kohlenhydrate" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:126 -msgid "Fats" -msgstr "Fette" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:128 -msgid "Proteins" -msgstr "Proteine" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:150 -#: .\cookbook\templates\forms\edit_internal_recipe.html:504 -msgid "Step" -msgstr "Schritt" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:171 -msgid "Show as header" -msgstr "Als Überschrift anzeigen" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:177 -msgid "Hide as header" -msgstr "Nicht als Überschrift anzeigen" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:182 -msgid "Move Up" -msgstr "Nach oben" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:187 -msgid "Move Down" -msgstr "Nach unten" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:196 -msgid "Step Name" -msgstr "Name des Schritts" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:200 -msgid "Step Type" -msgstr "Art des Schritts" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:213 -msgid "Step time in Minutes" -msgstr "Zeit in Minuten" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:229 -msgid "Select File" -msgstr "Datei auswählen" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:230 -#: .\cookbook\templates\forms\edit_internal_recipe.html:252 -#: .\cookbook\templates\forms\edit_internal_recipe.html:313 -#: .\cookbook\templates\forms\edit_internal_recipe.html:337 -#: .\cookbook\templates\shopping_list.html:189 -#: .\cookbook\templates\shopping_list.html:211 -#: .\cookbook\templates\shopping_list.html:241 -#: .\cookbook\templates\shopping_list.html:265 -#: .\cookbook\templates\url_import.html:495 -#: .\cookbook\templates\url_import.html:527 -msgid "Select" -msgstr "Auswählen" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:251 -#, fuzzy -#| msgid "Delete Recipe" -msgid "Select Recipe" -msgstr "Rezept löschen" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:311 -#: .\cookbook\templates\shopping_list.html:187 -msgid "Select Unit" -msgstr "Einheit wählen" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:312 -#: .\cookbook\templates\forms\edit_internal_recipe.html:336 -#: .\cookbook\templates\shopping_list.html:188 -#: .\cookbook\templates\shopping_list.html:210 -msgid "Create" -msgstr "Erstellen" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:335 -#: .\cookbook\templates\shopping_list.html:209 -msgid "Select Food" -msgstr "Zutat auswählen" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:352 -#: .\cookbook\templates\meal_plan.html:256 -#: .\cookbook\templates\url_import.html:542 -msgid "Note" -msgstr "Notiz" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:369 -msgid "Delete Ingredient" -msgstr "Zutat löschen" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:375 -msgid "Make Header" -msgstr "Überschrift erstellen" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:381 -msgid "Make Ingredient" -msgstr "Zutat erstellen" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:387 -msgid "Disable Amount" -msgstr "Menge deaktivieren" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:393 -msgid "Enable Amount" -msgstr "Menge aktivieren" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:398 -msgid "Copy Template Reference" -msgstr "Kopiere Vorlagen-Referenz" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:424 -#: .\cookbook\templates\url_import.html:297 -#: .\cookbook\templates\url_import.html:567 -msgid "Instructions" -msgstr "Anleitung" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:437 -#: .\cookbook\templates\forms\edit_internal_recipe.html:468 -msgid "Save & View" -msgstr "Speichern & Ansehen" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:441 -#: .\cookbook\templates\forms\edit_internal_recipe.html:474 -msgid "Add Step" -msgstr "Schritt hinzufügen" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:444 -#: .\cookbook\templates\forms\edit_internal_recipe.html:478 -msgid "Add Nutrition" -msgstr "Nährwerte hinzufügen" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:446 -#: .\cookbook\templates\forms\edit_internal_recipe.html:480 -msgid "Remove Nutrition" -msgstr "Nährwerte entfernen" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:448 -#: .\cookbook\templates\forms\edit_internal_recipe.html:483 -msgid "View Recipe" -msgstr "Rezept ansehen" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:450 -#: .\cookbook\templates\forms\edit_internal_recipe.html:485 -msgid "Delete Recipe" -msgstr "Rezept löschen" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:491 -msgid "Steps" -msgstr "Schritte" - #: .\cookbook\templates\forms\ingredients.html:15 msgid "Edit Ingredients" msgstr "Zutaten bearbeiten" @@ -1165,11 +1297,6 @@ msgstr "" "entsprechenden Rezepte.\n" " " -#: .\cookbook\templates\forms\ingredients.html:24 -#: .\cookbook\templates\space.html:41 .\cookbook\templates\stats.html:26 -msgid "Units" -msgstr "Einheiten" - #: .\cookbook\templates\forms\ingredients.html:26 msgid "Are you sure that you want to merge these two units?" msgstr "" @@ -1185,30 +1312,47 @@ 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:18 +#: .\cookbook\templates\generic\delete_template.html:21 #, python-format msgid "Are you sure you want to delete the %(title)s: %(object)s " msgstr "" -"Bist du sicher, dass %(title)s: %(object)s gelöscht werden soll?" +"Bist du sicher, dass %(title)s: %(object)s gelöscht werden soll? " -#: .\cookbook\templates\generic\edit_template.html:30 +#: .\cookbook\templates\generic\delete_template.html:26 +msgid "Protected" +msgstr "Geschützt" + +#: .\cookbook\templates\generic\delete_template.html:41 +msgid "Cascade" +msgstr "Kaskadierung" + +#: .\cookbook\templates\generic\delete_template.html:72 +msgid "Cancel" +msgstr "Abbrechen" + +#: .\cookbook\templates\generic\edit_template.html:32 msgid "View" -msgstr "Anschauen" +msgstr "Ansicht" -#: .\cookbook\templates\generic\edit_template.html:34 +#: .\cookbook\templates\generic\edit_template.html:36 msgid "Delete original file" -msgstr "Original löschen" +msgstr "Originaldatei löschen" #: .\cookbook\templates\generic\list_template.html:6 -#: .\cookbook\templates\generic\list_template.html:12 +#: .\cookbook\templates\generic\list_template.html:22 msgid "List" msgstr "Liste" -#: .\cookbook\templates\generic\list_template.html:25 +#: .\cookbook\templates\generic\list_template.html:33 +#: .\cookbook\templates\shopping_list.html:33 +msgid "Try the new shopping list" +msgstr "Neue Einkaufsliste ausprobieren" + +#: .\cookbook\templates\generic\list_template.html:45 msgid "Filter" msgstr "Filter" -#: .\cookbook\templates\generic\list_template.html:30 +#: .\cookbook\templates\generic\list_template.html:50 msgid "Import all" msgstr "Alle importieren" @@ -1234,23 +1378,32 @@ msgstr "Kochverlauf" msgid "Import Recipes" msgstr "Rezepte importieren" -#: .\cookbook\templates\include\log_cooking.html:7 +#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 +#: .\cookbook\templates\import_response.html:7 +#: .\cookbook\templates\test.html:14 .\cookbook\templates\test.html:20 +#: .\cookbook\templates\url_import.html:29 +#: .\cookbook\templates\url_import.html:108 +#: .\cookbook\templates\url_import.html:130 +#: .\cookbook\templates\url_import.html:324 +#: .\cookbook\templates\url_import.html:618 .\cookbook\views\delete.py:89 +#: .\cookbook\views\edit.py:200 +msgid "Import" +msgstr "Importieren" + +#: .\cookbook\templates\include\log_cooking.html:9 msgid "Log Recipe Cooking" msgstr "Kochen protokollieren" -#: .\cookbook\templates\include\log_cooking.html:13 +#: .\cookbook\templates\include\log_cooking.html:15 msgid "All fields are optional and can be left empty." msgstr "Alle Felder sind optional und können leer gelassen werden." -#: .\cookbook\templates\include\log_cooking.html:19 +#: .\cookbook\templates\include\log_cooking.html:21 msgid "Rating" msgstr "Bewertung" -#: .\cookbook\templates\include\log_cooking.html:27 +#: .\cookbook\templates\include\log_cooking.html:29 #: .\cookbook\templates\include\recipe_open_modal.html:18 -#: .\cookbook\templates\meal_plan.html:283 -#: .\cookbook\templates\meal_plan.html:327 -#: .\cookbook\templates\meal_plan.html:366 msgid "Close" msgstr "Schließen" @@ -1275,8 +1428,8 @@ msgid "" " " msgstr "" "\n" -" Password und Token werden im Klartext in der " -"Datenbank gespeichert.\n" +" Password und Token werden im Klartext in der Datenbank " +"gespeichert.\n" " Dies ist notwendig da Passwort oder Token benötigt werden, um API-" "Anfragen zu stellen, bringt jedoch auch ein Sicherheitsrisiko mit sich.
\n" @@ -1304,8 +1457,8 @@ msgstr "Suche zurücksetzen" msgid "Last viewed" msgstr "Zuletzt angesehen" -#: .\cookbook\templates\index.html:87 .\cookbook\templates\meal_plan.html:178 -#: .\cookbook\templates\space.html:35 .\cookbook\templates\stats.html:22 +#: .\cookbook\templates\index.html:87 .\cookbook\templates\space.html:37 +#: .\cookbook\templates\stats.html:22 msgid "Recipes" msgstr "Rezepte" @@ -1334,12 +1487,14 @@ msgid "" " " msgstr "" "\n" -"Markdown ist eine Schreibweise mit der Text einfach formatiert werden kann. " -"Diese Seite benutzt
Python Markdown, eine Bibliothek, die reinen Text in schönes " -"HTML umwandelt. Die komplette Dokumentation befindet sich hier. Die wichtigsten Formatierungszeichen befinden sich hier auf dieser Seite." +" Markdown ist eine Schreibweise mit der Text einfach formatiert " +"werden kann. Diese Seite benutzt Python Markdown, eine Bibliothek, die reinen " +"Text in schönes HTML umwandelt. Die komplette Dokumentation befindet sich hier. Die wichtigsten Formatierungszeichen befinden sich hier " +"auf dieser Seite.\n" +" " #: .\cookbook\templates\markdown_info.html:25 msgid "Headers" @@ -1443,7 +1598,8 @@ msgid "" msgstr "" "Es ist schwierig, Markdown-Tabellen von Hand zu erstellen. Daher bietet es " "sich an, Werkzeuge wie dieses hier zu verwenden." +"markdown_tables\" rel=\"noreferrer noopener\" target=\"_blank\">dieses hier zu verwenden." #: .\cookbook\templates\markdown_info.html:155 #: .\cookbook\templates\markdown_info.html:157 @@ -1462,173 +1618,23 @@ msgstr "Überschrift" msgid "Cell" msgstr "Zelle" -#: .\cookbook\templates\meal_plan.html:101 -msgid "New Entry" -msgstr "Neuer Eintrag" +#: .\cookbook\templates\meal_plan_entry.html:6 +msgid "Meal Plan View" +msgstr "Plan-Ansicht" -#: .\cookbook\templates\meal_plan.html:113 -#: .\cookbook\templates\shopping_list.html:56 -msgid "Search Recipe" -msgstr "Rezept suchen" - -#: .\cookbook\templates\meal_plan.html:139 -msgid "Title" -msgstr "Titel" - -#: .\cookbook\templates\meal_plan.html:141 -msgid "Note (optional)" -msgstr "Notiz (optional)" - -#: .\cookbook\templates\meal_plan.html:143 -msgid "" -"You can use markdown to format this field. See the docs here" -msgstr "" -"Dieses Feld Unterstützt Markdown Formatierung. Siehe Dokumentation" - -#: .\cookbook\templates\meal_plan.html:147 -#: .\cookbook\templates\meal_plan.html:251 -msgid "Serving Count" -msgstr "Anzahl Portionen" - -#: .\cookbook\templates\meal_plan.html:153 -msgid "Create only note" -msgstr "Nur Notiz erstellen" - -#: .\cookbook\templates\meal_plan.html:168 -#: .\cookbook\templates\shopping_list.html:7 -#: .\cookbook\templates\shopping_list.html:29 -#: .\cookbook\templates\shopping_list.html:714 -msgid "Shopping List" -msgstr "Einkaufsliste" - -#: .\cookbook\templates\meal_plan.html:172 -msgid "Shopping list currently empty" -msgstr "Die Einkaufsliste ist aktuell leer" - -#: .\cookbook\templates\meal_plan.html:175 -msgid "Open Shopping List" -msgstr "Einkaufsliste öffnen" - -#: .\cookbook\templates\meal_plan.html:189 -msgid "Plan" -msgstr "Plan" - -#: .\cookbook\templates\meal_plan.html:196 -msgid "Number of Days" -msgstr "Anzahl an Tagen" - -#: .\cookbook\templates\meal_plan.html:206 -msgid "Weekday offset" -msgstr "Wochentage verschieben" - -#: .\cookbook\templates\meal_plan.html:209 -msgid "" -"Number of days starting from the first day of the week to offset the default " -"view." -msgstr "" -"Anzahl der Tage von ersten Tag der Woche, die der Plan standardmäßig " -"verschoben sein soll." - -#: .\cookbook\templates\meal_plan.html:217 -#: .\cookbook\templates\meal_plan.html:294 -msgid "Edit plan types" -msgstr "Plantypen editieren" - -#: .\cookbook\templates\meal_plan.html:219 -msgid "Show help" -msgstr "Hilfe anzeigen" - -#: .\cookbook\templates\meal_plan.html:220 -msgid "Week iCal export" -msgstr "Woche als iCal exportieren" - -#: .\cookbook\templates\meal_plan.html:264 #: .\cookbook\templates\meal_plan_entry.html:18 msgid "Created by" msgstr "Erstellt von" -#: .\cookbook\templates\meal_plan.html:270 #: .\cookbook\templates\meal_plan_entry.html:20 -#: .\cookbook\templates\shopping_list.html:254 +#: .\cookbook\templates\shopping_list.html:232 msgid "Shared with" msgstr "Geteilt mit" -#: .\cookbook\templates\meal_plan.html:280 -msgid "Add to Shopping" -msgstr "Zur Einkaufsliste hinzufügen" - -#: .\cookbook\templates\meal_plan.html:323 -msgid "New meal type" -msgstr "Neue Mahlzeit" - -#: .\cookbook\templates\meal_plan.html:338 -msgid "Meal Plan Help" -msgstr "Plan-Hilfe" - -#: .\cookbook\templates\meal_plan.html:344 -msgid "" -"\n" -"

The meal plan module allows planning of meals " -"both with recipes and notes.

\n" -"

Simply select a recipe from the list of " -"recently viewed recipes or search the one you\n" -" want and drag it to the desired plan " -"position. You can also add a note and a title and\n" -" then drag the recipe to create a plan entry " -"with a custom title and note. Creating only\n" -" Notes is possible by dragging the create " -"note box into the plan.

\n" -"

Click on a recipe in order to open the " -"detailed view. There you can also add it to the\n" -" shopping list. You can also add all recipes " -"of a day to the shopping list by\n" -" clicking the shopping cart at the top of the " -"table.

\n" -"

Since a common use case is to plan meals " -"together you can define\n" -" users you want to share your plan with in " -"the settings.\n" -"

\n" -"

You can also edit the types of meals you want " -"to plan. If you share your plan with\n" -" someone with\n" -" different meals, their meal types will " -"appear in your list as well. To prevent\n" -" duplicates (e.g. Other and Misc.)\n" -" name your meal types the same as the users " -"you share your meals with and they will be\n" -" merged.

\n" -" " -msgstr "" -"\n" -"

Das Planmodul erlaubt das Planen mithilfe von " -"Rezepten und Notizen.

\n" -"

Einfach ein Rezept aussuchen und an die " -"Stelle im Plan ziehen, an der es gekocht werden soll. Es kann außerdem eine " -"Notiz und ein Titel hinzugefügt werden. Einen Eintrag nur als Notiz zu " -"erstellen ist durch Eingabe einer Notiz und Schieben des Notiz-Blocks in den " -"Plan möglich.

\n" -"

Durch Klicken auf ein Rezept öffnet sich die " -"Detailansicht. Da kann das Rezept auch auf die Einkaufsliste hinzugefügt " -"werden. Es können auch alle Rezepte eines Tages auf die Einkaufsliste " -"gesetzt werden, indem der Einkaufswagen im Tabellenkopf angeklickt wird.\n" -"

Da Pläne häufig für mehrere Nutzer erstellt " -"werden, können Nutzer in den Einstellungen angegeben werden, mit denen neue " -"Pläne automatisch geteilt werden sollen.\n" -"

\n" -"

Die Mahlzeiten, die geplant werden sollen, " -"können bearbeitet werden. Wenn Pläne zwischen Nutzern mit unterschiedlichen " -"Mahlzeiten geteilt werden, erscheinen alle Mahlzeiten. Um Duplikate zu " -"vermeiden (z.B. Mittagessen und Mittag) sollten Mahlzeiten teilender Nutzer " -"gleich benannt werden, dadurch kann das System sie zusammenfassen.

\n" -" " - -#: .\cookbook\templates\meal_plan_entry.html:6 -msgid "Meal Plan View" -msgstr "Plan-Ansicht" +#: .\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." @@ -1675,6 +1681,8 @@ msgid "" "Recipes, foods, shopping lists and more are organized in spaces of one or " "more people." msgstr "" +"Rezepte, Lebensmittel, Einkaufslisten und weiteres werden Instanzen mit " +"einem oder mehreren Mitgliedern zugeordnet." #: .\cookbook\templates\no_space_info.html:18 msgid "" @@ -1730,29 +1738,28 @@ msgstr "" "Die unterhalb aufgelisteten Rezepte sind offline verfügbar, da du sie vor " "kurzem angesehen hast. Beachte, dass die Daten veraltetet sein könnten." -#: .\cookbook\templates\recipe_view.html:21 .\cookbook\templates\space.html:62 -#: .\cookbook\templates\stats.html:47 -msgid "Comments" -msgstr "Kommentare" +#: .\cookbook\templates\recipe_view.html:26 +msgid "by" +msgstr "von" -#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:118 -#: .\cookbook\views\edit.py:179 +#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:147 +#: .\cookbook\views\edit.py:180 msgid "Comment" msgstr "Kommentar" #: .\cookbook\templates\recipes_table.html:19 #: .\cookbook\templates\recipes_table.html:23 -#: .\cookbook\templates\url_import.html:440 +#: .\cookbook\templates\url_import.html:447 msgid "Recipe Image" msgstr "Rezeptbild" #: .\cookbook\templates\recipes_table.html:51 -#: .\cookbook\templates\url_import.html:445 +#: .\cookbook\templates\url_import.html:452 msgid "Preparation time ca." msgstr "Zubereitungszeit ca." #: .\cookbook\templates\recipes_table.html:57 -#: .\cookbook\templates\url_import.html:450 +#: .\cookbook\templates\url_import.html:457 msgid "Waiting time ca." msgstr "Wartezeit ca." @@ -1768,54 +1775,309 @@ msgstr "Kochen protokollieren" msgid "Recipe Home" msgstr "Rezept-Hauptseite" -#: .\cookbook\templates\settings.html:25 +#: .\cookbook\templates\search_info.html:5 +#: .\cookbook\templates\search_info.html:9 +#: .\cookbook\templates\settings.html:172 +msgid "Search Settings" +msgstr "Sucheinstellungen" + +#: .\cookbook\templates\search_info.html:10 +msgid "" +"\n" +" Creating the best search experience is complicated and weighs " +"heavily on your personal configuration. \n" +" Changing any of the search settings can have significant impact on " +"the speed and quality of the results.\n" +" Search Methods, Trigrams and Full Text Search configurations are " +"only available if you are using Postgres for your database.\n" +" " +msgstr "" +"\n" +" Das optimieren der Suchergebnisse ist kompliziert und stark abhängig " +"von deiner persönlichen Konfiguration. \n" +" Auch einzelne Einstellungen können die Geschwindigkeit und Qualität " +"der Suchergebnisse maßgeblich beinflussen..\n" +" Die Suchtypen \"Trigram\" und Volltext sind nur verfügbar falls eine " +"PostgreSQL Datenbank verwendet wird..\n" +" " + +#: .\cookbook\templates\search_info.html:19 +msgid "Search Methods" +msgstr "Suchtypen" + +#: .\cookbook\templates\search_info.html:23 +msgid "" +" \n" +" Full text searches attempt to normalize the words provided to " +"match common variants. For example: 'forked', 'forking', 'forks' will all " +"normalize to 'fork'.\n" +" There are several methods available, described below, that will " +"control how the search behavior should react when multiple words are " +"searched.\n" +" Full technical details on how these operate can be viewed on Postgresql's website.\n" +" " +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" +" Es sind verschiedene Methoden verfügbar, welche weiter unten " +"genau beschrieben werden. Diese beeinflussen das Suchergebnis bei einer " +"Suche mit mehreren Wörtern.\n" +" Technische Details können auf der Website von PostgreSQL. eingesehen werden.\n" +" " + +#: .\cookbook\templates\search_info.html:29 +msgid "" +" \n" +" Simple searches ignore punctuation and common words such as " +"'the', 'a', 'and'. And will treat seperate words as required.\n" +" Searching for 'apple or flour' will return any recipe that " +"includes both 'apple' and 'flour' anywhere in the fields that have been " +"selected for a full text search.\n" +" " +msgstr "" +" \n" +" Einfache Suchen ignorieren Satzzeichen und Stoppwörter wie \"und" +"\", \"der\", \"doch\". Getrennte Wörter werden als erforderlich gewertet.\n" +" Eine Suche nach \"Der Apfel und Mehl\" wird alle Rezepte liefern " +"die \"Apfel\" oder \"Mehl\" in einem der ausgewählten Suchfeldern " +"enthalten.\n" +" " + +#: .\cookbook\templates\search_info.html:34 +msgid "" +" \n" +" Phrase searches ignore punctuation, but will search for all of " +"the words in the exact order provided.\n" +" Searching for 'apple or flour' will only return a recipe that " +"includes the exact phrase 'apple or flour' in any of the fields that have " +"been selected for a full text search.\n" +" " +msgstr "" +" \n" +" Die Suche nach Phrasen ignoriert Satzzeichen, beachtet aber die " +"Reihenfolge der Suchworte.\n" +" Eine Suche nach \"Apfel und Mehl\" wird nur Rezepte liefern die " +"\"Apfel und Mehl\" in einem der ausgewählten Suchfeldern enthalten.\n" +" " + +#: .\cookbook\templates\search_info.html:39 +msgid "" +" \n" +" Web searches simulate functionality found on many web search " +"sites supporting special syntax.\n" +" Placing quotes around several words will convert those words " +"into a phrase.\n" +" 'or' is recongized as searching for the word (or phrase) " +"immediately before 'or' OR the word (or phrase) directly after.\n" +" '-' is recognized as searching for recipes that do not include " +"the word (or phrase) that comes immediately after. \n" +" For example searching for 'apple pie' or cherry -butter will " +"return any recipe that includes the phrase 'apple pie' or the word " +"'cherry' \n" +" in any field included in the full text search but exclude any " +"recipe that has the word 'butter' in any field included.\n" +" " +msgstr "" +" \n" +" Der Suchtyp \"Web\" simuliert die Funktion vieler " +"Internetsuchmaschinen mit speziellem Syntax.\n" +" Anführungszeichen um mehrere Wörter verwandeln diese in eine " +"Phrase.\n" +" \"or\" versteht sich als \"oder\", sprich es muss das Wort (oder " +"die Phrase) vor dem \"or\" oder nach dem \"or\" enthalten sein.\n" +" '-' ist als Ausschluss nutzbar, so werden nur Rezepte gefunden " +"die nicht das folgende Wort (oder die Phrase) enthalten. \n" +" Beispiel: Eine Suche nach \"'Apfelkuchen mit Sahne' or Torte -" +"Butter\" liefert alle Suchergebnisse die entweder \"Apfelkuchen mit Sahne" +"\" \n" +" oder Torte enthalten, schließt aber Ergebnisse welche Butter " +"enthalten aus.\n" +" " + +#: .\cookbook\templates\search_info.html:48 +msgid "" +" \n" +" Raw search is similar to Web except will take puncuation " +"operators such as '|', '&' and '()'\n" +" " +msgstr "" +" \n" +" Der Suchtyp Rohdaten ist ähnlich zu Web, erlaubt aber " +"Satzzeichen und spezielle Operatoren wie '|', '&' und '()'\n" +" " + +#: .\cookbook\templates\search_info.html:59 +msgid "" +" \n" +" Another approach to searching that also requires Postgresql is " +"fuzzy search or trigram similarity. A trigram is a group of three " +"consecutive characters.\n" +" For example searching for 'apple' will create x trigrams 'app', " +"'ppl', 'ple' and will create a score of how closely words match the " +"generated trigrams.\n" +" One benefit of searching trigams is that a search for 'sandwich' " +"will find mispelled words such as 'sandwhich' that would be missed by other " +"methods.\n" +" " +msgstr "" +" \n" +" 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 " +"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" +" " + +#: .\cookbook\templates\search_info.html:69 +msgid "Search Fields" +msgstr "Suchfelder" + +#: .\cookbook\templates\search_info.html:73 +msgid "" +" \n" +" Unaccent is a special case in that it enables searching a field " +"'unaccented' for each search style attempting to ignore accented values. \n" +" For example when you enable unaccent for 'Name' any search " +"(starts with, contains, trigram) will attempt the search ignoring accented " +"characters.\n" +" \n" +" For the other options, you can enable search on any or all " +"fields and they will be combined together with an assumed 'OR'.\n" +" For example enabling 'Name' for Starts With, 'Name' and " +"'Description' for Partial Match and 'Ingredients' and 'Keywords' for Full " +"Search\n" +" and searching for 'apple' will generate a search that will " +"return recipes that have:\n" +" - A recipe name that starts with 'apple'\n" +" - OR a recipe name that contains 'apple'\n" +" - OR a recipe description that contains 'apple'\n" +" - OR a recipe that will have a full text search match ('apple' " +"or 'apples') in ingredients\n" +" - OR a recipe that will have a full text search match in " +"Keywords\n" +"\n" +" Combining too many fields in too many types of search can have a " +"negative impact on performance, create duplicate results or return " +"unexpected results.\n" +" For example, enabling fuzzy search or partial matches will " +"interfere with web search methods. \n" +" Searching for 'apple -pie' with fuzzy search and full text " +"search will return the recipe Apple Pie. Though it is not included in the " +"full text results, it does match the trigram results.\n" +" " +msgstr "" +" \n" +" Unbetonte Suche ist ein spezieller Typ welcher erlaubt ein Feld " +"\"unbetont\" für jeden Suchtyp zu durchsuchen. \n" +" Wenn die unbetonte Suche Beispielsweise für das Feld \"Name\" " +"aktiviert werden, wird jeder Suchtyp auf diesem Feld versuchen unbetont zu " +"suchen.\n" +" \n" +" Wen die Suche für weitere Felder aktiviert wird, versteht die " +"Suche dies als \"oder\".\n" +" Beispielsweise könnte man \"Name\" als Beginnt mit , \"Name\" " +"und \"Description\" als Partielle Treffer und \"Inhaltstoffe\" sowie " +"\"Keyword\" im Volltext durchsuchen \n" +" Eine Suche nach \"Apfel\" wird dann zu folgenden Ergebnissen " +"führen::\n" +" - Rezeptname beginnt mit \"Apfel\"\n" +" - ODER Rezeptname enthält \"Apfel\"\n" +" - ODER Rezeptbeschreibung enthält \"Apfel'\n" +" - ODER das Rezept hat einen Volltext-Treffer in den " +"Inhaltstoffen\n" +" - ODER das Rezept hat einen Volltext-Treffer in den Keywords\n" +"\n" +" Das Kombinieren von zu vielen Suchtypen kann negative Einflüsse " +"auf die Geschwindigkeit der Suche haben, doppelte Ergebnisse verursachen " +"oder unerwartete Ergebnisse liefern.\n" +" Beispielsweise führt das aktivieren der Ungenauen Suche zu " +"Problemen in Kombination mit dem Suchtyp Web.\n" +" " + +#: .\cookbook\templates\search_info.html:95 +msgid "Search Index" +msgstr "Suchindex" + +#: .\cookbook\templates\search_info.html:99 +msgid "" +" \n" +" Trigram search and Full Text Search both rely on database " +"indexes to perform effectively. \n" +" You can rebuild the indexes on all fields in the Admin page for " +"Recipes and selecting all recipes and running 'rebuild index for selected " +"recipes'\n" +" You can also rebuild indexes at the command line by executing " +"the management command 'python manage.py rebuildindex'\n" +" " +msgstr "" +" \n" +" Die Trigramm und Volltext-Suche benötigen Indizes auf der " +"Datenbank um schnell Ergebnisse zu liefern. \n" +" 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" +" " + +#: .\cookbook\templates\settings.html:28 msgid "Account" msgstr "Account" -#: .\cookbook\templates\settings.html:29 +#: .\cookbook\templates\settings.html:35 msgid "Preferences" msgstr "Präferenzen" -#: .\cookbook\templates\settings.html:33 +#: .\cookbook\templates\settings.html:42 msgid "API-Settings" msgstr "API-Einstellungen" -#: .\cookbook\templates\settings.html:41 +#: .\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:49 -#, fuzzy -#| msgid "Account Connections" +#: .\cookbook\templates\settings.html:73 msgid "Account Settings" -msgstr "Account-Verbindungen" +msgstr "Account-Einstellungen" -#: .\cookbook\templates\settings.html:51 -#, fuzzy -#| msgid "Add E-mail" +#: .\cookbook\templates\settings.html:75 msgid "Emails" -msgstr "Email hinzufügen" +msgstr "E-Mail Adressen" -#: .\cookbook\templates\settings.html:54 +#: .\cookbook\templates\settings.html:78 #: .\cookbook\templates\socialaccount\connections.html:11 -#, fuzzy -#| msgid "Social Login" msgid "Social" -msgstr "Social Login" +msgstr "Social" -#: .\cookbook\templates\settings.html:66 +#: .\cookbook\templates\settings.html:91 msgid "Language" msgstr "Sprache" -#: .\cookbook\templates\settings.html:96 +#: .\cookbook\templates\settings.html:121 msgid "Style" msgstr "Stil" -#: .\cookbook\templates\settings.html:116 +#: .\cookbook\templates\settings.html:142 msgid "API Token" msgstr "API-Token" -#: .\cookbook\templates\settings.html:117 +#: .\cookbook\templates\settings.html:143 msgid "" "You can use both basic authentication and token based authentication to " "access the REST API." @@ -1823,7 +2085,7 @@ msgstr "" "Sowohl Basic Authentication als auch tokenbasierte Authentifizierung können " "für die REST-API verwendet werden." -#: .\cookbook\templates\settings.html:134 +#: .\cookbook\templates\settings.html:160 msgid "" "Use the token as an Authorization header prefixed by the word token as shown " "in the following examples:" @@ -1831,10 +2093,75 @@ msgstr "" "Nutz den Token als Authorization-Header mit der Präfix \"Token\" wie in " "folgendem Beispiel:" -#: .\cookbook\templates\settings.html:136 +#: .\cookbook\templates\settings.html:162 msgid "or" msgstr "oder" +#: .\cookbook\templates\settings.html:173 +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 +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 "" +"Im Normalfall ist es nicht notwendig die Einstellung zu verändern. " +"Meist erreichen die Standardeinstellungen oder eine der folgenden " +"Suchprofile sehr gute Suchergebnisse." + +#: .\cookbook\templates\settings.html:175 +msgid "" +"If you do want to configure the search you can read about the different " +"options here." +msgstr "" +"Weitere Informationen zu den einzelnen Optionen sind hier zu finden." + +#: .\cookbook\templates\settings.html:180 +msgid "Fuzzy" +msgstr "Unscharf" + +#: .\cookbook\templates\settings.html:181 +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 "" +"Liefert alle erwartbaren Suchergebnisse auch wenn Tippfehler im Suchbegriff " +"sind. Kann jedoch mehr Ergebnisse als notwendig liefern." + +#: .\cookbook\templates\settings.html:182 +msgid "This is the default behavior" +msgstr "Dies ist die Standardeinstellung" + +#: .\cookbook\templates\settings.html:183 +#: .\cookbook\templates\settings.html:191 +msgid "Apply" +msgstr "Anwenden" + +#: .\cookbook\templates\settings.html:188 +msgid "Precise" +msgstr "Präzise" + +#: .\cookbook\templates\settings.html:189 +msgid "" +"Allows fine control over search results but might not return results if too " +"many spelling mistakes are made." +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 +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" @@ -1854,50 +2181,73 @@ msgstr "" msgid "Create Superuser account" msgstr "Administrator-Account Erstellen" -#: .\cookbook\templates\shopping_list.html:79 +#: .\cookbook\templates\shopping_list.html:8 +#: .\cookbook\templates\shopping_list.html:29 +#: .\cookbook\templates\shopping_list.html:663 +msgid "Shopping List" +msgstr "Einkaufsliste" + +#: .\cookbook\templates\shopping_list.html:55 +msgid "Search Recipe" +msgstr "Rezept suchen" + +#: .\cookbook\templates\shopping_list.html:72 msgid "Shopping Recipes" msgstr "Einkaufs-Rezepte" -#: .\cookbook\templates\shopping_list.html:83 +#: .\cookbook\templates\shopping_list.html:74 msgid "No recipes selected" msgstr "Keine Rezepte ausgewählt" -#: .\cookbook\templates\shopping_list.html:150 +#: .\cookbook\templates\shopping_list.html:131 msgid "Entry Mode" msgstr "Eintrags-Modus" -#: .\cookbook\templates\shopping_list.html:158 +#: .\cookbook\templates\shopping_list.html:139 msgid "Add Entry" msgstr "Eintrag hinzufügen" -#: .\cookbook\templates\shopping_list.html:174 +#: .\cookbook\templates\shopping_list.html:152 msgid "Amount" msgstr "Menge" -#: .\cookbook\templates\shopping_list.html:240 +#: .\cookbook\templates\shopping_list.html:164 +msgid "Select Unit" +msgstr "Einheit wählen" + +#: .\cookbook\templates\shopping_list.html:166 +#: .\cookbook\templates\shopping_list.html:189 +#: .\cookbook\templates\shopping_list.html:219 +#: .\cookbook\templates\shopping_list.html:243 +#: .\cookbook\templates\url_import.html:505 +#: .\cookbook\templates\url_import.html:537 +msgid "Select" +msgstr "Auswählen" + +#: .\cookbook\templates\shopping_list.html:187 +msgid "Select Food" +msgstr "Zutat auswählen" + +#: .\cookbook\templates\shopping_list.html:218 msgid "Select Supermarket" msgstr "Supermarkt auswählen" -#: .\cookbook\templates\shopping_list.html:264 +#: .\cookbook\templates\shopping_list.html:242 msgid "Select User" msgstr "Nutzer auswählen" -#: .\cookbook\templates\shopping_list.html:283 +#: .\cookbook\templates\shopping_list.html:258 msgid "Finished" msgstr "Erledigt" -#: .\cookbook\templates\shopping_list.html:296 +#: .\cookbook\templates\shopping_list.html:267 msgid "You are offline, shopping list might not syncronize." msgstr "Du bist offline, die Einkaufsliste wird ggf. nicht synchronisiert." -#: .\cookbook\templates\shopping_list.html:361 +#: .\cookbook\templates\shopping_list.html:318 msgid "Copy/Export" msgstr "Kopieren/Exportieren" -#: .\cookbook\templates\shopping_list.html:365 -msgid "List Prefix" -msgstr "Listenpräfix" - #: .\cookbook\templates\socialaccount\connections.html:4 #: .\cookbook\templates\socialaccount\connections.html:15 msgid "Account Connections" @@ -1922,10 +2272,8 @@ msgid "Add a 3rd Party Account" msgstr "Fremden Account hinzufügen" #: .\cookbook\templates\socialaccount\signup.html:5 -#, fuzzy -#| msgid "Sign Up" msgid "Signup" -msgstr "Registrieren" +msgstr "Registrierung" #: .\cookbook\templates\socialaccount\signup.html:10 #, python-format @@ -1934,6 +2282,9 @@ msgid "" " %(provider_name)s account to login to\n" " %(site_name)s. As a final step, please complete the following form:" msgstr "" +"Du wirst via\n" +" %(provider_name)s eingeloggt.\n" +" %(site_name)s. Fülle bitte vorher noch diese Formular aus:" #: .\cookbook\templates\socialaccount\snippets\provider_list.html:23 #: .\cookbook\templates\socialaccount\snippets\provider_list.html:31 @@ -1949,97 +2300,83 @@ msgstr "" #: .\cookbook\templates\socialaccount\snippets\provider_list.html:111 #: .\cookbook\templates\socialaccount\snippets\provider_list.html:119 #: .\cookbook\templates\socialaccount\snippets\provider_list.html:127 -#, fuzzy -#| msgid "Sign In" msgid "Sign in using" -msgstr "Einloggen" +msgstr "Einloggen mit" -#: .\cookbook\templates\space.html:23 -#, fuzzy -#| msgid "No Space" +#: .\cookbook\templates\space.html:25 msgid "Space:" -msgstr "Kein Space" +msgstr "Instanz:" -#: .\cookbook\templates\space.html:24 -#, fuzzy -#| msgid "Description" +#: .\cookbook\templates\space.html:26 msgid "Manage Subscription" -msgstr "Beschreibung" +msgstr "Tarif verwalten" -#: .\cookbook\templates\space.html:32 .\cookbook\templates\stats.html:19 +#: .\cookbook\templates\space.html:34 .\cookbook\templates\stats.html:19 msgid "Number of objects" msgstr "Anzahl an Objekten" -#: .\cookbook\templates\space.html:45 .\cookbook\templates\stats.html:30 +#: .\cookbook\templates\space.html:54 .\cookbook\templates\stats.html:30 msgid "Recipe Imports" msgstr "Importierte Rezepte" -#: .\cookbook\templates\space.html:53 .\cookbook\templates\stats.html:38 +#: .\cookbook\templates\space.html:62 .\cookbook\templates\stats.html:38 msgid "Objects stats" msgstr "Objekt-Statistiken" -#: .\cookbook\templates\space.html:56 .\cookbook\templates\stats.html:41 +#: .\cookbook\templates\space.html:65 .\cookbook\templates\stats.html:41 msgid "Recipes without Keywords" msgstr "Rezepte ohne Schlagwort" -#: .\cookbook\templates\space.html:58 .\cookbook\templates\stats.html:43 -msgid "External Recipes" -msgstr "Externe Rezepte" - -#: .\cookbook\templates\space.html:60 .\cookbook\templates\stats.html:45 +#: .\cookbook\templates\space.html:73 .\cookbook\templates\stats.html:45 msgid "Internal Recipes" msgstr "Interne Rezepte" -#: .\cookbook\templates\space.html:73 +#: .\cookbook\templates\space.html:89 msgid "Members" msgstr "Mitglieder" -#: .\cookbook\templates\space.html:77 +#: .\cookbook\templates\space.html:95 msgid "Invite User" msgstr "Benutzer einladen" -#: .\cookbook\templates\space.html:88 +#: .\cookbook\templates\space.html:107 msgid "User" msgstr "Benutzer" -#: .\cookbook\templates\space.html:89 +#: .\cookbook\templates\space.html:108 msgid "Groups" msgstr "Gruppen" -#: .\cookbook\templates\space.html:105 -#, fuzzy -#| msgid "Admin" +#: .\cookbook\templates\space.html:119 msgid "admin" msgstr "Admin" -#: .\cookbook\templates\space.html:106 +#: .\cookbook\templates\space.html:120 msgid "user" -msgstr "" +msgstr "Benutzer" -#: .\cookbook\templates\space.html:107 +#: .\cookbook\templates\space.html:121 msgid "guest" -msgstr "" +msgstr "Gast" -#: .\cookbook\templates\space.html:108 -#, fuzzy -#| msgid "Remove" +#: .\cookbook\templates\space.html:122 msgid "remove" msgstr "Entfernen" -#: .\cookbook\templates\space.html:112 +#: .\cookbook\templates\space.html:126 msgid "Update" -msgstr "" +msgstr "Aktualisierung" -#: .\cookbook\templates\space.html:116 +#: .\cookbook\templates\space.html:130 msgid "You cannot edit yourself." msgstr "Du kannst dies nicht selbst bearbeiten." -#: .\cookbook\templates\space.html:123 +#: .\cookbook\templates\space.html:136 msgid "There are no members in your space yet!" msgstr "In diesem Space sind bisher noch keine Mitglieder!" -#: .\cookbook\templates\space.html:130 .\cookbook\templates\system.html:21 -#: .\cookbook\views\lists.py:115 +#: .\cookbook\templates\space.html:143 .\cookbook\templates\system.html:21 +#: .\cookbook\views\lists.py:85 msgid "Invite Links" msgstr "Einladungslinks" @@ -2047,6 +2384,10 @@ msgstr "Einladungslinks" msgid "Stats" msgstr "Statistiken" +#: .\cookbook\templates\stats.html:10 +msgid "Statistics" +msgstr "Statistiken" + #: .\cookbook\templates\system.html:22 msgid "Show Links" msgstr "Links anzeigen" @@ -2099,7 +2440,8 @@ msgstr "" "Das direkte ausliefern von Mediendateien mit gunicorn/python ist nicht " "empfehlenswert! Bitte folge den beschriebenen Schritten hier, um Ihre " -"Installation zu aktualisieren." +"Installation zu aktualisieren.\n" +" " #: .\cookbook\templates\system.html:57 .\cookbook\templates\system.html:73 #: .\cookbook\templates\system.html:88 .\cookbook\templates\system.html:102 @@ -2108,7 +2450,7 @@ msgstr "Alles in Ordnung!" #: .\cookbook\templates\system.html:62 msgid "Secret Key" -msgstr "Secret Key" +msgstr "Geheimer Schlüssel" #: .\cookbook\templates\system.html:66 msgid "" @@ -2123,11 +2465,12 @@ msgid "" " " msgstr "" "\n" -"Du hast keinen SECRET_KEY in deiner .env-Datei " -"konfiguriert. Django verwendet standardmäßig den mit der Installation " -"gelieferten Standardschlüssel, der öffentlich bekannt und unsicher ist! " -"Bitte setze den SECRET_KEY in der Konfigurationsdatei ." -"env." +" Du hast keinen SECRET_KEY in deiner .env-Datei konfiguriert. Django verwendet standardmäßig den mit der " +"Installation gelieferten Standardschlüssel, der öffentlich bekannt und " +"unsicher ist! Bitte setze den SECRET_KEY in der " +"Konfigurationsdatei .env.\n" +" " #: .\cookbook\templates\system.html:78 msgid "Debug Mode" @@ -2144,10 +2487,11 @@ msgid "" " " msgstr "" "\n" -"Diese Anwendung läuft noch im Debug-Modus. Dieser wird höchstwahrscheinlich " -"nicht benötigt.\n" +" Diese Anwendung läuft noch im Debug-Modus. Dieser wird " +"höchstwahrscheinlich nicht benötigt.\n" "Schalte den Debug-Modus aus, indem du DEBUG=0 in der " -"Konfigurationsdatei .env einstellst." +"Konfigurationsdatei .env einstellst.\n" +" " #: .\cookbook\templates\system.html:93 msgid "Database" @@ -2166,148 +2510,179 @@ msgid "" " " msgstr "" "\n" -"Diese Anwendung läuft nicht mit einer Postgres Datenbank. Dies ist in " -"Ordnung, wird aber nicht empfohlen, da einige\n" -"Funktionen nur mit einer Postgres-Datenbanken funktionieren." +" Diese Anwendung läuft nicht mit einer PostgreSQL Datenbank. Dies " +"ist in Ordnung, wird aber nicht empfohlen, da einige\n" +"Funktionen nur mit einer PostgreSQL-Datenbanken funktionieren.\n" +" " -#: .\cookbook\templates\url_import.html:6 +#: .\cookbook\templates\url_import.html:8 msgid "URL Import" msgstr "URL-Import" -#: .\cookbook\templates\url_import.html:31 +#: .\cookbook\templates\url_import.html:33 msgid "Drag me to your bookmarks to import recipes from anywhere" msgstr "Ziehe mich in deine Lesezeichen, um Rezepte von überall zu importieren" -#: .\cookbook\templates\url_import.html:32 -#, fuzzy -#| msgid "Bookmark saved!" +#: .\cookbook\templates\url_import.html:34 msgid "Bookmark Me!" msgstr "Lesezeichen speichern!" -#: .\cookbook\templates\url_import.html:61 +#: .\cookbook\templates\url_import.html:38 +msgid "URL" +msgstr "URL" + +#: .\cookbook\templates\url_import.html:40 +msgid "App" +msgstr "Anwendung" + +#: .\cookbook\templates\url_import.html:64 msgid "Enter website URL" msgstr "Webseite-URL eingeben" -#: .\cookbook\templates\url_import.html:97 -#, fuzzy +#: .\cookbook\templates\url_import.html:104 msgid "Select recipe files to import or drop them here..." msgstr "Wähle Rezept-Dateien zum Importieren oder platziere sie hier..." -#: .\cookbook\templates\url_import.html:118 +#: .\cookbook\templates\url_import.html:125 msgid "Paste json or html source here to load recipe." msgstr "Füge JSON- oder HTML-Daten hier ein um das Rezept zu laden." -#: .\cookbook\templates\url_import.html:146 +#: .\cookbook\templates\url_import.html:153 msgid "Preview Recipe Data" msgstr "Rezept-Daten ansehen" -#: .\cookbook\templates\url_import.html:147 +#: .\cookbook\templates\url_import.html:154 msgid "Drag recipe attributes from the right into the appropriate box below." -msgstr "" +msgstr "Ziehe Rezepteigenschaften von Rechts in die entsprechende Box unten." -#: .\cookbook\templates\url_import.html:156 -#: .\cookbook\templates\url_import.html:173 -#: .\cookbook\templates\url_import.html:190 -#: .\cookbook\templates\url_import.html:209 -#: .\cookbook\templates\url_import.html:227 -#: .\cookbook\templates\url_import.html:242 -#: .\cookbook\templates\url_import.html:257 -#: .\cookbook\templates\url_import.html:273 -#: .\cookbook\templates\url_import.html:300 -#: .\cookbook\templates\url_import.html:351 +#: .\cookbook\templates\url_import.html:163 +#: .\cookbook\templates\url_import.html:180 +#: .\cookbook\templates\url_import.html:197 +#: .\cookbook\templates\url_import.html:216 +#: .\cookbook\templates\url_import.html:234 +#: .\cookbook\templates\url_import.html:249 +#: .\cookbook\templates\url_import.html:264 +#: .\cookbook\templates\url_import.html:280 +#: .\cookbook\templates\url_import.html:307 +#: .\cookbook\templates\url_import.html:358 msgid "Clear Contents" -msgstr "" +msgstr "Inhalte leeren" -#: .\cookbook\templates\url_import.html:158 +#: .\cookbook\templates\url_import.html:165 msgid "Text dragged here will be appended to the name." -msgstr "" +msgstr "Text welcher hierhin gezogen wird, wird an den Namen angehängt." -#: .\cookbook\templates\url_import.html:175 +#: .\cookbook\templates\url_import.html:178 +msgid "Description" +msgstr "Beschreibung" + +#: .\cookbook\templates\url_import.html:182 msgid "Text dragged here will be appended to the description." -msgstr "" +msgstr "Text welcher hierhin gezogen wird, wird an die Beschreibung angehängt." -#: .\cookbook\templates\url_import.html:192 +#: .\cookbook\templates\url_import.html:199 msgid "Keywords dragged here will be appended to current list" msgstr "" +"Stichworte welche hierhin gezogen werden, werden zur aktuellen Liste " +"hinzugefügt" -#: .\cookbook\templates\url_import.html:207 +#: .\cookbook\templates\url_import.html:214 msgid "Image" msgstr "Bild" -#: .\cookbook\templates\url_import.html:239 +#: .\cookbook\templates\url_import.html:246 msgid "Prep Time" msgstr "Vorbereitungszeit" -#: .\cookbook\templates\url_import.html:254 +#: .\cookbook\templates\url_import.html:261 msgid "Cook Time" msgstr "Kochzeit" -#: .\cookbook\templates\url_import.html:275 +#: .\cookbook\templates\url_import.html:282 msgid "Ingredients dragged here will be appended to current list." msgstr "" +"Zutaten welche hierhin gezogen werden, werden zur aktuellen Liste " +"hinzugefügt." -#: .\cookbook\templates\url_import.html:302 +#: .\cookbook\templates\url_import.html:304 +#: .\cookbook\templates\url_import.html:579 +msgid "Instructions" +msgstr "Anleitung" + +#: .\cookbook\templates\url_import.html:309 msgid "" "Recipe instructions dragged here will be appended to current instructions." msgstr "" +"Rezeptanweisungen welche hierhin gezogen werden, werden zu den aktuellen " +"Anweisungen hinzugefügt." -#: .\cookbook\templates\url_import.html:325 +#: .\cookbook\templates\url_import.html:332 msgid "Discovered Attributes" msgstr "Entdeckte Attribute" -#: .\cookbook\templates\url_import.html:327 +#: .\cookbook\templates\url_import.html:334 msgid "" "Drag recipe attributes from below into the appropriate box on the left. " "Click any node to display its full properties." msgstr "" +"Ziehe Rezepteigenschaften von unten in das jeweilige Feld links. Klicke auf " +"beliebige Elemente um dessen Eigenschaften anzuzeigen." -#: .\cookbook\templates\url_import.html:344 +#: .\cookbook\templates\url_import.html:351 msgid "Show Blank Field" msgstr "Leeres Feld anzeigen" -#: .\cookbook\templates\url_import.html:349 +#: .\cookbook\templates\url_import.html:356 msgid "Blank Field" msgstr "Leeres Feld" -#: .\cookbook\templates\url_import.html:353 +#: .\cookbook\templates\url_import.html:360 msgid "Items dragged to Blank Field will be appended." -msgstr "" +msgstr "Elemente die in ein leeres Feld gezogen werden, werden angefügt." -#: .\cookbook\templates\url_import.html:400 +#: .\cookbook\templates\url_import.html:407 msgid "Delete Text" msgstr "Text löschen" -#: .\cookbook\templates\url_import.html:413 +#: .\cookbook\templates\url_import.html:420 msgid "Delete image" msgstr "Bild löschen" -#: .\cookbook\templates\url_import.html:429 +#: .\cookbook\templates\url_import.html:436 msgid "Recipe Name" msgstr "Rezeptname" -#: .\cookbook\templates\url_import.html:433 +#: .\cookbook\templates\url_import.html:440 msgid "Recipe Description" msgstr "Rezept Beschreibung" -#: .\cookbook\templates\url_import.html:494 -#: .\cookbook\templates\url_import.html:526 -#: .\cookbook\templates\url_import.html:582 +#: .\cookbook\templates\url_import.html:504 +#: .\cookbook\templates\url_import.html:536 +#: .\cookbook\templates\url_import.html:596 msgid "Select one" msgstr "Auswählen" -#: .\cookbook\templates\url_import.html:596 +#: .\cookbook\templates\url_import.html:554 +msgid "Note" +msgstr "Notiz" + +#: .\cookbook\templates\url_import.html:597 +msgid "Add Keyword" +msgstr "Schlagwort hinzufügen" + +#: .\cookbook\templates\url_import.html:610 msgid "All Keywords" msgstr "Alle Schlagwörter" -#: .\cookbook\templates\url_import.html:599 +#: .\cookbook\templates\url_import.html:613 msgid "Import all keywords, not only the ones already existing." msgstr "Alle Schlagwörter importieren, nicht nur die bereits bestehenden." -#: .\cookbook\templates\url_import.html:626 +#: .\cookbook\templates\url_import.html:640 msgid "Information" msgstr "Information" -#: .\cookbook\templates\url_import.html:628 +#: .\cookbook\templates\url_import.html:642 msgid "" " Only websites containing ld+json or microdata information can currently\n" " be imported. Most big recipe pages " @@ -2317,81 +2692,230 @@ msgid "" "data feel free to post an example in the\n" " github issues." msgstr "" -"Nur Webseiten mit ld+json oder microdata können importiert werden. Die " +" Nur Webseiten mit ld+json oder microdata können importiert werden. Die " "meisten großen Seiten unterstützen diese Formate. Wenn eine Seite nicht " "importiert werden kann, sie aber strukturierte Daten aufweist, kann ein " "GitHub-Issue geöffnet werden." -#: .\cookbook\templates\url_import.html:636 +#: .\cookbook\templates\url_import.html:650 msgid "Google ld+json Info" msgstr "Google ld+json Informationen" -#: .\cookbook\templates\url_import.html:639 +#: .\cookbook\templates\url_import.html:653 msgid "GitHub Issues" msgstr "GitHub-Issues" -#: .\cookbook\templates\url_import.html:641 +#: .\cookbook\templates\url_import.html:655 msgid "Recipe Markup Specification" msgstr "Rezept-Markup-Spezifikation" -#: .\cookbook\views\api.py:79 +#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:170 msgid "Parameter updated_at incorrectly formatted" msgstr "Der Parameter updated_at ist falsch formatiert" -#: .\cookbook\views\api.py:580 .\cookbook\views\views.py:303 -msgid "This feature is not available in the demo version!" -msgstr "Diese Funktion ist in der Demo-Version nicht verfügbar!" +#: .\cookbook\views\api.py:190 .\cookbook\views\api.py:291 +#, python-brace-format +msgid "No {self.basename} with id {pk} exists" +msgstr "Kein {self.basename} mit der ID {pk} existiert" -#: .\cookbook\views\api.py:603 +#: .\cookbook\views\api.py:194 +msgid "Cannot merge with the same object!" +msgstr "Zusammenführen mit selben Objekt nicht möglich!" + +#: .\cookbook\views\api.py:201 +#, python-brace-format +msgid "No {self.basename} with id {target} exists" +msgstr "Kein {self.basename} mit der ID {target} existiert" + +#: .\cookbook\views\api.py:206 +msgid "Cannot merge with child object!" +msgstr "Zusammenführen mit untergeordnetem Objekt nicht möglich!" + +#: .\cookbook\views\api.py:239 +#, 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:244 +#, 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:300 +#, python-brace-format +msgid "{child.name} was moved successfully to the root." +msgstr "{child.name} wurde erfolgreich zur Wurzel verschoben." + +#: .\cookbook\views\api.py:303 .\cookbook\views\api.py:321 +msgid "An error occurred attempting to move " +msgstr "Fehler aufgetreten beim verschieben von " + +#: .\cookbook\views\api.py:306 +msgid "Cannot move an object to itself!" +msgstr "Ein Element kann nicht in sich selbst verschoben werden!" + +#: .\cookbook\views\api.py:312 +#, python-brace-format +msgid "No {self.basename} with id {parent} exists" +msgstr "Kein {self.basename} mit ID {parent} existiert" + +#: .\cookbook\views\api.py:318 +#, 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:470 +#, python-brace-format +msgid "{obj.name} was removed from the shopping list." +msgstr "{obj.name} wurde von der Einkaufsliste entfernt." + +#: .\cookbook\views\api.py:475 .\cookbook\views\api.py:726 +#, python-brace-format +msgid "{obj.name} was added to the shopping list." +msgstr "{obj.name} wurde der Einkaufsliste hinzugefügt." + +#: .\cookbook\views\api.py:587 +msgid "ID of recipe a step is part of. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:588 +msgid "Query string matched (fuzzy) against object name." +msgstr "" + +#: .\cookbook\views\api.py:631 +msgid "" +"Query string matched (fuzzy) against recipe name. In the future also " +"fulltext search." +msgstr "" + +#: .\cookbook\views\api.py:632 +msgid "ID of keyword a recipe should have. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:633 +msgid "ID of food a recipe should have. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:634 +msgid "ID of unit a recipe should have." +msgstr "ID der Einheit, die ein Rezept haben sollte." + +#: .\cookbook\views\api.py:635 +msgid "Rating a recipe should have. [0 - 5]" +msgstr "Bewertung, die ein Rezept haben sollte. [ 0 - 5]" + +#: .\cookbook\views\api.py:636 +msgid "ID of book a recipe should be in. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:637 +msgid "" +"If recipe should have all (AND=false) or any (OR=true) of the " +"provided keywords." +msgstr "" + +#: .\cookbook\views\api.py:638 +msgid "" +"If recipe should have all (AND=false) or any (OR=true) of the " +"provided foods." +msgstr "" + +#: .\cookbook\views\api.py:639 +msgid "" +"If recipe should be in all (AND=false) or any (OR=true) of the " +"provided books." +msgstr "" + +#: .\cookbook\views\api.py:640 +msgid "If only internal recipes should be returned. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:641 +msgid "Returns the results in randomized order. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:642 +msgid "Returns new results first in search results. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:768 +msgid "" +"Returns the shopping list entry with a primary key of id. Multiple values " +"allowed." +msgstr "" + +#: .\cookbook\views\api.py:771 +msgid "" +"Filter shopping list entries on checked. [true, false, both, recent]
- recent includes unchecked items and recently completed items." +msgstr "" + +#: .\cookbook\views\api.py:773 +msgid "Returns the shopping list entries sorted by supermarket category order." +msgstr "" + +#: .\cookbook\views\api.py:922 .\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 "Diese Funktion ist in dieser Version von Tandoor noch nicht verfügbar!" + +#: .\cookbook\views\api.py:944 msgid "Sync successful!" msgstr "Synchronisation erfolgreich!" -#: .\cookbook\views\api.py:608 +#: .\cookbook\views\api.py:949 msgid "Error synchronizing with Storage" msgstr "Fehler beim Synchronisieren" -#: .\cookbook\views\api.py:686 +#: .\cookbook\views\api.py:1028 msgid "Nothing to do." msgstr "Nichts zu tun." -#: .\cookbook\views\api.py:701 +#: .\cookbook\views\api.py:1043 msgid "The requested site provided malformed data and cannot be read." msgstr "" "Die angefragte Seite hat ungültige Daten zurückgegeben oder die Daten " "konnten nicht verarbeitet werden." -#: .\cookbook\views\api.py:708 +#: .\cookbook\views\api.py:1050 msgid "The requested page could not be found." msgstr "Die angefragte Seite konnte nicht gefunden werden." -#: .\cookbook\views\api.py:717 +#: .\cookbook\views\api.py:1068 msgid "" "The requested site does not provide any recognized data format to import the " "recipe from." msgstr "" "Die angefragte Seite stellt keine bekannten Datenformate zur Verfügung." -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:1082 +msgid "Connection Refused." +msgstr "Verbindung fehlgeschlagen." + +#: .\cookbook\views\api.py:1091 msgid "No useable data could be found." msgstr "Es konnten keine nutzbaren Daten gefunden werden." -#: .\cookbook\views\api.py:747 +#: .\cookbook\views\api.py:1107 msgid "I couldn't find anything to do." msgstr "Ich konnte nichts zu tun finden." -#: .\cookbook\views\data.py:31 .\cookbook\views\data.py:122 -#: .\cookbook\views\edit.py:50 .\cookbook\views\import_export.py:67 -#: .\cookbook\views\new.py:32 +#: .\cookbook\views\data.py:34 .\cookbook\views\data.py:129 +#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:80 +#: .\cookbook\views\new.py:33 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\views\data.py:35 .\cookbook\views\data.py:126 -#: .\cookbook\views\edit.py:54 .\cookbook\views\import_export.py:71 -#: .\cookbook\views\new.py:36 +#: .\cookbook\views\data.py:38 .\cookbook\views\data.py:133 +#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:84 +#: .\cookbook\views\new.py:37 msgid "You have more users than allowed in your space." msgstr "Du hast mehr Benutzer in Deinem Space als erlaubt." -#: .\cookbook\views\data.py:104 +#: .\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." @@ -2399,149 +2923,149 @@ msgstr[0] "Massenbearbeitung erfolgreich. %(count)d Rezept wurde aktualisiert." msgstr[1] "" "Massenbearbeitung erfolgreich. %(count)d Rezepte wurden aktualisiert." -#: .\cookbook\views\delete.py:72 +#: .\cookbook\views\delete.py:101 msgid "Monitor" msgstr "Überwachen" -#: .\cookbook\views\delete.py:96 .\cookbook\views\lists.py:102 -#: .\cookbook\views\new.py:98 +#: .\cookbook\views\delete.py:125 .\cookbook\views\lists.py:71 +#: .\cookbook\views\new.py:101 msgid "Storage Backend" msgstr "Speicherquelle" -#: .\cookbook\views\delete.py:106 +#: .\cookbook\views\delete.py:135 msgid "" "Could not delete this storage backend as it is used in at least one monitor." msgstr "" "Speicherquelle konnte nicht gelöscht werden, da sie in mindestens einem " "Monitor verwendet wird." -#: .\cookbook\views\delete.py:129 .\cookbook\views\edit.py:213 -#: .\cookbook\views\new.py:156 +#: .\cookbook\views\delete.py:158 msgid "Recipe Book" msgstr "Rezeptbuch" -#: .\cookbook\views\delete.py:141 +#: .\cookbook\views\delete.py:170 msgid "Bookmarks" msgstr "Lesezeichen" -#: .\cookbook\views\delete.py:163 .\cookbook\views\new.py:252 +#: .\cookbook\views\delete.py:192 .\cookbook\views\new.py:238 msgid "Invite Link" msgstr "Einladungslink" -#: .\cookbook\views\edit.py:119 -msgid "Food" -msgstr "Lebensmittel" - -#: .\cookbook\views\edit.py:128 +#: .\cookbook\views\edit.py:125 msgid "You cannot edit this storage!" msgstr "Du kannst diese Speicherquelle nicht bearbeiten!" -#: .\cookbook\views\edit.py:148 +#: .\cookbook\views\edit.py:149 msgid "Storage saved!" msgstr "Speicherquelle gespeichert!" -#: .\cookbook\views\edit.py:154 +#: .\cookbook\views\edit.py:155 msgid "There was an error updating this storage backend!" msgstr "Es gab einen Fehler beim Aktualisieren dieser Speicherquelle!" -#: .\cookbook\views\edit.py:165 -msgid "Storage" -msgstr "Speicher" - -#: .\cookbook\views\edit.py:261 +#: .\cookbook\views\edit.py:248 msgid "Changes saved!" msgstr "Änderungen gespeichert!" -#: .\cookbook\views\edit.py:265 +#: .\cookbook\views\edit.py:252 msgid "Error saving changes!" msgstr "Fehler beim Speichern der Daten!" -#: .\cookbook\views\edit.py:299 -msgid "Units merged!" -msgstr "Einheiten zusammengeführt!" - -#: .\cookbook\views\edit.py:301 .\cookbook\views\edit.py:317 -msgid "Cannot merge with the same object!" -msgstr "Zusammenführen mit selben Objekt nicht möglich!" - -#: .\cookbook\views\edit.py:315 -msgid "Foods merged!" -msgstr "Zutaten zusammengeführt!" - -#: .\cookbook\views\import_export.py:93 +#: .\cookbook\views\import_export.py:106 msgid "Importing is not implemented for this provider" msgstr "Importieren ist für diesen Anbieter noch nicht implementiert" -#: .\cookbook\views\import_export.py:115 +#: .\cookbook\views\import_export.py:127 +msgid "" +"The PDF Exporter is not enabled on this instance as it is still in an " +"experimental state." +msgstr "" +"Der PDF-Exporter ist in dieser Instanz nicht aktiviert, da er sich noch in " +"einem experimentellen Zustand befindet." + +#: .\cookbook\views\import_export.py:132 msgid "Exporting is not implemented for this provider" msgstr "Exportieren ist für diesen Anbieter noch nicht implementiert" -#: .\cookbook\views\lists.py:40 +#: .\cookbook\views\lists.py:25 msgid "Import Log" msgstr "Importverlauf" -#: .\cookbook\views\lists.py:53 +#: .\cookbook\views\lists.py:38 msgid "Discovery" msgstr "Entdecken" -#: .\cookbook\views\lists.py:85 +#: .\cookbook\views\lists.py:54 msgid "Shopping Lists" msgstr "Einkaufslisten" -#: .\cookbook\views\new.py:123 +#: .\cookbook\views\lists.py:148 +msgid "Supermarkets" +msgstr "Supermärkte" + +#: .\cookbook\views\lists.py:164 +msgid "Shopping Categories" +msgstr "Einkaufskategorien" + +#: .\cookbook\views\lists.py:217 +msgid "Steps" +msgstr "Schritte" + +#: .\cookbook\views\lists.py:232 +msgid "New Shopping List" +msgstr "Neue Einkaufsliste" + +#: .\cookbook\views\new.py:126 msgid "Imported new recipe!" msgstr "Neues Rezept importiert!" -#: .\cookbook\views\new.py:126 +#: .\cookbook\views\new.py:129 msgid "There was an error importing this recipe!" msgstr "Beim Importieren des Rezeptes ist ein Fehler aufgetreten!" -#: .\cookbook\views\new.py:226 +#: .\cookbook\views\new.py:212 msgid "Hello" msgstr "Hallo" -#: .\cookbook\views\new.py:226 +#: .\cookbook\views\new.py:212 msgid "You have been invited by " msgstr "Du wurdest eingeladen von " -#: .\cookbook\views\new.py:227 -#, fuzzy +#: .\cookbook\views\new.py:213 msgid " to join their Tandoor Recipes space " -msgstr " um deren Tandoor Recipes Space " +msgstr " um deren Tandoor Recipes Instanz beizutreten " -#: .\cookbook\views\new.py:228 +#: .\cookbook\views\new.py:214 msgid "Click the following link to activate your account: " msgstr "Klicke auf den folgenden Link, um deinen Account zu aktivieren: " -#: .\cookbook\views\new.py:229 +#: .\cookbook\views\new.py:215 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\views\new.py:230 +#: .\cookbook\views\new.py:216 msgid "The invitation is valid until " msgstr "Die Einladung ist gültig bis " -#: .\cookbook\views\new.py:231 -#, fuzzy +#: .\cookbook\views\new.py:217 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " msgstr "" -"Tandoor Recipes ist ein Open-Source Rezept-Manager. Sieh es Dir auf GitHub " -"an " +"Tandoor Recipes ist ein Open-Source Rezept-Manager. Mehr Informationen sind " +"auf GitHub zu finden " -#: .\cookbook\views\new.py:234 -#, fuzzy +#: .\cookbook\views\new.py:220 msgid "Tandoor Recipes Invite" msgstr "Tandoor Recipes Einladung" -#: .\cookbook\views\new.py:241 +#: .\cookbook\views\new.py:227 msgid "Invite link successfully send to user." msgstr "Einladungslink erfolgreich an Benutzer gesendet." -#: .\cookbook\views\new.py:244 +#: .\cookbook\views\new.py:230 msgid "" "You have send to many emails, please share the link manually or wait a few " "hours." @@ -2549,13 +3073,13 @@ msgstr "" "Du hast zu viele Email gesendet. Bitte teile den Link manuell oder warte ein " "paar Stunden." -#: .\cookbook\views\new.py:246 +#: .\cookbook\views\new.py:232 msgid "Email to user could not be send, please share link manually." msgstr "" "Email konnte an den Benutzer nicht gesendet werden. Bitte teile den Link " "manuell." -#: .\cookbook\views\views.py:129 +#: .\cookbook\views\views.py:126 msgid "" "You have successfully created your own recipe space. Start by adding some " "recipes or invite other people to join you." @@ -2563,16 +3087,36 @@ 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:177 +#: .\cookbook\views\views.py:174 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:188 +#: .\cookbook\views\views.py:185 msgid "Comment saved!" msgstr "Kommentar gespeichert!" -#: .\cookbook\views\views.py:395 +#: .\cookbook\views\views.py:276 +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:335 +msgid "You must select at least one field to search!" +msgstr "Es muss mindestens ein Feld ausgewählt sein!" + +#: .\cookbook\views\views.py:340 +msgid "" +"To use this search method you must select at least one full text search " +"field!" +msgstr "" +"Um diese Suchmethode zu verwenden muss mindestens ein Feld für die " +"Volltextsuche ausgewählt sein!" + +#: .\cookbook\views\views.py:344 +msgid "Fuzzy search is not compatible with this search method!" +msgstr "Die \"Ungenaue\" Suche ist mit diesem Suchtyp nicht kompatibel!" + +#: .\cookbook\views\views.py:470 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 " @@ -2581,43 +3125,319 @@ 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:402 +#: .\cookbook\views\views.py:477 msgid "Passwords dont match!" msgstr "Passwörter stimmen nicht überein!" -#: .\cookbook\views\views.py:418 +#: .\cookbook\views\views.py:493 msgid "User has been created, please login!" msgstr "Benutzer wurde erstellt, bitte einloggen!" -#: .\cookbook\views\views.py:434 +#: .\cookbook\views\views.py:509 msgid "Malformed Invite Link supplied!" msgstr "Fehlerhafter Einladungslink angegeben!" -#: .\cookbook\views\views.py:441 +#: .\cookbook\views\views.py:516 msgid "You are already member of a space and therefore cannot join this one." msgstr "" "Du bist bereits Mitglied eines Space, daher kannst du diesem Space nicht " "beitreten." -#: .\cookbook\views\views.py:452 +#: .\cookbook\views\views.py:527 msgid "Successfully joined space." msgstr "Space erfolgreich beigetreten." -#: .\cookbook\views\views.py:458 +#: .\cookbook\views\views.py:533 msgid "Invite Link not valid or already used!" msgstr "Einladungslink ungültig oder bereits genutzt!" -#: .\cookbook\views\views.py:522 +#: .\cookbook\views\views.py:614 msgid "" "Reporting share links is not enabled for this instance. Please notify the " "page administrator to report problems." msgstr "" +"Das melden von Links ist in dieser Instanz nicht aktiviert. Bitte " +"kontaktieren sie den Seitenadministrator um Probleme zu melden." -#: .\cookbook\views\views.py:528 +#: .\cookbook\views\views.py:620 msgid "" "Recipe sharing link has been disabled! For additional information please " "contact the page administrator." msgstr "" +"Dieser Link wurde deaktiviert! Bitte kontaktieren sie den " +"Seitenadministrator für weitere Informationen." + +#, python-brace-format +#~ msgid "No {self.basename} with id {child} exists" +#~ msgstr "Kein {self.basename} mit ID {child} existiert" + +#~ msgid "New Unit" +#~ msgstr "Neue Einheit" + +#~ msgid "New unit that other gets replaced by." +#~ msgstr "Neue Einheit, welche die alte ersetzt." + +#~ msgid "Old Unit" +#~ msgstr "Alte Einheit" + +#~ msgid "Unit that should be replaced." +#~ msgstr "Einheit, die ersetzt werden soll." + +#~ msgid "New Food" +#~ msgstr "Neue Zutat" + +#~ msgid "New food that other gets replaced by." +#~ msgstr "Neue Zutat, welche die alte ersetzt." + +#~ msgid "Old Food" +#~ msgstr "Alte Zutat" + +#~ msgid "New Entry" +#~ msgstr "Neuer Eintrag" + +#~ msgid "Title" +#~ msgstr "Titel" + +#~ msgid "Note (optional)" +#~ msgstr "Notiz (optional)" + +#~ msgid "" +#~ "You can use markdown to format this field. See the docs here" +#~ msgstr "" +#~ "Dieses Feld Unterstützt Markdown Formatierung. Siehe Dokumentation" + +#~ msgid "Serving Count" +#~ msgstr "Anzahl Portionen" + +#~ msgid "Create only note" +#~ msgstr "Nur Notiz erstellen" + +#~ msgid "Plan" +#~ msgstr "Plan" + +#~ msgid "Number of Days" +#~ msgstr "Anzahl an Tagen" + +#~ msgid "Weekday offset" +#~ msgstr "Wochentage verschieben" + +#~ msgid "" +#~ "Number of days starting from the first day of the week to offset the " +#~ "default view." +#~ msgstr "" +#~ "Anzahl der Tage von ersten Tag der Woche, die der Plan standardmäßig " +#~ "verschoben sein soll." + +#~ msgid "Edit plan types" +#~ msgstr "Plantypen editieren" + +#~ msgid "Show help" +#~ msgstr "Hilfe anzeigen" + +#~ msgid "Week iCal export" +#~ msgstr "Woche als iCal exportieren" + +#~ msgid "Add to Shopping" +#~ msgstr "Zur Einkaufsliste hinzufügen" + +#~ msgid "New meal type" +#~ msgstr "Neue Mahlzeit" + +#~ msgid "Meal Plan Help" +#~ msgstr "Plan-Hilfe" + +#~ msgid "" +#~ "\n" +#~ "

The meal plan module allows planning of " +#~ "meals both with recipes and notes.

\n" +#~ "

Simply select a recipe from the list of " +#~ "recently viewed recipes or search the one you\n" +#~ " want and drag it to the desired plan " +#~ "position. You can also add a note and a title and\n" +#~ " then drag the recipe to create a plan " +#~ "entry with a custom title and note. Creating only\n" +#~ " Notes is possible by dragging the create " +#~ "note box into the plan.

\n" +#~ "

Click on a recipe in order to open the " +#~ "detailed view. There you can also add it to the\n" +#~ " shopping list. You can also add all " +#~ "recipes of a day to the shopping list by\n" +#~ " clicking the shopping cart at the top of " +#~ "the table.

\n" +#~ "

Since a common use case is to plan meals " +#~ "together you can define\n" +#~ " users you want to share your plan with in " +#~ "the settings.\n" +#~ "

\n" +#~ "

You can also edit the types of meals you " +#~ "want to plan. If you share your plan with\n" +#~ " someone with\n" +#~ " different meals, their meal types will " +#~ "appear in your list as well. To prevent\n" +#~ " duplicates (e.g. Other and Misc.)\n" +#~ " name your meal types the same as the " +#~ "users you share your meals with and they will be\n" +#~ " merged.

\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ "

Das Planmodul erlaubt das Planen mithilfe " +#~ "von Rezepten und Notizen.

\n" +#~ "

Einfach ein Rezept aussuchen und an die " +#~ "Stelle im Plan ziehen, an der es gekocht werden soll. Es kann außerdem " +#~ "eine Notiz und ein Titel hinzugefügt werden. Einen Eintrag nur als Notiz " +#~ "zu erstellen ist durch Eingabe einer Notiz und Schieben des Notiz-Blocks " +#~ "in den Plan möglich.

\n" +#~ "

Durch Klicken auf ein Rezept öffnet sich " +#~ "die Detailansicht. Da kann das Rezept auch auf die Einkaufsliste " +#~ "hinzugefügt werden. Es können auch alle Rezepte eines Tages auf die " +#~ "Einkaufsliste gesetzt werden, indem der Einkaufswagen im Tabellenkopf " +#~ "angeklickt wird.

\n" +#~ "

Da Pläne häufig für mehrere Nutzer " +#~ "erstellt werden, können Nutzer in den Einstellungen angegeben werden, mit " +#~ "denen neue Pläne automatisch geteilt werden sollen.\n" +#~ "

\n" +#~ "

Die Mahlzeiten, die geplant werden sollen, " +#~ "können bearbeitet werden. Wenn Pläne zwischen Nutzern mit " +#~ "unterschiedlichen Mahlzeiten geteilt werden, erscheinen alle Mahlzeiten. " +#~ "Um Duplikate zu vermeiden (z.B. Mittagessen und Mittag) sollten " +#~ "Mahlzeiten teilender Nutzer gleich benannt werden, dadurch kann das " +#~ "System sie zusammenfassen.

\n" +#~ " " + +#~ msgid "Units merged!" +#~ msgstr "Einheiten zusammengeführt!" + +#~ msgid "Foods merged!" +#~ msgstr "Zutaten zusammengeführt!" + +#~ msgid "Utensils" +#~ msgstr "Utensilien" + +#~ msgid "Storage Data" +#~ msgstr "Datenquellen" + +#~ msgid "Storage Backends" +#~ msgstr "Speicherquellen" + +#~ msgid "Configure Sync" +#~ msgstr "Synchronisation einstellen" + +#~ msgid "Discovered Recipes" +#~ msgstr "Entdeckte Rezepte" + +#~ msgid "Discovery Log" +#~ msgstr "Entdeckungsverlauf" + +#~ msgid "Units & Ingredients" +#~ msgstr "Einheiten & Zutaten" + +#~ msgid "New Book" +#~ msgstr "Neues Buch" + +#~ msgid "Toggle Recipes" +#~ msgstr "Rezepte umschalten" + +#~ msgid "There are no recipes in this book yet." +#~ msgstr "In diesem Buch sind bisher noch keine Rezepte." + +#~ msgid "Waiting Time" +#~ msgstr "Wartezeit" + +#~ msgid "Servings Text" +#~ msgstr "Portionen-Text" + +#~ msgid "Select Keywords" +#~ msgstr "Schlagwörter wählen" + +#~ msgid "Nutrition" +#~ msgstr "Nährwerte" + +#~ msgid "Delete Step" +#~ msgstr "Schritt löschen" + +#~ msgid "Calories" +#~ msgstr "Kalorien" + +#~ msgid "Carbohydrates" +#~ msgstr "Kohlenhydrate" + +#~ msgid "Fats" +#~ msgstr "Fette" + +#~ msgid "Proteins" +#~ msgstr "Proteine" + +#~ msgid "Step" +#~ msgstr "Schritt" + +#~ msgid "Show as header" +#~ msgstr "Als Überschrift anzeigen" + +#~ msgid "Hide as header" +#~ msgstr "Nicht als Überschrift anzeigen" + +#~ msgid "Move Up" +#~ msgstr "Nach oben" + +#~ msgid "Move Down" +#~ msgstr "Nach unten" + +#~ msgid "Step Name" +#~ msgstr "Name des Schritts" + +#~ msgid "Step Type" +#~ msgstr "Art des Schritts" + +#~ msgid "Step time in Minutes" +#~ msgstr "Zeit in Minuten" + +#~ msgid "Select File" +#~ msgstr "Datei auswählen" + +#, fuzzy +#~| msgid "Delete Recipe" +#~ msgid "Select Recipe" +#~ msgstr "Rezept löschen" + +#~ msgid "Delete Ingredient" +#~ msgstr "Zutat löschen" + +#~ msgid "Make Header" +#~ msgstr "Überschrift erstellen" + +#~ msgid "Make Ingredient" +#~ msgstr "Zutat erstellen" + +#~ msgid "Disable Amount" +#~ msgstr "Menge deaktivieren" + +#~ msgid "Enable Amount" +#~ msgstr "Menge aktivieren" + +#~ msgid "Copy Template Reference" +#~ msgstr "Kopiere Vorlagen-Referenz" + +#~ msgid "Save & View" +#~ msgstr "Speichern & Ansehen" + +#~ msgid "Add Step" +#~ msgstr "Schritt hinzufügen" + +#~ msgid "Add Nutrition" +#~ msgstr "Nährwerte hinzufügen" + +#~ msgid "Remove Nutrition" +#~ msgstr "Nährwerte entfernen" + +#~ msgid "View Recipe" +#~ msgstr "Rezept ansehen" + +#~ msgid "Delete Recipe" +#~ msgstr "Rezept löschen" #~ msgid "Password Settings" #~ msgstr "Passwort-Einstellungen" @@ -2625,9 +3445,6 @@ msgstr "" #~ msgid "Email Settings" #~ msgstr "Email-Einstellungen" -#~ msgid "Manage Email Settings" -#~ msgstr "Email-Einstellungen verwalten" - #~ msgid "Manage Social Accounts" #~ msgstr "Social Accounts verwalten" diff --git a/cookbook/locale/en/LC_MESSAGES/django.po b/cookbook/locale/en/LC_MESSAGES/django.po index a8168d42..49ddcb0b 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: 2021-08-17 08:44+0200\n" +"POT-Creation-Date: 2022-01-18 14:52+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,49 +18,106 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: .\cookbook\filters.py:23 .\cookbook\templates\base.html:98 -#: .\cookbook\templates\forms\edit_internal_recipe.html:269 -#: .\cookbook\templates\forms\ingredients.html:34 -#: .\cookbook\templates\space.html:43 .\cookbook\templates\stats.html:28 -#: .\cookbook\templates\url_import.html:270 .\cookbook\views\lists.py:67 +#: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 +#: .\cookbook\templates\space.html:50 .\cookbook\templates\stats.html:28 +#: .\cookbook\templates\url_import.html:277 msgid "Ingredients" msgstr "" -#: .\cookbook\forms.py:49 +#: .\cookbook\forms.py:56 +msgid "Default unit" +msgstr "" + +#: .\cookbook\forms.py:57 +msgid "Use fractions" +msgstr "" + +#: .\cookbook\forms.py:58 +msgid "Use KJ" +msgstr "" + +#: .\cookbook\forms.py:59 +msgid "Theme" +msgstr "" + +#: .\cookbook\forms.py:60 +msgid "Navbar color" +msgstr "" + +#: .\cookbook\forms.py:61 +msgid "Sticky navbar" +msgstr "" + +#: .\cookbook\forms.py:62 +msgid "Default page" +msgstr "" + +#: .\cookbook\forms.py:63 +msgid "Show recent recipes" +msgstr "" + +#: .\cookbook\forms.py:64 +msgid "Search style" +msgstr "" + +#: .\cookbook\forms.py:65 +msgid "Plan sharing" +msgstr "" + +#: .\cookbook\forms.py:66 +msgid "Ingredient decimal places" +msgstr "" + +#: .\cookbook\forms.py:67 +msgid "Shopping list auto sync period" +msgstr "" + +#: .\cookbook\forms.py:68 .\cookbook\templates\recipe_view.html:21 +#: .\cookbook\templates\space.html:77 .\cookbook\templates\stats.html:47 +msgid "Comments" +msgstr "" + +#: .\cookbook\forms.py:72 msgid "" "Color of the top navigation bar. Not all colors work with all themes, just " "try them out!" msgstr "" -#: .\cookbook\forms.py:51 +#: .\cookbook\forms.py:74 msgid "Default Unit to be used when inserting a new ingredient into a recipe." msgstr "" -#: .\cookbook\forms.py:53 +#: .\cookbook\forms.py:76 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" msgstr "" -#: .\cookbook\forms.py:56 -msgid "" -"Users with whom newly created meal plan/shopping list entries should be " -"shared by default." +#: .\cookbook\forms.py:78 +msgid "Display nutritional energy amounts in joules instead of calories" msgstr "" -#: .\cookbook\forms.py:58 +#: .\cookbook\forms.py:79 +msgid "Users with whom newly created meal plans should be shared by default." +msgstr "" + +#: .\cookbook\forms.py:80 +msgid "Users with whom to share shopping lists." +msgstr "" + +#: .\cookbook\forms.py:82 msgid "Show recently viewed recipes on search page." msgstr "" -#: .\cookbook\forms.py:59 +#: .\cookbook\forms.py:83 msgid "Number of decimals to round ingredients." msgstr "" -#: .\cookbook\forms.py:60 +#: .\cookbook\forms.py:84 msgid "If you want to be able to create and see comments underneath recipes." msgstr "" -#: .\cookbook\forms.py:62 +#: .\cookbook\forms.py:86 .\cookbook\forms.py:493 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. " @@ -68,216 +125,373 @@ msgid "" "mobile data. If lower than instance limit it is reset when saving." msgstr "" -#: .\cookbook\forms.py:65 +#: .\cookbook\forms.py:89 msgid "Makes the navbar stick to the top of the page." msgstr "" -#: .\cookbook\forms.py:81 +#: .\cookbook\forms.py:90 .\cookbook\forms.py:496 +msgid "Automatically add meal plan ingredients to shopping list." +msgstr "" + +#: .\cookbook\forms.py:91 +msgid "Exclude ingredients that are on hand." +msgstr "" + +#: .\cookbook\forms.py:108 msgid "" "Both fields are optional. If none are given the username will be displayed " "instead" msgstr "" -#: .\cookbook\forms.py:102 .\cookbook\forms.py:331 -#: .\cookbook\templates\forms\edit_internal_recipe.html:49 -#: .\cookbook\templates\url_import.html:154 +#: .\cookbook\forms.py:129 .\cookbook\forms.py:298 +#: .\cookbook\templates\url_import.html:161 msgid "Name" msgstr "" -#: .\cookbook\forms.py:103 .\cookbook\forms.py:332 -#: .\cookbook\templates\base.html:108 .\cookbook\templates\base.html:169 -#: .\cookbook\templates\forms\edit_internal_recipe.html:85 -#: .\cookbook\templates\space.html:39 .\cookbook\templates\stats.html:24 -#: .\cookbook\templates\url_import.html:188 -#: .\cookbook\templates\url_import.html:573 +#: .\cookbook\forms.py:130 .\cookbook\forms.py:299 +#: .\cookbook\templates\space.html:44 .\cookbook\templates\stats.html:24 +#: .\cookbook\templates\url_import.html:195 +#: .\cookbook\templates\url_import.html:585 .\cookbook\views\lists.py:97 msgid "Keywords" msgstr "" -#: .\cookbook\forms.py:104 +#: .\cookbook\forms.py:131 msgid "Preparation time in minutes" msgstr "" -#: .\cookbook\forms.py:105 +#: .\cookbook\forms.py:132 msgid "Waiting time (cooking/baking) in minutes" msgstr "" -#: .\cookbook\forms.py:106 .\cookbook\forms.py:333 +#: .\cookbook\forms.py:133 .\cookbook\forms.py:267 .\cookbook\forms.py:300 msgid "Path" msgstr "" -#: .\cookbook\forms.py:107 +#: .\cookbook\forms.py:134 msgid "Storage UID" msgstr "" -#: .\cookbook\forms.py:133 +#: .\cookbook\forms.py:164 msgid "Default" msgstr "" -#: .\cookbook\forms.py:144 .\cookbook\templates\url_import.html:90 +#: .\cookbook\forms.py:175 .\cookbook\templates\url_import.html:97 msgid "" "To prevent duplicates recipes with the same name as existing ones are " "ignored. Check this box to import everything." msgstr "" -#: .\cookbook\forms.py:164 -msgid "New Unit" -msgstr "" - -#: .\cookbook\forms.py:165 -msgid "New unit that other gets replaced by." -msgstr "" - -#: .\cookbook\forms.py:170 -msgid "Old Unit" -msgstr "" - -#: .\cookbook\forms.py:171 -msgid "Unit that should be replaced." -msgstr "" - -#: .\cookbook\forms.py:187 -msgid "New Food" -msgstr "" - -#: .\cookbook\forms.py:188 -msgid "New food that other gets replaced by." -msgstr "" - -#: .\cookbook\forms.py:193 -msgid "Old Food" -msgstr "" - -#: .\cookbook\forms.py:194 -msgid "Food that should be replaced." -msgstr "" - -#: .\cookbook\forms.py:212 +#: .\cookbook\forms.py:197 msgid "Add your comment: " msgstr "" -#: .\cookbook\forms.py:253 +#: .\cookbook\forms.py:212 msgid "Leave empty for dropbox and enter app password for nextcloud." msgstr "" -#: .\cookbook\forms.py:260 +#: .\cookbook\forms.py:219 msgid "Leave empty for nextcloud and enter api token for dropbox." msgstr "" -#: .\cookbook\forms.py:269 +#: .\cookbook\forms.py:228 msgid "" "Leave empty for dropbox and enter only base url for nextcloud (/remote." "php/webdav/ is added automatically)" msgstr "" -#: .\cookbook\forms.py:307 +#: .\cookbook\forms.py:266 .\cookbook\views\edit.py:166 +msgid "Storage" +msgstr "" + +#: .\cookbook\forms.py:268 +msgid "Active" +msgstr "" + +#: .\cookbook\forms.py:274 msgid "Search String" msgstr "" -#: .\cookbook\forms.py:334 +#: .\cookbook\forms.py:301 msgid "File ID" msgstr "" -#: .\cookbook\forms.py:370 +#: .\cookbook\forms.py:323 msgid "You must provide at least a recipe or a title." msgstr "" -#: .\cookbook\forms.py:383 +#: .\cookbook\forms.py:336 msgid "You can list default users to share recipes with in the settings." msgstr "" -#: .\cookbook\forms.py:384 -#: .\cookbook\templates\forms\edit_internal_recipe.html:427 +#: .\cookbook\forms.py:337 msgid "" "You can use markdown to format this field. See the
docs here" msgstr "" -#: .\cookbook\forms.py:409 +#: .\cookbook\forms.py:363 msgid "Maximum number of users for this space reached." msgstr "" -#: .\cookbook\forms.py:415 +#: .\cookbook\forms.py:369 msgid "Email address already taken!" msgstr "" -#: .\cookbook\forms.py:423 +#: .\cookbook\forms.py:377 msgid "" -"An email address is not required but if present the invite link will be send " +"An email address is not required but if present the invite link will be sent " "to the user." msgstr "" -#: .\cookbook\forms.py:438 +#: .\cookbook\forms.py:392 msgid "Name already taken." msgstr "" -#: .\cookbook\forms.py:449 +#: .\cookbook\forms.py:403 msgid "Accept Terms and Privacy" msgstr "" +#: .\cookbook\forms.py:435 +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:445 +msgid "" +"Select type method of search. Click here for " +"full desciption of choices." +msgstr "" + +#: .\cookbook\forms.py:446 +msgid "" +"Use fuzzy matching on units, keywords and ingredients when editing and " +"importing recipes." +msgstr "" + +#: .\cookbook\forms.py:448 +msgid "" +"Fields to search ignoring accents. Selecting this option can improve or " +"degrade search quality depending on language" +msgstr "" + +#: .\cookbook\forms.py:450 +msgid "" +"Fields to search for partial matches. (e.g. searching for 'Pie' will return " +"'pie' and 'piece' and 'soapie')" +msgstr "" + +#: .\cookbook\forms.py:452 +msgid "" +"Fields to search for beginning of word matches. (e.g. searching for 'sa' " +"will return 'salad' and 'sandwich')" +msgstr "" + +#: .\cookbook\forms.py:454 +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:456 +msgid "" +"Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " +"only function with fulltext fields." +msgstr "" + +#: .\cookbook\forms.py:460 +msgid "Search Method" +msgstr "" + +#: .\cookbook\forms.py:461 +msgid "Fuzzy Lookups" +msgstr "" + +#: .\cookbook\forms.py:462 +msgid "Ignore Accent" +msgstr "" + +#: .\cookbook\forms.py:463 +msgid "Partial Match" +msgstr "" + +#: .\cookbook\forms.py:464 +msgid "Starts Wtih" +msgstr "" + +#: .\cookbook\forms.py:465 +msgid "Fuzzy Search" +msgstr "" + +#: .\cookbook\forms.py:466 +msgid "Full Text" +msgstr "" + +#: .\cookbook\forms.py:491 +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:497 +msgid "" +"When adding a meal plan to the shopping list (manually or automatically), " +"include all related recipes." +msgstr "" + +#: .\cookbook\forms.py:498 +msgid "" +"When adding a meal plan to the shopping list (manually or automatically), " +"exclude ingredients that are on hand." +msgstr "" + +#: .\cookbook\forms.py:499 +msgid "Default number of hours to delay a shopping list entry." +msgstr "" + +#: .\cookbook\forms.py:500 +msgid "Filter shopping list to only include supermarket categories." +msgstr "" + +#: .\cookbook\forms.py:501 +msgid "Days of recent shopping list entries to display." +msgstr "" + +#: .\cookbook\forms.py:502 +msgid "Mark food 'On Hand' when checked off shopping list." +msgstr "" + +#: .\cookbook\forms.py:503 +msgid "Delimiter to use for CSV exports." +msgstr "" + +#: .\cookbook\forms.py:504 +msgid "Prefix to add when copying list to the clipboard." +msgstr "" + +#: .\cookbook\forms.py:508 +msgid "Share Shopping List" +msgstr "" + +#: .\cookbook\forms.py:509 +msgid "Autosync" +msgstr "" + +#: .\cookbook\forms.py:510 +msgid "Auto Add Meal Plan" +msgstr "" + +#: .\cookbook\forms.py:511 +msgid "Exclude On Hand" +msgstr "" + +#: .\cookbook\forms.py:512 +msgid "Include Related" +msgstr "" + +#: .\cookbook\forms.py:513 +msgid "Default Delay Hours" +msgstr "" + +#: .\cookbook\forms.py:514 +msgid "Filter to Supermarket" +msgstr "" + +#: .\cookbook\forms.py:515 +msgid "Recent Days" +msgstr "" + +#: .\cookbook\forms.py:516 +msgid "CSV Delimiter" +msgstr "" + +#: .\cookbook\forms.py:517 .\cookbook\templates\shopping_list.html:322 +msgid "List Prefix" +msgstr "" + +#: .\cookbook\forms.py:518 +msgid "Auto On Hand" +msgstr "" + +#: .\cookbook\forms.py:528 +msgid "Reset Food Inheritance" +msgstr "" + +#: .\cookbook\forms.py:529 +msgid "Reset all food to inherit the fields configured." +msgstr "" + +#: .\cookbook\forms.py:541 +msgid "Fields on food that should be inherited by default." +msgstr "" + +#: .\cookbook\forms.py:542 +msgid "Show recipe counts on search filters" +msgstr "" + #: .\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 "" -#: .\cookbook\helper\permission_helper.py:138 -#: .\cookbook\helper\permission_helper.py:161 .\cookbook\views\views.py:151 +#: .\cookbook\helper\permission_helper.py:136 +#: .\cookbook\helper\permission_helper.py:159 .\cookbook\views\views.py:148 msgid "You are not logged in and therefore cannot view this page!" msgstr "" -#: .\cookbook\helper\permission_helper.py:142 -#: .\cookbook\helper\permission_helper.py:148 -#: .\cookbook\helper\permission_helper.py:173 -#: .\cookbook\helper\permission_helper.py:218 -#: .\cookbook\helper\permission_helper.py:232 -#: .\cookbook\helper\permission_helper.py:243 -#: .\cookbook\helper\permission_helper.py:254 .\cookbook\views\data.py:40 -#: .\cookbook\views\views.py:162 .\cookbook\views\views.py:169 -#: .\cookbook\views\views.py:259 +#: .\cookbook\helper\permission_helper.py:140 +#: .\cookbook\helper\permission_helper.py:146 +#: .\cookbook\helper\permission_helper.py:171 +#: .\cookbook\helper\permission_helper.py:219 +#: .\cookbook\helper\permission_helper.py:233 +#: .\cookbook\helper\permission_helper.py:244 +#: .\cookbook\helper\permission_helper.py:255 .\cookbook\views\data.py:47 +#: .\cookbook\views\views.py:159 .\cookbook\views\views.py:166 +#: .\cookbook\views\views.py:232 msgid "You do not have the required permissions to view this page!" msgstr "" -#: .\cookbook\helper\permission_helper.py:166 -#: .\cookbook\helper\permission_helper.py:189 -#: .\cookbook\helper\permission_helper.py:204 +#: .\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 "" -#: .\cookbook\helper\template_helper.py:60 -#: .\cookbook\helper\template_helper.py:62 +#: .\cookbook\helper\recipe_search.py:473 +msgid "One of queryset or hash_key must be provided" +msgstr "" + +#: .\cookbook\helper\shopping_helper.py:54 +msgid "You must supply a recipe or mealplan" +msgstr "" + +#: .\cookbook\helper\shopping_helper.py:58 +msgid "You must supply a created_by" +msgstr "" + +#: .\cookbook\helper\template_helper.py:61 +#: .\cookbook\helper\template_helper.py:63 msgid "Could not parse template code." msgstr "" -#: .\cookbook\integration\integration.py:104 -#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 -#: .\cookbook\templates\import_response.html:7 -#: .\cookbook\templates\test.html:14 .\cookbook\templates\test.html:20 -#: .\cookbook\templates\url_import.html:27 -#: .\cookbook\templates\url_import.html:101 -#: .\cookbook\templates\url_import.html:123 -#: .\cookbook\templates\url_import.html:317 -#: .\cookbook\templates\url_import.html:604 .\cookbook\views\delete.py:60 -#: .\cookbook\views\edit.py:199 -msgid "Import" -msgstr "" - -#: .\cookbook\integration\integration.py:185 +#: .\cookbook\integration\integration.py:200 msgid "" "Importer expected a .zip file. Did you choose the correct importer type for " "your data ?" msgstr "" -#: .\cookbook\integration\integration.py:188 +#: .\cookbook\integration\integration.py:203 msgid "" "An unexpected error occurred during the import. Please make sure you have " "uploaded a valid file." msgstr "" -#: .\cookbook\integration\integration.py:192 +#: .\cookbook\integration\integration.py:208 msgid "The following recipes were ignored because they already existed:" msgstr "" -#: .\cookbook\integration\integration.py:196 +#: .\cookbook\integration\integration.py:212 #, python-format msgid "Imported %s recipes." msgstr "" @@ -290,37 +504,51 @@ msgstr "" msgid "Nutritional Information" msgstr "" -#: .\cookbook\integration\paprika.py:53 +#: .\cookbook\integration\paprika.py:53 .\cookbook\templates\url_import.html:42 msgid "Source" msgstr "" -#: .\cookbook\integration\safron.py:23 -#: .\cookbook\templates\forms\edit_internal_recipe.html:79 -#: .\cookbook\templates\include\log_cooking.html:16 -#: .\cookbook\templates\url_import.html:224 -#: .\cookbook\templates\url_import.html:455 +#: .\cookbook\integration\saffron.py:23 +#: .\cookbook\templates\include\log_cooking.html:18 +#: .\cookbook\templates\url_import.html:231 +#: .\cookbook\templates\url_import.html:462 msgid "Servings" msgstr "" -#: .\cookbook\integration\safron.py:25 +#: .\cookbook\integration\saffron.py:25 msgid "Waiting time" msgstr "" -#: .\cookbook\integration\safron.py:27 -#: .\cookbook\templates\forms\edit_internal_recipe.html:73 +#: .\cookbook\integration\saffron.py:27 msgid "Preparation Time" msgstr "" -#: .\cookbook\integration\safron.py:29 .\cookbook\templates\base.html:78 +#: .\cookbook\integration\saffron.py:29 .\cookbook\templates\base.html:78 #: .\cookbook\templates\forms\ingredients.html:7 #: .\cookbook\templates\index.html:7 msgid "Cookbook" msgstr "" -#: .\cookbook\integration\safron.py:31 +#: .\cookbook\integration\saffron.py:31 msgid "Section" msgstr "" +#: .\cookbook\management\commands\rebuildindex.py:14 +msgid "Rebuilds full text search index on Recipe" +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:18 +msgid "Only Postgress databases use full text search, no index to rebuild" +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:29 +msgid "Recipe index rebuild complete." +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:31 +msgid "Recipe index rebuild failed." +msgstr "" + #: .\cookbook\migrations\0047_auto_20200602_1133.py:14 msgid "Breakfast" msgstr "" @@ -337,90 +565,143 @@ msgstr "" msgid "Other" msgstr "" -#: .\cookbook\models.py:72 +#: .\cookbook\models.py:246 msgid "" "Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " "upload." msgstr "" -#: .\cookbook\models.py:123 .\cookbook\templates\search.html:7 -#: .\cookbook\templates\shopping_list.html:52 +#: .\cookbook\models.py:300 .\cookbook\templates\search.html:7 +#: .\cookbook\templates\shopping_list.html:53 msgid "Search" msgstr "" -#: .\cookbook\models.py:124 .\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 +#: .\cookbook\models.py:301 .\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 "" -#: .\cookbook\models.py:125 .\cookbook\templates\base.html:89 +#: .\cookbook\models.py:302 .\cookbook\templates\base.html:90 msgid "Books" msgstr "" -#: .\cookbook\models.py:133 +#: .\cookbook\models.py:310 msgid "Small" msgstr "" -#: .\cookbook\models.py:133 +#: .\cookbook\models.py:310 msgid "Large" msgstr "" -#: .\cookbook\models.py:133 .\cookbook\templates\generic\new_template.html:6 +#: .\cookbook\models.py:310 .\cookbook\templates\generic\new_template.html:6 #: .\cookbook\templates\generic\new_template.html:14 -#: .\cookbook\templates\meal_plan.html:323 msgid "New" msgstr "" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:202 +#: .\cookbook\models.py:512 +msgid " is part of a recipe step and cannot be deleted" +msgstr "" + +#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:44 msgid "Text" msgstr "" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:203 +#: .\cookbook\models.py:586 msgid "Time" msgstr "" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:204 -#: .\cookbook\templates\forms\edit_internal_recipe.html:219 +#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:46 msgid "File" msgstr "" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:205 -#: .\cookbook\templates\forms\edit_internal_recipe.html:241 +#: .\cookbook\models.py:586 #: .\cookbook\templates\include\recipe_open_modal.html:7 -#: .\cookbook\templates\meal_plan.html:247 .\cookbook\views\delete.py:28 -#: .\cookbook\views\edit.py:273 .\cookbook\views\new.py:52 +#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260 +#: .\cookbook\views\new.py:53 msgid "Recipe" msgstr "" -#: .\cookbook\serializer.py:109 +#: .\cookbook\models.py:1041 .\cookbook\templates\search_info.html:28 +msgid "Simple" +msgstr "" + +#: .\cookbook\models.py:1042 .\cookbook\templates\search_info.html:33 +msgid "Phrase" +msgstr "" + +#: .\cookbook\models.py:1043 .\cookbook\templates\search_info.html:38 +msgid "Web" +msgstr "" + +#: .\cookbook\models.py:1044 .\cookbook\templates\search_info.html:47 +msgid "Raw" +msgstr "" + +#: .\cookbook\models.py:1082 +msgid "Food Alias" +msgstr "" + +#: .\cookbook\models.py:1082 +msgid "Unit Alias" +msgstr "" + +#: .\cookbook\models.py:1082 +msgid "Keyword Alias" +msgstr "" + +#: .\cookbook\serializer.py:175 +msgid "A user is required" +msgstr "" + +#: .\cookbook\serializer.py:195 msgid "File uploads are not enabled for this Space." msgstr "" -#: .\cookbook\serializer.py:117 +#: .\cookbook\serializer.py:206 msgid "You have reached your file upload limit." msgstr "" -#: .\cookbook\tables.py:35 .\cookbook\templates\books.html:36 -#: .\cookbook\templates\generic\edit_template.html:6 +#: .\cookbook\serializer.py:962 +msgid "Existing shopping list to update" +msgstr "" + +#: .\cookbook\serializer.py:964 +msgid "" +"List of ingredient IDs from the recipe to add, if not provided all " +"ingredients will be added." +msgstr "" + +#: .\cookbook\serializer.py:965 +msgid "" +"Providing a list_recipe ID and servings of 0 will delete that shopping list." +msgstr "" + +#: .\cookbook\serializer.py:973 +msgid "Amount of food to add to the shopping list" +msgstr "" + +#: .\cookbook\serializer.py:974 +msgid "ID of unit to use for the shopping list" +msgstr "" + +#: .\cookbook\serializer.py:975 +msgid "When set to true will delete all food from active shopping lists." +msgstr "" + +#: .\cookbook\tables.py:35 .\cookbook\templates\generic\edit_template.html:6 #: .\cookbook\templates\generic\edit_template.html:14 -#: .\cookbook\templates\meal_plan.html:281 #: .\cookbook\templates\recipes_table.html:82 -#: .\cookbook\templates\shopping_list.html:33 -#: .\cookbook\templates\space.html:90 +#: .\cookbook\templates\shopping_list.html:37 +#: .\cookbook\templates\space.html:109 msgid "Edit" msgstr "" -#: .\cookbook\tables.py:124 .\cookbook\tables.py:147 -#: .\cookbook\templates\books.html:38 -#: .\cookbook\templates\generic\delete_template.html:5 -#: .\cookbook\templates\generic\delete_template.html:13 -#: .\cookbook\templates\generic\edit_template.html:27 -#: .\cookbook\templates\meal_plan.html:277 +#: .\cookbook\tables.py:115 .\cookbook\tables.py:138 +#: .\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 "" @@ -449,7 +730,7 @@ 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:154 .\cookbook\templates\settings.html:6 +#: .\cookbook\templates\base.html:257 .\cookbook\templates\settings.html:6 #: .\cookbook\templates\settings.html:17 #: .\cookbook\templates\socialaccount\connections.html:10 msgid "Settings" @@ -484,6 +765,7 @@ msgid "Re-send Verification" msgstr "" #: .\cookbook\templates\account\email.html:50 +#: .\cookbook\templates\generic\delete_template.html:56 #: .\cookbook\templates\socialaccount\connections.html:44 msgid "Remove" msgstr "" @@ -525,7 +807,7 @@ msgid "" msgstr "" #: .\cookbook\templates\account\email_confirm.html:22 -#: .\cookbook\templates\generic\delete_template.html:21 +#: .\cookbook\templates\generic\delete_template.html:71 msgid "Confirm" msgstr "" @@ -537,7 +819,7 @@ msgid "" "request." msgstr "" -#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:189 +#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:289 msgid "Login" msgstr "" @@ -548,27 +830,27 @@ msgstr "" msgid "Sign In" msgstr "" -#: .\cookbook\templates\account\login.html:32 +#: .\cookbook\templates\account\login.html:34 #: .\cookbook\templates\socialaccount\signup.html:8 #: .\cookbook\templates\socialaccount\signup.html:57 msgid "Sign Up" msgstr "" -#: .\cookbook\templates\account\login.html:36 -#: .\cookbook\templates\account\login.html:37 +#: .\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:37 +#: .\cookbook\templates\account\login.html:40 msgid "Lost your password?" msgstr "" -#: .\cookbook\templates\account\login.html:48 +#: .\cookbook\templates\account\login.html:52 msgid "Social Login" msgstr "" -#: .\cookbook\templates\account\login.html:49 +#: .\cookbook\templates\account\login.html:53 msgid "You can use any of the following providers to sign in." msgstr "" @@ -585,12 +867,16 @@ msgstr "" #: .\cookbook\templates\account\password_change.html:6 #: .\cookbook\templates\account\password_change.html:16 #: .\cookbook\templates\account\password_change.html:21 +#: .\cookbook\templates\account\password_reset_from_key.html:7 +#: .\cookbook\templates\account\password_reset_from_key.html:13 +#: .\cookbook\templates\account\password_reset_from_key_done.html:7 +#: .\cookbook\templates\account\password_reset_from_key_done.html:13 msgid "Change Password" msgstr "" #: .\cookbook\templates\account\password_change.html:12 #: .\cookbook\templates\account\password_set.html:12 -#: .\cookbook\templates\settings.html:52 +#: .\cookbook\templates\settings.html:76 msgid "Password" msgstr "" @@ -621,6 +907,28 @@ msgid "" "within a few minutes." msgstr "" +#: .\cookbook\templates\account\password_reset_from_key.html:13 +msgid "Bad Token" +msgstr "" + +#: .\cookbook\templates\account\password_reset_from_key.html:25 +#, python-format +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used.\n" +" Please request a new " +"password reset." +msgstr "" + +#: .\cookbook\templates\account\password_reset_from_key.html:33 +msgid "change password" +msgstr "" + +#: .\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 "" + #: .\cookbook\templates\account\password_set.html:6 #: .\cookbook\templates\account\password_set.html:16 #: .\cookbook\templates\account\password_set.html:21 @@ -672,98 +980,110 @@ msgstr "" msgid "We are sorry, but the sign up is currently closed." msgstr "" -#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:179 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:279 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "" -#: .\cookbook\templates\base.html:85 -msgid "Utensils" -msgstr "" - -#: .\cookbook\templates\base.html:95 +#: .\cookbook\templates\base.html:86 msgid "Shopping" msgstr "" -#: .\cookbook\templates\base.html:101 -#: .\cookbook\templates\shopping_list.html:230 +#: .\cookbook\templates\base.html:113 +msgid "Keyword" +msgstr "" + +#: .\cookbook\templates\base.html:125 .\cookbook\views\lists.py:114 +msgid "Foods" +msgstr "" + +#: .\cookbook\templates\base.html:137 +#: .\cookbook\templates\forms\ingredients.html:24 +#: .\cookbook\templates\space.html:47 .\cookbook\templates\stats.html:26 +#: .\cookbook\views\lists.py:131 +msgid "Units" +msgstr "" + +#: .\cookbook\templates\base.html:151 +#: .\cookbook\templates\shopping_list.html:208 #: .\cookbook\templates\supermarket.html:7 msgid "Supermarket" msgstr "" -#: .\cookbook\templates\base.html:112 .\cookbook\views\delete.py:84 -#: .\cookbook\views\edit.py:102 .\cookbook\views\lists.py:26 -#: .\cookbook\views\new.py:78 -msgid "Keyword" +#: .\cookbook\templates\base.html:163 +msgid "Supermarket Category" msgstr "" -#: .\cookbook\templates\base.html:114 +#: .\cookbook\templates\base.html:175 .\cookbook\views\lists.py:180 +msgid "Automations" +msgstr "" + +#: .\cookbook\templates\base.html:189 .\cookbook\views\lists.py:200 +msgid "Files" +msgstr "" + +#: .\cookbook\templates\base.html:201 msgid "Batch Edit" msgstr "" -#: .\cookbook\templates\base.html:119 -msgid "Storage Data" -msgstr "" - -#: .\cookbook\templates\base.html:123 -msgid "Storage Backends" -msgstr "" - -#: .\cookbook\templates\base.html:125 -msgid "Configure Sync" -msgstr "" - -#: .\cookbook\templates\base.html:127 -msgid "Discovered Recipes" -msgstr "" - -#: .\cookbook\templates\base.html:129 -msgid "Discovery Log" -msgstr "" - -#: .\cookbook\templates\base.html:131 .\cookbook\templates\stats.html:10 -msgid "Statistics" -msgstr "" - -#: .\cookbook\templates\base.html:133 -msgid "Units & Ingredients" -msgstr "" - -#: .\cookbook\templates\base.html:135 .\cookbook\templates\index.html:47 -msgid "Import Recipe" -msgstr "" - -#: .\cookbook\templates\base.html:156 .\cookbook\templates\history.html:6 +#: .\cookbook\templates\base.html:213 .\cookbook\templates\history.html:6 #: .\cookbook\templates\history.html:14 msgid "History" msgstr "" -#: .\cookbook\templates\base.html:159 .\cookbook\templates\space.html:7 -#: .\cookbook\templates\space.html:19 +#: .\cookbook\templates\base.html:228 .\cookbook\templates\export.html:14 +#: .\cookbook\templates\export.html:20 +#: .\cookbook\templates\shopping_list.html:310 +#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 +msgid "Export" +msgstr "" + +#: .\cookbook\templates\base.html:244 .\cookbook\templates\index.html:47 +msgid "Import Recipe" +msgstr "" + +#: .\cookbook\templates\base.html:246 +#: .\cookbook\templates\shopping_list.html:165 +#: .\cookbook\templates\shopping_list.html:188 +msgid "Create" +msgstr "" + +#: .\cookbook\templates\base.html:259 +#: .\cookbook\templates\generic\list_template.html:14 +#: .\cookbook\templates\space.html:69 .\cookbook\templates\stats.html:43 +msgid "External Recipes" +msgstr "" + +#: .\cookbook\templates\base.html:262 .\cookbook\templates\space.html:8 +#: .\cookbook\templates\space.html:20 .\cookbook\templates\space.html:150 msgid "Space Settings" msgstr "" -#: .\cookbook\templates\base.html:163 .\cookbook\templates\system.html:13 +#: .\cookbook\templates\base.html:267 .\cookbook\templates\system.html:13 msgid "System" msgstr "" -#: .\cookbook\templates\base.html:165 .\cookbook\templates\base.html:171 +#: .\cookbook\templates\base.html:269 msgid "Admin" msgstr "" -#: .\cookbook\templates\base.html:175 +#: .\cookbook\templates\base.html:273 msgid "Markdown Guide" msgstr "" -#: .\cookbook\templates\base.html:177 +#: .\cookbook\templates\base.html:275 msgid "GitHub" msgstr "" -#: .\cookbook\templates\base.html:181 +#: .\cookbook\templates\base.html:277 +msgid "Translate Tandoor" +msgstr "" + +#: .\cookbook\templates\base.html:281 msgid "API Browser" msgstr "" -#: .\cookbook\templates\base.html:184 +#: .\cookbook\templates\base.html:284 msgid "Log out" msgstr "" @@ -779,7 +1099,7 @@ msgstr "" msgid "Add the specified keywords to all recipes containing a word" msgstr "" -#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:85 +#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:82 msgid "Sync" msgstr "" @@ -797,10 +1117,36 @@ msgstr "" msgid "The path must be in the following format" msgstr "" -#: .\cookbook\templates\batch\monitor.html:27 +#: .\cookbook\templates\batch\monitor.html:20 +#: .\cookbook\templates\forms\edit_import_recipe.html:14 +#: .\cookbook\templates\generic\edit_template.html:23 +#: .\cookbook\templates\generic\new_template.html:23 +#: .\cookbook\templates\include\log_cooking.html:30 +#: .\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\shopping_list.html:311 +#: .\cookbook\templates\space.html:155 +msgid "Save" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:21 +msgid "Manage External Storage" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:28 msgid "Sync Now!" msgstr "" +#: .\cookbook\templates\batch\monitor.html:29 +msgid "Show Recipes" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:30 +msgid "Show Log" +msgstr "" + #: .\cookbook\templates\batch\waiting.html:4 #: .\cookbook\templates\batch\waiting.html:10 msgid "Importing Recipes" @@ -812,257 +1158,23 @@ msgid "" "please wait." msgstr "" -#: .\cookbook\templates\books.html:5 .\cookbook\templates\books.html:11 +#: .\cookbook\templates\books.html:7 msgid "Recipe Books" msgstr "" -#: .\cookbook\templates\books.html:15 -msgid "New Book" -msgstr "" - -#: .\cookbook\templates\books.html:27 .\cookbook\templates\recipe_view.html:26 -msgid "by" -msgstr "" - -#: .\cookbook\templates\books.html:34 -msgid "Toggle Recipes" -msgstr "" - -#: .\cookbook\templates\books.html:54 -#: .\cookbook\templates\meal_plan_entry.html:48 -#: .\cookbook\templates\recipes_table.html:64 -msgid "Last cooked" -msgstr "" - -#: .\cookbook\templates\books.html:71 -msgid "There are no recipes in this book yet." -msgstr "" - #: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6 msgid "Export Recipes" msgstr "" -#: .\cookbook\templates\export.html:14 .\cookbook\templates\export.html:20 -#: .\cookbook\templates\shopping_list.html:351 -#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 -msgid "Export" -msgstr "" - -#: .\cookbook\templates\files.html:7 -msgid "Files" -msgstr "" - #: .\cookbook\templates\forms\edit_import_recipe.html:5 #: .\cookbook\templates\forms\edit_import_recipe.html:9 msgid "Import new Recipe" msgstr "" -#: .\cookbook\templates\forms\edit_import_recipe.html:14 -#: .\cookbook\templates\forms\edit_internal_recipe.html:439 -#: .\cookbook\templates\forms\edit_internal_recipe.html:471 -#: .\cookbook\templates\generic\edit_template.html:23 -#: .\cookbook\templates\generic\new_template.html:23 -#: .\cookbook\templates\include\log_cooking.html:28 -#: .\cookbook\templates\meal_plan.html:325 -#: .\cookbook\templates\settings.html:46 .\cookbook\templates\settings.html:87 -#: .\cookbook\templates\settings.html:105 -#: .\cookbook\templates\shopping_list.html:353 -msgid "Save" -msgstr "" - #: .\cookbook\templates\forms\edit_internal_recipe.html:7 -#: .\cookbook\templates\forms\edit_internal_recipe.html:34 msgid "Edit Recipe" msgstr "" -#: .\cookbook\templates\forms\edit_internal_recipe.html:56 -#: .\cookbook\templates\url_import.html:171 -msgid "Description" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:76 -msgid "Waiting Time" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:82 -msgid "Servings Text" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:93 -msgid "Select Keywords" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:94 -#: .\cookbook\templates\url_import.html:583 -msgid "Add Keyword" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:112 -msgid "Nutrition" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:116 -#: .\cookbook\templates\forms\edit_internal_recipe.html:166 -msgid "Delete Step" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:120 -msgid "Calories" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:123 -msgid "Carbohydrates" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:126 -msgid "Fats" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:128 -msgid "Proteins" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:150 -#: .\cookbook\templates\forms\edit_internal_recipe.html:504 -msgid "Step" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:171 -msgid "Show as header" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:177 -msgid "Hide as header" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:182 -msgid "Move Up" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:187 -msgid "Move Down" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:196 -msgid "Step Name" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:200 -msgid "Step Type" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:213 -msgid "Step time in Minutes" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:229 -msgid "Select File" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:230 -#: .\cookbook\templates\forms\edit_internal_recipe.html:252 -#: .\cookbook\templates\forms\edit_internal_recipe.html:313 -#: .\cookbook\templates\forms\edit_internal_recipe.html:337 -#: .\cookbook\templates\shopping_list.html:189 -#: .\cookbook\templates\shopping_list.html:211 -#: .\cookbook\templates\shopping_list.html:241 -#: .\cookbook\templates\shopping_list.html:265 -#: .\cookbook\templates\url_import.html:495 -#: .\cookbook\templates\url_import.html:527 -msgid "Select" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:251 -msgid "Select Recipe" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:311 -#: .\cookbook\templates\shopping_list.html:187 -msgid "Select Unit" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:312 -#: .\cookbook\templates\forms\edit_internal_recipe.html:336 -#: .\cookbook\templates\shopping_list.html:188 -#: .\cookbook\templates\shopping_list.html:210 -msgid "Create" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:335 -#: .\cookbook\templates\shopping_list.html:209 -msgid "Select Food" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:352 -#: .\cookbook\templates\meal_plan.html:256 -#: .\cookbook\templates\url_import.html:542 -msgid "Note" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:369 -msgid "Delete Ingredient" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:375 -msgid "Make Header" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:381 -msgid "Make Ingredient" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:387 -msgid "Disable Amount" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:393 -msgid "Enable Amount" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:398 -msgid "Copy Template Reference" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:424 -#: .\cookbook\templates\url_import.html:297 -#: .\cookbook\templates\url_import.html:567 -msgid "Instructions" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:437 -#: .\cookbook\templates\forms\edit_internal_recipe.html:468 -msgid "Save & View" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:441 -#: .\cookbook\templates\forms\edit_internal_recipe.html:474 -msgid "Add Step" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:444 -#: .\cookbook\templates\forms\edit_internal_recipe.html:478 -msgid "Add Nutrition" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:446 -#: .\cookbook\templates\forms\edit_internal_recipe.html:480 -msgid "Remove Nutrition" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:448 -#: .\cookbook\templates\forms\edit_internal_recipe.html:483 -msgid "View Recipe" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:450 -#: .\cookbook\templates\forms\edit_internal_recipe.html:485 -msgid "Delete Recipe" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:491 -msgid "Steps" -msgstr "" - #: .\cookbook\templates\forms\ingredients.html:15 msgid "Edit Ingredients" msgstr "" @@ -1078,11 +1190,6 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\forms\ingredients.html:24 -#: .\cookbook\templates\space.html:41 .\cookbook\templates\stats.html:26 -msgid "Units" -msgstr "" - #: .\cookbook\templates\forms\ingredients.html:26 msgid "Are you sure that you want to merge these two units?" msgstr "" @@ -1096,29 +1203,46 @@ msgstr "" msgid "Are you sure that you want to merge these two ingredients?" msgstr "" -#: .\cookbook\templates\generic\delete_template.html:18 +#: .\cookbook\templates\generic\delete_template.html:21 #, python-format msgid "Are you sure you want to delete the %(title)s: %(object)s " msgstr "" -#: .\cookbook\templates\generic\edit_template.html:30 +#: .\cookbook\templates\generic\delete_template.html:26 +msgid "Protected" +msgstr "" + +#: .\cookbook\templates\generic\delete_template.html:41 +msgid "Cascade" +msgstr "" + +#: .\cookbook\templates\generic\delete_template.html:72 +msgid "Cancel" +msgstr "" + +#: .\cookbook\templates\generic\edit_template.html:32 msgid "View" msgstr "" -#: .\cookbook\templates\generic\edit_template.html:34 +#: .\cookbook\templates\generic\edit_template.html:36 msgid "Delete original file" msgstr "" #: .\cookbook\templates\generic\list_template.html:6 -#: .\cookbook\templates\generic\list_template.html:12 +#: .\cookbook\templates\generic\list_template.html:22 msgid "List" msgstr "" -#: .\cookbook\templates\generic\list_template.html:25 +#: .\cookbook\templates\generic\list_template.html:33 +#: .\cookbook\templates\shopping_list.html:33 +msgid "Try the new shopping list" +msgstr "" + +#: .\cookbook\templates\generic\list_template.html:45 msgid "Filter" msgstr "" -#: .\cookbook\templates\generic\list_template.html:30 +#: .\cookbook\templates\generic\list_template.html:50 msgid "Import all" msgstr "" @@ -1144,23 +1268,32 @@ msgstr "" msgid "Import Recipes" msgstr "" -#: .\cookbook\templates\include\log_cooking.html:7 +#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 +#: .\cookbook\templates\import_response.html:7 +#: .\cookbook\templates\test.html:14 .\cookbook\templates\test.html:20 +#: .\cookbook\templates\url_import.html:29 +#: .\cookbook\templates\url_import.html:108 +#: .\cookbook\templates\url_import.html:130 +#: .\cookbook\templates\url_import.html:324 +#: .\cookbook\templates\url_import.html:618 .\cookbook\views\delete.py:89 +#: .\cookbook\views\edit.py:200 +msgid "Import" +msgstr "" + +#: .\cookbook\templates\include\log_cooking.html:9 msgid "Log Recipe Cooking" msgstr "" -#: .\cookbook\templates\include\log_cooking.html:13 +#: .\cookbook\templates\include\log_cooking.html:15 msgid "All fields are optional and can be left empty." msgstr "" -#: .\cookbook\templates\include\log_cooking.html:19 +#: .\cookbook\templates\include\log_cooking.html:21 msgid "Rating" msgstr "" -#: .\cookbook\templates\include\log_cooking.html:27 +#: .\cookbook\templates\include\log_cooking.html:29 #: .\cookbook\templates\include\recipe_open_modal.html:18 -#: .\cookbook\templates\meal_plan.html:283 -#: .\cookbook\templates\meal_plan.html:327 -#: .\cookbook\templates\meal_plan.html:366 msgid "Close" msgstr "" @@ -1205,8 +1338,8 @@ msgstr "" msgid "Last viewed" msgstr "" -#: .\cookbook\templates\index.html:87 .\cookbook\templates\meal_plan.html:178 -#: .\cookbook\templates\space.html:35 .\cookbook\templates\stats.html:22 +#: .\cookbook\templates\index.html:87 .\cookbook\templates\space.html:37 +#: .\cookbook\templates\stats.html:22 msgid "Recipes" msgstr "" @@ -1349,145 +1482,22 @@ msgstr "" msgid "Cell" msgstr "" -#: .\cookbook\templates\meal_plan.html:101 -msgid "New Entry" +#: .\cookbook\templates\meal_plan_entry.html:6 +msgid "Meal Plan View" msgstr "" -#: .\cookbook\templates\meal_plan.html:113 -#: .\cookbook\templates\shopping_list.html:56 -msgid "Search Recipe" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:139 -msgid "Title" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:141 -msgid "Note (optional)" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:143 -msgid "" -"You can use markdown to format this field. See the docs here" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:147 -#: .\cookbook\templates\meal_plan.html:251 -msgid "Serving Count" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:153 -msgid "Create only note" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:168 -#: .\cookbook\templates\shopping_list.html:7 -#: .\cookbook\templates\shopping_list.html:29 -#: .\cookbook\templates\shopping_list.html:714 -msgid "Shopping List" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:172 -msgid "Shopping list currently empty" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:175 -msgid "Open Shopping List" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:189 -msgid "Plan" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:196 -msgid "Number of Days" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:206 -msgid "Weekday offset" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:209 -msgid "" -"Number of days starting from the first day of the week to offset the default " -"view." -msgstr "" - -#: .\cookbook\templates\meal_plan.html:217 -#: .\cookbook\templates\meal_plan.html:294 -msgid "Edit plan types" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:219 -msgid "Show help" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:220 -msgid "Week iCal export" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:264 #: .\cookbook\templates\meal_plan_entry.html:18 msgid "Created by" msgstr "" -#: .\cookbook\templates\meal_plan.html:270 #: .\cookbook\templates\meal_plan_entry.html:20 -#: .\cookbook\templates\shopping_list.html:254 +#: .\cookbook\templates\shopping_list.html:232 msgid "Shared with" msgstr "" -#: .\cookbook\templates\meal_plan.html:280 -msgid "Add to Shopping" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:323 -msgid "New meal type" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:338 -msgid "Meal Plan Help" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:344 -msgid "" -"\n" -"

The meal plan module allows planning of meals " -"both with recipes and notes.

\n" -"

Simply select a recipe from the list of " -"recently viewed recipes or search the one you\n" -" want and drag it to the desired plan " -"position. You can also add a note and a title and\n" -" then drag the recipe to create a plan entry " -"with a custom title and note. Creating only\n" -" Notes is possible by dragging the create " -"note box into the plan.

\n" -"

Click on a recipe in order to open the " -"detailed view. There you can also add it to the\n" -" shopping list. You can also add all recipes " -"of a day to the shopping list by\n" -" clicking the shopping cart at the top of the " -"table.

\n" -"

Since a common use case is to plan meals " -"together you can define\n" -" users you want to share your plan with in " -"the settings.\n" -"

\n" -"

You can also edit the types of meals you want " -"to plan. If you share your plan with\n" -" someone with\n" -" different meals, their meal types will " -"appear in your list as well. To prevent\n" -" duplicates (e.g. Other and Misc.)\n" -" name your meal types the same as the users " -"you share your meals with and they will be\n" -" merged.

\n" -" " -msgstr "" - -#: .\cookbook\templates\meal_plan_entry.html:6 -msgid "Meal Plan View" +#: .\cookbook\templates\meal_plan_entry.html:48 +#: .\cookbook\templates\recipes_table.html:64 +msgid "Last cooked" msgstr "" #: .\cookbook\templates\meal_plan_entry.html:50 @@ -1581,29 +1591,28 @@ msgid "" "recently viewed them. Keep in mind that data might be outdated." msgstr "" -#: .\cookbook\templates\recipe_view.html:21 .\cookbook\templates\space.html:62 -#: .\cookbook\templates\stats.html:47 -msgid "Comments" +#: .\cookbook\templates\recipe_view.html:26 +msgid "by" msgstr "" -#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:118 -#: .\cookbook\views\edit.py:179 +#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:147 +#: .\cookbook\views\edit.py:180 msgid "Comment" msgstr "" #: .\cookbook\templates\recipes_table.html:19 #: .\cookbook\templates\recipes_table.html:23 -#: .\cookbook\templates\url_import.html:440 +#: .\cookbook\templates\url_import.html:447 msgid "Recipe Image" msgstr "" #: .\cookbook\templates\recipes_table.html:51 -#: .\cookbook\templates\url_import.html:445 +#: .\cookbook\templates\url_import.html:452 msgid "Preparation time ca." msgstr "" #: .\cookbook\templates\recipes_table.html:57 -#: .\cookbook\templates\url_import.html:450 +#: .\cookbook\templates\url_import.html:457 msgid "Waiting time ca." msgstr "" @@ -1619,63 +1628,284 @@ msgstr "" msgid "Recipe Home" msgstr "" -#: .\cookbook\templates\settings.html:25 +#: .\cookbook\templates\search_info.html:5 +#: .\cookbook\templates\search_info.html:9 +#: .\cookbook\templates\settings.html:172 +msgid "Search Settings" +msgstr "" + +#: .\cookbook\templates\search_info.html:10 +msgid "" +"\n" +" Creating the best search experience is complicated and weighs " +"heavily on your personal configuration. \n" +" Changing any of the search settings can have significant impact on " +"the speed and quality of the results.\n" +" Search Methods, Trigrams and Full Text Search configurations are " +"only available if you are using Postgres for your database.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:19 +msgid "Search Methods" +msgstr "" + +#: .\cookbook\templates\search_info.html:23 +msgid "" +" \n" +" Full text searches attempt to normalize the words provided to " +"match common variants. For example: 'forked', 'forking', 'forks' will all " +"normalize to 'fork'.\n" +" There are several methods available, described below, that will " +"control how the search behavior should react when multiple words are " +"searched.\n" +" Full technical details on how these operate can be viewed on Postgresql's website.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:29 +msgid "" +" \n" +" Simple searches ignore punctuation and common words such as " +"'the', 'a', 'and'. And will treat seperate words as required.\n" +" Searching for 'apple or flour' will return any recipe that " +"includes both 'apple' and 'flour' anywhere in the fields that have been " +"selected for a full text search.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:34 +msgid "" +" \n" +" Phrase searches ignore punctuation, but will search for all of " +"the words in the exact order provided.\n" +" Searching for 'apple or flour' will only return a recipe that " +"includes the exact phrase 'apple or flour' in any of the fields that have " +"been selected for a full text search.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:39 +msgid "" +" \n" +" Web searches simulate functionality found on many web search " +"sites supporting special syntax.\n" +" Placing quotes around several words will convert those words " +"into a phrase.\n" +" 'or' is recongized as searching for the word (or phrase) " +"immediately before 'or' OR the word (or phrase) directly after.\n" +" '-' is recognized as searching for recipes that do not include " +"the word (or phrase) that comes immediately after. \n" +" For example searching for 'apple pie' or cherry -butter will " +"return any recipe that includes the phrase 'apple pie' or the word " +"'cherry' \n" +" in any field included in the full text search but exclude any " +"recipe that has the word 'butter' in any field included.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:48 +msgid "" +" \n" +" Raw search is similar to Web except will take puncuation " +"operators such as '|', '&' and '()'\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:59 +msgid "" +" \n" +" Another approach to searching that also requires Postgresql is " +"fuzzy search or trigram similarity. A trigram is a group of three " +"consecutive characters.\n" +" For example searching for 'apple' will create x trigrams 'app', " +"'ppl', 'ple' and will create a score of how closely words match the " +"generated trigrams.\n" +" One benefit of searching trigams is that a search for 'sandwich' " +"will find mispelled words such as 'sandwhich' that would be missed by other " +"methods.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:69 +msgid "Search Fields" +msgstr "" + +#: .\cookbook\templates\search_info.html:73 +msgid "" +" \n" +" Unaccent is a special case in that it enables searching a field " +"'unaccented' for each search style attempting to ignore accented values. \n" +" For example when you enable unaccent for 'Name' any search " +"(starts with, contains, trigram) will attempt the search ignoring accented " +"characters.\n" +" \n" +" For the other options, you can enable search on any or all " +"fields and they will be combined together with an assumed 'OR'.\n" +" For example enabling 'Name' for Starts With, 'Name' and " +"'Description' for Partial Match and 'Ingredients' and 'Keywords' for Full " +"Search\n" +" and searching for 'apple' will generate a search that will " +"return recipes that have:\n" +" - A recipe name that starts with 'apple'\n" +" - OR a recipe name that contains 'apple'\n" +" - OR a recipe description that contains 'apple'\n" +" - OR a recipe that will have a full text search match ('apple' " +"or 'apples') in ingredients\n" +" - OR a recipe that will have a full text search match in " +"Keywords\n" +"\n" +" Combining too many fields in too many types of search can have a " +"negative impact on performance, create duplicate results or return " +"unexpected results.\n" +" For example, enabling fuzzy search or partial matches will " +"interfere with web search methods. \n" +" Searching for 'apple -pie' with fuzzy search and full text " +"search will return the recipe Apple Pie. Though it is not included in the " +"full text results, it does match the trigram results.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:95 +msgid "Search Index" +msgstr "" + +#: .\cookbook\templates\search_info.html:99 +msgid "" +" \n" +" Trigram search and Full Text Search both rely on database " +"indexes to perform effectively. \n" +" You can rebuild the indexes on all fields in the Admin page for " +"Recipes and selecting all recipes and running 'rebuild index for selected " +"recipes'\n" +" You can also rebuild indexes at the command line by executing " +"the management command 'python manage.py rebuildindex'\n" +" " +msgstr "" + +#: .\cookbook\templates\settings.html:28 msgid "Account" msgstr "" -#: .\cookbook\templates\settings.html:29 +#: .\cookbook\templates\settings.html:35 msgid "Preferences" msgstr "" -#: .\cookbook\templates\settings.html:33 +#: .\cookbook\templates\settings.html:42 msgid "API-Settings" msgstr "" -#: .\cookbook\templates\settings.html:41 +#: .\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:49 +#: .\cookbook\templates\settings.html:73 msgid "Account Settings" msgstr "" -#: .\cookbook\templates\settings.html:51 +#: .\cookbook\templates\settings.html:75 msgid "Emails" msgstr "" -#: .\cookbook\templates\settings.html:54 +#: .\cookbook\templates\settings.html:78 #: .\cookbook\templates\socialaccount\connections.html:11 msgid "Social" msgstr "" -#: .\cookbook\templates\settings.html:66 +#: .\cookbook\templates\settings.html:91 msgid "Language" msgstr "" -#: .\cookbook\templates\settings.html:96 +#: .\cookbook\templates\settings.html:121 msgid "Style" msgstr "" -#: .\cookbook\templates\settings.html:116 +#: .\cookbook\templates\settings.html:142 msgid "API Token" msgstr "" -#: .\cookbook\templates\settings.html:117 +#: .\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:134 +#: .\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:136 +#: .\cookbook\templates\settings.html:162 msgid "or" msgstr "" +#: .\cookbook\templates\settings.html:173 +msgid "" +"There are many options to configure the search depending on your personal " +"preferences." +msgstr "" + +#: .\cookbook\templates\settings.html:174 +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 +msgid "" +"If you do want to configure the search you can read about the different " +"options here." +msgstr "" + +#: .\cookbook\templates\settings.html:180 +msgid "Fuzzy" +msgstr "" + +#: .\cookbook\templates\settings.html:181 +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 +msgid "This is the default behavior" +msgstr "" + +#: .\cookbook\templates\settings.html:183 +#: .\cookbook\templates\settings.html:191 +msgid "Apply" +msgstr "" + +#: .\cookbook\templates\settings.html:188 +msgid "Precise" +msgstr "" + +#: .\cookbook\templates\settings.html:189 +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 +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 "" @@ -1693,50 +1923,73 @@ msgstr "" msgid "Create Superuser account" msgstr "" -#: .\cookbook\templates\shopping_list.html:79 +#: .\cookbook\templates\shopping_list.html:8 +#: .\cookbook\templates\shopping_list.html:29 +#: .\cookbook\templates\shopping_list.html:663 +msgid "Shopping List" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:55 +msgid "Search Recipe" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:72 msgid "Shopping Recipes" msgstr "" -#: .\cookbook\templates\shopping_list.html:83 +#: .\cookbook\templates\shopping_list.html:74 msgid "No recipes selected" msgstr "" -#: .\cookbook\templates\shopping_list.html:150 +#: .\cookbook\templates\shopping_list.html:131 msgid "Entry Mode" msgstr "" -#: .\cookbook\templates\shopping_list.html:158 +#: .\cookbook\templates\shopping_list.html:139 msgid "Add Entry" msgstr "" -#: .\cookbook\templates\shopping_list.html:174 +#: .\cookbook\templates\shopping_list.html:152 msgid "Amount" msgstr "" -#: .\cookbook\templates\shopping_list.html:240 +#: .\cookbook\templates\shopping_list.html:164 +msgid "Select Unit" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:166 +#: .\cookbook\templates\shopping_list.html:189 +#: .\cookbook\templates\shopping_list.html:219 +#: .\cookbook\templates\shopping_list.html:243 +#: .\cookbook\templates\url_import.html:505 +#: .\cookbook\templates\url_import.html:537 +msgid "Select" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:187 +msgid "Select Food" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:218 msgid "Select Supermarket" msgstr "" -#: .\cookbook\templates\shopping_list.html:264 +#: .\cookbook\templates\shopping_list.html:242 msgid "Select User" msgstr "" -#: .\cookbook\templates\shopping_list.html:283 +#: .\cookbook\templates\shopping_list.html:258 msgid "Finished" msgstr "" -#: .\cookbook\templates\shopping_list.html:296 +#: .\cookbook\templates\shopping_list.html:267 msgid "You are offline, shopping list might not syncronize." msgstr "" -#: .\cookbook\templates\shopping_list.html:361 +#: .\cookbook\templates\shopping_list.html:318 msgid "Copy/Export" msgstr "" -#: .\cookbook\templates\shopping_list.html:365 -msgid "List Prefix" -msgstr "" - #: .\cookbook\templates\socialaccount\connections.html:4 #: .\cookbook\templates\socialaccount\connections.html:15 msgid "Account Connections" @@ -1786,84 +2039,80 @@ msgstr "" msgid "Sign in using" msgstr "" -#: .\cookbook\templates\space.html:23 +#: .\cookbook\templates\space.html:25 msgid "Space:" msgstr "" -#: .\cookbook\templates\space.html:24 +#: .\cookbook\templates\space.html:26 msgid "Manage Subscription" msgstr "" -#: .\cookbook\templates\space.html:32 .\cookbook\templates\stats.html:19 +#: .\cookbook\templates\space.html:34 .\cookbook\templates\stats.html:19 msgid "Number of objects" msgstr "" -#: .\cookbook\templates\space.html:45 .\cookbook\templates\stats.html:30 +#: .\cookbook\templates\space.html:54 .\cookbook\templates\stats.html:30 msgid "Recipe Imports" msgstr "" -#: .\cookbook\templates\space.html:53 .\cookbook\templates\stats.html:38 +#: .\cookbook\templates\space.html:62 .\cookbook\templates\stats.html:38 msgid "Objects stats" msgstr "" -#: .\cookbook\templates\space.html:56 .\cookbook\templates\stats.html:41 +#: .\cookbook\templates\space.html:65 .\cookbook\templates\stats.html:41 msgid "Recipes without Keywords" msgstr "" -#: .\cookbook\templates\space.html:58 .\cookbook\templates\stats.html:43 -msgid "External Recipes" -msgstr "" - -#: .\cookbook\templates\space.html:60 .\cookbook\templates\stats.html:45 +#: .\cookbook\templates\space.html:73 .\cookbook\templates\stats.html:45 msgid "Internal Recipes" msgstr "" -#: .\cookbook\templates\space.html:73 +#: .\cookbook\templates\space.html:89 msgid "Members" msgstr "" -#: .\cookbook\templates\space.html:77 +#: .\cookbook\templates\space.html:95 msgid "Invite User" msgstr "" -#: .\cookbook\templates\space.html:88 +#: .\cookbook\templates\space.html:107 msgid "User" msgstr "" -#: .\cookbook\templates\space.html:89 +#: .\cookbook\templates\space.html:108 msgid "Groups" msgstr "" -#: .\cookbook\templates\space.html:105 +#: .\cookbook\templates\space.html:119 msgid "admin" msgstr "" -#: .\cookbook\templates\space.html:106 +#: .\cookbook\templates\space.html:120 msgid "user" msgstr "" -#: .\cookbook\templates\space.html:107 +#: .\cookbook\templates\space.html:121 msgid "guest" msgstr "" -#: .\cookbook\templates\space.html:108 +#: .\cookbook\templates\space.html:122 msgid "remove" msgstr "" -#: .\cookbook\templates\space.html:112 +#: .\cookbook\templates\space.html:126 msgid "Update" msgstr "" -#: .\cookbook\templates\space.html:116 +#: .\cookbook\templates\space.html:130 msgid "You cannot edit yourself." msgstr "" -#: .\cookbook\templates\space.html:123 +#: .\cookbook\templates\space.html:136 msgid "There are no members in your space yet!" msgstr "" -#: .\cookbook\templates\space.html:130 .\cookbook\templates\system.html:21 -#: .\cookbook\views\lists.py:115 +#: .\cookbook\templates\space.html:143 .\cookbook\templates\system.html:21 +#: .\cookbook\views\lists.py:85 msgid "Invite Links" msgstr "" @@ -1871,6 +2120,10 @@ msgstr "" msgid "Stats" msgstr "" +#: .\cookbook\templates\stats.html:10 +msgid "Statistics" +msgstr "" + #: .\cookbook\templates\system.html:22 msgid "Show Links" msgstr "" @@ -1968,141 +2221,166 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\url_import.html:6 +#: .\cookbook\templates\url_import.html:8 msgid "URL Import" msgstr "" -#: .\cookbook\templates\url_import.html:31 +#: .\cookbook\templates\url_import.html:33 msgid "Drag me to your bookmarks to import recipes from anywhere" msgstr "" -#: .\cookbook\templates\url_import.html:32 +#: .\cookbook\templates\url_import.html:34 msgid "Bookmark Me!" msgstr "" -#: .\cookbook\templates\url_import.html:61 +#: .\cookbook\templates\url_import.html:38 +msgid "URL" +msgstr "" + +#: .\cookbook\templates\url_import.html:40 +msgid "App" +msgstr "" + +#: .\cookbook\templates\url_import.html:64 msgid "Enter website URL" msgstr "" -#: .\cookbook\templates\url_import.html:97 +#: .\cookbook\templates\url_import.html:104 msgid "Select recipe files to import or drop them here..." msgstr "" -#: .\cookbook\templates\url_import.html:118 +#: .\cookbook\templates\url_import.html:125 msgid "Paste json or html source here to load recipe." msgstr "" -#: .\cookbook\templates\url_import.html:146 +#: .\cookbook\templates\url_import.html:153 msgid "Preview Recipe Data" msgstr "" -#: .\cookbook\templates\url_import.html:147 +#: .\cookbook\templates\url_import.html:154 msgid "Drag recipe attributes from the right into the appropriate box below." msgstr "" -#: .\cookbook\templates\url_import.html:156 -#: .\cookbook\templates\url_import.html:173 -#: .\cookbook\templates\url_import.html:190 -#: .\cookbook\templates\url_import.html:209 -#: .\cookbook\templates\url_import.html:227 -#: .\cookbook\templates\url_import.html:242 -#: .\cookbook\templates\url_import.html:257 -#: .\cookbook\templates\url_import.html:273 -#: .\cookbook\templates\url_import.html:300 -#: .\cookbook\templates\url_import.html:351 +#: .\cookbook\templates\url_import.html:163 +#: .\cookbook\templates\url_import.html:180 +#: .\cookbook\templates\url_import.html:197 +#: .\cookbook\templates\url_import.html:216 +#: .\cookbook\templates\url_import.html:234 +#: .\cookbook\templates\url_import.html:249 +#: .\cookbook\templates\url_import.html:264 +#: .\cookbook\templates\url_import.html:280 +#: .\cookbook\templates\url_import.html:307 +#: .\cookbook\templates\url_import.html:358 msgid "Clear Contents" msgstr "" -#: .\cookbook\templates\url_import.html:158 +#: .\cookbook\templates\url_import.html:165 msgid "Text dragged here will be appended to the name." msgstr "" -#: .\cookbook\templates\url_import.html:175 +#: .\cookbook\templates\url_import.html:178 +msgid "Description" +msgstr "" + +#: .\cookbook\templates\url_import.html:182 msgid "Text dragged here will be appended to the description." msgstr "" -#: .\cookbook\templates\url_import.html:192 +#: .\cookbook\templates\url_import.html:199 msgid "Keywords dragged here will be appended to current list" msgstr "" -#: .\cookbook\templates\url_import.html:207 +#: .\cookbook\templates\url_import.html:214 msgid "Image" msgstr "" -#: .\cookbook\templates\url_import.html:239 +#: .\cookbook\templates\url_import.html:246 msgid "Prep Time" msgstr "" -#: .\cookbook\templates\url_import.html:254 +#: .\cookbook\templates\url_import.html:261 msgid "Cook Time" msgstr "" -#: .\cookbook\templates\url_import.html:275 +#: .\cookbook\templates\url_import.html:282 msgid "Ingredients dragged here will be appended to current list." msgstr "" -#: .\cookbook\templates\url_import.html:302 +#: .\cookbook\templates\url_import.html:304 +#: .\cookbook\templates\url_import.html:579 +msgid "Instructions" +msgstr "" + +#: .\cookbook\templates\url_import.html:309 msgid "" "Recipe instructions dragged here will be appended to current instructions." msgstr "" -#: .\cookbook\templates\url_import.html:325 +#: .\cookbook\templates\url_import.html:332 msgid "Discovered Attributes" msgstr "" -#: .\cookbook\templates\url_import.html:327 +#: .\cookbook\templates\url_import.html:334 msgid "" "Drag recipe attributes from below into the appropriate box on the left. " "Click any node to display its full properties." msgstr "" -#: .\cookbook\templates\url_import.html:344 +#: .\cookbook\templates\url_import.html:351 msgid "Show Blank Field" msgstr "" -#: .\cookbook\templates\url_import.html:349 +#: .\cookbook\templates\url_import.html:356 msgid "Blank Field" msgstr "" -#: .\cookbook\templates\url_import.html:353 +#: .\cookbook\templates\url_import.html:360 msgid "Items dragged to Blank Field will be appended." msgstr "" -#: .\cookbook\templates\url_import.html:400 +#: .\cookbook\templates\url_import.html:407 msgid "Delete Text" msgstr "" -#: .\cookbook\templates\url_import.html:413 +#: .\cookbook\templates\url_import.html:420 msgid "Delete image" msgstr "" -#: .\cookbook\templates\url_import.html:429 +#: .\cookbook\templates\url_import.html:436 msgid "Recipe Name" msgstr "" -#: .\cookbook\templates\url_import.html:433 +#: .\cookbook\templates\url_import.html:440 msgid "Recipe Description" msgstr "" -#: .\cookbook\templates\url_import.html:494 -#: .\cookbook\templates\url_import.html:526 -#: .\cookbook\templates\url_import.html:582 +#: .\cookbook\templates\url_import.html:504 +#: .\cookbook\templates\url_import.html:536 +#: .\cookbook\templates\url_import.html:596 msgid "Select one" msgstr "" -#: .\cookbook\templates\url_import.html:596 +#: .\cookbook\templates\url_import.html:554 +msgid "Note" +msgstr "" + +#: .\cookbook\templates\url_import.html:597 +msgid "Add Keyword" +msgstr "" + +#: .\cookbook\templates\url_import.html:610 msgid "All Keywords" msgstr "" -#: .\cookbook\templates\url_import.html:599 +#: .\cookbook\templates\url_import.html:613 msgid "Import all keywords, not only the ones already existing." msgstr "" -#: .\cookbook\templates\url_import.html:626 +#: .\cookbook\templates\url_import.html:640 msgid "Information" msgstr "" -#: .\cookbook\templates\url_import.html:628 +#: .\cookbook\templates\url_import.html:642 msgid "" " Only websites containing ld+json or microdata information can currently\n" " be imported. Most big recipe pages " @@ -2113,274 +2391,439 @@ msgid "" " github issues." msgstr "" -#: .\cookbook\templates\url_import.html:636 +#: .\cookbook\templates\url_import.html:650 msgid "Google ld+json Info" msgstr "" -#: .\cookbook\templates\url_import.html:639 +#: .\cookbook\templates\url_import.html:653 msgid "GitHub Issues" msgstr "" -#: .\cookbook\templates\url_import.html:641 +#: .\cookbook\templates\url_import.html:655 msgid "Recipe Markup Specification" msgstr "" -#: .\cookbook\views\api.py:79 +#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:170 msgid "Parameter updated_at incorrectly formatted" msgstr "" -#: .\cookbook\views\api.py:580 .\cookbook\views\views.py:303 -msgid "This feature is not available in the demo version!" +#: .\cookbook\views\api.py:190 .\cookbook\views\api.py:291 +#, python-brace-format +msgid "No {self.basename} with id {pk} exists" msgstr "" -#: .\cookbook\views\api.py:603 +#: .\cookbook\views\api.py:194 +msgid "Cannot merge with the same object!" +msgstr "" + +#: .\cookbook\views\api.py:201 +#, python-brace-format +msgid "No {self.basename} with id {target} exists" +msgstr "" + +#: .\cookbook\views\api.py:206 +msgid "Cannot merge with child object!" +msgstr "" + +#: .\cookbook\views\api.py:239 +#, python-brace-format +msgid "{source.name} was merged successfully with {target.name}" +msgstr "" + +#: .\cookbook\views\api.py:244 +#, python-brace-format +msgid "An error occurred attempting to merge {source.name} with {target.name}" +msgstr "" + +#: .\cookbook\views\api.py:300 +#, python-brace-format +msgid "{child.name} was moved successfully to the root." +msgstr "" + +#: .\cookbook\views\api.py:303 .\cookbook\views\api.py:321 +msgid "An error occurred attempting to move " +msgstr "" + +#: .\cookbook\views\api.py:306 +msgid "Cannot move an object to itself!" +msgstr "" + +#: .\cookbook\views\api.py:312 +#, python-brace-format +msgid "No {self.basename} with id {parent} exists" +msgstr "" + +#: .\cookbook\views\api.py:318 +#, python-brace-format +msgid "{child.name} was moved successfully to parent {parent.name}" +msgstr "" + +#: .\cookbook\views\api.py:470 +#, python-brace-format +msgid "{obj.name} was removed from the shopping list." +msgstr "" + +#: .\cookbook\views\api.py:475 .\cookbook\views\api.py:726 +#, python-brace-format +msgid "{obj.name} was added to the shopping list." +msgstr "" + +#: .\cookbook\views\api.py:587 +msgid "ID of recipe a step is part of. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:588 +msgid "Query string matched (fuzzy) against object name." +msgstr "" + +#: .\cookbook\views\api.py:631 +msgid "" +"Query string matched (fuzzy) against recipe name. In the future also " +"fulltext search." +msgstr "" + +#: .\cookbook\views\api.py:632 +msgid "ID of keyword a recipe should have. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:633 +msgid "ID of food a recipe should have. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:634 +msgid "ID of unit a recipe should have." +msgstr "" + +#: .\cookbook\views\api.py:635 +msgid "Rating a recipe should have. [0 - 5]" +msgstr "" + +#: .\cookbook\views\api.py:636 +msgid "ID of book a recipe should be in. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:637 +msgid "" +"If recipe should have all (AND=false) or any (OR=true) of the " +"provided keywords." +msgstr "" + +#: .\cookbook\views\api.py:638 +msgid "" +"If recipe should have all (AND=false) or any (OR=true) of the " +"provided foods." +msgstr "" + +#: .\cookbook\views\api.py:639 +msgid "" +"If recipe should be in all (AND=false) or any (OR=true) of the " +"provided books." +msgstr "" + +#: .\cookbook\views\api.py:640 +msgid "If only internal recipes should be returned. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:641 +msgid "Returns the results in randomized order. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:642 +msgid "Returns new results first in search results. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:768 +msgid "" +"Returns the shopping list entry with a primary key of id. Multiple values " +"allowed." +msgstr "" + +#: .\cookbook\views\api.py:771 +msgid "" +"Filter shopping list entries on checked. [true, false, both, recent]
- recent includes unchecked items and recently completed items." +msgstr "" + +#: .\cookbook\views\api.py:773 +msgid "Returns the shopping list entries sorted by supermarket category order." +msgstr "" + +#: .\cookbook\views\api.py:922 .\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 "" + +#: .\cookbook\views\api.py:944 msgid "Sync successful!" msgstr "" -#: .\cookbook\views\api.py:608 +#: .\cookbook\views\api.py:949 msgid "Error synchronizing with Storage" msgstr "" -#: .\cookbook\views\api.py:686 +#: .\cookbook\views\api.py:1028 msgid "Nothing to do." msgstr "" -#: .\cookbook\views\api.py:701 +#: .\cookbook\views\api.py:1043 msgid "The requested site provided malformed data and cannot be read." msgstr "" -#: .\cookbook\views\api.py:708 +#: .\cookbook\views\api.py:1050 msgid "The requested page could not be found." msgstr "" -#: .\cookbook\views\api.py:717 +#: .\cookbook\views\api.py:1068 msgid "" "The requested site does not provide any recognized data format to import the " "recipe from." msgstr "" -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:1082 +msgid "Connection Refused." +msgstr "" + +#: .\cookbook\views\api.py:1091 msgid "No useable data could be found." msgstr "" -#: .\cookbook\views\api.py:747 +#: .\cookbook\views\api.py:1107 msgid "I couldn't find anything to do." msgstr "" -#: .\cookbook\views\data.py:31 .\cookbook\views\data.py:122 -#: .\cookbook\views\edit.py:50 .\cookbook\views\import_export.py:67 -#: .\cookbook\views\new.py:32 +#: .\cookbook\views\data.py:34 .\cookbook\views\data.py:129 +#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:80 +#: .\cookbook\views\new.py:33 msgid "You have reached the maximum number of recipes for your space." msgstr "" -#: .\cookbook\views\data.py:35 .\cookbook\views\data.py:126 -#: .\cookbook\views\edit.py:54 .\cookbook\views\import_export.py:71 -#: .\cookbook\views\new.py:36 +#: .\cookbook\views\data.py:38 .\cookbook\views\data.py:133 +#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:84 +#: .\cookbook\views\new.py:37 msgid "You have more users than allowed in your space." msgstr "" -#: .\cookbook\views\data.py:104 +#: .\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] "" -#: .\cookbook\views\delete.py:72 +#: .\cookbook\views\delete.py:101 msgid "Monitor" msgstr "" -#: .\cookbook\views\delete.py:96 .\cookbook\views\lists.py:102 -#: .\cookbook\views\new.py:98 +#: .\cookbook\views\delete.py:125 .\cookbook\views\lists.py:71 +#: .\cookbook\views\new.py:101 msgid "Storage Backend" msgstr "" -#: .\cookbook\views\delete.py:106 +#: .\cookbook\views\delete.py:135 msgid "" "Could not delete this storage backend as it is used in at least one monitor." msgstr "" -#: .\cookbook\views\delete.py:129 .\cookbook\views\edit.py:213 -#: .\cookbook\views\new.py:156 +#: .\cookbook\views\delete.py:158 msgid "Recipe Book" msgstr "" -#: .\cookbook\views\delete.py:141 +#: .\cookbook\views\delete.py:170 msgid "Bookmarks" msgstr "" -#: .\cookbook\views\delete.py:163 .\cookbook\views\new.py:252 +#: .\cookbook\views\delete.py:192 .\cookbook\views\new.py:238 msgid "Invite Link" msgstr "" -#: .\cookbook\views\edit.py:119 -msgid "Food" -msgstr "" - -#: .\cookbook\views\edit.py:128 +#: .\cookbook\views\edit.py:125 msgid "You cannot edit this storage!" msgstr "" -#: .\cookbook\views\edit.py:148 +#: .\cookbook\views\edit.py:149 msgid "Storage saved!" msgstr "" -#: .\cookbook\views\edit.py:154 +#: .\cookbook\views\edit.py:155 msgid "There was an error updating this storage backend!" msgstr "" -#: .\cookbook\views\edit.py:165 -msgid "Storage" -msgstr "" - -#: .\cookbook\views\edit.py:261 +#: .\cookbook\views\edit.py:248 msgid "Changes saved!" msgstr "" -#: .\cookbook\views\edit.py:265 +#: .\cookbook\views\edit.py:252 msgid "Error saving changes!" msgstr "" -#: .\cookbook\views\edit.py:299 -msgid "Units merged!" -msgstr "" - -#: .\cookbook\views\edit.py:301 .\cookbook\views\edit.py:317 -msgid "Cannot merge with the same object!" -msgstr "" - -#: .\cookbook\views\edit.py:315 -msgid "Foods merged!" -msgstr "" - -#: .\cookbook\views\import_export.py:93 +#: .\cookbook\views\import_export.py:106 msgid "Importing is not implemented for this provider" msgstr "" -#: .\cookbook\views\import_export.py:115 +#: .\cookbook\views\import_export.py:127 +msgid "" +"The PDF Exporter is not enabled on this instance as it is still in an " +"experimental state." +msgstr "" + +#: .\cookbook\views\import_export.py:132 msgid "Exporting is not implemented for this provider" msgstr "" -#: .\cookbook\views\lists.py:40 +#: .\cookbook\views\lists.py:25 msgid "Import Log" msgstr "" -#: .\cookbook\views\lists.py:53 +#: .\cookbook\views\lists.py:38 msgid "Discovery" msgstr "" -#: .\cookbook\views\lists.py:85 +#: .\cookbook\views\lists.py:54 msgid "Shopping Lists" msgstr "" -#: .\cookbook\views\new.py:123 -msgid "Imported new recipe!" +#: .\cookbook\views\lists.py:148 +msgid "Supermarkets" +msgstr "" + +#: .\cookbook\views\lists.py:164 +msgid "Shopping Categories" +msgstr "" + +#: .\cookbook\views\lists.py:217 +msgid "Steps" +msgstr "" + +#: .\cookbook\views\lists.py:232 +msgid "New Shopping List" msgstr "" #: .\cookbook\views\new.py:126 +msgid "Imported new recipe!" +msgstr "" + +#: .\cookbook\views\new.py:129 msgid "There was an error importing this recipe!" msgstr "" -#: .\cookbook\views\new.py:226 +#: .\cookbook\views\new.py:212 msgid "Hello" msgstr "" -#: .\cookbook\views\new.py:226 +#: .\cookbook\views\new.py:212 msgid "You have been invited by " msgstr "" -#: .\cookbook\views\new.py:227 +#: .\cookbook\views\new.py:213 msgid " to join their Tandoor Recipes space " msgstr "" -#: .\cookbook\views\new.py:228 +#: .\cookbook\views\new.py:214 msgid "Click the following link to activate your account: " msgstr "" -#: .\cookbook\views\new.py:229 +#: .\cookbook\views\new.py:215 msgid "" "If the link does not work use the following code to manually join the space: " msgstr "" -#: .\cookbook\views\new.py:230 +#: .\cookbook\views\new.py:216 msgid "The invitation is valid until " msgstr "" -#: .\cookbook\views\new.py:231 +#: .\cookbook\views\new.py:217 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " msgstr "" -#: .\cookbook\views\new.py:234 +#: .\cookbook\views\new.py:220 msgid "Tandoor Recipes Invite" msgstr "" -#: .\cookbook\views\new.py:241 +#: .\cookbook\views\new.py:227 msgid "Invite link successfully send to user." msgstr "" -#: .\cookbook\views\new.py:244 +#: .\cookbook\views\new.py:230 msgid "" "You have send to many emails, please share the link manually or wait a few " "hours." msgstr "" -#: .\cookbook\views\new.py:246 +#: .\cookbook\views\new.py:232 msgid "Email to user could not be send, please share link manually." msgstr "" -#: .\cookbook\views\views.py:129 +#: .\cookbook\views\views.py:126 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:177 +#: .\cookbook\views\views.py:174 msgid "You do not have the required permissions to perform this action!" msgstr "" -#: .\cookbook\views\views.py:188 +#: .\cookbook\views\views.py:185 msgid "Comment saved!" msgstr "" -#: .\cookbook\views\views.py:395 +#: .\cookbook\views\views.py:276 +msgid "This feature is not available in the demo version!" +msgstr "" + +#: .\cookbook\views\views.py:335 +msgid "You must select at least one field to search!" +msgstr "" + +#: .\cookbook\views\views.py:340 +msgid "" +"To use this search method you must select at least one full text search " +"field!" +msgstr "" + +#: .\cookbook\views\views.py:344 +msgid "Fuzzy search is not compatible with this search method!" +msgstr "" + +#: .\cookbook\views\views.py:470 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:402 +#: .\cookbook\views\views.py:477 msgid "Passwords dont match!" msgstr "" -#: .\cookbook\views\views.py:418 +#: .\cookbook\views\views.py:493 msgid "User has been created, please login!" msgstr "" -#: .\cookbook\views\views.py:434 +#: .\cookbook\views\views.py:509 msgid "Malformed Invite Link supplied!" msgstr "" -#: .\cookbook\views\views.py:441 +#: .\cookbook\views\views.py:516 msgid "You are already member of a space and therefore cannot join this one." msgstr "" -#: .\cookbook\views\views.py:452 +#: .\cookbook\views\views.py:527 msgid "Successfully joined space." msgstr "" -#: .\cookbook\views\views.py:458 +#: .\cookbook\views\views.py:533 msgid "Invite Link not valid or already used!" msgstr "" -#: .\cookbook\views\views.py:522 +#: .\cookbook\views\views.py:614 msgid "" "Reporting share links is not enabled for this instance. Please notify the " "page administrator to report problems." msgstr "" -#: .\cookbook\views\views.py:528 +#: .\cookbook\views\views.py:620 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 b53695b2..53aed057 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 5674a3be..46d87bbc 100644 --- a/cookbook/locale/es/LC_MESSAGES/django.po +++ b/cookbook/locale/es/LC_MESSAGES/django.po @@ -14,7 +14,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-08-17 08:44+0200\n" +"POT-Creation-Date: 2022-01-18 14:52+0100\n" "PO-Revision-Date: 2020-06-02 19:28+0000\n" "Last-Translator: Miguel Canteras , 2021\n" "Language-Team: Spanish (https://www.transifex.com/django-recipes/" @@ -25,15 +25,80 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: .\cookbook\filters.py:23 .\cookbook\templates\base.html:98 -#: .\cookbook\templates\forms\edit_internal_recipe.html:269 -#: .\cookbook\templates\forms\ingredients.html:34 -#: .\cookbook\templates\space.html:43 .\cookbook\templates\stats.html:28 -#: .\cookbook\templates\url_import.html:270 .\cookbook\views\lists.py:67 +#: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 +#: .\cookbook\templates\space.html:50 .\cookbook\templates\stats.html:28 +#: .\cookbook\templates\url_import.html:277 msgid "Ingredients" msgstr "Ingredientes" -#: .\cookbook\forms.py:49 +#: .\cookbook\forms.py:56 +#, fuzzy +#| msgid "Default" +msgid "Default unit" +msgstr "Por defecto" + +#: .\cookbook\forms.py:57 +#, fuzzy +#| msgid "System Information" +msgid "Use fractions" +msgstr "Información del Sistema" + +#: .\cookbook\forms.py:58 +msgid "Use KJ" +msgstr "" + +#: .\cookbook\forms.py:59 +msgid "Theme" +msgstr "" + +#: .\cookbook\forms.py:60 +msgid "Navbar color" +msgstr "" + +#: .\cookbook\forms.py:61 +msgid "Sticky navbar" +msgstr "" + +#: .\cookbook\forms.py:62 +#, fuzzy +#| msgid "Default" +msgid "Default page" +msgstr "Por defecto" + +#: .\cookbook\forms.py:63 +#, fuzzy +#| msgid "Shopping Recipes" +msgid "Show recent recipes" +msgstr "Recetas en el carro de la compra" + +#: .\cookbook\forms.py:64 +#, fuzzy +#| msgid "Search" +msgid "Search style" +msgstr "Buscar" + +#: .\cookbook\forms.py:65 +msgid "Plan sharing" +msgstr "" + +#: .\cookbook\forms.py:66 +#, fuzzy +#| msgid "Ingredients" +msgid "Ingredient decimal places" +msgstr "Ingredientes" + +#: .\cookbook\forms.py:67 +#, fuzzy +#| msgid "Shopping list currently empty" +msgid "Shopping list auto sync period" +msgstr "Lista de la compra vacía" + +#: .\cookbook\forms.py:68 .\cookbook\templates\recipe_view.html:21 +#: .\cookbook\templates\space.html:77 .\cookbook\templates\stats.html:47 +msgid "Comments" +msgstr "Comentarios" + +#: .\cookbook\forms.py:72 msgid "" "Color of the top navigation bar. Not all colors work with all themes, just " "try them out!" @@ -41,13 +106,13 @@ msgstr "" "Color de la barra de navegación superior. No todos los colores funcionan con " "todos los temas, ¡pruébalos!" -#: .\cookbook\forms.py:51 +#: .\cookbook\forms.py:74 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:53 +#: .\cookbook\forms.py:76 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" @@ -55,27 +120,39 @@ msgstr "" "Permite utilizar fracciones en cantidades de ingredientes (e.g. convierte " "los decimales en fracciones automáticamente)" -#: .\cookbook\forms.py:56 -msgid "" -"Users with whom newly created meal plan/shopping list entries should be " -"shared by default." +#: .\cookbook\forms.py:78 +msgid "Display nutritional energy amounts in joules instead of calories" +msgstr "" + +#: .\cookbook\forms.py:79 +#, fuzzy +#| msgid "" +#| "Users with whom newly created meal plan/shopping list entries should be " +#| "shared by default." +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/lista de " "la compra deben compartirse de forma predeterminada." -#: .\cookbook\forms.py:58 +#: .\cookbook\forms.py:80 +#, fuzzy +#| msgid "Open Shopping List" +msgid "Users with whom to share shopping lists." +msgstr "Abrir Lista de la Compra" + +#: .\cookbook\forms.py:82 msgid "Show recently viewed recipes on search page." msgstr "Muestra recetas vistas recientemente en la página de búsqueda." -#: .\cookbook\forms.py:59 +#: .\cookbook\forms.py:83 msgid "Number of decimals to round ingredients." msgstr "Número de decimales para redondear los ingredientes." -#: .\cookbook\forms.py:60 +#: .\cookbook\forms.py:84 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:62 +#: .\cookbook\forms.py:86 .\cookbook\forms.py:493 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. " @@ -89,11 +166,19 @@ msgstr "" "valor establecido es inferior al límite de la instancia, este se " "restablecerá al guardar." -#: .\cookbook\forms.py:65 +#: .\cookbook\forms.py:89 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:81 +#: .\cookbook\forms.py:90 .\cookbook\forms.py:496 +msgid "Automatically add meal plan ingredients to shopping list." +msgstr "" + +#: .\cookbook\forms.py:91 +msgid "Exclude ingredients that are on hand." +msgstr "" + +#: .\cookbook\forms.py:108 msgid "" "Both fields are optional. If none are given the username will be displayed " "instead" @@ -105,95 +190,60 @@ msgstr "" " \n" " " -#: .\cookbook\forms.py:102 .\cookbook\forms.py:331 -#: .\cookbook\templates\forms\edit_internal_recipe.html:49 -#: .\cookbook\templates\url_import.html:154 +#: .\cookbook\forms.py:129 .\cookbook\forms.py:298 +#: .\cookbook\templates\url_import.html:161 msgid "Name" msgstr "Nombre" -#: .\cookbook\forms.py:103 .\cookbook\forms.py:332 -#: .\cookbook\templates\base.html:108 .\cookbook\templates\base.html:169 -#: .\cookbook\templates\forms\edit_internal_recipe.html:85 -#: .\cookbook\templates\space.html:39 .\cookbook\templates\stats.html:24 -#: .\cookbook\templates\url_import.html:188 -#: .\cookbook\templates\url_import.html:573 +#: .\cookbook\forms.py:130 .\cookbook\forms.py:299 +#: .\cookbook\templates\space.html:44 .\cookbook\templates\stats.html:24 +#: .\cookbook\templates\url_import.html:195 +#: .\cookbook\templates\url_import.html:585 .\cookbook\views\lists.py:97 msgid "Keywords" msgstr "Palabras clave" -#: .\cookbook\forms.py:104 +#: .\cookbook\forms.py:131 msgid "Preparation time in minutes" msgstr "Tiempo de preparación en minutos" -#: .\cookbook\forms.py:105 +#: .\cookbook\forms.py:132 msgid "Waiting time (cooking/baking) in minutes" msgstr "Tiempo de espera (cocinar/hornear) en minutos" -#: .\cookbook\forms.py:106 .\cookbook\forms.py:333 +#: .\cookbook\forms.py:133 .\cookbook\forms.py:267 .\cookbook\forms.py:300 msgid "Path" msgstr "Ruta" -#: .\cookbook\forms.py:107 +#: .\cookbook\forms.py:134 msgid "Storage UID" msgstr "UID de almacenamiento" -#: .\cookbook\forms.py:133 +#: .\cookbook\forms.py:164 msgid "Default" msgstr "Por defecto" -#: .\cookbook\forms.py:144 .\cookbook\templates\url_import.html:90 +#: .\cookbook\forms.py:175 .\cookbook\templates\url_import.html:97 msgid "" "To prevent duplicates recipes with the same name as existing ones are " "ignored. Check this box to import everything." msgstr "" -#: .\cookbook\forms.py:164 -msgid "New Unit" -msgstr "Nueva Unidad" - -#: .\cookbook\forms.py:165 -msgid "New unit that other gets replaced by." -msgstr "Nueva unidad que reemplaza a la anterior." - -#: .\cookbook\forms.py:170 -msgid "Old Unit" -msgstr "Antigua unidad" - -#: .\cookbook\forms.py:171 -msgid "Unit that should be replaced." -msgstr "Unidad que se va a reemplazar." - -#: .\cookbook\forms.py:187 -msgid "New Food" -msgstr "Nuevo Alimento" - -#: .\cookbook\forms.py:188 -msgid "New food that other gets replaced by." -msgstr "Nuevo alimento que remplaza al anterior." - -#: .\cookbook\forms.py:193 -msgid "Old Food" -msgstr "Antiguo alimento" - -#: .\cookbook\forms.py:194 -msgid "Food that should be replaced." -msgstr "Alimento que se va a reemplazar." - -#: .\cookbook\forms.py:212 +#: .\cookbook\forms.py:197 msgid "Add your comment: " msgstr "Añada su comentario:" -#: .\cookbook\forms.py:253 +#: .\cookbook\forms.py:212 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:260 +#: .\cookbook\forms.py:219 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:269 +#: .\cookbook\forms.py:228 msgid "" "Leave empty for dropbox and enter only base url for nextcloud (/remote." "php/webdav/ is added automatically)" @@ -201,26 +251,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:307 +#: .\cookbook\forms.py:266 .\cookbook\views\edit.py:166 +msgid "Storage" +msgstr "Almacenamiento" + +#: .\cookbook\forms.py:268 +msgid "Active" +msgstr "" + +#: .\cookbook\forms.py:274 msgid "Search String" msgstr "Cadena de búsqueda" -#: .\cookbook\forms.py:334 +#: .\cookbook\forms.py:301 msgid "File ID" msgstr "ID de Fichero" -#: .\cookbook\forms.py:370 +#: .\cookbook\forms.py:323 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:383 +#: .\cookbook\forms.py:336 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:384 -#: .\cookbook\templates\forms\edit_internal_recipe.html:427 +#: .\cookbook\forms.py:337 msgid "" "You can use markdown to format this field. See the docs here" @@ -228,76 +285,269 @@ msgstr "" "Puede utilizar Markdown para formatear este campo. Vea la documentación aqui" -#: .\cookbook\forms.py:409 +#: .\cookbook\forms.py:363 msgid "Maximum number of users for this space reached." msgstr "" -#: .\cookbook\forms.py:415 +#: .\cookbook\forms.py:369 msgid "Email address already taken!" msgstr "" -#: .\cookbook\forms.py:423 +#: .\cookbook\forms.py:377 msgid "" -"An email address is not required but if present the invite link will be send " +"An email address is not required but if present the invite link will be sent " "to the user." msgstr "" -#: .\cookbook\forms.py:438 +#: .\cookbook\forms.py:392 msgid "Name already taken." msgstr "" -#: .\cookbook\forms.py:449 +#: .\cookbook\forms.py:403 msgid "Accept Terms and Privacy" msgstr "" +#: .\cookbook\forms.py:435 +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:445 +msgid "" +"Select type method of search. Click here for " +"full desciption of choices." +msgstr "" + +#: .\cookbook\forms.py:446 +msgid "" +"Use fuzzy matching on units, keywords and ingredients when editing and " +"importing recipes." +msgstr "" + +#: .\cookbook\forms.py:448 +msgid "" +"Fields to search ignoring accents. Selecting this option can improve or " +"degrade search quality depending on language" +msgstr "" + +#: .\cookbook\forms.py:450 +msgid "" +"Fields to search for partial matches. (e.g. searching for 'Pie' will return " +"'pie' and 'piece' and 'soapie')" +msgstr "" + +#: .\cookbook\forms.py:452 +msgid "" +"Fields to search for beginning of word matches. (e.g. searching for 'sa' " +"will return 'salad' and 'sandwich')" +msgstr "" + +#: .\cookbook\forms.py:454 +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:456 +msgid "" +"Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " +"only function with fulltext fields." +msgstr "" + +#: .\cookbook\forms.py:460 +#, fuzzy +#| msgid "Search" +msgid "Search Method" +msgstr "Buscar" + +#: .\cookbook\forms.py:461 +msgid "Fuzzy Lookups" +msgstr "" + +#: .\cookbook\forms.py:462 +msgid "Ignore Accent" +msgstr "" + +#: .\cookbook\forms.py:463 +msgid "Partial Match" +msgstr "" + +#: .\cookbook\forms.py:464 +msgid "Starts Wtih" +msgstr "" + +#: .\cookbook\forms.py:465 +#, fuzzy +#| msgid "Search" +msgid "Fuzzy Search" +msgstr "Buscar" + +#: .\cookbook\forms.py:466 +#, fuzzy +#| msgid "Text" +msgid "Full Text" +msgstr "Texto" + +#: .\cookbook\forms.py:491 +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:497 +msgid "" +"When adding a meal plan to the shopping list (manually or automatically), " +"include all related recipes." +msgstr "" + +#: .\cookbook\forms.py:498 +msgid "" +"When adding a meal plan to the shopping list (manually or automatically), " +"exclude ingredients that are on hand." +msgstr "" + +#: .\cookbook\forms.py:499 +msgid "Default number of hours to delay a shopping list entry." +msgstr "" + +#: .\cookbook\forms.py:500 +msgid "Filter shopping list to only include supermarket categories." +msgstr "" + +#: .\cookbook\forms.py:501 +msgid "Days of recent shopping list entries to display." +msgstr "" + +#: .\cookbook\forms.py:502 +msgid "Mark food 'On Hand' when checked off shopping list." +msgstr "" + +#: .\cookbook\forms.py:503 +msgid "Delimiter to use for CSV exports." +msgstr "" + +#: .\cookbook\forms.py:504 +msgid "Prefix to add when copying list to the clipboard." +msgstr "" + +#: .\cookbook\forms.py:508 +#, fuzzy +#| msgid "Shopping List" +msgid "Share Shopping List" +msgstr "Lista de la Compra" + +#: .\cookbook\forms.py:509 +msgid "Autosync" +msgstr "" + +#: .\cookbook\forms.py:510 +msgid "Auto Add Meal Plan" +msgstr "" + +#: .\cookbook\forms.py:511 +msgid "Exclude On Hand" +msgstr "" + +#: .\cookbook\forms.py:512 +msgid "Include Related" +msgstr "" + +#: .\cookbook\forms.py:513 +msgid "Default Delay Hours" +msgstr "" + +#: .\cookbook\forms.py:514 +#, fuzzy +#| msgid "Select Supermarket" +msgid "Filter to Supermarket" +msgstr "Seleccionar supermercado" + +#: .\cookbook\forms.py:515 +msgid "Recent Days" +msgstr "" + +#: .\cookbook\forms.py:516 +msgid "CSV Delimiter" +msgstr "" + +#: .\cookbook\forms.py:517 .\cookbook\templates\shopping_list.html:322 +msgid "List Prefix" +msgstr "Prefijo de la lista" + +#: .\cookbook\forms.py:518 +msgid "Auto On Hand" +msgstr "" + +#: .\cookbook\forms.py:528 +msgid "Reset Food Inheritance" +msgstr "" + +#: .\cookbook\forms.py:529 +msgid "Reset all food to inherit the fields configured." +msgstr "" + +#: .\cookbook\forms.py:541 +#, fuzzy +#| msgid "Food that should be replaced." +msgid "Fields on food that should be inherited by default." +msgstr "Alimento que se va a reemplazar." + +#: .\cookbook\forms.py:542 +#, fuzzy +#| msgid "Show recently viewed recipes on search page." +msgid "Show recipe counts on search filters" +msgstr "Muestra recetas vistas recientemente en la página de búsqueda." + #: .\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 "" -#: .\cookbook\helper\permission_helper.py:138 -#: .\cookbook\helper\permission_helper.py:161 .\cookbook\views\views.py:151 +#: .\cookbook\helper\permission_helper.py:136 +#: .\cookbook\helper\permission_helper.py:159 .\cookbook\views\views.py:148 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:142 -#: .\cookbook\helper\permission_helper.py:148 -#: .\cookbook\helper\permission_helper.py:173 -#: .\cookbook\helper\permission_helper.py:218 -#: .\cookbook\helper\permission_helper.py:232 -#: .\cookbook\helper\permission_helper.py:243 -#: .\cookbook\helper\permission_helper.py:254 .\cookbook\views\data.py:40 -#: .\cookbook\views\views.py:162 .\cookbook\views\views.py:169 -#: .\cookbook\views\views.py:259 +#: .\cookbook\helper\permission_helper.py:140 +#: .\cookbook\helper\permission_helper.py:146 +#: .\cookbook\helper\permission_helper.py:171 +#: .\cookbook\helper\permission_helper.py:219 +#: .\cookbook\helper\permission_helper.py:233 +#: .\cookbook\helper\permission_helper.py:244 +#: .\cookbook\helper\permission_helper.py:255 .\cookbook\views\data.py:47 +#: .\cookbook\views\views.py:159 .\cookbook\views\views.py:166 +#: .\cookbook\views\views.py:232 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:166 -#: .\cookbook\helper\permission_helper.py:189 -#: .\cookbook\helper\permission_helper.py:204 +#: .\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 "¡No puede interactuar con este objeto ya que no es de tu propiedad!" -#: .\cookbook\helper\template_helper.py:60 -#: .\cookbook\helper\template_helper.py:62 +#: .\cookbook\helper\recipe_search.py:473 +msgid "One of queryset or hash_key must be provided" +msgstr "" + +#: .\cookbook\helper\shopping_helper.py:54 +#, fuzzy +#| msgid "You must provide at least a recipe or a title." +msgid "You must supply a recipe or mealplan" +msgstr "Debe proporcionar al menos una receta o un título." + +#: .\cookbook\helper\shopping_helper.py:58 +msgid "You must supply a created_by" +msgstr "" + +#: .\cookbook\helper\template_helper.py:61 +#: .\cookbook\helper\template_helper.py:63 msgid "Could not parse template code." msgstr "" -#: .\cookbook\integration\integration.py:104 -#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 -#: .\cookbook\templates\import_response.html:7 -#: .\cookbook\templates\test.html:14 .\cookbook\templates\test.html:20 -#: .\cookbook\templates\url_import.html:27 -#: .\cookbook\templates\url_import.html:101 -#: .\cookbook\templates\url_import.html:123 -#: .\cookbook\templates\url_import.html:317 -#: .\cookbook\templates\url_import.html:604 .\cookbook\views\delete.py:60 -#: .\cookbook\views\edit.py:199 -msgid "Import" -msgstr "Importar" - -#: .\cookbook\integration\integration.py:185 +#: .\cookbook\integration\integration.py:200 msgid "" "Importer expected a .zip file. Did you choose the correct importer type for " "your data ?" @@ -305,17 +555,17 @@ msgstr "" "El importador esperaba un fichero.zip. ¿Has escogido el tipo de importador " "correcto para tus datos?" -#: .\cookbook\integration\integration.py:188 +#: .\cookbook\integration\integration.py:203 msgid "" "An unexpected error occurred during the import. Please make sure you have " "uploaded a valid file." msgstr "" -#: .\cookbook\integration\integration.py:192 +#: .\cookbook\integration\integration.py:208 msgid "The following recipes were ignored because they already existed:" msgstr "" -#: .\cookbook\integration\integration.py:196 +#: .\cookbook\integration\integration.py:212 #, fuzzy, python-format #| msgid "Imported new recipe!" msgid "Imported %s recipes." @@ -333,37 +583,51 @@ msgstr "Nota" msgid "Nutritional Information" msgstr "Información" -#: .\cookbook\integration\paprika.py:53 +#: .\cookbook\integration\paprika.py:53 .\cookbook\templates\url_import.html:42 msgid "Source" msgstr "" -#: .\cookbook\integration\safron.py:23 -#: .\cookbook\templates\forms\edit_internal_recipe.html:79 -#: .\cookbook\templates\include\log_cooking.html:16 -#: .\cookbook\templates\url_import.html:224 -#: .\cookbook\templates\url_import.html:455 +#: .\cookbook\integration\saffron.py:23 +#: .\cookbook\templates\include\log_cooking.html:18 +#: .\cookbook\templates\url_import.html:231 +#: .\cookbook\templates\url_import.html:462 msgid "Servings" msgstr "Raciones" -#: .\cookbook\integration\safron.py:25 +#: .\cookbook\integration\saffron.py:25 msgid "Waiting time" msgstr "Tiempo de espera" -#: .\cookbook\integration\safron.py:27 -#: .\cookbook\templates\forms\edit_internal_recipe.html:73 +#: .\cookbook\integration\saffron.py:27 msgid "Preparation Time" msgstr "Tiempo de Preparación" -#: .\cookbook\integration\safron.py:29 .\cookbook\templates\base.html:78 +#: .\cookbook\integration\saffron.py:29 .\cookbook\templates\base.html:78 #: .\cookbook\templates\forms\ingredients.html:7 #: .\cookbook\templates\index.html:7 msgid "Cookbook" msgstr "Libro de cocina" -#: .\cookbook\integration\safron.py:31 +#: .\cookbook\integration\saffron.py:31 msgid "Section" msgstr "Sección" +#: .\cookbook\management\commands\rebuildindex.py:14 +msgid "Rebuilds full text search index on Recipe" +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:18 +msgid "Only Postgress databases use full text search, no index to rebuild" +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:29 +msgid "Recipe index rebuild complete." +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:31 +msgid "Recipe index rebuild failed." +msgstr "" + #: .\cookbook\migrations\0047_auto_20200602_1133.py:14 msgid "Breakfast" msgstr "Desayuno" @@ -380,92 +644,151 @@ msgstr "Cena" msgid "Other" msgstr "Otro" -#: .\cookbook\models.py:72 +#: .\cookbook\models.py:246 msgid "" "Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " "upload." msgstr "" -#: .\cookbook\models.py:123 .\cookbook\templates\search.html:7 -#: .\cookbook\templates\shopping_list.html:52 +#: .\cookbook\models.py:300 .\cookbook\templates\search.html:7 +#: .\cookbook\templates\shopping_list.html:53 msgid "Search" msgstr "Buscar" -#: .\cookbook\models.py:124 .\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 +#: .\cookbook\models.py:301 .\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 "Régimen de comidas" -#: .\cookbook\models.py:125 .\cookbook\templates\base.html:89 +#: .\cookbook\models.py:302 .\cookbook\templates\base.html:90 msgid "Books" msgstr "Libros" -#: .\cookbook\models.py:133 +#: .\cookbook\models.py:310 msgid "Small" msgstr "Pequeño" -#: .\cookbook\models.py:133 +#: .\cookbook\models.py:310 msgid "Large" msgstr "Grande" -#: .\cookbook\models.py:133 .\cookbook\templates\generic\new_template.html:6 +#: .\cookbook\models.py:310 .\cookbook\templates\generic\new_template.html:6 #: .\cookbook\templates\generic\new_template.html:14 -#: .\cookbook\templates\meal_plan.html:323 msgid "New" msgstr "Nuevo" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:202 +#: .\cookbook\models.py:512 +msgid " is part of a recipe step and cannot be deleted" +msgstr "" + +#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:44 msgid "Text" msgstr "Texto" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:203 +#: .\cookbook\models.py:586 msgid "Time" msgstr "Tiempo" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:204 -#: .\cookbook\templates\forms\edit_internal_recipe.html:219 +#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:46 #, fuzzy #| msgid "File ID" msgid "File" msgstr "ID de Fichero" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:205 -#: .\cookbook\templates\forms\edit_internal_recipe.html:241 +#: .\cookbook\models.py:586 #: .\cookbook\templates\include\recipe_open_modal.html:7 -#: .\cookbook\templates\meal_plan.html:247 .\cookbook\views\delete.py:28 -#: .\cookbook\views\edit.py:273 .\cookbook\views\new.py:52 +#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260 +#: .\cookbook\views\new.py:53 msgid "Recipe" msgstr "Receta" -#: .\cookbook\serializer.py:109 +#: .\cookbook\models.py:1041 .\cookbook\templates\search_info.html:28 +msgid "Simple" +msgstr "" + +#: .\cookbook\models.py:1042 .\cookbook\templates\search_info.html:33 +msgid "Phrase" +msgstr "" + +#: .\cookbook\models.py:1043 .\cookbook\templates\search_info.html:38 +msgid "Web" +msgstr "" + +#: .\cookbook\models.py:1044 .\cookbook\templates\search_info.html:47 +msgid "Raw" +msgstr "" + +#: .\cookbook\models.py:1082 +#, fuzzy +#| msgid "Food" +msgid "Food Alias" +msgstr "Comida" + +#: .\cookbook\models.py:1082 +#, fuzzy +#| msgid "Units" +msgid "Unit Alias" +msgstr "Unidades" + +#: .\cookbook\models.py:1082 +#, fuzzy +#| msgid "Keywords" +msgid "Keyword Alias" +msgstr "Palabras clave" + +#: .\cookbook\serializer.py:175 +msgid "A user is required" +msgstr "" + +#: .\cookbook\serializer.py:195 msgid "File uploads are not enabled for this Space." msgstr "" -#: .\cookbook\serializer.py:117 +#: .\cookbook\serializer.py:206 msgid "You have reached your file upload limit." msgstr "" -#: .\cookbook\tables.py:35 .\cookbook\templates\books.html:36 -#: .\cookbook\templates\generic\edit_template.html:6 +#: .\cookbook\serializer.py:962 +msgid "Existing shopping list to update" +msgstr "" + +#: .\cookbook\serializer.py:964 +msgid "" +"List of ingredient IDs from the recipe to add, if not provided all " +"ingredients will be added." +msgstr "" + +#: .\cookbook\serializer.py:965 +msgid "" +"Providing a list_recipe ID and servings of 0 will delete that shopping list." +msgstr "" + +#: .\cookbook\serializer.py:973 +msgid "Amount of food to add to the shopping list" +msgstr "" + +#: .\cookbook\serializer.py:974 +msgid "ID of unit to use for the shopping list" +msgstr "" + +#: .\cookbook\serializer.py:975 +msgid "When set to true will delete all food from active shopping lists." +msgstr "" + +#: .\cookbook\tables.py:35 .\cookbook\templates\generic\edit_template.html:6 #: .\cookbook\templates\generic\edit_template.html:14 -#: .\cookbook\templates\meal_plan.html:281 #: .\cookbook\templates\recipes_table.html:82 -#: .\cookbook\templates\shopping_list.html:33 -#: .\cookbook\templates\space.html:90 +#: .\cookbook\templates\shopping_list.html:37 +#: .\cookbook\templates\space.html:109 msgid "Edit" msgstr "Editar" -#: .\cookbook\tables.py:124 .\cookbook\tables.py:147 -#: .\cookbook\templates\books.html:38 -#: .\cookbook\templates\generic\delete_template.html:5 -#: .\cookbook\templates\generic\delete_template.html:13 -#: .\cookbook\templates\generic\edit_template.html:27 -#: .\cookbook\templates\meal_plan.html:277 +#: .\cookbook\tables.py:115 .\cookbook\tables.py:138 +#: .\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" @@ -494,7 +817,7 @@ 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:154 .\cookbook\templates\settings.html:6 +#: .\cookbook\templates\base.html:257 .\cookbook\templates\settings.html:6 #: .\cookbook\templates\settings.html:17 #: .\cookbook\templates\socialaccount\connections.html:10 msgid "Settings" @@ -531,6 +854,7 @@ msgid "Re-send Verification" msgstr "" #: .\cookbook\templates\account\email.html:50 +#: .\cookbook\templates\generic\delete_template.html:56 #: .\cookbook\templates\socialaccount\connections.html:44 msgid "Remove" msgstr "Eliminar" @@ -574,7 +898,7 @@ msgid "" msgstr "" #: .\cookbook\templates\account\email_confirm.html:22 -#: .\cookbook\templates\generic\delete_template.html:21 +#: .\cookbook\templates\generic\delete_template.html:71 msgid "Confirm" msgstr "Confirmar" @@ -586,7 +910,7 @@ msgid "" "request." msgstr "" -#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:189 +#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:289 msgid "Login" msgstr "Iniciar sesión" @@ -597,7 +921,7 @@ msgstr "Iniciar sesión" msgid "Sign In" msgstr "Iniciar sesión" -#: .\cookbook\templates\account\login.html:32 +#: .\cookbook\templates\account\login.html:34 #: .\cookbook\templates\socialaccount\signup.html:8 #: .\cookbook\templates\socialaccount\signup.html:57 #, fuzzy @@ -605,21 +929,21 @@ msgstr "Iniciar sesión" msgid "Sign Up" msgstr "Iniciar sesión" -#: .\cookbook\templates\account\login.html:36 -#: .\cookbook\templates\account\login.html:37 +#: .\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:37 +#: .\cookbook\templates\account\login.html:40 msgid "Lost your password?" msgstr "" -#: .\cookbook\templates\account\login.html:48 +#: .\cookbook\templates\account\login.html:52 msgid "Social Login" msgstr "Inicio de sesión social" -#: .\cookbook\templates\account\login.html:49 +#: .\cookbook\templates\account\login.html:53 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." @@ -637,6 +961,10 @@ msgstr "¿Seguro que quieres salir?" #: .\cookbook\templates\account\password_change.html:6 #: .\cookbook\templates\account\password_change.html:16 #: .\cookbook\templates\account\password_change.html:21 +#: .\cookbook\templates\account\password_reset_from_key.html:7 +#: .\cookbook\templates\account\password_reset_from_key.html:13 +#: .\cookbook\templates\account\password_reset_from_key_done.html:7 +#: .\cookbook\templates\account\password_reset_from_key_done.html:13 #, fuzzy #| msgid "Changes saved!" msgid "Change Password" @@ -644,7 +972,7 @@ msgstr "¡Cambios guardados!" #: .\cookbook\templates\account\password_change.html:12 #: .\cookbook\templates\account\password_set.html:12 -#: .\cookbook\templates\settings.html:52 +#: .\cookbook\templates\settings.html:76 #, fuzzy #| msgid "Password Reset" msgid "Password" @@ -679,6 +1007,32 @@ msgid "" "within a few minutes." msgstr "" +#: .\cookbook\templates\account\password_reset_from_key.html:13 +#, fuzzy +#| msgid "API Token" +msgid "Bad Token" +msgstr "Token API" + +#: .\cookbook\templates\account\password_reset_from_key.html:25 +#, python-format +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used.\n" +" Please request a new " +"password reset." +msgstr "" + +#: .\cookbook\templates\account\password_reset_from_key.html:33 +#, fuzzy +#| msgid "Changes saved!" +msgid "change password" +msgstr "¡Cambios guardados!" + +#: .\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 "" + #: .\cookbook\templates\account\password_set.html:6 #: .\cookbook\templates\account\password_set.html:16 #: .\cookbook\templates\account\password_set.html:21 @@ -734,100 +1088,120 @@ msgstr "" msgid "We are sorry, but the sign up is currently closed." msgstr "" -#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:179 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:279 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "Documentación de API" -#: .\cookbook\templates\base.html:85 -msgid "Utensils" -msgstr "Utensilios" - -#: .\cookbook\templates\base.html:95 +#: .\cookbook\templates\base.html:86 msgid "Shopping" msgstr "Compras" -#: .\cookbook\templates\base.html:101 -#: .\cookbook\templates\shopping_list.html:230 +#: .\cookbook\templates\base.html:113 +msgid "Keyword" +msgstr "Palabra clave" + +#: .\cookbook\templates\base.html:125 .\cookbook\views\lists.py:114 +#, fuzzy +#| msgid "Food" +msgid "Foods" +msgstr "Comida" + +#: .\cookbook\templates\base.html:137 +#: .\cookbook\templates\forms\ingredients.html:24 +#: .\cookbook\templates\space.html:47 .\cookbook\templates\stats.html:26 +#: .\cookbook\views\lists.py:131 +msgid "Units" +msgstr "Unidades" + +#: .\cookbook\templates\base.html:151 +#: .\cookbook\templates\shopping_list.html:208 #: .\cookbook\templates\supermarket.html:7 msgid "Supermarket" msgstr "Supermercado" -#: .\cookbook\templates\base.html:112 .\cookbook\views\delete.py:84 -#: .\cookbook\views\edit.py:102 .\cookbook\views\lists.py:26 -#: .\cookbook\views\new.py:78 -msgid "Keyword" -msgstr "Palabra clave" +#: .\cookbook\templates\base.html:163 +#, fuzzy +#| msgid "Supermarket" +msgid "Supermarket Category" +msgstr "Supermercado" -#: .\cookbook\templates\base.html:114 +#: .\cookbook\templates\base.html:175 .\cookbook\views\lists.py:180 +#, fuzzy +#| msgid "Information" +msgid "Automations" +msgstr "Información" + +#: .\cookbook\templates\base.html:189 .\cookbook\views\lists.py:200 +#, fuzzy +#| msgid "File ID" +msgid "Files" +msgstr "ID de Fichero" + +#: .\cookbook\templates\base.html:201 msgid "Batch Edit" msgstr "Edición Masiva" -#: .\cookbook\templates\base.html:119 -msgid "Storage Data" -msgstr "Almacenamiento de Datos" - -#: .\cookbook\templates\base.html:123 -msgid "Storage Backends" -msgstr "Backends de Almacenamiento" - -#: .\cookbook\templates\base.html:125 -msgid "Configure Sync" -msgstr "Configurar Sincronización" - -#: .\cookbook\templates\base.html:127 -msgid "Discovered Recipes" -msgstr "Recetas Descubiertas" - -#: .\cookbook\templates\base.html:129 -msgid "Discovery Log" -msgstr "Registro de descubrimiento" - -#: .\cookbook\templates\base.html:131 .\cookbook\templates\stats.html:10 -msgid "Statistics" -msgstr "Estadísticas" - -#: .\cookbook\templates\base.html:133 -msgid "Units & Ingredients" -msgstr "Unidades e ingredientes" - -#: .\cookbook\templates\base.html:135 .\cookbook\templates\index.html:47 -msgid "Import Recipe" -msgstr "Importar receta" - -#: .\cookbook\templates\base.html:156 .\cookbook\templates\history.html:6 +#: .\cookbook\templates\base.html:213 .\cookbook\templates\history.html:6 #: .\cookbook\templates\history.html:14 msgid "History" msgstr "Historial" -#: .\cookbook\templates\base.html:159 .\cookbook\templates\space.html:7 -#: .\cookbook\templates\space.html:19 +#: .\cookbook\templates\base.html:228 .\cookbook\templates\export.html:14 +#: .\cookbook\templates\export.html:20 +#: .\cookbook\templates\shopping_list.html:310 +#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 +msgid "Export" +msgstr "Exportar" + +#: .\cookbook\templates\base.html:244 .\cookbook\templates\index.html:47 +msgid "Import Recipe" +msgstr "Importar receta" + +#: .\cookbook\templates\base.html:246 +#: .\cookbook\templates\shopping_list.html:165 +#: .\cookbook\templates\shopping_list.html:188 +msgid "Create" +msgstr "Crear" + +#: .\cookbook\templates\base.html:259 +#: .\cookbook\templates\generic\list_template.html:14 +#: .\cookbook\templates\space.html:69 .\cookbook\templates\stats.html:43 +msgid "External Recipes" +msgstr "Recetas Externas" + +#: .\cookbook\templates\base.html:262 .\cookbook\templates\space.html:8 +#: .\cookbook\templates\space.html:20 .\cookbook\templates\space.html:150 #, fuzzy #| msgid "Settings" msgid "Space Settings" msgstr "Opciones" -#: .\cookbook\templates\base.html:163 .\cookbook\templates\system.html:13 +#: .\cookbook\templates\base.html:267 .\cookbook\templates\system.html:13 msgid "System" msgstr "Sistema" -#: .\cookbook\templates\base.html:165 .\cookbook\templates\base.html:171 +#: .\cookbook\templates\base.html:269 msgid "Admin" msgstr "Administrador" -#: .\cookbook\templates\base.html:175 +#: .\cookbook\templates\base.html:273 msgid "Markdown Guide" msgstr "Guia Markdown" -#: .\cookbook\templates\base.html:177 +#: .\cookbook\templates\base.html:275 msgid "GitHub" msgstr "GitHub" -#: .\cookbook\templates\base.html:181 +#: .\cookbook\templates\base.html:277 +msgid "Translate Tandoor" +msgstr "" + +#: .\cookbook\templates\base.html:281 msgid "API Browser" msgstr "Explorador de API" -#: .\cookbook\templates\base.html:184 +#: .\cookbook\templates\base.html:284 msgid "Log out" msgstr "" @@ -845,7 +1219,7 @@ msgstr "" "Agregue las palabras clave especificadas a todas las recetas que contengan " "una palabra" -#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:85 +#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:82 msgid "Sync" msgstr "Sincronizar" @@ -865,10 +1239,40 @@ msgstr "" msgid "The path must be in the following format" msgstr "La ruta debe tener el siguiente formato" -#: .\cookbook\templates\batch\monitor.html:27 +#: .\cookbook\templates\batch\monitor.html:20 +#: .\cookbook\templates\forms\edit_import_recipe.html:14 +#: .\cookbook\templates\generic\edit_template.html:23 +#: .\cookbook\templates\generic\new_template.html:23 +#: .\cookbook\templates\include\log_cooking.html:30 +#: .\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\shopping_list.html:311 +#: .\cookbook\templates\space.html:155 +msgid "Save" +msgstr "Guardar" + +#: .\cookbook\templates\batch\monitor.html:21 +msgid "Manage External Storage" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:28 msgid "Sync Now!" msgstr "¡Sincronizar ahora!" +#: .\cookbook\templates\batch\monitor.html:29 +#, fuzzy +#| msgid "Shopping Recipes" +msgid "Show Recipes" +msgstr "Recetas en el carro de la compra" + +#: .\cookbook\templates\batch\monitor.html:30 +#, fuzzy +#| msgid "Show Links" +msgid "Show Log" +msgstr "Mostrar Enlaces" + #: .\cookbook\templates\batch\waiting.html:4 #: .\cookbook\templates\batch\waiting.html:10 msgid "Importing Recipes" @@ -882,265 +1286,23 @@ msgstr "" "Esto puede tardar unos minutos, dependiendo de la cantidad de recetas " "sincronizadas, espere." -#: .\cookbook\templates\books.html:5 .\cookbook\templates\books.html:11 +#: .\cookbook\templates\books.html:7 msgid "Recipe Books" msgstr "Libros de recetas" -#: .\cookbook\templates\books.html:15 -msgid "New Book" -msgstr "Nuevo Libro" - -#: .\cookbook\templates\books.html:27 .\cookbook\templates\recipe_view.html:26 -msgid "by" -msgstr "por" - -#: .\cookbook\templates\books.html:34 -msgid "Toggle Recipes" -msgstr "Alternar recetas" - -#: .\cookbook\templates\books.html:54 -#: .\cookbook\templates\meal_plan_entry.html:48 -#: .\cookbook\templates\recipes_table.html:64 -msgid "Last cooked" -msgstr "Cocinado por última vez" - -#: .\cookbook\templates\books.html:71 -msgid "There are no recipes in this book yet." -msgstr "Todavía no hay recetas en este libro." - #: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6 msgid "Export Recipes" msgstr "Exportar recetas" -#: .\cookbook\templates\export.html:14 .\cookbook\templates\export.html:20 -#: .\cookbook\templates\shopping_list.html:351 -#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 -msgid "Export" -msgstr "Exportar" - -#: .\cookbook\templates\files.html:7 -#, fuzzy -#| msgid "File ID" -msgid "Files" -msgstr "ID de Fichero" - #: .\cookbook\templates\forms\edit_import_recipe.html:5 #: .\cookbook\templates\forms\edit_import_recipe.html:9 msgid "Import new Recipe" msgstr "Importar nueva receta" -#: .\cookbook\templates\forms\edit_import_recipe.html:14 -#: .\cookbook\templates\forms\edit_internal_recipe.html:439 -#: .\cookbook\templates\forms\edit_internal_recipe.html:471 -#: .\cookbook\templates\generic\edit_template.html:23 -#: .\cookbook\templates\generic\new_template.html:23 -#: .\cookbook\templates\include\log_cooking.html:28 -#: .\cookbook\templates\meal_plan.html:325 -#: .\cookbook\templates\settings.html:46 .\cookbook\templates\settings.html:87 -#: .\cookbook\templates\settings.html:105 -#: .\cookbook\templates\shopping_list.html:353 -msgid "Save" -msgstr "Guardar" - #: .\cookbook\templates\forms\edit_internal_recipe.html:7 -#: .\cookbook\templates\forms\edit_internal_recipe.html:34 msgid "Edit Recipe" msgstr "Editar receta" -#: .\cookbook\templates\forms\edit_internal_recipe.html:56 -#: .\cookbook\templates\url_import.html:171 -msgid "Description" -msgstr "Descripción" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:76 -msgid "Waiting Time" -msgstr "Tiempo de espera" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:82 -msgid "Servings Text" -msgstr "Texto de raciones" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:93 -msgid "Select Keywords" -msgstr "Seleccionar palabras clave" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:94 -#: .\cookbook\templates\url_import.html:583 -#, fuzzy -#| msgid "All Keywords" -msgid "Add Keyword" -msgstr "Todas las palabras clave." - -#: .\cookbook\templates\forms\edit_internal_recipe.html:112 -msgid "Nutrition" -msgstr "Información Nutricional" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:116 -#: .\cookbook\templates\forms\edit_internal_recipe.html:166 -msgid "Delete Step" -msgstr "Eliminar paso" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:120 -msgid "Calories" -msgstr "Calorías" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:123 -msgid "Carbohydrates" -msgstr "Carbohidratos" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:126 -msgid "Fats" -msgstr "Grasas" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:128 -msgid "Proteins" -msgstr "Proteinas" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:150 -#: .\cookbook\templates\forms\edit_internal_recipe.html:504 -msgid "Step" -msgstr "Paso" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:171 -msgid "Show as header" -msgstr "Mostrar como encabezado" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:177 -msgid "Hide as header" -msgstr "Ocultar como encabezado" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:182 -msgid "Move Up" -msgstr "Mover Arriba" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:187 -msgid "Move Down" -msgstr "Mover Abajo" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:196 -msgid "Step Name" -msgstr "Nombre del paso" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:200 -msgid "Step Type" -msgstr "Tipo de paso" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:213 -msgid "Step time in Minutes" -msgstr "Tiempo de paso en minutos" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:229 -#, fuzzy -#| msgid "Select one" -msgid "Select File" -msgstr "Seleccione uno" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:230 -#: .\cookbook\templates\forms\edit_internal_recipe.html:252 -#: .\cookbook\templates\forms\edit_internal_recipe.html:313 -#: .\cookbook\templates\forms\edit_internal_recipe.html:337 -#: .\cookbook\templates\shopping_list.html:189 -#: .\cookbook\templates\shopping_list.html:211 -#: .\cookbook\templates\shopping_list.html:241 -#: .\cookbook\templates\shopping_list.html:265 -#: .\cookbook\templates\url_import.html:495 -#: .\cookbook\templates\url_import.html:527 -msgid "Select" -msgstr "Seleccionar" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:251 -#, fuzzy -#| msgid "Delete Recipe" -msgid "Select Recipe" -msgstr "Eliminar receta" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:311 -#: .\cookbook\templates\shopping_list.html:187 -msgid "Select Unit" -msgstr "Seleccionar unidad" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:312 -#: .\cookbook\templates\forms\edit_internal_recipe.html:336 -#: .\cookbook\templates\shopping_list.html:188 -#: .\cookbook\templates\shopping_list.html:210 -msgid "Create" -msgstr "Crear" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:335 -#: .\cookbook\templates\shopping_list.html:209 -msgid "Select Food" -msgstr "Seleccionar Alimento" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:352 -#: .\cookbook\templates\meal_plan.html:256 -#: .\cookbook\templates\url_import.html:542 -msgid "Note" -msgstr "Nota" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:369 -msgid "Delete Ingredient" -msgstr "Eliminar ingrediente" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:375 -msgid "Make Header" -msgstr "Crear encabezado" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:381 -msgid "Make Ingredient" -msgstr "Crear ingrediente" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:387 -msgid "Disable Amount" -msgstr "Deshabilitar cantidad" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:393 -msgid "Enable Amount" -msgstr "Habilitar cantidad" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:398 -msgid "Copy Template Reference" -msgstr "Copiar Referencia de Plantilla" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:424 -#: .\cookbook\templates\url_import.html:297 -#: .\cookbook\templates\url_import.html:567 -msgid "Instructions" -msgstr "Instrucciones" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:437 -#: .\cookbook\templates\forms\edit_internal_recipe.html:468 -msgid "Save & View" -msgstr "Guardar y ver" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:441 -#: .\cookbook\templates\forms\edit_internal_recipe.html:474 -msgid "Add Step" -msgstr "Agregar paso" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:444 -#: .\cookbook\templates\forms\edit_internal_recipe.html:478 -msgid "Add Nutrition" -msgstr "Añadir Información Nutricional" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:446 -#: .\cookbook\templates\forms\edit_internal_recipe.html:480 -msgid "Remove Nutrition" -msgstr "Eliminar Información Nutricional" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:448 -#: .\cookbook\templates\forms\edit_internal_recipe.html:483 -msgid "View Recipe" -msgstr "Ver la receta" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:450 -#: .\cookbook\templates\forms\edit_internal_recipe.html:485 -msgid "Delete Recipe" -msgstr "Eliminar receta" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:491 -msgid "Steps" -msgstr "Pasos" - #: .\cookbook\templates\forms\ingredients.html:15 msgid "Edit Ingredients" msgstr "Editar ingredientes" @@ -1163,11 +1325,6 @@ msgstr "" "que los usan.\n" " " -#: .\cookbook\templates\forms\ingredients.html:24 -#: .\cookbook\templates\space.html:41 .\cookbook\templates\stats.html:26 -msgid "Units" -msgstr "Unidades" - #: .\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?" @@ -1181,29 +1338,48 @@ 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?" -#: .\cookbook\templates\generic\delete_template.html:18 +#: .\cookbook\templates\generic\delete_template.html:21 #, python-format msgid "Are you sure you want to delete the %(title)s: %(object)s " msgstr "¿Estás seguro de que quieres borrar el %(title)s: %(object)s?" -#: .\cookbook\templates\generic\edit_template.html:30 +#: .\cookbook\templates\generic\delete_template.html:26 +msgid "Protected" +msgstr "" + +#: .\cookbook\templates\generic\delete_template.html:41 +msgid "Cascade" +msgstr "" + +#: .\cookbook\templates\generic\delete_template.html:72 +msgid "Cancel" +msgstr "" + +#: .\cookbook\templates\generic\edit_template.html:32 msgid "View" msgstr "Ver" -#: .\cookbook\templates\generic\edit_template.html:34 +#: .\cookbook\templates\generic\edit_template.html:36 msgid "Delete original file" msgstr "Eliminar archivo original" #: .\cookbook\templates\generic\list_template.html:6 -#: .\cookbook\templates\generic\list_template.html:12 +#: .\cookbook\templates\generic\list_template.html:22 msgid "List" msgstr "Lista" -#: .\cookbook\templates\generic\list_template.html:25 +#: .\cookbook\templates\generic\list_template.html:33 +#: .\cookbook\templates\shopping_list.html:33 +#, fuzzy +#| msgid "Open Shopping List" +msgid "Try the new shopping list" +msgstr "Abrir Lista de la Compra" + +#: .\cookbook\templates\generic\list_template.html:45 msgid "Filter" msgstr "Filtro" -#: .\cookbook\templates\generic\list_template.html:30 +#: .\cookbook\templates\generic\list_template.html:50 msgid "Import all" msgstr "Importar todo" @@ -1229,23 +1405,32 @@ msgstr "Registro de cocina" msgid "Import Recipes" msgstr "Importar recetas" -#: .\cookbook\templates\include\log_cooking.html:7 +#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 +#: .\cookbook\templates\import_response.html:7 +#: .\cookbook\templates\test.html:14 .\cookbook\templates\test.html:20 +#: .\cookbook\templates\url_import.html:29 +#: .\cookbook\templates\url_import.html:108 +#: .\cookbook\templates\url_import.html:130 +#: .\cookbook\templates\url_import.html:324 +#: .\cookbook\templates\url_import.html:618 .\cookbook\views\delete.py:89 +#: .\cookbook\views\edit.py:200 +msgid "Import" +msgstr "Importar" + +#: .\cookbook\templates\include\log_cooking.html:9 msgid "Log Recipe Cooking" msgstr "Registrar receta cocinada" -#: .\cookbook\templates\include\log_cooking.html:13 +#: .\cookbook\templates\include\log_cooking.html:15 msgid "All fields are optional and can be left empty." msgstr "Todos los campos son opcionales y pueden dejarse vacíos." -#: .\cookbook\templates\include\log_cooking.html:19 +#: .\cookbook\templates\include\log_cooking.html:21 msgid "Rating" msgstr "Calificación" -#: .\cookbook\templates\include\log_cooking.html:27 +#: .\cookbook\templates\include\log_cooking.html:29 #: .\cookbook\templates\include\recipe_open_modal.html:18 -#: .\cookbook\templates\meal_plan.html:283 -#: .\cookbook\templates\meal_plan.html:327 -#: .\cookbook\templates\meal_plan.html:366 msgid "Close" msgstr "Cerrar" @@ -1299,8 +1484,8 @@ msgstr "Restablecer búsqueda" msgid "Last viewed" msgstr "Visto por última vez" -#: .\cookbook\templates\index.html:87 .\cookbook\templates\meal_plan.html:178 -#: .\cookbook\templates\space.html:35 .\cookbook\templates\stats.html:22 +#: .\cookbook\templates\index.html:87 .\cookbook\templates\space.html:37 +#: .\cookbook\templates\stats.html:22 msgid "Recipes" msgstr "Recetas" @@ -1461,183 +1646,23 @@ msgstr "Cabecera" msgid "Cell" msgstr "Celda" -#: .\cookbook\templates\meal_plan.html:101 -msgid "New Entry" -msgstr "Nueva entrada" +#: .\cookbook\templates\meal_plan_entry.html:6 +msgid "Meal Plan View" +msgstr "Vista de menú" -#: .\cookbook\templates\meal_plan.html:113 -#: .\cookbook\templates\shopping_list.html:56 -msgid "Search Recipe" -msgstr "Buscar Receta" - -#: .\cookbook\templates\meal_plan.html:139 -msgid "Title" -msgstr "Titulo" - -#: .\cookbook\templates\meal_plan.html:141 -msgid "Note (optional)" -msgstr "Nota (opcional)" - -#: .\cookbook\templates\meal_plan.html:143 -msgid "" -"You can use markdown to format this field. See the docs here" -msgstr "" -"Puedes utilizar Markdown para dar formato a este campo. Consulta la documentación aquí" - -#: .\cookbook\templates\meal_plan.html:147 -#: .\cookbook\templates\meal_plan.html:251 -msgid "Serving Count" -msgstr "Número de raciones" - -#: .\cookbook\templates\meal_plan.html:153 -msgid "Create only note" -msgstr "Crear sólo una nota" - -#: .\cookbook\templates\meal_plan.html:168 -#: .\cookbook\templates\shopping_list.html:7 -#: .\cookbook\templates\shopping_list.html:29 -#: .\cookbook\templates\shopping_list.html:714 -msgid "Shopping List" -msgstr "Lista de la Compra" - -#: .\cookbook\templates\meal_plan.html:172 -msgid "Shopping list currently empty" -msgstr "Lista de la compra vacía" - -#: .\cookbook\templates\meal_plan.html:175 -msgid "Open Shopping List" -msgstr "Abrir Lista de la Compra" - -#: .\cookbook\templates\meal_plan.html:189 -msgid "Plan" -msgstr "Menú" - -#: .\cookbook\templates\meal_plan.html:196 -msgid "Number of Days" -msgstr "Número de Días" - -#: .\cookbook\templates\meal_plan.html:206 -msgid "Weekday offset" -msgstr "Compensar día inicial" - -#: .\cookbook\templates\meal_plan.html:209 -msgid "" -"Number of days starting from the first day of the week to offset the default " -"view." -msgstr "" -"Número de días a partir del primer día de la semana para compensar la vista " -"por defecto." - -#: .\cookbook\templates\meal_plan.html:217 -#: .\cookbook\templates\meal_plan.html:294 -msgid "Edit plan types" -msgstr "Modificar el tipo de menú" - -#: .\cookbook\templates\meal_plan.html:219 -msgid "Show help" -msgstr "Mostrar Ayuda" - -#: .\cookbook\templates\meal_plan.html:220 -msgid "Week iCal export" -msgstr "Exportar a iCal" - -#: .\cookbook\templates\meal_plan.html:264 #: .\cookbook\templates\meal_plan_entry.html:18 msgid "Created by" msgstr "Creado por" -#: .\cookbook\templates\meal_plan.html:270 #: .\cookbook\templates\meal_plan_entry.html:20 -#: .\cookbook\templates\shopping_list.html:254 +#: .\cookbook\templates\shopping_list.html:232 msgid "Shared with" msgstr "Compartido con" -#: .\cookbook\templates\meal_plan.html:280 -msgid "Add to Shopping" -msgstr "Añadir para comprar" - -#: .\cookbook\templates\meal_plan.html:323 -msgid "New meal type" -msgstr "Nuevo tipo de comida" - -#: .\cookbook\templates\meal_plan.html:338 -msgid "Meal Plan Help" -msgstr "Ayuda del menú" - -#: .\cookbook\templates\meal_plan.html:344 -msgid "" -"\n" -"

The meal plan module allows planning of meals " -"both with recipes and notes.

\n" -"

Simply select a recipe from the list of " -"recently viewed recipes or search the one you\n" -" want and drag it to the desired plan " -"position. You can also add a note and a title and\n" -" then drag the recipe to create a plan entry " -"with a custom title and note. Creating only\n" -" Notes is possible by dragging the create " -"note box into the plan.

\n" -"

Click on a recipe in order to open the " -"detailed view. There you can also add it to the\n" -" shopping list. You can also add all recipes " -"of a day to the shopping list by\n" -" clicking the shopping cart at the top of the " -"table.

\n" -"

Since a common use case is to plan meals " -"together you can define\n" -" users you want to share your plan with in " -"the settings.\n" -"

\n" -"

You can also edit the types of meals you want " -"to plan. If you share your plan with\n" -" someone with\n" -" different meals, their meal types will " -"appear in your list as well. To prevent\n" -" duplicates (e.g. Other and Misc.)\n" -" name your meal types the same as the users " -"you share your meals with and they will be\n" -" merged.

\n" -" " -msgstr "" -"\n" -"

El módulo de menú permite planificar las " -"comidas con recetas o con notas.

\n" -"

Simplemente selecciona una receta de la lista " -"de recetas vistas recientemente o busca la que\n" -" quieras y arrastrala a la posición deseada " -"del menú. También puede añadir una nota y un título y\n" -" luego arrastrar la receta para crear una " -"entrada del plan con un título y una nota personalizados. Es posible crear\n" -" solamente notas arrastrando el cuadro de " -"creación de notas al menú.

\n" -"

Haga clic en una receta para abrir la vista " -"detallada. Desde aquí también puedes añadirla a la\n" -" lista de la compra. También puedes añadir " -"todas las recetas de un día a la lista de la compra\n" -" haciendo clic en el carrito de la compra en " -"la parte superior de la tabla.

\n" -"

Ya que un caso de uso común es planificar las " -"comidas juntos, en los ajustes\n" -" puedes definir los usuarios con los que " -"quieres compartir el menú.\n" -"

\n" -"

También puedes editar los tipos de comidas " -"del menú. Si compartes tu menú con\n" -" alguien con\n" -" diferentes tipos de comidas, sus tipos de " -"comida aparecerán también en tu listado. Para prevenir\n" -" duplicados (p. ej. Otros y Misc.)\n" -" nombra los tipos de comida igual que el " -"resto de usuarios con los que compartes tus comidas y serán\n" -" combinados.

\n" -" " - -#: .\cookbook\templates\meal_plan_entry.html:6 -msgid "Meal Plan View" -msgstr "Vista de menú" +#: .\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." @@ -1745,29 +1770,28 @@ msgstr "" "porque las has visto recientemente. Ten en cuenta que los datos pueden estar " "desactualizados." -#: .\cookbook\templates\recipe_view.html:21 .\cookbook\templates\space.html:62 -#: .\cookbook\templates\stats.html:47 -msgid "Comments" -msgstr "Comentarios" +#: .\cookbook\templates\recipe_view.html:26 +msgid "by" +msgstr "por" -#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:118 -#: .\cookbook\views\edit.py:179 +#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:147 +#: .\cookbook\views\edit.py:180 msgid "Comment" msgstr "Comentario" #: .\cookbook\templates\recipes_table.html:19 #: .\cookbook\templates\recipes_table.html:23 -#: .\cookbook\templates\url_import.html:440 +#: .\cookbook\templates\url_import.html:447 msgid "Recipe Image" msgstr "Imagen de la receta" #: .\cookbook\templates\recipes_table.html:51 -#: .\cookbook\templates\url_import.html:445 +#: .\cookbook\templates\url_import.html:452 msgid "Preparation time ca." msgstr "Tiempo de preparación ca." #: .\cookbook\templates\recipes_table.html:57 -#: .\cookbook\templates\url_import.html:450 +#: .\cookbook\templates\url_import.html:457 msgid "Waiting time ca." msgstr "Tiempo de espera ca." @@ -1783,58 +1807,235 @@ msgstr "Registrar receta cocinada" msgid "Recipe Home" msgstr "Página de inicio" -#: .\cookbook\templates\settings.html:25 +#: .\cookbook\templates\search_info.html:5 +#: .\cookbook\templates\search_info.html:9 +#: .\cookbook\templates\settings.html:172 +#, fuzzy +#| msgid "Search String" +msgid "Search Settings" +msgstr "Cadena de búsqueda" + +#: .\cookbook\templates\search_info.html:10 +msgid "" +"\n" +" Creating the best search experience is complicated and weighs " +"heavily on your personal configuration. \n" +" Changing any of the search settings can have significant impact on " +"the speed and quality of the results.\n" +" Search Methods, Trigrams and Full Text Search configurations are " +"only available if you are using Postgres for your database.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:19 +#, fuzzy +#| msgid "Search" +msgid "Search Methods" +msgstr "Buscar" + +#: .\cookbook\templates\search_info.html:23 +msgid "" +" \n" +" Full text searches attempt to normalize the words provided to " +"match common variants. For example: 'forked', 'forking', 'forks' will all " +"normalize to 'fork'.\n" +" There are several methods available, described below, that will " +"control how the search behavior should react when multiple words are " +"searched.\n" +" Full technical details on how these operate can be viewed on Postgresql's website.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:29 +msgid "" +" \n" +" Simple searches ignore punctuation and common words such as " +"'the', 'a', 'and'. And will treat seperate words as required.\n" +" Searching for 'apple or flour' will return any recipe that " +"includes both 'apple' and 'flour' anywhere in the fields that have been " +"selected for a full text search.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:34 +msgid "" +" \n" +" Phrase searches ignore punctuation, but will search for all of " +"the words in the exact order provided.\n" +" Searching for 'apple or flour' will only return a recipe that " +"includes the exact phrase 'apple or flour' in any of the fields that have " +"been selected for a full text search.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:39 +msgid "" +" \n" +" Web searches simulate functionality found on many web search " +"sites supporting special syntax.\n" +" Placing quotes around several words will convert those words " +"into a phrase.\n" +" 'or' is recongized as searching for the word (or phrase) " +"immediately before 'or' OR the word (or phrase) directly after.\n" +" '-' is recognized as searching for recipes that do not include " +"the word (or phrase) that comes immediately after. \n" +" For example searching for 'apple pie' or cherry -butter will " +"return any recipe that includes the phrase 'apple pie' or the word " +"'cherry' \n" +" in any field included in the full text search but exclude any " +"recipe that has the word 'butter' in any field included.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:48 +msgid "" +" \n" +" Raw search is similar to Web except will take puncuation " +"operators such as '|', '&' and '()'\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:59 +msgid "" +" \n" +" Another approach to searching that also requires Postgresql is " +"fuzzy search or trigram similarity. A trigram is a group of three " +"consecutive characters.\n" +" For example searching for 'apple' will create x trigrams 'app', " +"'ppl', 'ple' and will create a score of how closely words match the " +"generated trigrams.\n" +" One benefit of searching trigams is that a search for 'sandwich' " +"will find mispelled words such as 'sandwhich' that would be missed by other " +"methods.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:69 +#, fuzzy +#| msgid "Search Recipe" +msgid "Search Fields" +msgstr "Buscar Receta" + +#: .\cookbook\templates\search_info.html:73 +msgid "" +" \n" +" Unaccent is a special case in that it enables searching a field " +"'unaccented' for each search style attempting to ignore accented values. \n" +" For example when you enable unaccent for 'Name' any search " +"(starts with, contains, trigram) will attempt the search ignoring accented " +"characters.\n" +" \n" +" For the other options, you can enable search on any or all " +"fields and they will be combined together with an assumed 'OR'.\n" +" For example enabling 'Name' for Starts With, 'Name' and " +"'Description' for Partial Match and 'Ingredients' and 'Keywords' for Full " +"Search\n" +" and searching for 'apple' will generate a search that will " +"return recipes that have:\n" +" - A recipe name that starts with 'apple'\n" +" - OR a recipe name that contains 'apple'\n" +" - OR a recipe description that contains 'apple'\n" +" - OR a recipe that will have a full text search match ('apple' " +"or 'apples') in ingredients\n" +" - OR a recipe that will have a full text search match in " +"Keywords\n" +"\n" +" Combining too many fields in too many types of search can have a " +"negative impact on performance, create duplicate results or return " +"unexpected results.\n" +" For example, enabling fuzzy search or partial matches will " +"interfere with web search methods. \n" +" Searching for 'apple -pie' with fuzzy search and full text " +"search will return the recipe Apple Pie. Though it is not included in the " +"full text results, it does match the trigram results.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:95 +#, fuzzy +#| msgid "Search" +msgid "Search Index" +msgstr "Buscar" + +#: .\cookbook\templates\search_info.html:99 +msgid "" +" \n" +" Trigram search and Full Text Search both rely on database " +"indexes to perform effectively. \n" +" You can rebuild the indexes on all fields in the Admin page for " +"Recipes and selecting all recipes and running 'rebuild index for selected " +"recipes'\n" +" You can also rebuild indexes at the command line by executing " +"the management command 'python manage.py rebuildindex'\n" +" " +msgstr "" + +#: .\cookbook\templates\settings.html:28 msgid "Account" msgstr "Cuenta" -#: .\cookbook\templates\settings.html:29 +#: .\cookbook\templates\settings.html:35 msgid "Preferences" msgstr "" -#: .\cookbook\templates\settings.html:33 +#: .\cookbook\templates\settings.html:42 #, fuzzy #| msgid "Settings" msgid "API-Settings" msgstr "Opciones" -#: .\cookbook\templates\settings.html:41 +#: .\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:49 +#: .\cookbook\templates\settings.html:73 #, fuzzy #| msgid "Account Connections" msgid "Account Settings" msgstr "Conexiones de la cuenta" -#: .\cookbook\templates\settings.html:51 +#: .\cookbook\templates\settings.html:75 #, fuzzy #| msgid "Settings" msgid "Emails" msgstr "Opciones" -#: .\cookbook\templates\settings.html:54 +#: .\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:66 +#: .\cookbook\templates\settings.html:91 msgid "Language" msgstr "Idioma" -#: .\cookbook\templates\settings.html:96 +#: .\cookbook\templates\settings.html:121 msgid "Style" msgstr "Estilo" -#: .\cookbook\templates\settings.html:116 +#: .\cookbook\templates\settings.html:142 msgid "API Token" msgstr "Token API" -#: .\cookbook\templates\settings.html:117 +#: .\cookbook\templates\settings.html:143 msgid "" "You can use both basic authentication and token based authentication to " "access the REST API." @@ -1842,7 +2043,7 @@ 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:134 +#: .\cookbook\templates\settings.html:160 msgid "" "Use the token as an Authorization header prefixed by the word token as shown " "in the following examples:" @@ -1850,10 +2051,68 @@ 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:136 +#: .\cookbook\templates\settings.html:162 msgid "or" msgstr "o" +#: .\cookbook\templates\settings.html:173 +msgid "" +"There are many options to configure the search depending on your personal " +"preferences." +msgstr "" + +#: .\cookbook\templates\settings.html:174 +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 +msgid "" +"If you do want to configure the search you can read about the different " +"options here." +msgstr "" + +#: .\cookbook\templates\settings.html:180 +msgid "Fuzzy" +msgstr "" + +#: .\cookbook\templates\settings.html:181 +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 +msgid "This is the default behavior" +msgstr "" + +#: .\cookbook\templates\settings.html:183 +#: .\cookbook\templates\settings.html:191 +msgid "Apply" +msgstr "" + +#: .\cookbook\templates\settings.html:188 +msgid "Precise" +msgstr "" + +#: .\cookbook\templates\settings.html:189 +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 +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" @@ -1873,50 +2132,73 @@ msgstr "" msgid "Create Superuser account" msgstr "Crear cuenta de Superusuario" -#: .\cookbook\templates\shopping_list.html:79 +#: .\cookbook\templates\shopping_list.html:8 +#: .\cookbook\templates\shopping_list.html:29 +#: .\cookbook\templates\shopping_list.html:663 +msgid "Shopping List" +msgstr "Lista de la Compra" + +#: .\cookbook\templates\shopping_list.html:55 +msgid "Search Recipe" +msgstr "Buscar Receta" + +#: .\cookbook\templates\shopping_list.html:72 msgid "Shopping Recipes" msgstr "Recetas en el carro de la compra" -#: .\cookbook\templates\shopping_list.html:83 +#: .\cookbook\templates\shopping_list.html:74 msgid "No recipes selected" msgstr "No hay recetas seleccionadas" -#: .\cookbook\templates\shopping_list.html:150 +#: .\cookbook\templates\shopping_list.html:131 msgid "Entry Mode" msgstr "Modo de entrada" -#: .\cookbook\templates\shopping_list.html:158 +#: .\cookbook\templates\shopping_list.html:139 msgid "Add Entry" msgstr "Añadir entrada" -#: .\cookbook\templates\shopping_list.html:174 +#: .\cookbook\templates\shopping_list.html:152 msgid "Amount" msgstr "Cantidad" -#: .\cookbook\templates\shopping_list.html:240 +#: .\cookbook\templates\shopping_list.html:164 +msgid "Select Unit" +msgstr "Seleccionar unidad" + +#: .\cookbook\templates\shopping_list.html:166 +#: .\cookbook\templates\shopping_list.html:189 +#: .\cookbook\templates\shopping_list.html:219 +#: .\cookbook\templates\shopping_list.html:243 +#: .\cookbook\templates\url_import.html:505 +#: .\cookbook\templates\url_import.html:537 +msgid "Select" +msgstr "Seleccionar" + +#: .\cookbook\templates\shopping_list.html:187 +msgid "Select Food" +msgstr "Seleccionar Alimento" + +#: .\cookbook\templates\shopping_list.html:218 msgid "Select Supermarket" msgstr "Seleccionar supermercado" -#: .\cookbook\templates\shopping_list.html:264 +#: .\cookbook\templates\shopping_list.html:242 msgid "Select User" msgstr "Seleccionar Usuario" -#: .\cookbook\templates\shopping_list.html:283 +#: .\cookbook\templates\shopping_list.html:258 msgid "Finished" msgstr "Completada" -#: .\cookbook\templates\shopping_list.html:296 +#: .\cookbook\templates\shopping_list.html:267 msgid "You are offline, shopping list might not syncronize." msgstr "Estás desconectado, la lista de la compra no se sincronizará." -#: .\cookbook\templates\shopping_list.html:361 +#: .\cookbook\templates\shopping_list.html:318 msgid "Copy/Export" msgstr "Copiar/Exportar" -#: .\cookbook\templates\shopping_list.html:365 -msgid "List Prefix" -msgstr "Prefijo de la lista" - #: .\cookbook\templates\socialaccount\connections.html:4 #: .\cookbook\templates\socialaccount\connections.html:15 msgid "Account Connections" @@ -1972,96 +2254,92 @@ msgstr "" msgid "Sign in using" msgstr "Iniciar sesión" -#: .\cookbook\templates\space.html:23 +#: .\cookbook\templates\space.html:25 msgid "Space:" msgstr "" -#: .\cookbook\templates\space.html:24 +#: .\cookbook\templates\space.html:26 #, fuzzy #| msgid "Description" msgid "Manage Subscription" msgstr "Descripción" -#: .\cookbook\templates\space.html:32 .\cookbook\templates\stats.html:19 +#: .\cookbook\templates\space.html:34 .\cookbook\templates\stats.html:19 msgid "Number of objects" msgstr "Número de objetos" -#: .\cookbook\templates\space.html:45 .\cookbook\templates\stats.html:30 +#: .\cookbook\templates\space.html:54 .\cookbook\templates\stats.html:30 msgid "Recipe Imports" msgstr "Recetas importadas" -#: .\cookbook\templates\space.html:53 .\cookbook\templates\stats.html:38 +#: .\cookbook\templates\space.html:62 .\cookbook\templates\stats.html:38 msgid "Objects stats" msgstr "Estadísticas de objetos" -#: .\cookbook\templates\space.html:56 .\cookbook\templates\stats.html:41 +#: .\cookbook\templates\space.html:65 .\cookbook\templates\stats.html:41 msgid "Recipes without Keywords" msgstr "Recetas sin palabras clave" -#: .\cookbook\templates\space.html:58 .\cookbook\templates\stats.html:43 -msgid "External Recipes" -msgstr "Recetas Externas" - -#: .\cookbook\templates\space.html:60 .\cookbook\templates\stats.html:45 +#: .\cookbook\templates\space.html:73 .\cookbook\templates\stats.html:45 msgid "Internal Recipes" msgstr "Recetas Internas" -#: .\cookbook\templates\space.html:73 +#: .\cookbook\templates\space.html:89 msgid "Members" msgstr "" -#: .\cookbook\templates\space.html:77 +#: .\cookbook\templates\space.html:95 #, fuzzy #| msgid "Invite Links" msgid "Invite User" msgstr "Enlaces de Invitación" -#: .\cookbook\templates\space.html:88 +#: .\cookbook\templates\space.html:107 msgid "User" msgstr "" -#: .\cookbook\templates\space.html:89 +#: .\cookbook\templates\space.html:108 msgid "Groups" msgstr "" -#: .\cookbook\templates\space.html:105 +#: .\cookbook\templates\space.html:119 #, fuzzy #| msgid "Admin" msgid "admin" msgstr "Administrador" -#: .\cookbook\templates\space.html:106 +#: .\cookbook\templates\space.html:120 msgid "user" msgstr "" -#: .\cookbook\templates\space.html:107 +#: .\cookbook\templates\space.html:121 msgid "guest" msgstr "" -#: .\cookbook\templates\space.html:108 +#: .\cookbook\templates\space.html:122 #, fuzzy #| msgid "Remove" msgid "remove" msgstr "Eliminar" -#: .\cookbook\templates\space.html:112 +#: .\cookbook\templates\space.html:126 msgid "Update" msgstr "" -#: .\cookbook\templates\space.html:116 +#: .\cookbook\templates\space.html:130 #, fuzzy #| msgid "You cannot edit this storage!" msgid "You cannot edit yourself." msgstr "¡No puede editar este almacenamiento!" -#: .\cookbook\templates\space.html:123 +#: .\cookbook\templates\space.html:136 #, fuzzy #| msgid "There are no recipes in this book yet." msgid "There are no members in your space yet!" msgstr "Todavía no hay recetas en este libro." -#: .\cookbook\templates\space.html:130 .\cookbook\templates\system.html:21 -#: .\cookbook\views\lists.py:115 +#: .\cookbook\templates\space.html:143 .\cookbook\templates\system.html:21 +#: .\cookbook\views\lists.py:85 msgid "Invite Links" msgstr "Enlaces de Invitación" @@ -2069,6 +2347,10 @@ msgstr "Enlaces de Invitación" msgid "Stats" msgstr "Estadísticas" +#: .\cookbook\templates\stats.html:10 +msgid "Statistics" +msgstr "Estadísticas" + #: .\cookbook\templates\system.html:22 msgid "Show Links" msgstr "Mostrar Enlaces" @@ -2201,159 +2483,186 @@ msgstr "" " características sólo funcionan con bases de datos Postgres.\n" " " -#: .\cookbook\templates\url_import.html:6 +#: .\cookbook\templates\url_import.html:8 msgid "URL Import" msgstr "Importar URL" -#: .\cookbook\templates\url_import.html:31 +#: .\cookbook\templates\url_import.html:33 msgid "Drag me to your bookmarks to import recipes from anywhere" msgstr "" -#: .\cookbook\templates\url_import.html:32 +#: .\cookbook\templates\url_import.html:34 #, fuzzy #| msgid "Bookmark saved!" msgid "Bookmark Me!" msgstr "¡Marcador guardado!" -#: .\cookbook\templates\url_import.html:61 +#: .\cookbook\templates\url_import.html:38 +msgid "URL" +msgstr "" + +#: .\cookbook\templates\url_import.html:40 +msgid "App" +msgstr "" + +#: .\cookbook\templates\url_import.html:64 msgid "Enter website URL" msgstr "Introduce la URL del sitio web" -#: .\cookbook\templates\url_import.html:97 +#: .\cookbook\templates\url_import.html:104 msgid "Select recipe files to import or drop them here..." msgstr "" -#: .\cookbook\templates\url_import.html:118 +#: .\cookbook\templates\url_import.html:125 msgid "Paste json or html source here to load recipe." msgstr "" -#: .\cookbook\templates\url_import.html:146 +#: .\cookbook\templates\url_import.html:153 #, fuzzy #| msgid "View Recipe" msgid "Preview Recipe Data" msgstr "Ver la receta" -#: .\cookbook\templates\url_import.html:147 +#: .\cookbook\templates\url_import.html:154 msgid "Drag recipe attributes from the right into the appropriate box below." msgstr "" -#: .\cookbook\templates\url_import.html:156 -#: .\cookbook\templates\url_import.html:173 -#: .\cookbook\templates\url_import.html:190 -#: .\cookbook\templates\url_import.html:209 -#: .\cookbook\templates\url_import.html:227 -#: .\cookbook\templates\url_import.html:242 -#: .\cookbook\templates\url_import.html:257 -#: .\cookbook\templates\url_import.html:273 -#: .\cookbook\templates\url_import.html:300 -#: .\cookbook\templates\url_import.html:351 +#: .\cookbook\templates\url_import.html:163 +#: .\cookbook\templates\url_import.html:180 +#: .\cookbook\templates\url_import.html:197 +#: .\cookbook\templates\url_import.html:216 +#: .\cookbook\templates\url_import.html:234 +#: .\cookbook\templates\url_import.html:249 +#: .\cookbook\templates\url_import.html:264 +#: .\cookbook\templates\url_import.html:280 +#: .\cookbook\templates\url_import.html:307 +#: .\cookbook\templates\url_import.html:358 msgid "Clear Contents" msgstr "" -#: .\cookbook\templates\url_import.html:158 +#: .\cookbook\templates\url_import.html:165 msgid "Text dragged here will be appended to the name." msgstr "" -#: .\cookbook\templates\url_import.html:175 +#: .\cookbook\templates\url_import.html:178 +msgid "Description" +msgstr "Descripción" + +#: .\cookbook\templates\url_import.html:182 msgid "Text dragged here will be appended to the description." msgstr "" -#: .\cookbook\templates\url_import.html:192 +#: .\cookbook\templates\url_import.html:199 msgid "Keywords dragged here will be appended to current list" msgstr "" -#: .\cookbook\templates\url_import.html:207 +#: .\cookbook\templates\url_import.html:214 msgid "Image" msgstr "" -#: .\cookbook\templates\url_import.html:239 +#: .\cookbook\templates\url_import.html:246 #, fuzzy #| msgid "Preparation Time" msgid "Prep Time" msgstr "Tiempo de Preparación" -#: .\cookbook\templates\url_import.html:254 +#: .\cookbook\templates\url_import.html:261 #, fuzzy #| msgid "Time" msgid "Cook Time" msgstr "Tiempo" -#: .\cookbook\templates\url_import.html:275 +#: .\cookbook\templates\url_import.html:282 msgid "Ingredients dragged here will be appended to current list." msgstr "" -#: .\cookbook\templates\url_import.html:302 +#: .\cookbook\templates\url_import.html:304 +#: .\cookbook\templates\url_import.html:579 +msgid "Instructions" +msgstr "Instrucciones" + +#: .\cookbook\templates\url_import.html:309 msgid "" "Recipe instructions dragged here will be appended to current instructions." msgstr "" -#: .\cookbook\templates\url_import.html:325 +#: .\cookbook\templates\url_import.html:332 #, fuzzy #| msgid "Discovered Recipes" msgid "Discovered Attributes" msgstr "Recetas Descubiertas" -#: .\cookbook\templates\url_import.html:327 +#: .\cookbook\templates\url_import.html:334 msgid "" "Drag recipe attributes from below into the appropriate box on the left. " "Click any node to display its full properties." msgstr "" -#: .\cookbook\templates\url_import.html:344 +#: .\cookbook\templates\url_import.html:351 #, fuzzy #| msgid "Show as header" msgid "Show Blank Field" msgstr "Mostrar como encabezado" -#: .\cookbook\templates\url_import.html:349 +#: .\cookbook\templates\url_import.html:356 msgid "Blank Field" msgstr "" -#: .\cookbook\templates\url_import.html:353 +#: .\cookbook\templates\url_import.html:360 msgid "Items dragged to Blank Field will be appended." msgstr "" -#: .\cookbook\templates\url_import.html:400 +#: .\cookbook\templates\url_import.html:407 #, fuzzy #| msgid "Delete Step" msgid "Delete Text" msgstr "Eliminar paso" -#: .\cookbook\templates\url_import.html:413 +#: .\cookbook\templates\url_import.html:420 #, fuzzy #| msgid "Delete Recipe" msgid "Delete image" msgstr "Eliminar receta" -#: .\cookbook\templates\url_import.html:429 +#: .\cookbook\templates\url_import.html:436 msgid "Recipe Name" msgstr "Nombre de la Receta" -#: .\cookbook\templates\url_import.html:433 +#: .\cookbook\templates\url_import.html:440 #, fuzzy #| msgid "Description" msgid "Recipe Description" msgstr "Descripción" -#: .\cookbook\templates\url_import.html:494 -#: .\cookbook\templates\url_import.html:526 -#: .\cookbook\templates\url_import.html:582 +#: .\cookbook\templates\url_import.html:504 +#: .\cookbook\templates\url_import.html:536 +#: .\cookbook\templates\url_import.html:596 msgid "Select one" msgstr "Seleccione uno" -#: .\cookbook\templates\url_import.html:596 +#: .\cookbook\templates\url_import.html:554 +msgid "Note" +msgstr "Nota" + +#: .\cookbook\templates\url_import.html:597 +#, fuzzy +#| msgid "All Keywords" +msgid "Add Keyword" +msgstr "Todas las palabras clave." + +#: .\cookbook\templates\url_import.html:610 msgid "All Keywords" msgstr "Todas las palabras clave." -#: .\cookbook\templates\url_import.html:599 +#: .\cookbook\templates\url_import.html:613 msgid "Import all keywords, not only the ones already existing." msgstr "Importar todas las palabras clave, no solo las ya existentes." -#: .\cookbook\templates\url_import.html:626 +#: .\cookbook\templates\url_import.html:640 msgid "Information" msgstr "Información" -#: .\cookbook\templates\url_import.html:628 +#: .\cookbook\templates\url_import.html:642 msgid "" " Only websites containing ld+json or microdata information can currently\n" " be imported. Most big recipe pages " @@ -2372,51 +2681,197 @@ msgstr "" "no dudes en poner un ejemplo en las\n" " propuestas de GitHub." -#: .\cookbook\templates\url_import.html:636 +#: .\cookbook\templates\url_import.html:650 msgid "Google ld+json Info" msgstr "Información de Google ld+json" -#: .\cookbook\templates\url_import.html:639 +#: .\cookbook\templates\url_import.html:653 msgid "GitHub Issues" msgstr "Propuestas de GitHub" -#: .\cookbook\templates\url_import.html:641 +#: .\cookbook\templates\url_import.html:655 msgid "Recipe Markup Specification" msgstr "Especificación de anotaciones de la receta" -#: .\cookbook\views\api.py:79 +#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:170 #, fuzzy #| msgid "Parameter filter_list incorrectly formatted" msgid "Parameter updated_at incorrectly formatted" msgstr "Parámetro filter_list formateado incorrectamente" -#: .\cookbook\views\api.py:580 .\cookbook\views\views.py:303 -msgid "This feature is not available in the demo version!" +#: .\cookbook\views\api.py:190 .\cookbook\views\api.py:291 +#, python-brace-format +msgid "No {self.basename} with id {pk} exists" +msgstr "" + +#: .\cookbook\views\api.py:194 +msgid "Cannot merge with the same object!" +msgstr "¡No se puede unir con el mismo objeto!" + +#: .\cookbook\views\api.py:201 +#, python-brace-format +msgid "No {self.basename} with id {target} exists" +msgstr "" + +#: .\cookbook\views\api.py:206 +#, 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:239 +#, python-brace-format +msgid "{source.name} was merged successfully with {target.name}" +msgstr "" + +#: .\cookbook\views\api.py:244 +#, python-brace-format +msgid "An error occurred attempting to merge {source.name} with {target.name}" +msgstr "" + +#: .\cookbook\views\api.py:300 +#, python-brace-format +msgid "{child.name} was moved successfully to the root." +msgstr "" + +#: .\cookbook\views\api.py:303 .\cookbook\views\api.py:321 +msgid "An error occurred attempting to move " +msgstr "" + +#: .\cookbook\views\api.py:306 +msgid "Cannot move an object to itself!" +msgstr "" + +#: .\cookbook\views\api.py:312 +#, python-brace-format +msgid "No {self.basename} with id {parent} exists" +msgstr "" + +#: .\cookbook\views\api.py:318 +#, python-brace-format +msgid "{child.name} was moved successfully to parent {parent.name}" +msgstr "" + +#: .\cookbook\views\api.py:470 +#, python-brace-format +msgid "{obj.name} was removed from the shopping list." +msgstr "" + +#: .\cookbook\views\api.py:475 .\cookbook\views\api.py:726 +#, python-brace-format +msgid "{obj.name} was added to the shopping list." +msgstr "" + +#: .\cookbook\views\api.py:587 +msgid "ID of recipe a step is part of. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:588 +msgid "Query string matched (fuzzy) against object name." +msgstr "" + +#: .\cookbook\views\api.py:631 +msgid "" +"Query string matched (fuzzy) against recipe name. In the future also " +"fulltext search." +msgstr "" + +#: .\cookbook\views\api.py:632 +msgid "ID of keyword a recipe should have. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:633 +msgid "ID of food a recipe should have. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:634 +msgid "ID of unit a recipe should have." +msgstr "" + +#: .\cookbook\views\api.py:635 +msgid "Rating a recipe should have. [0 - 5]" +msgstr "" + +#: .\cookbook\views\api.py:636 +msgid "ID of book a recipe should be in. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:637 +msgid "" +"If recipe should have all (AND=false) or any (OR=true) of the " +"provided keywords." +msgstr "" + +#: .\cookbook\views\api.py:638 +msgid "" +"If recipe should have all (AND=false) or any (OR=true) of the " +"provided foods." +msgstr "" + +#: .\cookbook\views\api.py:639 +msgid "" +"If recipe should be in all (AND=false) or any (OR=true) of the " +"provided books." +msgstr "" + +#: .\cookbook\views\api.py:640 +msgid "If only internal recipes should be returned. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:641 +msgid "Returns the results in randomized order. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:642 +msgid "Returns new results first in search results. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:768 +msgid "" +"Returns the shopping list entry with a primary key of id. Multiple values " +"allowed." +msgstr "" + +#: .\cookbook\views\api.py:771 +msgid "" +"Filter shopping list entries on checked. [true, false, both, recent]
- recent includes unchecked items and recently completed items." +msgstr "" + +#: .\cookbook\views\api.py:773 +msgid "Returns the shopping list entries sorted by supermarket category order." +msgstr "" + +#: .\cookbook\views\api.py:922 .\cookbook\views\data.py:42 +#: .\cookbook\views\edit.py:129 .\cookbook\views\new.py:95 +#, fuzzy +#| msgid "This feature is not available in the demo version!" +msgid "This feature is not yet available in the hosted version of tandoor!" msgstr "¡Esta funcionalidad no está disponible en la versión demo!" -#: .\cookbook\views\api.py:603 +#: .\cookbook\views\api.py:944 msgid "Sync successful!" msgstr "¡Sincronización exitosa!" -#: .\cookbook\views\api.py:608 +#: .\cookbook\views\api.py:949 msgid "Error synchronizing with Storage" msgstr "Error de sincronización con el almacenamiento" -#: .\cookbook\views\api.py:686 +#: .\cookbook\views\api.py:1028 msgid "Nothing to do." msgstr "" -#: .\cookbook\views\api.py:701 +#: .\cookbook\views\api.py:1043 msgid "The requested site provided malformed data and cannot be read." msgstr "" "El sitio solicitado proporcionó datos con formato incorrecto y no se puede " "leer." -#: .\cookbook\views\api.py:708 +#: .\cookbook\views\api.py:1050 msgid "The requested page could not be found." msgstr "La página solicitada no pudo ser encontrada." -#: .\cookbook\views\api.py:717 +#: .\cookbook\views\api.py:1068 msgid "" "The requested site does not provide any recognized data format to import the " "recipe from." @@ -2424,195 +2879,224 @@ msgstr "" "El sitio solicitado no proporciona ningún formato de datos reconocido para " "importar la receta." -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:1082 +msgid "Connection Refused." +msgstr "" + +#: .\cookbook\views\api.py:1091 #, fuzzy #| msgid "The requested page could not be found." msgid "No useable data could be found." msgstr "La página solicitada no pudo ser encontrada." -#: .\cookbook\views\api.py:747 +#: .\cookbook\views\api.py:1107 msgid "I couldn't find anything to do." msgstr "" -#: .\cookbook\views\data.py:31 .\cookbook\views\data.py:122 -#: .\cookbook\views\edit.py:50 .\cookbook\views\import_export.py:67 -#: .\cookbook\views\new.py:32 +#: .\cookbook\views\data.py:34 .\cookbook\views\data.py:129 +#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:80 +#: .\cookbook\views\new.py:33 msgid "You have reached the maximum number of recipes for your space." msgstr "" -#: .\cookbook\views\data.py:35 .\cookbook\views\data.py:126 -#: .\cookbook\views\edit.py:54 .\cookbook\views\import_export.py:71 -#: .\cookbook\views\new.py:36 +#: .\cookbook\views\data.py:38 .\cookbook\views\data.py:133 +#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:84 +#: .\cookbook\views\new.py:37 msgid "You have more users than allowed in your space." msgstr "" -#: .\cookbook\views\data.py:104 +#: .\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] "Edición por lotes realizada. %(count)d Receta fue actualizada." msgstr[1] "Edición masiva realizada. %(count)d Recetas fueron actualizadas." -#: .\cookbook\views\delete.py:72 +#: .\cookbook\views\delete.py:101 msgid "Monitor" msgstr "Monitor" -#: .\cookbook\views\delete.py:96 .\cookbook\views\lists.py:102 -#: .\cookbook\views\new.py:98 +#: .\cookbook\views\delete.py:125 .\cookbook\views\lists.py:71 +#: .\cookbook\views\new.py:101 msgid "Storage Backend" msgstr "Backend de Almacenamiento" -#: .\cookbook\views\delete.py:106 +#: .\cookbook\views\delete.py:135 msgid "" "Could not delete this storage backend as it is used in at least one monitor." msgstr "" "No se pudo borrar este backend de almacenamiento ya que se utiliza en al " "menos un monitor." -#: .\cookbook\views\delete.py:129 .\cookbook\views\edit.py:213 -#: .\cookbook\views\new.py:156 +#: .\cookbook\views\delete.py:158 msgid "Recipe Book" msgstr "Libro de recetas" -#: .\cookbook\views\delete.py:141 +#: .\cookbook\views\delete.py:170 msgid "Bookmarks" msgstr "Marcadores" -#: .\cookbook\views\delete.py:163 .\cookbook\views\new.py:252 +#: .\cookbook\views\delete.py:192 .\cookbook\views\new.py:238 msgid "Invite Link" msgstr "Enlace de invitación" -#: .\cookbook\views\edit.py:119 -msgid "Food" -msgstr "Comida" - -#: .\cookbook\views\edit.py:128 +#: .\cookbook\views\edit.py:125 msgid "You cannot edit this storage!" msgstr "¡No puede editar este almacenamiento!" -#: .\cookbook\views\edit.py:148 +#: .\cookbook\views\edit.py:149 msgid "Storage saved!" msgstr "¡Almacenamiento guardado!" -#: .\cookbook\views\edit.py:154 +#: .\cookbook\views\edit.py:155 msgid "There was an error updating this storage backend!" msgstr "¡Hubo un error al actualizar este backend de almacenamiento!" -#: .\cookbook\views\edit.py:165 -msgid "Storage" -msgstr "Almacenamiento" - -#: .\cookbook\views\edit.py:261 +#: .\cookbook\views\edit.py:248 msgid "Changes saved!" msgstr "¡Cambios guardados!" -#: .\cookbook\views\edit.py:265 +#: .\cookbook\views\edit.py:252 msgid "Error saving changes!" msgstr "¡Error al guardar los cambios!" -#: .\cookbook\views\edit.py:299 -msgid "Units merged!" -msgstr "¡Unidades fusionadas!" - -#: .\cookbook\views\edit.py:301 .\cookbook\views\edit.py:317 -msgid "Cannot merge with the same object!" -msgstr "¡No se puede unir con el mismo objeto!" - -#: .\cookbook\views\edit.py:315 -msgid "Foods merged!" -msgstr "¡Alimentos fusionados!" - -#: .\cookbook\views\import_export.py:93 +#: .\cookbook\views\import_export.py:106 msgid "Importing is not implemented for this provider" msgstr "La importación no está implementada para este proveedor" -#: .\cookbook\views\import_export.py:115 +#: .\cookbook\views\import_export.py:127 +msgid "" +"The PDF Exporter is not enabled on this instance as it is still in an " +"experimental state." +msgstr "" + +#: .\cookbook\views\import_export.py:132 msgid "Exporting is not implemented for this provider" msgstr "La exportación no está implementada para este proveedor" -#: .\cookbook\views\lists.py:40 +#: .\cookbook\views\lists.py:25 msgid "Import Log" msgstr "Importar registro" -#: .\cookbook\views\lists.py:53 +#: .\cookbook\views\lists.py:38 msgid "Discovery" msgstr "Descubrimiento" -#: .\cookbook\views\lists.py:85 +#: .\cookbook\views\lists.py:54 msgid "Shopping Lists" msgstr "Listas de la compra" -#: .\cookbook\views\new.py:123 +#: .\cookbook\views\lists.py:148 +#, fuzzy +#| msgid "Supermarket" +msgid "Supermarkets" +msgstr "Supermercado" + +#: .\cookbook\views\lists.py:164 +#, fuzzy +#| msgid "Shopping Recipes" +msgid "Shopping Categories" +msgstr "Recetas en el carro de la compra" + +#: .\cookbook\views\lists.py:217 +msgid "Steps" +msgstr "Pasos" + +#: .\cookbook\views\lists.py:232 +#, fuzzy +#| msgid "Shopping List" +msgid "New Shopping List" +msgstr "Lista de la Compra" + +#: .\cookbook\views\new.py:126 msgid "Imported new recipe!" msgstr "¡Nueva receta importada!" -#: .\cookbook\views\new.py:126 +#: .\cookbook\views\new.py:129 msgid "There was an error importing this recipe!" msgstr "¡Hubo un error al importar esta receta!" -#: .\cookbook\views\new.py:226 +#: .\cookbook\views\new.py:212 msgid "Hello" msgstr "" -#: .\cookbook\views\new.py:226 +#: .\cookbook\views\new.py:212 msgid "You have been invited by " msgstr "" -#: .\cookbook\views\new.py:227 +#: .\cookbook\views\new.py:213 msgid " to join their Tandoor Recipes space " msgstr "" -#: .\cookbook\views\new.py:228 +#: .\cookbook\views\new.py:214 msgid "Click the following link to activate your account: " msgstr "" -#: .\cookbook\views\new.py:229 +#: .\cookbook\views\new.py:215 msgid "" "If the link does not work use the following code to manually join the space: " msgstr "" -#: .\cookbook\views\new.py:230 +#: .\cookbook\views\new.py:216 msgid "The invitation is valid until " msgstr "" -#: .\cookbook\views\new.py:231 +#: .\cookbook\views\new.py:217 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " msgstr "" -#: .\cookbook\views\new.py:234 +#: .\cookbook\views\new.py:220 msgid "Tandoor Recipes Invite" msgstr "" -#: .\cookbook\views\new.py:241 +#: .\cookbook\views\new.py:227 msgid "Invite link successfully send to user." msgstr "" -#: .\cookbook\views\new.py:244 +#: .\cookbook\views\new.py:230 msgid "" "You have send to many emails, please share the link manually or wait a few " "hours." msgstr "" -#: .\cookbook\views\new.py:246 +#: .\cookbook\views\new.py:232 msgid "Email to user could not be send, please share link manually." msgstr "" -#: .\cookbook\views\views.py:129 +#: .\cookbook\views\views.py:126 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:177 +#: .\cookbook\views\views.py:174 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:188 +#: .\cookbook\views\views.py:185 msgid "Comment saved!" msgstr "¡Comentario guardado!" -#: .\cookbook\views\views.py:395 +#: .\cookbook\views\views.py:276 +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:335 +msgid "You must select at least one field to search!" +msgstr "" + +#: .\cookbook\views\views.py:340 +msgid "" +"To use this search method you must select at least one full text search " +"field!" +msgstr "" + +#: .\cookbook\views\views.py:344 +msgid "Fuzzy search is not compatible with this search method!" +msgstr "" + +#: .\cookbook\views\views.py:470 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 " @@ -2622,44 +3106,323 @@ 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:402 +#: .\cookbook\views\views.py:477 msgid "Passwords dont match!" msgstr "¡Las contraseñas no coinciden!" -#: .\cookbook\views\views.py:418 +#: .\cookbook\views\views.py:493 msgid "User has been created, please login!" msgstr "El usuario ha sido creado, ¡inicie sesión!" -#: .\cookbook\views\views.py:434 +#: .\cookbook\views\views.py:509 msgid "Malformed Invite Link supplied!" msgstr "¡Se proporcionó un enlace de invitación con formato incorrecto!" -#: .\cookbook\views\views.py:441 +#: .\cookbook\views\views.py:516 #, fuzzy #| msgid "You are not logged in and therefore cannot view this page!" msgid "You are already member of a space and therefore cannot join this one." msgstr "¡No ha iniciado sesión y por lo tanto no puede ver esta página!" -#: .\cookbook\views\views.py:452 +#: .\cookbook\views\views.py:527 msgid "Successfully joined space." msgstr "" -#: .\cookbook\views\views.py:458 +#: .\cookbook\views\views.py:533 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:522 +#: .\cookbook\views\views.py:614 msgid "" "Reporting share links is not enabled for this instance. Please notify the " "page administrator to report problems." msgstr "" -#: .\cookbook\views\views.py:528 +#: .\cookbook\views\views.py:620 msgid "" "Recipe sharing link has been disabled! For additional information please " "contact the page administrator." msgstr "" +#~ msgid "New Unit" +#~ msgstr "Nueva Unidad" + +#~ msgid "New unit that other gets replaced by." +#~ msgstr "Nueva unidad que reemplaza a la anterior." + +#~ msgid "Old Unit" +#~ msgstr "Antigua unidad" + +#~ msgid "Unit that should be replaced." +#~ msgstr "Unidad que se va a reemplazar." + +#~ msgid "New Food" +#~ msgstr "Nuevo Alimento" + +#~ msgid "New food that other gets replaced by." +#~ msgstr "Nuevo alimento que remplaza al anterior." + +#~ msgid "Old Food" +#~ msgstr "Antiguo alimento" + +#~ msgid "New Entry" +#~ msgstr "Nueva entrada" + +#~ msgid "Title" +#~ msgstr "Titulo" + +#~ msgid "Note (optional)" +#~ msgstr "Nota (opcional)" + +#~ msgid "" +#~ "You can use markdown to format this field. See the docs here" +#~ msgstr "" +#~ "Puedes utilizar Markdown para dar formato a este campo. Consulta la documentación aquí" + +#~ msgid "Serving Count" +#~ msgstr "Número de raciones" + +#~ msgid "Create only note" +#~ msgstr "Crear sólo una nota" + +#~ msgid "Plan" +#~ msgstr "Menú" + +#~ msgid "Number of Days" +#~ msgstr "Número de Días" + +#~ msgid "Weekday offset" +#~ msgstr "Compensar día inicial" + +#~ msgid "" +#~ "Number of days starting from the first day of the week to offset the " +#~ "default view." +#~ msgstr "" +#~ "Número de días a partir del primer día de la semana para compensar la " +#~ "vista por defecto." + +#~ msgid "Edit plan types" +#~ msgstr "Modificar el tipo de menú" + +#~ msgid "Show help" +#~ msgstr "Mostrar Ayuda" + +#~ msgid "Week iCal export" +#~ msgstr "Exportar a iCal" + +#~ msgid "Add to Shopping" +#~ msgstr "Añadir para comprar" + +#~ msgid "New meal type" +#~ msgstr "Nuevo tipo de comida" + +#~ msgid "Meal Plan Help" +#~ msgstr "Ayuda del menú" + +#~ msgid "" +#~ "\n" +#~ "

The meal plan module allows planning of " +#~ "meals both with recipes and notes.

\n" +#~ "

Simply select a recipe from the list of " +#~ "recently viewed recipes or search the one you\n" +#~ " want and drag it to the desired plan " +#~ "position. You can also add a note and a title and\n" +#~ " then drag the recipe to create a plan " +#~ "entry with a custom title and note. Creating only\n" +#~ " Notes is possible by dragging the create " +#~ "note box into the plan.

\n" +#~ "

Click on a recipe in order to open the " +#~ "detailed view. There you can also add it to the\n" +#~ " shopping list. You can also add all " +#~ "recipes of a day to the shopping list by\n" +#~ " clicking the shopping cart at the top of " +#~ "the table.

\n" +#~ "

Since a common use case is to plan meals " +#~ "together you can define\n" +#~ " users you want to share your plan with in " +#~ "the settings.\n" +#~ "

\n" +#~ "

You can also edit the types of meals you " +#~ "want to plan. If you share your plan with\n" +#~ " someone with\n" +#~ " different meals, their meal types will " +#~ "appear in your list as well. To prevent\n" +#~ " duplicates (e.g. Other and Misc.)\n" +#~ " name your meal types the same as the " +#~ "users you share your meals with and they will be\n" +#~ " merged.

\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ "

El módulo de menú permite planificar las " +#~ "comidas con recetas o con notas.

\n" +#~ "

Simplemente selecciona una receta de la " +#~ "lista de recetas vistas recientemente o busca la que\n" +#~ " quieras y arrastrala a la posición " +#~ "deseada del menú. También puede añadir una nota y un título y\n" +#~ " luego arrastrar la receta para crear una " +#~ "entrada del plan con un título y una nota personalizados. Es posible " +#~ "crear\n" +#~ " solamente notas arrastrando el cuadro de " +#~ "creación de notas al menú.

\n" +#~ "

Haga clic en una receta para abrir la " +#~ "vista detallada. Desde aquí también puedes añadirla a la\n" +#~ " lista de la compra. También puedes añadir " +#~ "todas las recetas de un día a la lista de la compra\n" +#~ " haciendo clic en el carrito de la compra " +#~ "en la parte superior de la tabla.

\n" +#~ "

Ya que un caso de uso común es planificar " +#~ "las comidas juntos, en los ajustes\n" +#~ " puedes definir los usuarios con los que " +#~ "quieres compartir el menú.\n" +#~ "

\n" +#~ "

También puedes editar los tipos de comidas " +#~ "del menú. Si compartes tu menú con\n" +#~ " alguien con\n" +#~ " diferentes tipos de comidas, sus tipos de " +#~ "comida aparecerán también en tu listado. Para prevenir\n" +#~ " duplicados (p. ej. Otros y Misc.)\n" +#~ " nombra los tipos de comida igual que el " +#~ "resto de usuarios con los que compartes tus comidas y serán\n" +#~ " combinados.

\n" +#~ " " + +#~ msgid "Units merged!" +#~ msgstr "¡Unidades fusionadas!" + +#~ msgid "Foods merged!" +#~ msgstr "¡Alimentos fusionados!" + +#~ msgid "Utensils" +#~ msgstr "Utensilios" + +#~ msgid "Storage Data" +#~ msgstr "Almacenamiento de Datos" + +#~ msgid "Storage Backends" +#~ msgstr "Backends de Almacenamiento" + +#~ msgid "Configure Sync" +#~ msgstr "Configurar Sincronización" + +#~ msgid "Discovered Recipes" +#~ msgstr "Recetas Descubiertas" + +#~ msgid "Discovery Log" +#~ msgstr "Registro de descubrimiento" + +#~ msgid "Units & Ingredients" +#~ msgstr "Unidades e ingredientes" + +#~ msgid "New Book" +#~ msgstr "Nuevo Libro" + +#~ msgid "Toggle Recipes" +#~ msgstr "Alternar recetas" + +#~ msgid "There are no recipes in this book yet." +#~ msgstr "Todavía no hay recetas en este libro." + +#~ msgid "Waiting Time" +#~ msgstr "Tiempo de espera" + +#~ msgid "Servings Text" +#~ msgstr "Texto de raciones" + +#~ msgid "Select Keywords" +#~ msgstr "Seleccionar palabras clave" + +#~ msgid "Nutrition" +#~ msgstr "Información Nutricional" + +#~ msgid "Delete Step" +#~ msgstr "Eliminar paso" + +#~ msgid "Calories" +#~ msgstr "Calorías" + +#~ msgid "Carbohydrates" +#~ msgstr "Carbohidratos" + +#~ msgid "Fats" +#~ msgstr "Grasas" + +#~ msgid "Proteins" +#~ msgstr "Proteinas" + +#~ msgid "Step" +#~ msgstr "Paso" + +#~ msgid "Show as header" +#~ msgstr "Mostrar como encabezado" + +#~ msgid "Hide as header" +#~ msgstr "Ocultar como encabezado" + +#~ msgid "Move Up" +#~ msgstr "Mover Arriba" + +#~ msgid "Move Down" +#~ msgstr "Mover Abajo" + +#~ msgid "Step Name" +#~ msgstr "Nombre del paso" + +#~ msgid "Step Type" +#~ msgstr "Tipo de paso" + +#~ msgid "Step time in Minutes" +#~ msgstr "Tiempo de paso en minutos" + +#, fuzzy +#~| msgid "Select one" +#~ msgid "Select File" +#~ msgstr "Seleccione uno" + +#, fuzzy +#~| msgid "Delete Recipe" +#~ msgid "Select Recipe" +#~ msgstr "Eliminar receta" + +#~ msgid "Delete Ingredient" +#~ msgstr "Eliminar ingrediente" + +#~ msgid "Make Header" +#~ msgstr "Crear encabezado" + +#~ msgid "Make Ingredient" +#~ msgstr "Crear ingrediente" + +#~ msgid "Disable Amount" +#~ msgstr "Deshabilitar cantidad" + +#~ msgid "Enable Amount" +#~ msgstr "Habilitar cantidad" + +#~ msgid "Copy Template Reference" +#~ msgstr "Copiar Referencia de Plantilla" + +#~ msgid "Save & View" +#~ msgstr "Guardar y ver" + +#~ msgid "Add Step" +#~ msgstr "Agregar paso" + +#~ msgid "Add Nutrition" +#~ msgstr "Añadir Información Nutricional" + +#~ msgid "Remove Nutrition" +#~ msgstr "Eliminar Información Nutricional" + +#~ msgid "View Recipe" +#~ msgstr "Ver la receta" + +#~ msgid "Delete Recipe" +#~ msgstr "Eliminar receta" + #, fuzzy #~| msgid "Password Reset" #~ msgid "Password Settings" diff --git a/cookbook/locale/fi/LC_MESSAGES/django.mo b/cookbook/locale/fi/LC_MESSAGES/django.mo new file mode 100644 index 00000000..524884fe Binary files /dev/null and b/cookbook/locale/fi/LC_MESSAGES/django.mo differ diff --git a/cookbook/locale/fi/LC_MESSAGES/django.po b/cookbook/locale/fi/LC_MESSAGES/django.po new file mode 100644 index 00000000..7daeabb7 --- /dev/null +++ b/cookbook/locale/fi/LC_MESSAGES/django.po @@ -0,0 +1,2510 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-11-04 12:31+0100\n" +"PO-Revision-Date: 2021-11-06 14:06+0000\n" +"Last-Translator: Nicklas Yli-Länttä \n" +"Language-Team: Finnish \n" +"Language: fi\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.8\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:272 +msgid "Ingredients" +msgstr "Ainesosat" + +#: .\cookbook\forms.py:53 +msgid "" +"Color of the top navigation bar. Not all colors work with all themes, just " +"try them out!" +msgstr "" + +#: .\cookbook\forms.py:55 +msgid "Default Unit to be used when inserting a new ingredient into a recipe." +msgstr "" + +#: .\cookbook\forms.py:57 +msgid "" +"Enables support for fractions in ingredient amounts (e.g. convert decimals " +"to fractions automatically)" +msgstr "" +"Mahdollistaa ainesosien määrien murto-osien tuen (esim. muuntaa desimaalit " +"murtoluvuiksi automaattisesti)" + +#: .\cookbook\forms.py:59 +msgid "Display nutritional energy amounts in joules instead of calories" +msgstr "Näytä ravitsemukselliset energiamäärä jouleina kalorien sijaan" + +#: .\cookbook\forms.py:61 +msgid "" +"Users with whom newly created meal plan/shopping list entries should be " +"shared by default." +msgstr "" + +#: .\cookbook\forms.py:63 +msgid "Show recently viewed recipes on search page." +msgstr "Näytä äskettäin katsotut reseptit hakusivulla." + +#: .\cookbook\forms.py:64 +msgid "Number of decimals to round ingredients." +msgstr "Ainesosien pyöristettävä desimaalien määrä." + +#: .\cookbook\forms.py:65 +msgid "If you want to be able to create and see comments underneath recipes." +msgstr "Jos haluat luoda ja nähdä kommentteja reseptien alla." + +#: .\cookbook\forms.py:67 +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. " +"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 "" + +#: .\cookbook\forms.py:70 +msgid "Makes the navbar stick to the top of the page." +msgstr "" + +#: .\cookbook\forms.py:86 +msgid "" +"Both fields are optional. If none are given the username will be displayed " +"instead" +msgstr "" + +#: .\cookbook\forms.py:107 .\cookbook\forms.py:266 +#: .\cookbook\templates\url_import.html:156 +msgid "Name" +msgstr "Nimi" + +#: .\cookbook\forms.py:108 .\cookbook\forms.py:267 +#: .\cookbook\templates\space.html:39 .\cookbook\templates\stats.html:24 +#: .\cookbook\templates\url_import.html:190 +#: .\cookbook\templates\url_import.html:575 .\cookbook\views\lists.py:112 +msgid "Keywords" +msgstr "" + +#: .\cookbook\forms.py:109 +msgid "Preparation time in minutes" +msgstr "" + +#: .\cookbook\forms.py:110 +msgid "Waiting time (cooking/baking) in minutes" +msgstr "" + +#: .\cookbook\forms.py:111 .\cookbook\forms.py:268 +msgid "Path" +msgstr "" + +#: .\cookbook\forms.py:112 +msgid "Storage UID" +msgstr "" + +#: .\cookbook\forms.py:140 +msgid "Default" +msgstr "" + +#: .\cookbook\forms.py:151 .\cookbook\templates\url_import.html:92 +msgid "" +"To prevent duplicates recipes with the same name as existing ones are " +"ignored. Check this box to import everything." +msgstr "" + +#: .\cookbook\forms.py:173 +msgid "Add your comment: " +msgstr "Lisää kommenttisi: " + +#: .\cookbook\forms.py:188 +msgid "Leave empty for dropbox and enter app password for nextcloud." +msgstr "Jätä tyhjäksi dropboxia varten ja anna salasana nextcloudia varten." + +#: .\cookbook\forms.py:195 +msgid "Leave empty for nextcloud and enter api token for dropbox." +msgstr "Jätä tyhjäksi nextcloudia varten ja anna dropbox api-avain tähän." + +#: .\cookbook\forms.py:204 +msgid "" +"Leave empty for dropbox and enter only base url for nextcloud (/remote." +"php/webdav/ is added automatically)" +msgstr "" +"Jätä tyhjäksi dropboxia varten ja anna nextcloudin osoite tähän " +"(/remote.php/webdav/ lisätään automaattisesti)" + +#: .\cookbook\forms.py:242 +msgid "Search String" +msgstr "Hakusana" + +#: .\cookbook\forms.py:269 +msgid "File ID" +msgstr "Tiedosto ID" + +#: .\cookbook\forms.py:290 +msgid "You must provide at least a recipe or a title." +msgstr "Sinun on annettava vähintään resepti tai otsikko." + +#: .\cookbook\forms.py:303 +msgid "You can list default users to share recipes with in the settings." +msgstr "" + +#: .\cookbook\forms.py:304 +msgid "" +"You can use markdown to format this field. See the docs here" +msgstr "" + +#: .\cookbook\forms.py:329 +msgid "Maximum number of users for this space reached." +msgstr "" + +#: .\cookbook\forms.py:335 +msgid "Email address already taken!" +msgstr "" + +#: .\cookbook\forms.py:343 +msgid "" +"An email address is not required but if present the invite link will be send " +"to the user." +msgstr "" + +#: .\cookbook\forms.py:358 +msgid "Name already taken." +msgstr "" + +#: .\cookbook\forms.py:369 +msgid "Accept Terms and Privacy" +msgstr "" + +#: .\cookbook\forms.py:399 +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:407 +msgid "" +"Select type method of search. Click here for " +"full desciption of choices." +msgstr "" + +#: .\cookbook\forms.py:408 +msgid "" +"Use fuzzy matching on units, keywords and ingredients when editing and " +"importing recipes." +msgstr "" + +#: .\cookbook\forms.py:409 +msgid "" +"Fields to search ignoring accents. Selecting this option can improve or " +"degrade search quality depending on language" +msgstr "" + +#: .\cookbook\forms.py:410 +msgid "" +"Fields to search for partial matches. (e.g. searching for 'Pie' will return " +"'pie' and 'piece' and 'soapie')" +msgstr "" + +#: .\cookbook\forms.py:411 +msgid "" +"Fields to search for beginning of word matches. (e.g. searching for 'sa' " +"will return 'salad' and 'sandwich')" +msgstr "" + +#: .\cookbook\forms.py:412 +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:413 +msgid "" +"Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " +"only function with fulltext fields." +msgstr "" + +#: .\cookbook\forms.py:417 +msgid "Search Method" +msgstr "" + +#: .\cookbook\forms.py:418 +msgid "Fuzzy Lookups" +msgstr "" + +#: .\cookbook\forms.py:419 +msgid "Ignore Accent" +msgstr "" + +#: .\cookbook\forms.py:420 +msgid "Partial Match" +msgstr "" + +#: .\cookbook\forms.py:421 +msgid "Starts Wtih" +msgstr "" + +#: .\cookbook\forms.py:422 +msgid "Fuzzy Search" +msgstr "" + +#: .\cookbook\forms.py:423 +msgid "Full Text" +msgstr "" + +#: .\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 "" + +#: .\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 "" + +#: .\cookbook\helper\permission_helper.py:140 +#: .\cookbook\helper\permission_helper.py:146 +#: .\cookbook\helper\permission_helper.py:171 +#: .\cookbook\helper\permission_helper.py:216 +#: .\cookbook\helper\permission_helper.py:230 +#: .\cookbook\helper\permission_helper.py:241 +#: .\cookbook\helper\permission_helper.py:252 .\cookbook\views\data.py:42 +#: .\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 "" + +#: .\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 "" + +#: .\cookbook\helper\template_helper.py:61 +#: .\cookbook\helper\template_helper.py:63 +msgid "Could not parse template code." +msgstr "" + +#: .\cookbook\integration\integration.py:126 +#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 +#: .\cookbook\templates\import_response.html:7 +#: .\cookbook\templates\test.html:14 .\cookbook\templates\test.html:20 +#: .\cookbook\templates\url_import.html:27 +#: .\cookbook\templates\url_import.html:103 +#: .\cookbook\templates\url_import.html:125 +#: .\cookbook\templates\url_import.html:319 +#: .\cookbook\templates\url_import.html:606 .\cookbook\views\delete.py:89 +#: .\cookbook\views\edit.py:197 +msgid "Import" +msgstr "" + +#: .\cookbook\integration\integration.py:208 +msgid "" +"Importer expected a .zip file. Did you choose the correct importer type for " +"your data ?" +msgstr "" + +#: .\cookbook\integration\integration.py:211 +msgid "" +"An unexpected error occurred during the import. Please make sure you have " +"uploaded a valid file." +msgstr "" + +#: .\cookbook\integration\integration.py:216 +msgid "The following recipes were ignored because they already existed:" +msgstr "" + +#: .\cookbook\integration\integration.py:220 +#, python-format +msgid "Imported %s recipes." +msgstr "" + +#: .\cookbook\integration\paprika.py:46 +msgid "Notes" +msgstr "" + +#: .\cookbook\integration\paprika.py:49 +msgid "Nutritional Information" +msgstr "" + +#: .\cookbook\integration\paprika.py:53 +msgid "Source" +msgstr "" + +#: .\cookbook\integration\safron.py:23 +#: .\cookbook\templates\include\log_cooking.html:16 +#: .\cookbook\templates\url_import.html:226 +#: .\cookbook\templates\url_import.html:457 +msgid "Servings" +msgstr "" + +#: .\cookbook\integration\safron.py:25 +msgid "Waiting time" +msgstr "" + +#: .\cookbook\integration\safron.py:27 +msgid "Preparation Time" +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 "" + +#: .\cookbook\integration\safron.py:31 +msgid "Section" +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:14 +msgid "Rebuilds full text search index on Recipe" +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:18 +msgid "Only Postgress databases use full text search, no index to rebuild" +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:29 +msgid "Recipe index rebuild complete." +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:31 +msgid "Recipe index rebuild failed." +msgstr "" + +#: .\cookbook\migrations\0047_auto_20200602_1133.py:14 +msgid "Breakfast" +msgstr "" + +#: .\cookbook\migrations\0047_auto_20200602_1133.py:19 +msgid "Lunch" +msgstr "" + +#: .\cookbook\migrations\0047_auto_20200602_1133.py:24 +msgid "Dinner" +msgstr "" + +#: .\cookbook\migrations\0047_auto_20200602_1133.py:29 +msgid "Other" +msgstr "" + +#: .\cookbook\models.py:150 +msgid "" +"Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " +"upload." +msgstr "" + +#: .\cookbook\models.py:202 .\cookbook\templates\search.html:7 +#: .\cookbook\templates\shopping_list.html:59 +msgid "Search" +msgstr "" + +#: .\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:217 .\cookbook\views\new.py:180 +msgid "Meal-Plan" +msgstr "" + +#: .\cookbook\models.py:204 .\cookbook\templates\base.html:90 +msgid "Books" +msgstr "" + +#: .\cookbook\models.py:212 +msgid "Small" +msgstr "" + +#: .\cookbook\models.py:212 +msgid "Large" +msgstr "" + +#: .\cookbook\models.py:212 .\cookbook\templates\generic\new_template.html:6 +#: .\cookbook\templates\generic\new_template.html:14 +msgid "New" +msgstr "" + +#: .\cookbook\models.py:396 +msgid " is part of a recipe step and cannot be deleted" +msgstr "" + +#: .\cookbook\models.py:441 +msgid "Text" +msgstr "" + +#: .\cookbook\models.py:441 +msgid "Time" +msgstr "" + +#: .\cookbook\models.py:441 +msgid "File" +msgstr "" + +#: .\cookbook\models.py:441 +#: .\cookbook\templates\include\recipe_open_modal.html:7 +#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:257 +#: .\cookbook\views\new.py:52 +msgid "Recipe" +msgstr "" + +#: .\cookbook\models.py:871 .\cookbook\templates\search_info.html:28 +msgid "Simple" +msgstr "" + +#: .\cookbook\models.py:872 .\cookbook\templates\search_info.html:33 +msgid "Phrase" +msgstr "" + +#: .\cookbook\models.py:873 .\cookbook\templates\search_info.html:38 +msgid "Web" +msgstr "" + +#: .\cookbook\models.py:874 .\cookbook\templates\search_info.html:47 +msgid "Raw" +msgstr "" + +#: .\cookbook\models.py:912 +msgid "Food Alias" +msgstr "" + +#: .\cookbook\models.py:912 +msgid "Unit Alias" +msgstr "" + +#: .\cookbook\models.py:912 +msgid "Keyword Alias" +msgstr "" + +#: .\cookbook\serializer.py:157 +msgid "File uploads are not enabled for this Space." +msgstr "" + +#: .\cookbook\serializer.py:168 +msgid "You have reached your file upload limit." +msgstr "" + +#: .\cookbook\tables.py:35 .\cookbook\templates\generic\edit_template.html:6 +#: .\cookbook\templates\generic\edit_template.html:14 +#: .\cookbook\templates\recipes_table.html:82 +#: .\cookbook\templates\shopping_list.html:40 +#: .\cookbook\templates\space.html:90 +msgid "Edit" +msgstr "" + +#: .\cookbook\tables.py:115 .\cookbook\tables.py:138 +#: .\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 "" + +#: .\cookbook\templates\404.html:5 +msgid "404 Error" +msgstr "" + +#: .\cookbook\templates\404.html:18 +msgid "The page you are looking for could not be found." +msgstr "" + +#: .\cookbook\templates\404.html:33 +msgid "Take me Home" +msgstr "" + +#: .\cookbook\templates\404.html:35 +msgid "Report a Bug" +msgstr "" + +#: .\cookbook\templates\account\email.html:6 +#: .\cookbook\templates\account\email.html:17 +msgid "E-mail Addresses" +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:257 .\cookbook\templates\settings.html:6 +#: .\cookbook\templates\settings.html:17 +#: .\cookbook\templates\socialaccount\connections.html:10 +msgid "Settings" +msgstr "" + +#: .\cookbook\templates\account\email.html:13 +msgid "Email" +msgstr "" + +#: .\cookbook\templates\account\email.html:19 +msgid "The following e-mail addresses are associated with your account:" +msgstr "" + +#: .\cookbook\templates\account\email.html:36 +msgid "Verified" +msgstr "" + +#: .\cookbook\templates\account\email.html:38 +msgid "Unverified" +msgstr "" + +#: .\cookbook\templates\account\email.html:40 +msgid "Primary" +msgstr "" + +#: .\cookbook\templates\account\email.html:47 +msgid "Make Primary" +msgstr "" + +#: .\cookbook\templates\account\email.html:49 +msgid "Re-send Verification" +msgstr "" + +#: .\cookbook\templates\account\email.html:50 +#: .\cookbook\templates\generic\delete_template.html:56 +#: .\cookbook\templates\socialaccount\connections.html:44 +msgid "Remove" +msgstr "" + +#: .\cookbook\templates\account\email.html:58 +msgid "Warning:" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\account\email.html:64 +msgid "Add E-mail Address" +msgstr "" + +#: .\cookbook\templates\account\email.html:69 +msgid "Add E-mail" +msgstr "" + +#: .\cookbook\templates\account\email.html:79 +msgid "Do you really want to remove the selected e-mail address?" +msgstr "" + +#: .\cookbook\templates\account\email_confirm.html:6 +#: .\cookbook\templates\account\email_confirm.html:10 +msgid "Confirm E-mail Address" +msgstr "" + +#: .\cookbook\templates\account\email_confirm.html:16 +#, python-format +msgid "" +"Please confirm that\n" +" %(email)s is an e-mail address " +"for user %(user_display)s\n" +" ." +msgstr "" + +#: .\cookbook\templates\account\email_confirm.html:22 +#: .\cookbook\templates\generic\delete_template.html:71 +msgid "Confirm" +msgstr "" + +#: .\cookbook\templates\account\email_confirm.html:29 +#, python-format +msgid "" +"This e-mail confirmation link expired or is invalid. Please\n" +" issue a new e-mail confirmation " +"request." +msgstr "" + +#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:289 +msgid "Login" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\account\login.html:32 +#: .\cookbook\templates\socialaccount\signup.html:8 +#: .\cookbook\templates\socialaccount\signup.html:57 +msgid "Sign Up" +msgstr "" + +#: .\cookbook\templates\account\login.html:36 +#: .\cookbook\templates\account\login.html:37 +#: .\cookbook\templates\account\password_reset.html:29 +msgid "Reset My Password" +msgstr "" + +#: .\cookbook\templates\account\login.html:37 +msgid "Lost your password?" +msgstr "" + +#: .\cookbook\templates\account\login.html:48 +msgid "Social Login" +msgstr "" + +#: .\cookbook\templates\account\login.html:49 +msgid "You can use any of the following providers to sign in." +msgstr "" + +#: .\cookbook\templates\account\logout.html:5 +#: .\cookbook\templates\account\logout.html:9 +#: .\cookbook\templates\account\logout.html:18 +msgid "Sign Out" +msgstr "" + +#: .\cookbook\templates\account\logout.html:11 +msgid "Are you sure you want to sign out?" +msgstr "" + +#: .\cookbook\templates\account\password_change.html:6 +#: .\cookbook\templates\account\password_change.html:16 +#: .\cookbook\templates\account\password_change.html:21 +#: .\cookbook\templates\account\password_reset_from_key.html:7 +#: .\cookbook\templates\account\password_reset_from_key.html:13 +#: .\cookbook\templates\account\password_reset_from_key_done.html:7 +#: .\cookbook\templates\account\password_reset_from_key_done.html:13 +msgid "Change Password" +msgstr "" + +#: .\cookbook\templates\account\password_change.html:12 +#: .\cookbook\templates\account\password_set.html:12 +#: .\cookbook\templates\settings.html:69 +msgid "Password" +msgstr "" + +#: .\cookbook\templates\account\password_change.html:22 +msgid "Forgot Password?" +msgstr "" + +#: .\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 "" + +#: .\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 "" + +#: .\cookbook\templates\account\password_reset.html:32 +msgid "Password reset is disabled on this instance." +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\account\password_reset_from_key.html:13 +msgid "Bad Token" +msgstr "" + +#: .\cookbook\templates\account\password_reset_from_key.html:25 +#, python-format +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used.\n" +" Please request a new " +"password reset." +msgstr "" + +#: .\cookbook\templates\account\password_reset_from_key.html:33 +msgid "change password" +msgstr "" + +#: .\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 "" + +#: .\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 "" + +#: .\cookbook\templates\account\signup.html:6 +msgid "Register" +msgstr "" + +#: .\cookbook\templates\account\signup.html:12 +msgid "Create an Account" +msgstr "" + +#: .\cookbook\templates\account\signup.html:42 +#: .\cookbook\templates\socialaccount\signup.html:33 +msgid "I accept the follwoing" +msgstr "" + +#: .\cookbook\templates\account\signup.html:45 +#: .\cookbook\templates\socialaccount\signup.html:36 +msgid "Terms and Conditions" +msgstr "" + +#: .\cookbook\templates\account\signup.html:48 +#: .\cookbook\templates\socialaccount\signup.html:39 +msgid "and" +msgstr "" + +#: .\cookbook\templates\account\signup.html:52 +#: .\cookbook\templates\socialaccount\signup.html:43 +msgid "Privacy Policy" +msgstr "" + +#: .\cookbook\templates\account\signup.html:65 +msgid "Create User" +msgstr "" + +#: .\cookbook\templates\account\signup.html:69 +msgid "Already have an account?" +msgstr "" + +#: .\cookbook\templates\account\signup_closed.html:5 +#: .\cookbook\templates\account\signup_closed.html:11 +msgid "Sign Up Closed" +msgstr "" + +#: .\cookbook\templates\account\signup_closed.html:13 +msgid "We are sorry, but the sign up is currently closed." +msgstr "" + +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:279 +#: .\cookbook\templates\rest_framework\api.html:11 +msgid "API Documentation" +msgstr "" + +#: .\cookbook\templates\base.html:86 +msgid "Shopping" +msgstr "" + +#: .\cookbook\templates\base.html:113 +msgid "Keyword" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\base.html:151 +#: .\cookbook\templates\shopping_list.html:237 +#: .\cookbook\templates\supermarket.html:7 +msgid "Supermarket" +msgstr "" + +#: .\cookbook\templates\base.html:163 +msgid "Supermarket Category" +msgstr "" + +#: .\cookbook\templates\base.html:175 .\cookbook\views\lists.py:195 +msgid "Automations" +msgstr "" + +#: .\cookbook\templates\base.html:189 .\cookbook\views\lists.py:215 +msgid "Files" +msgstr "" + +#: .\cookbook\templates\base.html:201 +msgid "Batch Edit" +msgstr "" + +#: .\cookbook\templates\base.html:213 .\cookbook\templates\history.html:6 +#: .\cookbook\templates\history.html:14 +msgid "History" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\base.html:244 .\cookbook\templates\index.html:47 +msgid "Import Recipe" +msgstr "" + +#: .\cookbook\templates\base.html:246 +#: .\cookbook\templates\shopping_list.html:195 +#: .\cookbook\templates\shopping_list.html:217 +msgid "Create" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\base.html:262 .\cookbook\templates\space.html:7 +#: .\cookbook\templates\space.html:19 +msgid "Space Settings" +msgstr "" + +#: .\cookbook\templates\base.html:267 .\cookbook\templates\system.html:13 +msgid "System" +msgstr "" + +#: .\cookbook\templates\base.html:269 +msgid "Admin" +msgstr "" + +#: .\cookbook\templates\base.html:273 +msgid "Markdown Guide" +msgstr "" + +#: .\cookbook\templates\base.html:275 +msgid "GitHub" +msgstr "" + +#: .\cookbook\templates\base.html:277 +msgid "Translate Tandoor" +msgstr "" + +#: .\cookbook\templates\base.html:281 +msgid "API Browser" +msgstr "" + +#: .\cookbook\templates\base.html:284 +msgid "Log out" +msgstr "" + +#: .\cookbook\templates\batch\edit.html:6 +msgid "Batch edit Category" +msgstr "" + +#: .\cookbook\templates\batch\edit.html:15 +msgid "Batch edit Recipes" +msgstr "" + +#: .\cookbook\templates\batch\edit.html:20 +msgid "Add the specified keywords to all recipes containing a word" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:83 +msgid "Sync" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:10 +msgid "Manage watched Folders" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:14 +msgid "" +"On this Page you can manage all storage folder locations that should be " +"monitored and synced." +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:16 +msgid "The path must be in the following format" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:21 +msgid "Manage External Storage" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:28 +msgid "Sync Now!" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:29 +msgid "Show Recipes" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:30 +msgid "Show Log" +msgstr "" + +#: .\cookbook\templates\batch\waiting.html:4 +#: .\cookbook\templates\batch\waiting.html:10 +msgid "Importing Recipes" +msgstr "" + +#: .\cookbook\templates\batch\waiting.html:28 +msgid "" +"This can take a few minutes, depending on the number of recipes in sync, " +"please wait." +msgstr "" + +#: .\cookbook\templates\books.html:7 +msgid "Recipe Books" +msgstr "" + +#: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6 +msgid "Export Recipes" +msgstr "" + +#: .\cookbook\templates\forms\edit_import_recipe.html:5 +#: .\cookbook\templates\forms\edit_import_recipe.html:9 +msgid "Import new Recipe" +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\include\log_cooking.html:28 +#: .\cookbook\templates\settings.html:63 .\cookbook\templates\settings.html:105 +#: .\cookbook\templates\settings.html:123 +#: .\cookbook\templates\settings.html:195 +#: .\cookbook\templates\shopping_list.html:360 +msgid "Save" +msgstr "" + +#: .\cookbook\templates\forms\edit_internal_recipe.html:7 +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 " +msgstr "" + +#: .\cookbook\templates\generic\delete_template.html:26 +msgid "Protected" +msgstr "" + +#: .\cookbook\templates\generic\delete_template.html:41 +msgid "Cascade" +msgstr "" + +#: .\cookbook\templates\generic\delete_template.html:72 +msgid "Cancel" +msgstr "" + +#: .\cookbook\templates\generic\edit_template.html:32 +msgid "View" +msgstr "" + +#: .\cookbook\templates\generic\edit_template.html:36 +msgid "Delete original file" +msgstr "" + +#: .\cookbook\templates\generic\list_template.html:6 +#: .\cookbook\templates\generic\list_template.html:21 +msgid "List" +msgstr "" + +#: .\cookbook\templates\generic\list_template.html:34 +msgid "Filter" +msgstr "" + +#: .\cookbook\templates\generic\list_template.html:39 +msgid "Import all" +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 "" + +#: .\cookbook\templates\history.html:20 +msgid "View Log" +msgstr "" + +#: .\cookbook\templates\history.html:24 +msgid "Cook Log" +msgstr "" + +#: .\cookbook\templates\import.html:6 .\cookbook\templates\test.html:6 +msgid "Import Recipes" +msgstr "" + +#: .\cookbook\templates\include\log_cooking.html:7 +msgid "Log Recipe Cooking" +msgstr "" + +#: .\cookbook\templates\include\log_cooking.html:13 +msgid "All fields are optional and can be left empty." +msgstr "" + +#: .\cookbook\templates\include\log_cooking.html:19 +msgid "Rating" +msgstr "" + +#: .\cookbook\templates\include\log_cooking.html:27 +#: .\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 "" + +#: .\cookbook\templates\include\storage_backend_warning.html:5 +msgid "" +"\n" +" The Password and Token field are stored as plain text " +"inside the database.\n" +" This is necessary because they are needed to make API requests, but " +"it also increases the risk of\n" +" someone stealing it.
\n" +" To limit the possible damage tokens or accounts with limited access " +"can be used.\n" +" " +msgstr "" + +#: .\cookbook\templates\index.html:29 +msgid "Search recipe ..." +msgstr "" + +#: .\cookbook\templates\index.html:44 +msgid "New Recipe" +msgstr "" + +#: .\cookbook\templates\index.html:53 +msgid "Advanced Search" +msgstr "" + +#: .\cookbook\templates\index.html:57 +msgid "Reset Search" +msgstr "" + +#: .\cookbook\templates\index.html:85 +msgid "Last viewed" +msgstr "" + +#: .\cookbook\templates\index.html:87 .\cookbook\templates\space.html:35 +#: .\cookbook\templates\stats.html:22 +msgid "Recipes" +msgstr "" + +#: .\cookbook\templates\index.html:94 +msgid "Log in to view recipes" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:5 +#: .\cookbook\templates\markdown_info.html:13 +msgid "Markdown Info" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:14 +msgid "" +"\n" +" Markdown is lightweight markup language that can be used to format " +"plain text easily.\n" +" This site uses the Python Markdown library to\n" +" convert your text into nice looking HTML. Its full markdown " +"documentation can be found\n" +" here.\n" +" An incomplete but most likely sufficient documentation can be found " +"below.\n" +" " +msgstr "" + +#: .\cookbook\templates\markdown_info.html:25 +msgid "Headers" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:54 +msgid "Formatting" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\markdown_info.html:57 +#: .\cookbook\templates\markdown_info.html:73 +msgid "or by leaving a blank line inbetween." +msgstr "" + +#: .\cookbook\templates\markdown_info.html:59 +#: .\cookbook\templates\markdown_info.html:74 +msgid "This text is bold" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:60 +#: .\cookbook\templates\markdown_info.html:75 +msgid "This text is italic" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:61 +#: .\cookbook\templates\markdown_info.html:77 +msgid "Blockquotes are also possible" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:84 +msgid "Lists" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:85 +msgid "" +"Lists can ordered or unorderd. It is important to leave a blank line " +"before the list!" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:87 +#: .\cookbook\templates\markdown_info.html:108 +msgid "Ordered List" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:89 +#: .\cookbook\templates\markdown_info.html:90 +#: .\cookbook\templates\markdown_info.html:91 +#: .\cookbook\templates\markdown_info.html:110 +#: .\cookbook\templates\markdown_info.html:111 +#: .\cookbook\templates\markdown_info.html:112 +msgid "unordered list item" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:93 +#: .\cookbook\templates\markdown_info.html:114 +msgid "Unordered List" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:95 +#: .\cookbook\templates\markdown_info.html:96 +#: .\cookbook\templates\markdown_info.html:97 +#: .\cookbook\templates\markdown_info.html:116 +#: .\cookbook\templates\markdown_info.html:117 +#: .\cookbook\templates\markdown_info.html:118 +msgid "ordered list item" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:125 +msgid "Images & Links" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\markdown_info.html:132 +#: .\cookbook\templates\markdown_info.html:145 +msgid "This will become an image" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:152 +msgid "Tables" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:153 +msgid "" +"Markdown tables are hard to create by hand. It is recommended to use a table " +"editor like this one." +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\markdown_info.html:155 +#: .\cookbook\templates\markdown_info.html:172 +msgid "Header" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:157 +#: .\cookbook\templates\markdown_info.html:178 +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 +#: .\cookbook\templates\shopping_list.html:261 +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" +msgstr "" + +#: .\cookbook\templates\no_groups_info.html:17 +msgid "You do not have any groups and therefor cannot use this application." +msgstr "" + +#: .\cookbook\templates\no_groups_info.html:18 +#: .\cookbook\templates\no_perm_info.html:15 +msgid "Please contact your administrator." +msgstr "" + +#: .\cookbook\templates\no_perm_info.html:5 +#: .\cookbook\templates\no_perm_info.html:12 +msgid "No Permission" +msgstr "" + +#: .\cookbook\templates\no_perm_info.html:15 +msgid "" +"You do not have the required permissions to view this page or perform this " +"action." +msgstr "" + +#: .\cookbook\templates\no_space_info.html:6 +#: .\cookbook\templates\no_space_info.html:13 +msgid "No Space" +msgstr "" + +#: .\cookbook\templates\no_space_info.html:17 +msgid "" +"Recipes, foods, shopping lists and more are organized in spaces of one or " +"more people." +msgstr "" + +#: .\cookbook\templates\no_space_info.html:18 +msgid "" +"You can either be invited into an existing space or create your own one." +msgstr "" + +#: .\cookbook\templates\no_space_info.html:31 +#: .\cookbook\templates\no_space_info.html:40 +msgid "Join Space" +msgstr "" + +#: .\cookbook\templates\no_space_info.html:34 +msgid "Join an existing space." +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\no_space_info.html:48 +#: .\cookbook\templates\no_space_info.html:56 +msgid "Create Space" +msgstr "" + +#: .\cookbook\templates\no_space_info.html:51 +msgid "Create your own recipe space." +msgstr "" + +#: .\cookbook\templates\no_space_info.html:52 +msgid "Start your own recipe space and invite other users to it." +msgstr "" + +#: .\cookbook\templates\offline.html:6 +msgid "Offline" +msgstr "" + +#: .\cookbook\templates\offline.html:19 +msgid "You are currently offline!" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\recipe_view.html:21 .\cookbook\templates\space.html:62 +#: .\cookbook\templates\stats.html:47 +msgid "Comments" +msgstr "" + +#: .\cookbook\templates\recipe_view.html:26 +msgid "by" +msgstr "" + +#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:147 +#: .\cookbook\views\edit.py:177 +msgid "Comment" +msgstr "" + +#: .\cookbook\templates\recipes_table.html:19 +#: .\cookbook\templates\recipes_table.html:23 +#: .\cookbook\templates\url_import.html:442 +msgid "Recipe Image" +msgstr "" + +#: .\cookbook\templates\recipes_table.html:51 +#: .\cookbook\templates\url_import.html:447 +msgid "Preparation time ca." +msgstr "" + +#: .\cookbook\templates\recipes_table.html:57 +#: .\cookbook\templates\url_import.html:452 +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:165 +msgid "Search Settings" +msgstr "" + +#: .\cookbook\templates\search_info.html:10 +msgid "" +"\n" +" Creating the best search experience is complicated and weighs " +"heavily on your personal configuration. \n" +" Changing any of the search settings can have significant impact on " +"the speed and quality of the results.\n" +" Search Methods, Trigrams and Full Text Search configurations are " +"only available if you are using Postgres for your database.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:19 +msgid "Search Methods" +msgstr "" + +#: .\cookbook\templates\search_info.html:23 +msgid "" +" \n" +" Full text searches attempt to normalize the words provided to " +"match common variants. For example: 'forked', 'forking', 'forks' will all " +"normalize to 'fork'.\n" +" There are several methods available, described below, that will " +"control how the search behavior should react when multiple words are " +"searched.\n" +" Full technical details on how these operate can be viewed on Postgresql's website.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:29 +msgid "" +" \n" +" Simple searches ignore punctuation and common words such as " +"'the', 'a', 'and'. And will treat seperate words as required.\n" +" Searching for 'apple or flour' will return any recipe that " +"includes both 'apple' and 'flour' anywhere in the fields that have been " +"selected for a full text search.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:34 +msgid "" +" \n" +" Phrase searches ignore punctuation, but will search for all of " +"the words in the exact order provided.\n" +" Searching for 'apple or flour' will only return a recipe that " +"includes the exact phrase 'apple or flour' in any of the fields that have " +"been selected for a full text search.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:39 +msgid "" +" \n" +" Web searches simulate functionality found on many web search " +"sites supporting special syntax.\n" +" Placing quotes around several words will convert those words " +"into a phrase.\n" +" 'or' is recongized as searching for the word (or phrase) " +"immediately before 'or' OR the word (or phrase) directly after.\n" +" '-' is recognized as searching for recipes that do not include " +"the word (or phrase) that comes immediately after. \n" +" For example searching for 'apple pie' or cherry -butter will " +"return any recipe that includes the phrase 'apple pie' or the word " +"'cherry' \n" +" in any field included in the full text search but exclude any " +"recipe that has the word 'butter' in any field included.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:48 +msgid "" +" \n" +" Raw search is similar to Web except will take puncuation " +"operators such as '|', '&' and '()'\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:59 +msgid "" +" \n" +" Another approach to searching that also requires Postgresql is " +"fuzzy search or trigram similarity. A trigram is a group of three " +"consecutive characters.\n" +" For example searching for 'apple' will create x trigrams 'app', " +"'ppl', 'ple' and will create a score of how closely words match the " +"generated trigrams.\n" +" One benefit of searching trigams is that a search for 'sandwich' " +"will find mispelled words such as 'sandwhich' that would be missed by other " +"methods.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:69 +msgid "Search Fields" +msgstr "" + +#: .\cookbook\templates\search_info.html:73 +msgid "" +" \n" +" Unaccent is a special case in that it enables searching a field " +"'unaccented' for each search style attempting to ignore accented values. \n" +" For example when you enable unaccent for 'Name' any search " +"(starts with, contains, trigram) will attempt the search ignoring accented " +"characters.\n" +" \n" +" For the other options, you can enable search on any or all " +"fields and they will be combined together with an assumed 'OR'.\n" +" For example enabling 'Name' for Starts With, 'Name' and " +"'Description' for Partial Match and 'Ingredients' and 'Keywords' for Full " +"Search\n" +" and searching for 'apple' will generate a search that will " +"return recipes that have:\n" +" - A recipe name that starts with 'apple'\n" +" - OR a recipe name that contains 'apple'\n" +" - OR a recipe description that contains 'apple'\n" +" - OR a recipe that will have a full text search match ('apple' " +"or 'apples') in ingredients\n" +" - OR a recipe that will have a full text search match in " +"Keywords\n" +"\n" +" Combining too many fields in too many types of search can have a " +"negative impact on performance, create duplicate results or return " +"unexpected results.\n" +" For example, enabling fuzzy search or partial matches will " +"interfere with web search methods. \n" +" Searching for 'apple -pie' with fuzzy search and full text " +"search will return the recipe Apple Pie. Though it is not included in the " +"full text results, it does match the trigram results.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:95 +msgid "Search Index" +msgstr "" + +#: .\cookbook\templates\search_info.html:99 +msgid "" +" \n" +" Trigram search and Full Text Search both rely on database " +"indexes to perform effectively. \n" +" You can rebuild the indexes on all fields in the Admin page for " +"Recipes and selecting all recipes and running 'rebuild index for selected " +"recipes'\n" +" You can also rebuild indexes at the command line by executing " +"the management command 'python manage.py rebuildindex'\n" +" " +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:58 +msgid "Name Settings" +msgstr "" + +#: .\cookbook\templates\settings.html:66 +msgid "Account Settings" +msgstr "" + +#: .\cookbook\templates\settings.html:68 +msgid "Emails" +msgstr "" + +#: .\cookbook\templates\settings.html:71 +#: .\cookbook\templates\socialaccount\connections.html:11 +msgid "Social" +msgstr "" + +#: .\cookbook\templates\settings.html:84 +msgid "Language" +msgstr "" + +#: .\cookbook\templates\settings.html:114 +msgid "Style" +msgstr "" + +#: .\cookbook\templates\settings.html:135 +msgid "API Token" +msgstr "" + +#: .\cookbook\templates\settings.html:136 +msgid "" +"You can use both basic authentication and token based authentication to " +"access the REST API." +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\settings.html:155 +msgid "or" +msgstr "" + +#: .\cookbook\templates\settings.html:166 +msgid "" +"There are many options to configure the search depending on your personal " +"preferences." +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\settings.html:168 +msgid "" +"If you do want to configure the search you can read about the different " +"options here." +msgstr "" + +#: .\cookbook\templates\settings.html:173 +msgid "Fuzzy" +msgstr "" + +#: .\cookbook\templates\settings.html:174 +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:175 +msgid "This is the default behavior" +msgstr "" + +#: .\cookbook\templates\settings.html:176 +#: .\cookbook\templates\settings.html:184 +msgid "Apply" +msgstr "" + +#: .\cookbook\templates\settings.html:181 +msgid "Precise" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\settings.html:183 +msgid "Perfect for large Databases" +msgstr "" + +#: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5 +msgid "Cookbook Setup" +msgstr "" + +#: .\cookbook\templates\setup.html:14 +msgid "Setup" +msgstr "" + +#: .\cookbook\templates\setup.html:15 +msgid "" +"To start using this application you must first create a superuser account." +msgstr "" + +#: .\cookbook\templates\setup.html:20 +msgid "Create Superuser account" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:7 +#: .\cookbook\templates\shopping_list.html:29 +#: .\cookbook\templates\shopping_list.html:721 +msgid "Shopping List" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:34 +msgid "Try the new shopping list" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:63 +msgid "Search Recipe" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:86 +msgid "Shopping Recipes" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:90 +msgid "No recipes selected" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:157 +msgid "Entry Mode" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:165 +msgid "Add Entry" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:181 +msgid "Amount" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:194 +msgid "Select Unit" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:196 +#: .\cookbook\templates\shopping_list.html:218 +#: .\cookbook\templates\shopping_list.html:248 +#: .\cookbook\templates\shopping_list.html:272 +#: .\cookbook\templates\url_import.html:497 +#: .\cookbook\templates\url_import.html:529 +msgid "Select" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:216 +msgid "Select Food" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:247 +msgid "Select Supermarket" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:271 +msgid "Select User" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:290 +msgid "Finished" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:303 +msgid "You are offline, shopping list might not syncronize." +msgstr "" + +#: .\cookbook\templates\shopping_list.html:368 +msgid "Copy/Export" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:372 +msgid "List Prefix" +msgstr "" + +#: .\cookbook\templates\socialaccount\connections.html:4 +#: .\cookbook\templates\socialaccount\connections.html:15 +msgid "Account Connections" +msgstr "" + +#: .\cookbook\templates\socialaccount\connections.html:18 +msgid "" +"You can sign in to your account using any of the following third party\n" +" accounts:" +msgstr "" + +#: .\cookbook\templates\socialaccount\connections.html:52 +msgid "" +"You currently have no social network accounts connected to this account." +msgstr "" + +#: .\cookbook\templates\socialaccount\connections.html:55 +msgid "Add a 3rd Party Account" +msgstr "" + +#: .\cookbook\templates\socialaccount\signup.html:5 +msgid "Signup" +msgstr "" + +#: .\cookbook\templates\socialaccount\signup.html:10 +#, python-format +msgid "" +"You are about to use your\n" +" %(provider_name)s account to login to\n" +" %(site_name)s. As a final step, please complete the following form:" +msgstr "" + +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:23 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:31 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:39 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:47 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:55 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:63 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:71 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:79 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:87 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:95 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:103 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:111 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:119 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:127 +msgid "Sign in using" +msgstr "" + +#: .\cookbook\templates\space.html:23 +msgid "Space:" +msgstr "" + +#: .\cookbook\templates\space.html:24 +msgid "Manage Subscription" +msgstr "" + +#: .\cookbook\templates\space.html:32 .\cookbook\templates\stats.html:19 +msgid "Number of objects" +msgstr "" + +#: .\cookbook\templates\space.html:45 .\cookbook\templates\stats.html:30 +msgid "Recipe Imports" +msgstr "" + +#: .\cookbook\templates\space.html:53 .\cookbook\templates\stats.html:38 +msgid "Objects stats" +msgstr "" + +#: .\cookbook\templates\space.html:56 .\cookbook\templates\stats.html:41 +msgid "Recipes without Keywords" +msgstr "" + +#: .\cookbook\templates\space.html:60 .\cookbook\templates\stats.html:45 +msgid "Internal Recipes" +msgstr "" + +#: .\cookbook\templates\space.html:73 +msgid "Members" +msgstr "" + +#: .\cookbook\templates\space.html:77 +msgid "Invite User" +msgstr "" + +#: .\cookbook\templates\space.html:88 +msgid "User" +msgstr "" + +#: .\cookbook\templates\space.html:89 +msgid "Groups" +msgstr "" + +#: .\cookbook\templates\space.html:105 +msgid "admin" +msgstr "" + +#: .\cookbook\templates\space.html:106 +msgid "user" +msgstr "" + +#: .\cookbook\templates\space.html:107 +msgid "guest" +msgstr "" + +#: .\cookbook\templates\space.html:108 +msgid "remove" +msgstr "" + +#: .\cookbook\templates\space.html:112 +msgid "Update" +msgstr "" + +#: .\cookbook\templates\space.html:116 +msgid "You cannot edit yourself." +msgstr "" + +#: .\cookbook\templates\space.html:123 +msgid "There are no members in your space yet!" +msgstr "" + +#: .\cookbook\templates\space.html:130 .\cookbook\templates\system.html:21 +#: .\cookbook\views\lists.py:100 +msgid "Invite Links" +msgstr "" + +#: .\cookbook\templates\stats.html:4 +msgid "Stats" +msgstr "" + +#: .\cookbook\templates\stats.html:10 +msgid "Statistics" +msgstr "" + +#: .\cookbook\templates\system.html:22 +msgid "Show Links" +msgstr "" + +#: .\cookbook\templates\system.html:32 +msgid "System Information" +msgstr "" + +#: .\cookbook\templates\system.html:34 +msgid "" +"\n" +" Django Recipes is an open source free software application. It can " +"be found on\n" +" GitHub.\n" +" Changelogs can be found here.\n" +" " +msgstr "" + +#: .\cookbook\templates\system.html:48 +msgid "Media Serving" +msgstr "" + +#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 +#: .\cookbook\templates\system.html:80 +msgid "Warning" +msgstr "" + +#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 +#: .\cookbook\templates\system.html:80 .\cookbook\templates\system.html:95 +msgid "Ok" +msgstr "" + +#: .\cookbook\templates\system.html:51 +msgid "" +"Serving media files directly using gunicorn/python is not recommend!\n" +" Please follow the steps described\n" +" here to update\n" +" your installation.\n" +" " +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\system.html:62 +msgid "Secret Key" +msgstr "" + +#: .\cookbook\templates\system.html:66 +msgid "" +"\n" +" You do not have a SECRET_KEY configured in your " +".env file. Django defaulted to the\n" +" standard key\n" +" provided with the installation which is publicly know and " +"insecure! Please set\n" +" SECRET_KEY int the .env configuration " +"file.\n" +" " +msgstr "" + +#: .\cookbook\templates\system.html:78 +msgid "Debug Mode" +msgstr "" + +#: .\cookbook\templates\system.html:82 +msgid "" +"\n" +" This application is still running in debug mode. This is most " +"likely not needed. Turn of debug mode by\n" +" setting\n" +" DEBUG=0 int the .env configuration " +"file.\n" +" " +msgstr "" + +#: .\cookbook\templates\system.html:93 +msgid "Database" +msgstr "" + +#: .\cookbook\templates\system.html:95 +msgid "Info" +msgstr "" + +#: .\cookbook\templates\system.html:97 +msgid "" +"\n" +" This application is not running with a Postgres database " +"backend. This is ok but not recommended as some\n" +" features only work with postgres databases.\n" +" " +msgstr "" + +#: .\cookbook\templates\url_import.html:6 +msgid "URL Import" +msgstr "" + +#: .\cookbook\templates\url_import.html:31 +msgid "Drag me to your bookmarks to import recipes from anywhere" +msgstr "" + +#: .\cookbook\templates\url_import.html:32 +msgid "Bookmark Me!" +msgstr "" + +#: .\cookbook\templates\url_import.html:61 +msgid "Enter website URL" +msgstr "" + +#: .\cookbook\templates\url_import.html:99 +msgid "Select recipe files to import or drop them here..." +msgstr "" + +#: .\cookbook\templates\url_import.html:120 +msgid "Paste json or html source here to load recipe." +msgstr "" + +#: .\cookbook\templates\url_import.html:148 +msgid "Preview Recipe Data" +msgstr "" + +#: .\cookbook\templates\url_import.html:149 +msgid "Drag recipe attributes from the right into the appropriate box below." +msgstr "" + +#: .\cookbook\templates\url_import.html:158 +#: .\cookbook\templates\url_import.html:175 +#: .\cookbook\templates\url_import.html:192 +#: .\cookbook\templates\url_import.html:211 +#: .\cookbook\templates\url_import.html:229 +#: .\cookbook\templates\url_import.html:244 +#: .\cookbook\templates\url_import.html:259 +#: .\cookbook\templates\url_import.html:275 +#: .\cookbook\templates\url_import.html:302 +#: .\cookbook\templates\url_import.html:353 +msgid "Clear Contents" +msgstr "" + +#: .\cookbook\templates\url_import.html:160 +msgid "Text dragged here will be appended to the name." +msgstr "" + +#: .\cookbook\templates\url_import.html:173 +msgid "Description" +msgstr "" + +#: .\cookbook\templates\url_import.html:177 +msgid "Text dragged here will be appended to the description." +msgstr "" + +#: .\cookbook\templates\url_import.html:194 +msgid "Keywords dragged here will be appended to current list" +msgstr "" + +#: .\cookbook\templates\url_import.html:209 +msgid "Image" +msgstr "" + +#: .\cookbook\templates\url_import.html:241 +msgid "Prep Time" +msgstr "" + +#: .\cookbook\templates\url_import.html:256 +msgid "Cook Time" +msgstr "" + +#: .\cookbook\templates\url_import.html:277 +msgid "Ingredients dragged here will be appended to current list." +msgstr "" + +#: .\cookbook\templates\url_import.html:299 +#: .\cookbook\templates\url_import.html:569 +msgid "Instructions" +msgstr "" + +#: .\cookbook\templates\url_import.html:304 +msgid "" +"Recipe instructions dragged here will be appended to current instructions." +msgstr "" + +#: .\cookbook\templates\url_import.html:327 +msgid "Discovered Attributes" +msgstr "" + +#: .\cookbook\templates\url_import.html:329 +msgid "" +"Drag recipe attributes from below into the appropriate box on the left. " +"Click any node to display its full properties." +msgstr "" + +#: .\cookbook\templates\url_import.html:346 +msgid "Show Blank Field" +msgstr "" + +#: .\cookbook\templates\url_import.html:351 +msgid "Blank Field" +msgstr "" + +#: .\cookbook\templates\url_import.html:355 +msgid "Items dragged to Blank Field will be appended." +msgstr "" + +#: .\cookbook\templates\url_import.html:402 +msgid "Delete Text" +msgstr "" + +#: .\cookbook\templates\url_import.html:415 +msgid "Delete image" +msgstr "" + +#: .\cookbook\templates\url_import.html:431 +msgid "Recipe Name" +msgstr "" + +#: .\cookbook\templates\url_import.html:435 +msgid "Recipe Description" +msgstr "" + +#: .\cookbook\templates\url_import.html:496 +#: .\cookbook\templates\url_import.html:528 +#: .\cookbook\templates\url_import.html:584 +msgid "Select one" +msgstr "" + +#: .\cookbook\templates\url_import.html:544 +msgid "Note" +msgstr "" + +#: .\cookbook\templates\url_import.html:585 +msgid "Add Keyword" +msgstr "" + +#: .\cookbook\templates\url_import.html:598 +msgid "All Keywords" +msgstr "" + +#: .\cookbook\templates\url_import.html:601 +msgid "Import all keywords, not only the ones already existing." +msgstr "" + +#: .\cookbook\templates\url_import.html:628 +msgid "Information" +msgstr "" + +#: .\cookbook\templates\url_import.html:630 +msgid "" +" Only websites containing ld+json or microdata information can currently\n" +" be imported. Most big recipe pages " +"support this. If you site cannot be imported but\n" +" you think\n" +" it probably has some kind of structured " +"data feel free to post an example in the\n" +" github issues." +msgstr "" + +#: .\cookbook\templates\url_import.html:638 +msgid "Google ld+json Info" +msgstr "" + +#: .\cookbook\templates\url_import.html:641 +msgid "GitHub Issues" +msgstr "" + +#: .\cookbook\templates\url_import.html:643 +msgid "Recipe Markup Specification" +msgstr "" + +#: .\cookbook\views\api.py:82 .\cookbook\views\api.py:131 +msgid "Parameter updated_at incorrectly formatted" +msgstr "" + +#: .\cookbook\views\api.py:151 +#, python-brace-format +msgid "No {self.basename} with id {pk} exists" +msgstr "" + +#: .\cookbook\views\api.py:155 +msgid "Cannot merge with the same object!" +msgstr "" + +#: .\cookbook\views\api.py:162 +#, python-brace-format +msgid "No {self.basename} with id {target} exists" +msgstr "" + +#: .\cookbook\views\api.py:167 +msgid "Cannot merge with child object!" +msgstr "" + +#: .\cookbook\views\api.py:200 +#, python-brace-format +msgid "{source.name} was merged successfully with {target.name}" +msgstr "" + +#: .\cookbook\views\api.py:204 +#, python-brace-format +msgid "An error occurred attempting to merge {source.name} with {target.name}" +msgstr "" + +#: .\cookbook\views\api.py:248 +#, python-brace-format +msgid "No {self.basename} with id {child} exists" +msgstr "" + +#: .\cookbook\views\api.py:257 +#, python-brace-format +msgid "{child.name} was moved successfully to the root." +msgstr "" + +#: .\cookbook\views\api.py:260 .\cookbook\views\api.py:278 +msgid "An error occurred attempting to move " +msgstr "" + +#: .\cookbook\views\api.py:263 +msgid "Cannot move an object to itself!" +msgstr "" + +#: .\cookbook\views\api.py:269 +#, python-brace-format +msgid "No {self.basename} with id {parent} exists" +msgstr "" + +#: .\cookbook\views\api.py:275 +#, python-brace-format +msgid "{child.name} was moved successfully to parent {parent.name}" +msgstr "" + +#: .\cookbook\views\api.py:723 .\cookbook\views\views.py:277 +msgid "This feature is not available in the demo version!" +msgstr "" + +#: .\cookbook\views\api.py:746 +msgid "Sync successful!" +msgstr "" + +#: .\cookbook\views\api.py:751 +msgid "Error synchronizing with Storage" +msgstr "" + +#: .\cookbook\views\api.py:829 +msgid "Nothing to do." +msgstr "" + +#: .\cookbook\views\api.py:844 +msgid "The requested site provided malformed data and cannot be read." +msgstr "" + +#: .\cookbook\views\api.py:851 +msgid "The requested page could not be found." +msgstr "" + +#: .\cookbook\views\api.py:860 +msgid "" +"The requested site does not provide any recognized data format to import the " +"recipe from." +msgstr "" + +#: .\cookbook\views\api.py:874 +msgid "No useable data could be found." +msgstr "" + +#: .\cookbook\views\api.py:890 +msgid "I couldn't find anything to do." +msgstr "" + +#: .\cookbook\views\data.py:33 .\cookbook\views\data.py:124 +#: .\cookbook\views\edit.py:50 .\cookbook\views\import_export.py:73 +#: .\cookbook\views\new.py:32 +msgid "You have reached the maximum number of recipes for your space." +msgstr "" + +#: .\cookbook\views\data.py:37 .\cookbook\views\data.py:128 +#: .\cookbook\views\edit.py:54 .\cookbook\views\import_export.py:77 +#: .\cookbook\views\new.py:36 +msgid "You have more users than allowed in your space." +msgstr "" + +#: .\cookbook\views\data.py:106 +#, 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] "" + +#: .\cookbook\views\delete.py:101 +msgid "Monitor" +msgstr "" + +#: .\cookbook\views\delete.py:125 .\cookbook\views\lists.py:86 +#: .\cookbook\views\new.py:97 +msgid "Storage Backend" +msgstr "" + +#: .\cookbook\views\delete.py:135 +msgid "" +"Could not delete this storage backend as it is used in at least one monitor." +msgstr "" + +#: .\cookbook\views\delete.py:158 +msgid "Recipe Book" +msgstr "" + +#: .\cookbook\views\delete.py:170 +msgid "Bookmarks" +msgstr "" + +#: .\cookbook\views\delete.py:192 .\cookbook\views\new.py:231 +msgid "Invite Link" +msgstr "" + +#: .\cookbook\views\edit.py:126 +msgid "You cannot edit this storage!" +msgstr "" + +#: .\cookbook\views\edit.py:146 +msgid "Storage saved!" +msgstr "" + +#: .\cookbook\views\edit.py:152 +msgid "There was an error updating this storage backend!" +msgstr "" + +#: .\cookbook\views\edit.py:163 +msgid "Storage" +msgstr "" + +#: .\cookbook\views\edit.py:245 +msgid "Changes saved!" +msgstr "" + +#: .\cookbook\views\edit.py:249 +msgid "Error saving changes!" +msgstr "" + +#: .\cookbook\views\import_export.py:99 +msgid "Importing is not implemented for this provider" +msgstr "" + +#: .\cookbook\views\import_export.py:121 +msgid "Exporting is not implemented for this provider" +msgstr "" + +#: .\cookbook\views\lists.py:26 +msgid "Import Log" +msgstr "" + +#: .\cookbook\views\lists.py:39 +msgid "Discovery" +msgstr "" + +#: .\cookbook\views\lists.py:69 +msgid "Shopping Lists" +msgstr "" + +#: .\cookbook\views\lists.py:129 +msgid "Foods" +msgstr "" + +#: .\cookbook\views\lists.py:163 +msgid "Supermarkets" +msgstr "" + +#: .\cookbook\views\lists.py:179 +msgid "Shopping Categories" +msgstr "" + +#: .\cookbook\views\lists.py:232 +msgid "New Shopping List" +msgstr "" + +#: .\cookbook\views\new.py:122 +msgid "Imported new recipe!" +msgstr "" + +#: .\cookbook\views\new.py:125 +msgid "There was an error importing this recipe!" +msgstr "" + +#: .\cookbook\views\new.py:205 +msgid "Hello" +msgstr "" + +#: .\cookbook\views\new.py:205 +msgid "You have been invited by " +msgstr "" + +#: .\cookbook\views\new.py:206 +msgid " to join their Tandoor Recipes space " +msgstr "" + +#: .\cookbook\views\new.py:207 +msgid "Click the following link to activate your account: " +msgstr "" + +#: .\cookbook\views\new.py:208 +msgid "" +"If the link does not work use the following code to manually join the space: " +msgstr "" + +#: .\cookbook\views\new.py:209 +msgid "The invitation is valid until " +msgstr "" + +#: .\cookbook\views\new.py:210 +msgid "" +"Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " +msgstr "" + +#: .\cookbook\views\new.py:213 +msgid "Tandoor Recipes Invite" +msgstr "" + +#: .\cookbook\views\new.py:220 +msgid "Invite link successfully send to user." +msgstr "" + +#: .\cookbook\views\new.py:223 +msgid "" +"You have send to many emails, please share the link manually or wait a few " +"hours." +msgstr "" + +#: .\cookbook\views\new.py:225 +msgid "Email to user could not be send, please share link manually." +msgstr "" + +#: .\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 "" + +#: .\cookbook\views\views.py:175 +msgid "You do not have the required permissions to perform this action!" +msgstr "" + +#: .\cookbook\views\views.py:186 +msgid "Comment saved!" +msgstr "" + +#: .\cookbook\views\views.py:340 +msgid "You must select at least one field to search!" +msgstr "" + +#: .\cookbook\views\views.py:345 +msgid "" +"To use this search method you must select at least one full text search " +"field!" +msgstr "" + +#: .\cookbook\views\views.py:349 +msgid "Fuzzy search is not compatible with this search method!" +msgstr "" + +#: .\cookbook\views\views.py:452 +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:459 +msgid "Passwords dont match!" +msgstr "" + +#: .\cookbook\views\views.py:475 +msgid "User has been created, please login!" +msgstr "" + +#: .\cookbook\views\views.py:491 +msgid "Malformed Invite Link supplied!" +msgstr "" + +#: .\cookbook\views\views.py:498 +msgid "You are already member of a space and therefore cannot join this one." +msgstr "" + +#: .\cookbook\views\views.py:509 +msgid "Successfully joined space." +msgstr "" + +#: .\cookbook\views\views.py:515 +msgid "Invite Link not valid or already used!" +msgstr "" + +#: .\cookbook\views\views.py:579 +msgid "" +"Reporting share links is not enabled for this instance. Please notify the " +"page administrator to report problems." +msgstr "" + +#: .\cookbook\views\views.py:585 +msgid "" +"Recipe sharing link has been disabled! For additional information please " +"contact the page administrator." +msgstr "" diff --git a/cookbook/locale/fr/LC_MESSAGES/django.mo b/cookbook/locale/fr/LC_MESSAGES/django.mo index 2ce9bad7..81ba3726 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 67e5c994..b639bf0d 100644 --- a/cookbook/locale/fr/LC_MESSAGES/django.po +++ b/cookbook/locale/fr/LC_MESSAGES/django.po @@ -13,9 +13,9 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-08-17 08:44+0200\n" -"PO-Revision-Date: 2021-08-19 11:28+0000\n" -"Last-Translator: Afaren \n" +"POT-Creation-Date: 2022-01-18 14:52+0100\n" +"PO-Revision-Date: 2022-02-09 01:31+0000\n" +"Last-Translator: Marion Kämpfer \n" "Language-Team: French \n" "Language: fr\n" @@ -23,122 +23,188 @@ 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.7.2\n" +"X-Generator: Weblate 4.10.1\n" -#: .\cookbook\filters.py:23 .\cookbook\templates\base.html:98 -#: .\cookbook\templates\forms\edit_internal_recipe.html:269 -#: .\cookbook\templates\forms\ingredients.html:34 -#: .\cookbook\templates\space.html:43 .\cookbook\templates\stats.html:28 -#: .\cookbook\templates\url_import.html:270 .\cookbook\views\lists.py:67 +#: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 +#: .\cookbook\templates\space.html:50 .\cookbook\templates\stats.html:28 +#: .\cookbook\templates\url_import.html:277 msgid "Ingredients" msgstr "Ingrédients" -#: .\cookbook\forms.py:49 +#: .\cookbook\forms.py:56 +msgid "Default unit" +msgstr "Unité par défaut" + +#: .\cookbook\forms.py:57 +msgid "Use fractions" +msgstr "Utiliser les fractions" + +#: .\cookbook\forms.py:58 +msgid "Use KJ" +msgstr "Utiliser les kJ" + +#: .\cookbook\forms.py:59 +msgid "Theme" +msgstr "Thème" + +#: .\cookbook\forms.py:60 +msgid "Navbar color" +msgstr "Couleur de la barre de navigation" + +#: .\cookbook\forms.py:61 +msgid "Sticky navbar" +msgstr "Barre de navigation permanente" + +#: .\cookbook\forms.py:62 +msgid "Default page" +msgstr "Page par défaut" + +#: .\cookbook\forms.py:63 +msgid "Show recent recipes" +msgstr "Afficher les recettes récentes" + +#: .\cookbook\forms.py:64 +msgid "Search style" +msgstr "Rechercher" + +#: .\cookbook\forms.py:65 +msgid "Plan sharing" +msgstr "Partage du planificateur" + +#: .\cookbook\forms.py:66 +msgid "Ingredient decimal places" +msgstr "Nombre de décimales pour les ingrédients" + +#: .\cookbook\forms.py:67 +msgid "Shopping list auto sync period" +msgstr "Période de synchro automatique de la liste de courses" + +#: .\cookbook\forms.py:68 .\cookbook\templates\recipe_view.html:21 +#: .\cookbook\templates\space.html:77 .\cookbook\templates\stats.html:47 +msgid "Comments" +msgstr "Commentaires" + +#: .\cookbook\forms.py:72 msgid "" "Color of the top navigation bar. Not all colors work with all themes, just " "try them out!" msgstr "" -"La couleur de la barre de navigation du haut. Toutes les couleurs ne " -"marchent pas avec tous les thèmes, essayez-les !" +"Couleur de la barre de navigation du haut. Les couleurs ne fonctionnent pas " +"toutes avec tous les thèmes, faites des essais !" -#: .\cookbook\forms.py:51 +#: .\cookbook\forms.py:74 msgid "Default Unit to be used when inserting a new ingredient into a recipe." msgstr "" -"L'unité par défaut utilisée lors de l'ajout d'un nouvel ingrédient dans une " +"Unité par défaut utilisée lors de l’ajout d’un nouvel ingrédient dans une " "recette." -#: .\cookbook\forms.py:53 +#: .\cookbook\forms.py:76 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" msgstr "" -"Autorise l'usage des fractions dans les quantités des ingrédients (convertit " -"les décimales en fractions automatiquement)" +"Permet la prise en charge des fractions dans les quantités d’ingrédients (" +"convertit les décimales en fractions automatiquement)" -#: .\cookbook\forms.py:56 -msgid "" -"Users with whom newly created meal plan/shopping list entries should be " -"shared by default." +#: .\cookbook\forms.py:78 +msgid "Display nutritional energy amounts in joules instead of calories" msgstr "" -"Utilisateurs avec lesquels les listes de courses et plans de repas " -"nouvellement créés seront partagés par défaut." +"Afficher les quantités d’énergie nutritionnelle en joules plutôt qu’en " +"calories" -#: .\cookbook\forms.py:58 +#: .\cookbook\forms.py:79 +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:80 +msgid "Users with whom to share shopping lists." +msgstr "Utilisateurs avec lesquels partager des listes de courses." + +#: .\cookbook\forms.py:82 msgid "Show recently viewed recipes on search page." msgstr "Afficher les recettes récemment consultées sur la page de recherche." -#: .\cookbook\forms.py:59 +#: .\cookbook\forms.py:83 msgid "Number of decimals to round ingredients." msgstr "Nombre de décimales pour arrondir les ingrédients." -#: .\cookbook\forms.py:60 +#: .\cookbook\forms.py:84 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 " +"Si vous souhaitez pouvoir créer et consulter des commentaires en dessous des " "recettes." -#: .\cookbook\forms.py:62 +#: .\cookbook\forms.py:86 .\cookbook\forms.py:493 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. " "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\" désactivera la synchronisation automatique. Lorsque vous consultez une " +"« 0 » désactivera la synchronisation automatique. Lorsque vous consultez une " "liste de courses, la liste sera mise à jour toutes les x secondes pour " -"synchroniser les modifications apportées par quelqu'un d'autre. Utile " +"synchroniser les modifications apportées par quelqu’un d'autre. Utile " "lorsque vous faites vos courses à plusieurs mais peut consommer davantage de " -"données mobiles. Si la valeur est plus petite que les limites de l'instance, " +"données mobiles. Si la valeur est plus petite que les limites de l’instance, " "le paramètre sera réinitialisé." -#: .\cookbook\forms.py:65 +#: .\cookbook\forms.py:89 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:81 +#: .\cookbook\forms.py:90 .\cookbook\forms.py:496 +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:91 +msgid "Exclude ingredients that are on hand." +msgstr "Exclure les ingrédients disponibles." + +#: .\cookbook\forms.py:108 msgid "" "Both fields are optional. If none are given the username will be displayed " "instead" msgstr "" -"Les deux champs sont facultatifs. Si aucun n'est rempli, le nom " -"d'utilisateur sera affiché à la place" +"Les deux champs sont facultatifs. Si aucun n’est rempli, le nom d’" +"utilisateur sera affiché à la place" -#: .\cookbook\forms.py:102 .\cookbook\forms.py:331 -#: .\cookbook\templates\forms\edit_internal_recipe.html:49 -#: .\cookbook\templates\url_import.html:154 +#: .\cookbook\forms.py:129 .\cookbook\forms.py:298 +#: .\cookbook\templates\url_import.html:161 msgid "Name" msgstr "Nom" -#: .\cookbook\forms.py:103 .\cookbook\forms.py:332 -#: .\cookbook\templates\base.html:108 .\cookbook\templates\base.html:169 -#: .\cookbook\templates\forms\edit_internal_recipe.html:85 -#: .\cookbook\templates\space.html:39 .\cookbook\templates\stats.html:24 -#: .\cookbook\templates\url_import.html:188 -#: .\cookbook\templates\url_import.html:573 +#: .\cookbook\forms.py:130 .\cookbook\forms.py:299 +#: .\cookbook\templates\space.html:44 .\cookbook\templates\stats.html:24 +#: .\cookbook\templates\url_import.html:195 +#: .\cookbook\templates\url_import.html:585 .\cookbook\views\lists.py:97 msgid "Keywords" msgstr "Mots-clés" -#: .\cookbook\forms.py:104 +#: .\cookbook\forms.py:131 msgid "Preparation time in minutes" -msgstr "Le temps de préparation en minutes" +msgstr "Temps de préparation en minutes" -#: .\cookbook\forms.py:105 +#: .\cookbook\forms.py:132 msgid "Waiting time (cooking/baking) in minutes" -msgstr "Temps d'attente (pose/cuisson) en minutes" +msgstr "Temps d’attente (cuisson) en minutes" -#: .\cookbook\forms.py:106 .\cookbook\forms.py:333 +#: .\cookbook\forms.py:133 .\cookbook\forms.py:267 .\cookbook\forms.py:300 msgid "Path" msgstr "Chemin" -#: .\cookbook\forms.py:107 +#: .\cookbook\forms.py:134 msgid "Storage UID" msgstr "UID de stockage" -#: .\cookbook\forms.py:133 +#: .\cookbook\forms.py:164 msgid "Default" msgstr "Par défaut" -#: .\cookbook\forms.py:144 .\cookbook\templates\url_import.html:90 +#: .\cookbook\forms.py:175 .\cookbook\templates\url_import.html:97 msgid "" "To prevent duplicates recipes with the same name as existing ones are " "ignored. Check this box to import everything." @@ -146,81 +212,56 @@ msgstr "" "Pour éviter les doublons, les recettes de même nom seront ignorées. Cocher " "cette case pour tout importer." -#: .\cookbook\forms.py:164 -msgid "New Unit" -msgstr "Nouvelle unité" - -#: .\cookbook\forms.py:165 -msgid "New unit that other gets replaced by." -msgstr "La nouvelle unité qui remplacera l'autre." - -#: .\cookbook\forms.py:170 -msgid "Old Unit" -msgstr "Ancienne unité" - -#: .\cookbook\forms.py:171 -msgid "Unit that should be replaced." -msgstr "L'unité qui doit être remplacée." - -#: .\cookbook\forms.py:187 -msgid "New Food" -msgstr "Nouvel ingrédient" - -#: .\cookbook\forms.py:188 -msgid "New food that other gets replaced by." -msgstr "Nouvel ingrédient qui remplace les autres." - -#: .\cookbook\forms.py:193 -msgid "Old Food" -msgstr "Ancien ingrédient" - -#: .\cookbook\forms.py:194 -msgid "Food that should be replaced." -msgstr "Ingrédient qui devrait être remplacé." +#: .\cookbook\forms.py:197 +msgid "Add your comment: " +msgstr "Ajoutez votre commentaire : " #: .\cookbook\forms.py:212 -msgid "Add your comment: " -msgstr "Ajoutez votre commentaire : " - -#: .\cookbook\forms.py:253 msgid "Leave empty for dropbox and enter app password for nextcloud." msgstr "" -"Laissez vide pour Dropbox et renseigner votre mot de passe d'application " +"Laissez vide pour Dropbox et renseignez votre mot de passe d’application " "pour Nextcloud." -#: .\cookbook\forms.py:260 +#: .\cookbook\forms.py:219 msgid "Leave empty for nextcloud and enter api token for dropbox." msgstr "" -"Laissez vide pour Nextcloud et renseignez vote jeton d'API pour Dropbox." +"Laissez vide pour Nextcloud et renseignez votre jeton d’API pour Dropbox." -#: .\cookbook\forms.py:269 +#: .\cookbook\forms.py:228 msgid "" "Leave empty for dropbox and enter only base url for nextcloud (/remote." "php/webdav/ is added automatically)" msgstr "" -"Laisser vide pour Dropbox et saisissez seulement l'URL de base pour " +"Laisser vide pour Dropbox et saisissez seulement l’URL de base pour " "Nextcloud (/remote.php/webdav/ est ajouté automatiquement)" -#: .\cookbook\forms.py:307 +#: .\cookbook\forms.py:266 .\cookbook\views\edit.py:166 +msgid "Storage" +msgstr "Stockage" + +#: .\cookbook\forms.py:268 +msgid "Active" +msgstr "Actif" + +#: .\cookbook\forms.py:274 msgid "Search String" msgstr "Texte recherché" -#: .\cookbook\forms.py:334 +#: .\cookbook\forms.py:301 msgid "File ID" msgstr "ID du fichier" -#: .\cookbook\forms.py:370 +#: .\cookbook\forms.py:323 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:383 +#: .\cookbook\forms.py:336 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:384 -#: .\cookbook\templates\forms\edit_internal_recipe.html:427 +#: .\cookbook\forms.py:337 msgid "" "You can use markdown to format this field. See the docs here" @@ -228,102 +269,315 @@ msgstr "" "Vous pouvez utiliser du markdown pour mettre en forme ce champ. Voir la documentation ici" -#: .\cookbook\forms.py:409 +#: .\cookbook\forms.py:363 msgid "Maximum number of users for this space reached." -msgstr "Nombre maximum d'utilisateurs atteint pour ce groupe." +msgstr "Nombre maximum d’utilisateurs atteint pour ce groupe." -#: .\cookbook\forms.py:415 +#: .\cookbook\forms.py:369 msgid "Email address already taken!" -msgstr "Adresse mail déjà utilisée !" +msgstr "Adresse mail déjà utilisée !" -#: .\cookbook\forms.py:423 +#: .\cookbook\forms.py:377 msgid "" -"An email address is not required but if present the invite link will be send " +"An email address is not required but if present the invite link will be sent " "to the user." msgstr "" -"Une adresse mail n'est pas requise mais le lien d'invitation sera envoyé à " -"l'utilisateur si elle est présente." +"Une adresse mail n’est pas requise mais si elle est renseignée, le lien d’" +"invitation sera envoyé à l’utilisateur." -#: .\cookbook\forms.py:438 +#: .\cookbook\forms.py:392 msgid "Name already taken." -msgstr "Nom déjà pris." +msgstr "Nom déjà utilisé." -#: .\cookbook\forms.py:449 +#: .\cookbook\forms.py:403 msgid "Accept Terms and Privacy" -msgstr "Accepter les conditions d'utilisation" +msgstr "Accepter les conditions d’utilisation" + +#: .\cookbook\forms.py:435 +msgid "" +"Determines how fuzzy a search is if it uses trigram similarity matching (e." +"g. low values mean more typos are ignored)." +msgstr "" +"Détermine le degré de flou d’une recherche si elle utilise la correspondance " +"par similarité de trigrammes (par exemple, des valeurs faibles signifient " +"que davantage de fautes de frappe sont ignorées)." + +#: .\cookbook\forms.py:445 +msgid "" +"Select type method of search. Click here for " +"full desciption of choices." +msgstr "" +"Sélectionner la méthode de recherche. Cliquer ici pour une description complète des choix." + +#: .\cookbook\forms.py:446 +msgid "" +"Use fuzzy matching on units, keywords and ingredients when editing and " +"importing recipes." +msgstr "" +"Utilisez la correspondance floue sur les unités, les mots-clés et les " +"ingrédients lors de l’édition et de l’importation de recettes." + +#: .\cookbook\forms.py:448 +msgid "" +"Fields to search ignoring accents. Selecting this option can improve or " +"degrade search quality depending on language" +msgstr "" +"Champs à rechercher en ignorant les accents. La sélection de cette option " +"peut améliorer ou dégrader la qualité de la recherche en fonction de la " +"langue." + +#: .\cookbook\forms.py:450 +msgid "" +"Fields to search for partial matches. (e.g. searching for 'Pie' will return " +"'pie' and 'piece' and 'soapie')" +msgstr "" +"Champs à rechercher pour les correspondances partielles. (par exemple, la " +"recherche de « Tarte » renverra « tarte », « tartelette » et « tartes »)" + +#: .\cookbook\forms.py:452 +msgid "" +"Fields to search for beginning of word matches. (e.g. searching for 'sa' " +"will return 'salad' and 'sandwich')" +msgstr "" +"Champs permettant de rechercher les correspondances de début de mot (par " +"exemple, si vous recherchez « sa », vous obtiendrez « salade » et « " +"sandwich»)." + +#: .\cookbook\forms.py:454 +msgid "" +"Fields to 'fuzzy' search. (e.g. searching for 'recpie' will find 'recipe'.) " +"Note: this option will conflict with 'web' and 'raw' methods of search." +msgstr "" +"Champs pour la recherche « floue » (par exemple, si vous recherchez « rectte»" +", vous trouverez « recette ».) Remarque : cette option est incompatible avec " +"les méthodes de recherche « web » et « brute »." + +#: .\cookbook\forms.py:456 +msgid "" +"Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " +"only function with fulltext fields." +msgstr "" +"Champs de recherche en texte intégral. Remarque : les méthodes de recherche «" +" web », « phrase » et « brute » ne fonctionnent qu’avec des champs en texte " +"intégral." + +#: .\cookbook\forms.py:460 +msgid "Search Method" +msgstr "Méthode de recherche" + +#: .\cookbook\forms.py:461 +msgid "Fuzzy Lookups" +msgstr "Recherches floues" + +#: .\cookbook\forms.py:462 +msgid "Ignore Accent" +msgstr "Ignorer les accents" + +#: .\cookbook\forms.py:463 +msgid "Partial Match" +msgstr "correspondance partielle" + +#: .\cookbook\forms.py:464 +msgid "Starts Wtih" +msgstr "Commence par" + +#: .\cookbook\forms.py:465 +msgid "Fuzzy Search" +msgstr "Recherche floue" + +#: .\cookbook\forms.py:466 +msgid "Full Text" +msgstr "Texte intégral" + +#: .\cookbook\forms.py:491 +msgid "" +"Users will see all items you add to your shopping list. They must add you " +"to see items on their list." +msgstr "" +"Les utilisateurs verront tous les éléments que vous ajoutez à votre liste de " +"courses. Ils doivent vous ajouter pour que vous puissiez voir les éléments " +"de leur liste." + +#: .\cookbook\forms.py:497 +msgid "" +"When adding a meal plan to the shopping list (manually or automatically), " +"include all related recipes." +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:498 +msgid "" +"When adding a meal plan to the shopping list (manually or automatically), " +"exclude ingredients that are on hand." +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:499 +msgid "Default number of hours to delay a shopping list entry." +msgstr "" + +#: .\cookbook\forms.py:500 +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:501 +msgid "Days of recent shopping list entries to display." +msgstr "" + +#: .\cookbook\forms.py:502 +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:503 +msgid "Delimiter to use for CSV exports." +msgstr "Caractère de séparation à utiliser pour les exportations CSV." + +#: .\cookbook\forms.py:504 +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:508 +msgid "Share Shopping List" +msgstr "Partager la liste de courses" + +#: .\cookbook\forms.py:509 +msgid "Autosync" +msgstr "Synchronisation automatique" + +#: .\cookbook\forms.py:510 +msgid "Auto Add Meal Plan" +msgstr "Ajouter le menu de la semaine automatiquement" + +#: .\cookbook\forms.py:511 +msgid "Exclude On Hand" +msgstr "Exclure ingrédients disponibles" + +#: .\cookbook\forms.py:512 +msgid "Include Related" +msgstr "Inclure recettes connexes" + +#: .\cookbook\forms.py:513 +msgid "Default Delay Hours" +msgstr "" + +#: .\cookbook\forms.py:514 +#, fuzzy +#| msgid "Select Supermarket" +msgid "Filter to Supermarket" +msgstr "Sélectionner un supermarché" + +#: .\cookbook\forms.py:515 +msgid "Recent Days" +msgstr "Jours récents" + +#: .\cookbook\forms.py:516 +msgid "CSV Delimiter" +msgstr "Caractère de séparation CSV" + +#: .\cookbook\forms.py:517 .\cookbook\templates\shopping_list.html:322 +msgid "List Prefix" +msgstr "Préfixe de la liste" + +#: .\cookbook\forms.py:518 +msgid "Auto On Hand" +msgstr "Disponible automatique" + +#: .\cookbook\forms.py:528 +msgid "Reset Food Inheritance" +msgstr "" + +#: .\cookbook\forms.py:529 +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:541 +#, fuzzy +#| msgid "Food that should be replaced." +msgid "Fields on food that should be inherited by default." +msgstr "Aliment qui devrait être remplacé." + +#: .\cookbook\forms.py:542 +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 msgid "" "In order to prevent spam, the requested email was not send. Please wait a " "few minutes and try again." msgstr "" -"Pour éviter les spam, l'email demandé n'a pas été envoyé. Attendez quelques " -"minutes et réessayez." +"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:138 -#: .\cookbook\helper\permission_helper.py:161 .\cookbook\views\views.py:151 +#: .\cookbook\helper\permission_helper.py:136 +#: .\cookbook\helper\permission_helper.py:159 .\cookbook\views\views.py:148 msgid "You are not logged in and therefore cannot view this page!" -msgstr "Vous n'êtes pas connecté et ne pouvez donc pas afficher cette page !" +msgstr "Vous n’êtes pas connecté(e) et ne pouvez donc pas afficher cette page !" -#: .\cookbook\helper\permission_helper.py:142 -#: .\cookbook\helper\permission_helper.py:148 -#: .\cookbook\helper\permission_helper.py:173 -#: .\cookbook\helper\permission_helper.py:218 -#: .\cookbook\helper\permission_helper.py:232 -#: .\cookbook\helper\permission_helper.py:243 -#: .\cookbook\helper\permission_helper.py:254 .\cookbook\views\data.py:40 -#: .\cookbook\views\views.py:162 .\cookbook\views\views.py:169 -#: .\cookbook\views\views.py:259 +#: .\cookbook\helper\permission_helper.py:140 +#: .\cookbook\helper\permission_helper.py:146 +#: .\cookbook\helper\permission_helper.py:171 +#: .\cookbook\helper\permission_helper.py:219 +#: .\cookbook\helper\permission_helper.py:233 +#: .\cookbook\helper\permission_helper.py:244 +#: .\cookbook\helper\permission_helper.py:255 .\cookbook\views\data.py:47 +#: .\cookbook\views\views.py:159 .\cookbook\views\views.py:166 +#: .\cookbook\views\views.py:232 msgid "You do not have the required permissions to view this page!" -msgstr "Vous n'avez pas les droits suffisants pour afficher cette page !" +msgstr "Vous ne disposez pas de droits suffisants pour afficher cette page !" -#: .\cookbook\helper\permission_helper.py:166 -#: .\cookbook\helper\permission_helper.py:189 -#: .\cookbook\helper\permission_helper.py:204 +#: .\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 "" "Vous ne pouvez pas interagir avec cet objet car il appartient à un autre " -"utilisateur !" +"utilisateur !" -#: .\cookbook\helper\template_helper.py:60 -#: .\cookbook\helper\template_helper.py:62 +#: .\cookbook\helper\recipe_search.py:473 +msgid "One of queryset or hash_key must be provided" +msgstr "" + +#: .\cookbook\helper\shopping_helper.py:54 +msgid "You must supply a recipe or mealplan" +msgstr "Vous devez fournir une recette ou un menu de la semaine" + +#: .\cookbook\helper\shopping_helper.py:58 +msgid "You must supply a created_by" +msgstr "Vous devez fournir une information créé_par" + +#: .\cookbook\helper\template_helper.py:61 +#: .\cookbook\helper\template_helper.py:63 msgid "Could not parse template code." -msgstr "Le code du modèle n'a pas pu être analysé." +msgstr "Impossible d’analyser le code du modèle." -#: .\cookbook\integration\integration.py:104 -#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 -#: .\cookbook\templates\import_response.html:7 -#: .\cookbook\templates\test.html:14 .\cookbook\templates\test.html:20 -#: .\cookbook\templates\url_import.html:27 -#: .\cookbook\templates\url_import.html:101 -#: .\cookbook\templates\url_import.html:123 -#: .\cookbook\templates\url_import.html:317 -#: .\cookbook\templates\url_import.html:604 .\cookbook\views\delete.py:60 -#: .\cookbook\views\edit.py:199 -msgid "Import" -msgstr "Importer" - -#: .\cookbook\integration\integration.py:185 +#: .\cookbook\integration\integration.py:200 msgid "" "Importer expected a .zip file. Did you choose the correct importer type for " "your data ?" msgstr "" -"Un fichier .zip était attendu à l'importation. Avez-vous choisi le bon " -"format pour vos données ?" +"Un fichier .zip était attendu à l’importation. Avez-vous choisi le bon " +"format pour vos données ?" -#: .\cookbook\integration\integration.py:188 +#: .\cookbook\integration\integration.py:203 msgid "" "An unexpected error occurred during the import. Please make sure you have " "uploaded a valid file." msgstr "" -"Une erreur imprévue est survenue durant l'importation. Vérifiez que vous " -"avez téléverser un fichier valide." +"Une erreur imprévue est survenue durant l’importation. Vérifiez que vous " +"avez téléversé un fichier valide." -#: .\cookbook\integration\integration.py:192 +#: .\cookbook\integration\integration.py:208 msgid "The following recipes were ignored because they already existed:" -msgstr "Les recettes suivantes ont été ignorées car elles existaient déjà :" +msgstr "Les recettes suivantes ont été ignorées car elles existaient déjà :" -#: .\cookbook\integration\integration.py:196 +#: .\cookbook\integration\integration.py:212 #, python-format msgid "Imported %s recipes." msgstr "%s recettes importées." @@ -336,40 +590,56 @@ msgstr "Notes" msgid "Nutritional Information" msgstr "Informations nutritionnelles" -#: .\cookbook\integration\paprika.py:53 +#: .\cookbook\integration\paprika.py:53 .\cookbook\templates\url_import.html:42 msgid "Source" msgstr "Source" -#: .\cookbook\integration\safron.py:23 -#: .\cookbook\templates\forms\edit_internal_recipe.html:79 -#: .\cookbook\templates\include\log_cooking.html:16 -#: .\cookbook\templates\url_import.html:224 -#: .\cookbook\templates\url_import.html:455 +#: .\cookbook\integration\saffron.py:23 +#: .\cookbook\templates\include\log_cooking.html:18 +#: .\cookbook\templates\url_import.html:231 +#: .\cookbook\templates\url_import.html:462 msgid "Servings" msgstr "Portions" -#: .\cookbook\integration\safron.py:25 +#: .\cookbook\integration\saffron.py:25 msgid "Waiting time" -msgstr "Temps d'attente" +msgstr "Temps d’attente" -#: .\cookbook\integration\safron.py:27 -#: .\cookbook\templates\forms\edit_internal_recipe.html:73 +#: .\cookbook\integration\saffron.py:27 msgid "Preparation Time" msgstr "Temps de préparation" -#: .\cookbook\integration\safron.py:29 .\cookbook\templates\base.html:78 +#: .\cookbook\integration\saffron.py:29 .\cookbook\templates\base.html:78 #: .\cookbook\templates\forms\ingredients.html:7 #: .\cookbook\templates\index.html:7 msgid "Cookbook" msgstr "Livre de recettes" -#: .\cookbook\integration\safron.py:31 +#: .\cookbook\integration\saffron.py:31 msgid "Section" msgstr "Rubrique" +#: .\cookbook\management\commands\rebuildindex.py:14 +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 +msgid "Only Postgress databases use full text search, no index to rebuild" +msgstr "" +"Seules les bases de données Postgres utilisent la recherche en texte " +"intégral, sans index à reconstruire" + +#: .\cookbook\management\commands\rebuildindex.py:29 +msgid "Recipe index rebuild complete." +msgstr "La reconstruction de l’index des recettes est terminée." + +#: .\cookbook\management\commands\rebuildindex.py:31 +msgid "Recipe index rebuild failed." +msgstr "La reconstruction de l’index des recettes a échoué." + #: .\cookbook\migrations\0047_auto_20200602_1133.py:14 msgid "Breakfast" -msgstr "Petit-déjeuner" +msgstr "Petit déjeuner" #: .\cookbook\migrations\0047_auto_20200602_1133.py:19 msgid "Lunch" @@ -383,7 +653,7 @@ msgstr "Dîner" msgid "Other" msgstr "Autre" -#: .\cookbook\models.py:72 +#: .\cookbook\models.py:246 msgid "" "Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " "upload." @@ -391,84 +661,137 @@ 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:123 .\cookbook\templates\search.html:7 -#: .\cookbook\templates\shopping_list.html:52 +#: .\cookbook\models.py:300 .\cookbook\templates\search.html:7 +#: .\cookbook\templates\shopping_list.html:53 msgid "Search" msgstr "Rechercher" -#: .\cookbook\models.py:124 .\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 +#: .\cookbook\models.py:301 .\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 "Menu de la semaine" -#: .\cookbook\models.py:125 .\cookbook\templates\base.html:89 +#: .\cookbook\models.py:302 .\cookbook\templates\base.html:90 msgid "Books" msgstr "Livres" -#: .\cookbook\models.py:133 +#: .\cookbook\models.py:310 msgid "Small" msgstr "Petit" -#: .\cookbook\models.py:133 +#: .\cookbook\models.py:310 msgid "Large" msgstr "Grand" -#: .\cookbook\models.py:133 .\cookbook\templates\generic\new_template.html:6 +#: .\cookbook\models.py:310 .\cookbook\templates\generic\new_template.html:6 #: .\cookbook\templates\generic\new_template.html:14 -#: .\cookbook\templates\meal_plan.html:323 msgid "New" -msgstr "Nouveau/Nouvelle" +msgstr "Nouveau" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:202 +#: .\cookbook\models.py:512 +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:586 .\cookbook\templates\url_import.html:44 msgid "Text" msgstr "Texte" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:203 +#: .\cookbook\models.py:586 msgid "Time" msgstr "Temps" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:204 -#: .\cookbook\templates\forms\edit_internal_recipe.html:219 +#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:46 msgid "File" msgstr "Fichier" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:205 -#: .\cookbook\templates\forms\edit_internal_recipe.html:241 +#: .\cookbook\models.py:586 #: .\cookbook\templates\include\recipe_open_modal.html:7 -#: .\cookbook\templates\meal_plan.html:247 .\cookbook\views\delete.py:28 -#: .\cookbook\views\edit.py:273 .\cookbook\views\new.py:52 +#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260 +#: .\cookbook\views\new.py:53 msgid "Recipe" msgstr "Recette" -#: .\cookbook\serializer.py:109 -msgid "File uploads are not enabled for this Space." -msgstr "Le téléversement de fichiers n'est pas autorisé pour ce groupe." +#: .\cookbook\models.py:1041 .\cookbook\templates\search_info.html:28 +msgid "Simple" +msgstr "Simple" -#: .\cookbook\serializer.py:117 +#: .\cookbook\models.py:1042 .\cookbook\templates\search_info.html:33 +msgid "Phrase" +msgstr "Phrase" + +#: .\cookbook\models.py:1043 .\cookbook\templates\search_info.html:38 +msgid "Web" +msgstr "Internet" + +#: .\cookbook\models.py:1044 .\cookbook\templates\search_info.html:47 +msgid "Raw" +msgstr "Brut" + +#: .\cookbook\models.py:1082 +msgid "Food Alias" +msgstr "Aliment équivalent" + +#: .\cookbook\models.py:1082 +msgid "Unit Alias" +msgstr "Unité équivalente" + +#: .\cookbook\models.py:1082 +msgid "Keyword Alias" +msgstr "Mot-clé équivalent" + +#: .\cookbook\serializer.py:175 +msgid "A user is required" +msgstr "Un utilisateur est requis" + +#: .\cookbook\serializer.py:195 +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:206 msgid "You have reached your file upload limit." msgstr "Vous avez atteint votre limite de téléversement de fichiers." -#: .\cookbook\tables.py:35 .\cookbook\templates\books.html:36 -#: .\cookbook\templates\generic\edit_template.html:6 +#: .\cookbook\serializer.py:962 +msgid "Existing shopping list to update" +msgstr "Liste de courses existante à mettre à jour" + +#: .\cookbook\serializer.py:964 +msgid "" +"List of ingredient IDs from the recipe to add, if not provided all " +"ingredients will be added." +msgstr "" + +#: .\cookbook\serializer.py:965 +msgid "" +"Providing a list_recipe ID and servings of 0 will delete that shopping list." +msgstr "" + +#: .\cookbook\serializer.py:973 +msgid "Amount of food to add to the shopping list" +msgstr "Quantité d’aliments à ajouter à la liste de courses" + +#: .\cookbook\serializer.py:974 +msgid "ID of unit to use for the shopping list" +msgstr "ID de l’unité à utiliser pour la liste de courses" + +#: .\cookbook\serializer.py:975 +msgid "When set to true will delete all food from active shopping lists." +msgstr "" + +#: .\cookbook\tables.py:35 .\cookbook\templates\generic\edit_template.html:6 #: .\cookbook\templates\generic\edit_template.html:14 -#: .\cookbook\templates\meal_plan.html:281 #: .\cookbook\templates\recipes_table.html:82 -#: .\cookbook\templates\shopping_list.html:33 -#: .\cookbook\templates\space.html:90 +#: .\cookbook\templates\shopping_list.html:37 +#: .\cookbook\templates\space.html:109 msgid "Edit" msgstr "Modifier" -#: .\cookbook\tables.py:124 .\cookbook\tables.py:147 -#: .\cookbook\templates\books.html:38 -#: .\cookbook\templates\generic\delete_template.html:5 -#: .\cookbook\templates\generic\delete_template.html:13 -#: .\cookbook\templates\generic\edit_template.html:27 -#: .\cookbook\templates\meal_plan.html:277 +#: .\cookbook\tables.py:115 .\cookbook\tables.py:138 +#: .\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" @@ -479,11 +802,11 @@ msgstr "Erreur 404" #: .\cookbook\templates\404.html:18 msgid "The page you are looking for could not be found." -msgstr "La page que vous recherchez n'a pas été trouvée." +msgstr "La page que vous recherchez est introuvable." #: .\cookbook\templates\404.html:33 msgid "Take me Home" -msgstr "Page d'accueil" +msgstr "Page d’accueil" #: .\cookbook\templates\404.html:35 msgid "Report a Bug" @@ -497,7 +820,7 @@ 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:154 .\cookbook\templates\settings.html:6 +#: .\cookbook\templates\base.html:257 .\cookbook\templates\settings.html:6 #: .\cookbook\templates\settings.html:17 #: .\cookbook\templates\socialaccount\connections.html:10 msgid "Settings" @@ -509,7 +832,7 @@ msgstr "Adresse mail" #: .\cookbook\templates\account\email.html:19 msgid "The following e-mail addresses are associated with your account:" -msgstr "Les adresses mail suivantes sont associées à votre compte :" +msgstr "Les adresses mail suivantes sont associées à votre compte :" #: .\cookbook\templates\account\email.html:36 msgid "Verified" @@ -532,20 +855,21 @@ msgid "Re-send Verification" msgstr "Renvoyer le mail de vérification" #: .\cookbook\templates\account\email.html:50 +#: .\cookbook\templates\generic\delete_template.html:56 #: .\cookbook\templates\socialaccount\connections.html:44 msgid "Remove" msgstr "Supprimer" #: .\cookbook\templates\account\email.html:58 msgid "Warning:" -msgstr "Avertissement :" +msgstr "Avertissement :" #: .\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 "" -"Vous n'avez pas encore d'adresse mail associée. Vous devriez en ajouter une " +"Vous n’avez pas encore d’adresse mail associée. Vous devriez en ajouter une " "afin de recevoir les notifications, réinitialiser votre mot de passe, etc." #: .\cookbook\templates\account\email.html:64 @@ -558,12 +882,12 @@ msgstr "Ajouter une adresse mail" #: .\cookbook\templates\account\email.html:79 msgid "Do you really want to remove the selected e-mail address?" -msgstr "Voulez-vous vraiment supprimer l'adresse mail sélectionnée ?" +msgstr "Voulez-vous vraiment supprimer l’adresse mail sélectionnée ?" #: .\cookbook\templates\account\email_confirm.html:6 #: .\cookbook\templates\account\email_confirm.html:10 msgid "Confirm E-mail Address" -msgstr "Confirmer l'adresse mail" +msgstr "Confirmer l’adresse mail" #: .\cookbook\templates\account\email_confirm.html:16 #, python-format @@ -573,11 +897,12 @@ msgid "" "for user %(user_display)s\n" " ." msgstr "" -"Confirmez que est une adresse mail de " -"l'utilisateur %(user_display)s." +"Confirmez SVP que\n" +" est une adresse mail de l’" +"utilisateur %(user_display)s." #: .\cookbook\templates\account\email_confirm.html:22 -#: .\cookbook\templates\generic\delete_template.html:21 +#: .\cookbook\templates\generic\delete_template.html:71 msgid "Confirm" msgstr "Confirmer" @@ -588,10 +913,11 @@ msgid "" " issue a new e-mail confirmation " "request." msgstr "" -"Ce lien de confirmation par mail est expiré ou invalide. Veuillez demander une nouvelle vérification par mail." +"Ce lien de confirmation reçu par mail est expiré ou invalide. Veuillez\n" +" demander une nouvelle vérification " +"par mail." -#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:189 +#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:289 msgid "Login" msgstr "Connexion" @@ -602,27 +928,27 @@ msgstr "Connexion" msgid "Sign In" msgstr "Connexion" -#: .\cookbook\templates\account\login.html:32 +#: .\cookbook\templates\account\login.html:34 #: .\cookbook\templates\socialaccount\signup.html:8 #: .\cookbook\templates\socialaccount\signup.html:57 msgid "Sign Up" -msgstr "S'inscrire" +msgstr "S’inscrire" -#: .\cookbook\templates\account\login.html:36 -#: .\cookbook\templates\account\login.html:37 +#: .\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:37 +#: .\cookbook\templates\account\login.html:40 msgid "Lost your password?" -msgstr "Mot de passe perdu ?" +msgstr "Mot de passe perdu ?" -#: .\cookbook\templates\account\login.html:48 +#: .\cookbook\templates\account\login.html:52 msgid "Social Login" msgstr "Connexion par réseau social" -#: .\cookbook\templates\account\login.html:49 +#: .\cookbook\templates\account\login.html:53 msgid "You can use any of the following providers to sign in." msgstr "Vous pouvez utiliser les comptes suivants pour vous connecter." @@ -634,23 +960,27 @@ msgstr "Déconnexion" #: .\cookbook\templates\account\logout.html:11 msgid "Are you sure you want to sign out?" -msgstr "Êtes-vous sûr de vouloir vous déconnecter ?" +msgstr "Êtes-vous sûr(e) de vouloir vous déconnecter ?" #: .\cookbook\templates\account\password_change.html:6 #: .\cookbook\templates\account\password_change.html:16 #: .\cookbook\templates\account\password_change.html:21 +#: .\cookbook\templates\account\password_reset_from_key.html:7 +#: .\cookbook\templates\account\password_reset_from_key.html:13 +#: .\cookbook\templates\account\password_reset_from_key_done.html:7 +#: .\cookbook\templates\account\password_reset_from_key_done.html:13 msgid "Change Password" msgstr "Modifier le mot de passe" #: .\cookbook\templates\account\password_change.html:12 #: .\cookbook\templates\account\password_set.html:12 -#: .\cookbook\templates\settings.html:52 +#: .\cookbook\templates\settings.html:76 msgid "Password" msgstr "Mot de passe" #: .\cookbook\templates\account\password_change.html:22 msgid "Forgot Password?" -msgstr "Mot de passe oublié ?" +msgstr "Mot de passe oublié ?" #: .\cookbook\templates\account\password_reset.html:7 #: .\cookbook\templates\account\password_reset.html:13 @@ -664,8 +994,8 @@ msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." msgstr "" -"Mot de passe oublié ? Entrez votre adresse mail ci-dessous et vous recevrez " -"un mail permettant de le réinitialiser." +"Mot de passe oublié ? Saisissez votre adresse mail ci-dessous et vous " +"recevrez un mail permettant de le réinitialiser." #: .\cookbook\templates\account\password_reset.html:32 msgid "Password reset is disabled on this instance." @@ -680,15 +1010,41 @@ msgstr "" "Un email a été envoyé. Contactez-nous si vous ne le recevez pas dans les " "minutes à suivre." +#: .\cookbook\templates\account\password_reset_from_key.html:13 +msgid "Bad Token" +msgstr "Mauvais jeton" + +#: .\cookbook\templates\account\password_reset_from_key.html:25 +#, python-format +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used.\n" +" Please request a new " +"password reset." +msgstr "" +"Le lien de changement du mot de passe est invalide, probablement parce qu’il " +"a déjà été utilisé.\n" +" Merci de demander un nouveau changement de mot de passe." + +#: .\cookbook\templates\account\password_reset_from_key.html:33 +msgid "change password" +msgstr "modifier le mot de passe" + +#: .\cookbook\templates\account\password_reset_from_key.html:36 +#: .\cookbook\templates\account\password_reset_from_key_done.html:19 +msgid "Your password is now changed." +msgstr "Votre mot de passe a été modifié." + #: .\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 "Ajouter un mot de passe" +msgstr "Définir un mot de passe" #: .\cookbook\templates\account\signup.html:6 msgid "Register" -msgstr "S'inscrire" +msgstr "S’inscrire" #: .\cookbook\templates\account\signup.html:12 msgid "Create an Account" @@ -697,12 +1053,12 @@ msgstr "Créer un compte" #: .\cookbook\templates\account\signup.html:42 #: .\cookbook\templates\socialaccount\signup.html:33 msgid "I accept the follwoing" -msgstr "J'accepte les" +msgstr "J’accepte les" #: .\cookbook\templates\account\signup.html:45 #: .\cookbook\templates\socialaccount\signup.html:36 msgid "Terms and Conditions" -msgstr "conditions d'utilisations" +msgstr "conditions d’utilisation" #: .\cookbook\templates\account\signup.html:48 #: .\cookbook\templates\socialaccount\signup.html:39 @@ -720,7 +1076,7 @@ msgstr "Créer un utilisateur" #: .\cookbook\templates\account\signup.html:69 msgid "Already have an account?" -msgstr "Vous avez déjà un compte ?" +msgstr "Vous avez déjà un compte ?" #: .\cookbook\templates\account\signup_closed.html:5 #: .\cookbook\templates\account\signup_closed.html:11 @@ -731,114 +1087,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:179 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:279 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "Documentation API" -#: .\cookbook\templates\base.html:85 -msgid "Utensils" -msgstr "Ustensiles" - -#: .\cookbook\templates\base.html:95 +#: .\cookbook\templates\base.html:86 msgid "Shopping" msgstr "Courses" -#: .\cookbook\templates\base.html:101 -#: .\cookbook\templates\shopping_list.html:230 +#: .\cookbook\templates\base.html:113 +msgid "Keyword" +msgstr "Mot-clé" + +#: .\cookbook\templates\base.html:125 .\cookbook\views\lists.py:114 +msgid "Foods" +msgstr "Aliments" + +#: .\cookbook\templates\base.html:137 +#: .\cookbook\templates\forms\ingredients.html:24 +#: .\cookbook\templates\space.html:47 .\cookbook\templates\stats.html:26 +#: .\cookbook\views\lists.py:131 +msgid "Units" +msgstr "Unités" + +#: .\cookbook\templates\base.html:151 +#: .\cookbook\templates\shopping_list.html:208 #: .\cookbook\templates\supermarket.html:7 msgid "Supermarket" msgstr "Supermarché" -#: .\cookbook\templates\base.html:112 .\cookbook\views\delete.py:84 -#: .\cookbook\views\edit.py:102 .\cookbook\views\lists.py:26 -#: .\cookbook\views\new.py:78 -msgid "Keyword" -msgstr "Mot-clé" +#: .\cookbook\templates\base.html:163 +msgid "Supermarket Category" +msgstr "Catégorie de supermarché" -#: .\cookbook\templates\base.html:114 +#: .\cookbook\templates\base.html:175 .\cookbook\views\lists.py:180 +msgid "Automations" +msgstr "Automatisations" + +#: .\cookbook\templates\base.html:189 .\cookbook\views\lists.py:200 +msgid "Files" +msgstr "Fichiers" + +#: .\cookbook\templates\base.html:201 msgid "Batch Edit" -msgstr "Modification en masse" +msgstr "Édition par lot" -#: .\cookbook\templates\base.html:119 -msgid "Storage Data" -msgstr "Données de stockage" - -#: .\cookbook\templates\base.html:123 -msgid "Storage Backends" -msgstr "Espaces de stockage" - -#: .\cookbook\templates\base.html:125 -msgid "Configure Sync" -msgstr "Configurer synchro" - -#: .\cookbook\templates\base.html:127 -msgid "Discovered Recipes" -msgstr "Recettes découvertes" - -#: .\cookbook\templates\base.html:129 -msgid "Discovery Log" -msgstr "Historique des découvertes" - -#: .\cookbook\templates\base.html:131 .\cookbook\templates\stats.html:10 -msgid "Statistics" -msgstr "Statistiques" - -#: .\cookbook\templates\base.html:133 -msgid "Units & Ingredients" -msgstr "Unités et ingrédients" - -#: .\cookbook\templates\base.html:135 .\cookbook\templates\index.html:47 -msgid "Import Recipe" -msgstr "Importer une recette" - -#: .\cookbook\templates\base.html:156 .\cookbook\templates\history.html:6 +#: .\cookbook\templates\base.html:213 .\cookbook\templates\history.html:6 #: .\cookbook\templates\history.html:14 msgid "History" msgstr "Historique" -#: .\cookbook\templates\base.html:159 .\cookbook\templates\space.html:7 -#: .\cookbook\templates\space.html:19 +#: .\cookbook\templates\base.html:228 .\cookbook\templates\export.html:14 +#: .\cookbook\templates\export.html:20 +#: .\cookbook\templates\shopping_list.html:310 +#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 +msgid "Export" +msgstr "Exporter" + +#: .\cookbook\templates\base.html:244 .\cookbook\templates\index.html:47 +msgid "Import Recipe" +msgstr "Importer une recette" + +#: .\cookbook\templates\base.html:246 +#: .\cookbook\templates\shopping_list.html:165 +#: .\cookbook\templates\shopping_list.html:188 +msgid "Create" +msgstr "Créer" + +#: .\cookbook\templates\base.html:259 +#: .\cookbook\templates\generic\list_template.html:14 +#: .\cookbook\templates\space.html:69 .\cookbook\templates\stats.html:43 +msgid "External Recipes" +msgstr "Recettes externes" + +#: .\cookbook\templates\base.html:262 .\cookbook\templates\space.html:8 +#: .\cookbook\templates\space.html:20 .\cookbook\templates\space.html:150 msgid "Space Settings" msgstr "Paramètres de groupe" -#: .\cookbook\templates\base.html:163 .\cookbook\templates\system.html:13 +#: .\cookbook\templates\base.html:267 .\cookbook\templates\system.html:13 msgid "System" msgstr "Système" -#: .\cookbook\templates\base.html:165 .\cookbook\templates\base.html:171 +#: .\cookbook\templates\base.html:269 msgid "Admin" msgstr "Admin" -#: .\cookbook\templates\base.html:175 +#: .\cookbook\templates\base.html:273 msgid "Markdown Guide" msgstr "Guide Markdown" -#: .\cookbook\templates\base.html:177 +#: .\cookbook\templates\base.html:275 msgid "GitHub" msgstr "GitHub" -#: .\cookbook\templates\base.html:181 +#: .\cookbook\templates\base.html:277 +msgid "Translate Tandoor" +msgstr "Traduire Tandoor" + +#: .\cookbook\templates\base.html:281 msgid "API Browser" msgstr "Navigateur API" -#: .\cookbook\templates\base.html:184 +#: .\cookbook\templates\base.html:284 msgid "Log out" msgstr "Déconnexion" #: .\cookbook\templates\batch\edit.html:6 msgid "Batch edit Category" -msgstr "Modifier en masse les catégories" +msgstr "Édition par lot des catégories" #: .\cookbook\templates\batch\edit.html:15 msgid "Batch edit Recipes" -msgstr "Modifier en masse les recettes" +msgstr "Édition par lot des recettes" #: .\cookbook\templates\batch\edit.html:20 msgid "Add the specified keywords to all recipes containing a word" msgstr "Ajouter les mots-clés spécifiés à toutes les recettes contenant un mot" -#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:85 +#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:82 msgid "Sync" msgstr "Synchro" @@ -858,14 +1226,40 @@ msgstr "" msgid "The path must be in the following format" msgstr "Le chemin doit être au format suivant" -#: .\cookbook\templates\batch\monitor.html:27 +#: .\cookbook\templates\batch\monitor.html:20 +#: .\cookbook\templates\forms\edit_import_recipe.html:14 +#: .\cookbook\templates\generic\edit_template.html:23 +#: .\cookbook\templates\generic\new_template.html:23 +#: .\cookbook\templates\include\log_cooking.html:30 +#: .\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\shopping_list.html:311 +#: .\cookbook\templates\space.html:155 +msgid "Save" +msgstr "Sauvegarder" + +#: .\cookbook\templates\batch\monitor.html:21 +msgid "Manage External Storage" +msgstr "Gérer le stockage externe" + +#: .\cookbook\templates\batch\monitor.html:28 msgid "Sync Now!" -msgstr "Lancer la synchro !" +msgstr "Lancer la synchro !" + +#: .\cookbook\templates\batch\monitor.html:29 +msgid "Show Recipes" +msgstr "Afficher les recettes" + +#: .\cookbook\templates\batch\monitor.html:30 +msgid "Show Log" +msgstr "Afficher le journal" #: .\cookbook\templates\batch\waiting.html:4 #: .\cookbook\templates\batch\waiting.html:10 msgid "Importing Recipes" -msgstr "Importer des ecettes" +msgstr "Importer des recettes" #: .\cookbook\templates\batch\waiting.html:28 msgid "" @@ -875,257 +1269,23 @@ msgstr "" "Cela peut prendre quelques minutes, selon le nombre de recettes à " "synchroniser. Veuillez patienter." -#: .\cookbook\templates\books.html:5 .\cookbook\templates\books.html:11 +#: .\cookbook\templates\books.html:7 msgid "Recipe Books" msgstr "Livres de recettes" -#: .\cookbook\templates\books.html:15 -msgid "New Book" -msgstr "Nouveau livre" - -#: .\cookbook\templates\books.html:27 .\cookbook\templates\recipe_view.html:26 -msgid "by" -msgstr "par" - -#: .\cookbook\templates\books.html:34 -msgid "Toggle Recipes" -msgstr "Afficher les recettes" - -#: .\cookbook\templates\books.html:54 -#: .\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\books.html:71 -msgid "There are no recipes in this book yet." -msgstr "Il n'y a pas encore de recettes dans ce livre." - #: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6 msgid "Export Recipes" -msgstr "Exporter des ecettes" - -#: .\cookbook\templates\export.html:14 .\cookbook\templates\export.html:20 -#: .\cookbook\templates\shopping_list.html:351 -#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 -msgid "Export" -msgstr "Exporter" - -#: .\cookbook\templates\files.html:7 -msgid "Files" -msgstr "Fichiers" +msgstr "Exporter des recettes" #: .\cookbook\templates\forms\edit_import_recipe.html:5 #: .\cookbook\templates\forms\edit_import_recipe.html:9 msgid "Import new Recipe" msgstr "Importer une nouvelle recette" -#: .\cookbook\templates\forms\edit_import_recipe.html:14 -#: .\cookbook\templates\forms\edit_internal_recipe.html:439 -#: .\cookbook\templates\forms\edit_internal_recipe.html:471 -#: .\cookbook\templates\generic\edit_template.html:23 -#: .\cookbook\templates\generic\new_template.html:23 -#: .\cookbook\templates\include\log_cooking.html:28 -#: .\cookbook\templates\meal_plan.html:325 -#: .\cookbook\templates\settings.html:46 .\cookbook\templates\settings.html:87 -#: .\cookbook\templates\settings.html:105 -#: .\cookbook\templates\shopping_list.html:353 -msgid "Save" -msgstr "Sauvegarder" - #: .\cookbook\templates\forms\edit_internal_recipe.html:7 -#: .\cookbook\templates\forms\edit_internal_recipe.html:34 msgid "Edit Recipe" msgstr "Modifier une recette" -#: .\cookbook\templates\forms\edit_internal_recipe.html:56 -#: .\cookbook\templates\url_import.html:171 -msgid "Description" -msgstr "Description" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:76 -msgid "Waiting Time" -msgstr "Temps d'attente" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:82 -msgid "Servings Text" -msgstr "Service" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:93 -msgid "Select Keywords" -msgstr "Sélectionner des mots-clés" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:94 -#: .\cookbook\templates\url_import.html:583 -msgid "Add Keyword" -msgstr "Ajouter un mot-clé" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:112 -msgid "Nutrition" -msgstr "Informations nutritionnelles" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:116 -#: .\cookbook\templates\forms\edit_internal_recipe.html:166 -msgid "Delete Step" -msgstr "Supprimer l'étape" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:120 -msgid "Calories" -msgstr "Calories" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:123 -msgid "Carbohydrates" -msgstr "Glucides" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:126 -msgid "Fats" -msgstr "Matières grasses" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:128 -msgid "Proteins" -msgstr "Protéines" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:150 -#: .\cookbook\templates\forms\edit_internal_recipe.html:504 -msgid "Step" -msgstr "Étape" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:171 -msgid "Show as header" -msgstr "Afficher en entête" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:177 -msgid "Hide as header" -msgstr "Masquer en entête" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:182 -msgid "Move Up" -msgstr "Remonter" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:187 -msgid "Move Down" -msgstr "Descendre" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:196 -msgid "Step Name" -msgstr "Nom de l'étape" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:200 -msgid "Step Type" -msgstr "Type de l'étape" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:213 -msgid "Step time in Minutes" -msgstr "Durée de l'étape en minutes" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:229 -msgid "Select File" -msgstr "Sélectionner un fichier" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:230 -#: .\cookbook\templates\forms\edit_internal_recipe.html:252 -#: .\cookbook\templates\forms\edit_internal_recipe.html:313 -#: .\cookbook\templates\forms\edit_internal_recipe.html:337 -#: .\cookbook\templates\shopping_list.html:189 -#: .\cookbook\templates\shopping_list.html:211 -#: .\cookbook\templates\shopping_list.html:241 -#: .\cookbook\templates\shopping_list.html:265 -#: .\cookbook\templates\url_import.html:495 -#: .\cookbook\templates\url_import.html:527 -msgid "Select" -msgstr "Sélectionner" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:251 -msgid "Select Recipe" -msgstr "Sélectionner la recette" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:311 -#: .\cookbook\templates\shopping_list.html:187 -msgid "Select Unit" -msgstr "Sélectionnez l'unité" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:312 -#: .\cookbook\templates\forms\edit_internal_recipe.html:336 -#: .\cookbook\templates\shopping_list.html:188 -#: .\cookbook\templates\shopping_list.html:210 -msgid "Create" -msgstr "Créer" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:335 -#: .\cookbook\templates\shopping_list.html:209 -msgid "Select Food" -msgstr "Sélectionnez l'ingrédient" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:352 -#: .\cookbook\templates\meal_plan.html:256 -#: .\cookbook\templates\url_import.html:542 -msgid "Note" -msgstr "Notes" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:369 -msgid "Delete Ingredient" -msgstr "Supprimer l'ingrédient" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:375 -msgid "Make Header" -msgstr "Transformer en texte" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:381 -msgid "Make Ingredient" -msgstr "Transformer en ingrédient" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:387 -msgid "Disable Amount" -msgstr "Sans quantité" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:393 -msgid "Enable Amount" -msgstr "Avec quantité" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:398 -msgid "Copy Template Reference" -msgstr "Copier le modèle de référence" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:424 -#: .\cookbook\templates\url_import.html:297 -#: .\cookbook\templates\url_import.html:567 -msgid "Instructions" -msgstr "Instructions" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:437 -#: .\cookbook\templates\forms\edit_internal_recipe.html:468 -msgid "Save & View" -msgstr "Sauvegarder et afficher" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:441 -#: .\cookbook\templates\forms\edit_internal_recipe.html:474 -msgid "Add Step" -msgstr "Ajouter une étape" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:444 -#: .\cookbook\templates\forms\edit_internal_recipe.html:478 -msgid "Add Nutrition" -msgstr "Ajouter les informations nutritionnelles" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:446 -#: .\cookbook\templates\forms\edit_internal_recipe.html:480 -msgid "Remove Nutrition" -msgstr "Supprimer les informations nutritionnelles" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:448 -#: .\cookbook\templates\forms\edit_internal_recipe.html:483 -msgid "View Recipe" -msgstr "Afficher la recette" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:450 -#: .\cookbook\templates\forms\edit_internal_recipe.html:485 -msgid "Delete Recipe" -msgstr "Supprimer la recette" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:491 -msgid "Steps" -msgstr "Étapes" - #: .\cookbook\templates\forms\ingredients.html:15 msgid "Edit Ingredients" msgstr "Modifier les ingrédients" @@ -1143,18 +1303,13 @@ msgstr "" "\n" " Le formulaire suivant est utile lorsqu'il y a des doublons dans les " "unités ou les ingrédients.\n" -"Il fusionne deux unités ou ingrédients et met à jour toutes les recettes les " -"utilisant.\n" +" Il fusionne deux unités ou ingrédients et met à jour toutes les " +"recettes les utilisant.\n" " " -#: .\cookbook\templates\forms\ingredients.html:24 -#: .\cookbook\templates\space.html:41 .\cookbook\templates\stats.html:26 -msgid "Units" -msgstr "Unités" - #: .\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 ?" +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 @@ -1163,31 +1318,48 @@ 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 ?" +msgstr "Êtes-vous sûr(e) de vouloir fusionner ces deux ingrédients ?" -#: .\cookbook\templates\generic\delete_template.html:18 +#: .\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 certain de vouloir supprimer %(title)s : %(object)s " +msgstr "Êtes-vous sûr(e) de vouloir supprimer %(title)s : %(object)s " -#: .\cookbook\templates\generic\edit_template.html:30 +#: .\cookbook\templates\generic\delete_template.html:26 +msgid "Protected" +msgstr "Protégé" + +#: .\cookbook\templates\generic\delete_template.html:41 +msgid "Cascade" +msgstr "Cascade" + +#: .\cookbook\templates\generic\delete_template.html:72 +msgid "Cancel" +msgstr "Annuler" + +#: .\cookbook\templates\generic\edit_template.html:32 msgid "View" msgstr "Voir" -#: .\cookbook\templates\generic\edit_template.html:34 +#: .\cookbook\templates\generic\edit_template.html:36 msgid "Delete original file" msgstr "Supprimer le fichier original" #: .\cookbook\templates\generic\list_template.html:6 -#: .\cookbook\templates\generic\list_template.html:12 +#: .\cookbook\templates\generic\list_template.html:22 msgid "List" msgstr "Liste" -#: .\cookbook\templates\generic\list_template.html:25 +#: .\cookbook\templates\generic\list_template.html:33 +#: .\cookbook\templates\shopping_list.html:33 +msgid "Try the new shopping list" +msgstr "Essayer la nouvelle liste de courses" + +#: .\cookbook\templates\generic\list_template.html:45 msgid "Filter" msgstr "Filtre" -#: .\cookbook\templates\generic\list_template.html:30 +#: .\cookbook\templates\generic\list_template.html:50 msgid "Import all" msgstr "Tout importer" @@ -1203,7 +1375,7 @@ msgstr "suivant" #: .\cookbook\templates\history.html:20 msgid "View Log" -msgstr "Voir l'historique" +msgstr "Voir l’historique" #: .\cookbook\templates\history.html:24 msgid "Cook Log" @@ -1213,23 +1385,32 @@ msgstr "Historique de cuisine" msgid "Import Recipes" msgstr "Importer des recettes" -#: .\cookbook\templates\include\log_cooking.html:7 +#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 +#: .\cookbook\templates\import_response.html:7 +#: .\cookbook\templates\test.html:14 .\cookbook\templates\test.html:20 +#: .\cookbook\templates\url_import.html:29 +#: .\cookbook\templates\url_import.html:108 +#: .\cookbook\templates\url_import.html:130 +#: .\cookbook\templates\url_import.html:324 +#: .\cookbook\templates\url_import.html:618 .\cookbook\views\delete.py:89 +#: .\cookbook\views\edit.py:200 +msgid "Import" +msgstr "Importer" + +#: .\cookbook\templates\include\log_cooking.html:9 msgid "Log Recipe Cooking" msgstr "Marquer la recette comme cuisinée" -#: .\cookbook\templates\include\log_cooking.html:13 +#: .\cookbook\templates\include\log_cooking.html:15 msgid "All fields are optional and can be left empty." msgstr "Tous les champs sont facultatifs et peuvent être laissés vides." -#: .\cookbook\templates\include\log_cooking.html:19 +#: .\cookbook\templates\include\log_cooking.html:21 msgid "Rating" msgstr "Note" -#: .\cookbook\templates\include\log_cooking.html:27 +#: .\cookbook\templates\include\log_cooking.html:29 #: .\cookbook\templates\include\recipe_open_modal.html:18 -#: .\cookbook\templates\meal_plan.html:283 -#: .\cookbook\templates\meal_plan.html:327 -#: .\cookbook\templates\meal_plan.html:366 msgid "Close" msgstr "Fermer" @@ -1256,9 +1437,9 @@ msgstr "" "\n" " Les champs Mot de passe et Token sont stockés en texte " "brutdans la base de données.\n" -"C'est nécessaire car ils sont utilisés pour faire des requêtes API, mais " -"cela accroît le risque que quelqu'un les vole.
\n" -"Pour limiter les risques, des tokens ou comptes avec un accès limité " +" C'est nécessaire car ils sont utilisés pour faire des requêtes API, " +"mais cela accroît le risque que quelqu'un les vole.
\n" +" Pour limiter les risques, des tokens ou comptes avec un accès limité " "devraient être utilisés.\n" " " @@ -1268,7 +1449,7 @@ msgstr "Rechercher une recette..." #: .\cookbook\templates\index.html:44 msgid "New Recipe" -msgstr "Nouvelle ecette" +msgstr "Nouvelle recette" #: .\cookbook\templates\index.html:53 msgid "Advanced Search" @@ -1282,8 +1463,8 @@ msgstr "Réinitialiser la recherche" msgid "Last viewed" msgstr "Dernières recettes vues" -#: .\cookbook\templates\index.html:87 .\cookbook\templates\meal_plan.html:178 -#: .\cookbook\templates\space.html:35 .\cookbook\templates\stats.html:22 +#: .\cookbook\templates\index.html:87 .\cookbook\templates\space.html:37 +#: .\cookbook\templates\stats.html:22 msgid "Recipes" msgstr "Recettes" @@ -1314,13 +1495,14 @@ msgstr "" "\n" " Markdown est un langage de balisage léger utilisé pour formatter du " "texte facilement.\n" -"Ce site utilise la bibliothèque Python Markdown pour convertir votre texte en un " -"joli format HTML. Sa documentation complète est consultable ici.\n" -"Une documentation incomplète mais probablement suffisante se trouve plus " -"bas.\n" +" Ce site utilise la bibliothèque Python Markdown \n" +" pour convertir votre texte en un joli format HTML. Sa documentation " +"complète est consultable\n" +" ici.\n" +" Une documentation incomplète mais probablement suffisante se trouve " +"plus bas.\n" " " #: .\cookbook\templates\markdown_info.html:25 @@ -1335,7 +1517,7 @@ msgstr "Mise en forme" #: .\cookbook\templates\markdown_info.html:72 msgid "Line breaks are inserted by adding two spaces after the end of a line" msgstr "" -"Les sauts de ligne s'insèrent en ajoutant deux espaces après la fin d'une " +"Vous insérez des sauts de ligne en ajoutant deux espaces après la fin d’une " "ligne" #: .\cookbook\templates\markdown_info.html:57 @@ -1356,7 +1538,7 @@ msgstr "Ce texte est en italique" #: .\cookbook\templates\markdown_info.html:61 #: .\cookbook\templates\markdown_info.html:77 msgid "Blockquotes are also possible" -msgstr "On peut également faire des blocs de citation" +msgstr "Les citations groupées sont également possibles" #: .\cookbook\templates\markdown_info.html:84 msgid "Lists" @@ -1368,7 +1550,7 @@ msgid "" "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 @@ -1382,7 +1564,7 @@ msgstr "Liste ordonnée" #: .\cookbook\templates\markdown_info.html:111 #: .\cookbook\templates\markdown_info.html:112 msgid "unordered list item" -msgstr "élément d'une liste non ordonnée" +msgstr "élément d’une liste non ordonnée" #: .\cookbook\templates\markdown_info.html:93 #: .\cookbook\templates\markdown_info.html:114 @@ -1396,7 +1578,7 @@ msgstr "Liste non ordonnée" #: .\cookbook\templates\markdown_info.html:117 #: .\cookbook\templates\markdown_info.html:118 msgid "ordered list item" -msgstr "élément d'une liste ordonné" +msgstr "élément d’une liste ordonnée" #: .\cookbook\templates\markdown_info.html:125 msgid "Images & Links" @@ -1425,10 +1607,10 @@ msgid "" "editor like this one." msgstr "" -"Les tableaux Markdown sont difficiles à créer à la main. Il est recommandé " -"d'utiliser un éditeur de tableau comme celui-ci." -"" +"Les tableaux Markdown sont difficiles à créer à la main. Il est recommandé d’" +"utiliser un éditeur de tableau comme celui-" +"ci." #: .\cookbook\templates\markdown_info.html:155 #: .\cookbook\templates\markdown_info.html:157 @@ -1447,171 +1629,23 @@ msgstr "En-tête" msgid "Cell" msgstr "Cellule" -#: .\cookbook\templates\meal_plan.html:101 -msgid "New Entry" -msgstr "Nouvelle ligne" +#: .\cookbook\templates\meal_plan_entry.html:6 +msgid "Meal Plan View" +msgstr "Vue des menus" -#: .\cookbook\templates\meal_plan.html:113 -#: .\cookbook\templates\shopping_list.html:56 -msgid "Search Recipe" -msgstr "Rechercher une recette" - -#: .\cookbook\templates\meal_plan.html:139 -msgid "Title" -msgstr "Titre" - -#: .\cookbook\templates\meal_plan.html:141 -msgid "Note (optional)" -msgstr "Note (facultatif)" - -#: .\cookbook\templates\meal_plan.html:143 -msgid "" -"You can use markdown to format this field. See the docs here" -msgstr "" -"Vous pouvez utiliser du markdown pour mettre en forme ce champ. Consultez la " -"documentation ici" - -#: .\cookbook\templates\meal_plan.html:147 -#: .\cookbook\templates\meal_plan.html:251 -msgid "Serving Count" -msgstr "Nombre de parts" - -#: .\cookbook\templates\meal_plan.html:153 -msgid "Create only note" -msgstr "Créer uniquement une note" - -#: .\cookbook\templates\meal_plan.html:168 -#: .\cookbook\templates\shopping_list.html:7 -#: .\cookbook\templates\shopping_list.html:29 -#: .\cookbook\templates\shopping_list.html:714 -msgid "Shopping List" -msgstr "Liste de courses" - -#: .\cookbook\templates\meal_plan.html:172 -msgid "Shopping list currently empty" -msgstr "La liste de courses est actuellement vide" - -#: .\cookbook\templates\meal_plan.html:175 -msgid "Open Shopping List" -msgstr "Ouvrir la liste de courses" - -#: .\cookbook\templates\meal_plan.html:189 -msgid "Plan" -msgstr "Menu" - -#: .\cookbook\templates\meal_plan.html:196 -msgid "Number of Days" -msgstr "Nombre de jours" - -#: .\cookbook\templates\meal_plan.html:206 -msgid "Weekday offset" -msgstr "Décalage du jour" - -#: .\cookbook\templates\meal_plan.html:209 -msgid "" -"Number of days starting from the first day of the week to offset the default " -"view." -msgstr "" -"Permet de décaler le premier jour de la semaine dans la vue par défaut." - -#: .\cookbook\templates\meal_plan.html:217 -#: .\cookbook\templates\meal_plan.html:294 -msgid "Edit plan types" -msgstr "Modifier l'organisation du menu" - -#: .\cookbook\templates\meal_plan.html:219 -msgid "Show help" -msgstr "Afficher l'aide" - -#: .\cookbook\templates\meal_plan.html:220 -msgid "Week iCal export" -msgstr "Export iCal" - -#: .\cookbook\templates\meal_plan.html:264 #: .\cookbook\templates\meal_plan_entry.html:18 msgid "Created by" msgstr "Créé par" -#: .\cookbook\templates\meal_plan.html:270 #: .\cookbook\templates\meal_plan_entry.html:20 -#: .\cookbook\templates\shopping_list.html:254 +#: .\cookbook\templates\shopping_list.html:232 msgid "Shared with" msgstr "Partagé avec" -#: .\cookbook\templates\meal_plan.html:280 -msgid "Add to Shopping" -msgstr "Ajouter aux courses" - -#: .\cookbook\templates\meal_plan.html:323 -msgid "New meal type" -msgstr "Nouveau type de repas" - -#: .\cookbook\templates\meal_plan.html:338 -msgid "Meal Plan Help" -msgstr "Aide sur le menu de la semaine" - -#: .\cookbook\templates\meal_plan.html:344 -msgid "" -"\n" -"

The meal plan module allows planning of meals " -"both with recipes and notes.

\n" -"

Simply select a recipe from the list of " -"recently viewed recipes or search the one you\n" -" want and drag it to the desired plan " -"position. You can also add a note and a title and\n" -" then drag the recipe to create a plan entry " -"with a custom title and note. Creating only\n" -" Notes is possible by dragging the create " -"note box into the plan.

\n" -"

Click on a recipe in order to open the " -"detailed view. There you can also add it to the\n" -" shopping list. You can also add all recipes " -"of a day to the shopping list by\n" -" clicking the shopping cart at the top of the " -"table.

\n" -"

Since a common use case is to plan meals " -"together you can define\n" -" users you want to share your plan with in " -"the settings.\n" -"

\n" -"

You can also edit the types of meals you want " -"to plan. If you share your plan with\n" -" someone with\n" -" different meals, their meal types will " -"appear in your list as well. To prevent\n" -" duplicates (e.g. Other and Misc.)\n" -" name your meal types the same as the users " -"you share your meals with and they will be\n" -" merged.

\n" -" " -msgstr "" -"\n" -"

Le module menu de la semaine permet de " -"planifier les repas grâce à des recettes et des notes.

\n" -"

Choisissez simplement une recette dans la liste des recettes récemment " -"vues ou cherchez celle de votre choix et glissez-la à l'emplacement désiré. " -"Vous pouvez aussi ajouter une notre et un titre puis glisser la recette pour " -"créer une entrée personnalisée. Il est possible de n'utiliser que des notes " -"en glissant la boîte de création de notes dans le menu.

\n" -"

Cliquez sur une recette pour ouvrir la vue détaillée. Là, vous pouvez " -"aussi l'ajouter à la liste de courses.Vous pouvez aussi ajouter toutes les " -"recettes d'une journée à la liste de courses en cliquant sur le caddy en " -"haut du tableau.

\n" -"

Étant donné que les menus de la semaine sont souvent préparés ensemble, " -"vous pouvez définir des utilisateurs avec qui partager votre menu dans les " -"paramètres.

\n" -"

Vous pouvez aussi modifier le type de repas que vous voulez planifier. Si " -"vous partagez le menu avec quelqu'un qui a d'autres types de repas, leurs " -"repas apparaîtront aussi dans votre liste. Pour éviter les doublons, nommez " -"vos types de repas de la même façon que les utilisateurs avec qui vous " -"l'avez partager afin qu'ils soient fusionnés.

\n" -" " - -#: .\cookbook\templates\meal_plan_entry.html:6 -msgid "Meal Plan View" -msgstr "Vue des menus" +#: .\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." @@ -1624,35 +1658,35 @@ msgstr "Autres repas ce jour" #: .\cookbook\templates\no_groups_info.html:5 #: .\cookbook\templates\no_groups_info.html:12 msgid "No Permissions" -msgstr "Pas d'autorisations" +msgstr "Pas d’autorisations" #: .\cookbook\templates\no_groups_info.html:17 msgid "You do not have any groups and therefor cannot use this application." msgstr "" -"Vous n'êtes pas lié à un groupe, ainsi, vous ne pouvez utiliser cette " +"Vous ne faites pas partie d’un groupe et ne pouvez donc pas utiliser cette " "application." #: .\cookbook\templates\no_groups_info.html:18 #: .\cookbook\templates\no_perm_info.html:15 msgid "Please contact your administrator." -msgstr "Veuillez contacter l'administrateur." +msgstr "Veuillez contacter l’administrateur." #: .\cookbook\templates\no_perm_info.html:5 #: .\cookbook\templates\no_perm_info.html:12 msgid "No Permission" -msgstr "Pas d'autorisation" +msgstr "Pas d’autorisation" #: .\cookbook\templates\no_perm_info.html:15 msgid "" "You do not have the required permissions to view this page or perform this " "action." msgstr "" -"Vous n'avez pas la permission de voir cette page ou d'effectuer cette action." +"Vous n’avez pas la permission de voir cette page ou d’effectuer cette action." #: .\cookbook\templates\no_space_info.html:6 #: .\cookbook\templates\no_space_info.html:13 msgid "No Space" -msgstr "Pas de groupe" +msgstr "Aucun groupe" #: .\cookbook\templates\no_space_info.html:17 msgid "" @@ -1660,7 +1694,7 @@ msgid "" "more people." msgstr "" "Recettes, aliments, listes de courses et plus encore sont organisés en " -"groupes d'une ou plusieurs personnes." +"groupes d’une ou plusieurs personnes." #: .\cookbook\templates\no_space_info.html:18 msgid "" @@ -1681,8 +1715,8 @@ msgid "" "To join an existing space either enter your invite token or click on the " "invite link the space owner send you." msgstr "" -"Pour rejoindre un groupe déjà existant, entrez le token d'invitation ou " -"cliquez sur le lien d'invitation que le créateur du groupe vous a envoyé." +"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\no_space_info.html:48 #: .\cookbook\templates\no_space_info.html:56 @@ -1696,16 +1730,16 @@ msgstr "Créer votre propre groupe de partage de recettes." #: .\cookbook\templates\no_space_info.html:52 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." +"Créez votre propre groupe de partage de recettes et invitez d’autres " +"utilisateurs à l’utiliser." #: .\cookbook\templates\offline.html:6 msgid "Offline" -msgstr "Hors-ligne" +msgstr "Hors ligne" #: .\cookbook\templates\offline.html:19 msgid "You are currently offline!" -msgstr "Vous êtes actuellement hors-ligne !" +msgstr "Vous êtes actuellement hors ligne !" #: .\cookbook\templates\offline.html:20 msgid "" @@ -1713,32 +1747,31 @@ msgid "" "recently viewed them. Keep in mind that data might be outdated." msgstr "" "Les recettes listées ci-dessous sont accessible hors connexion car vous les " -"avez récemment regardées. Gardez à l'esprit que les données peuvent avoir " -"été modifiées depuis." +"avez récemment regardées. Veuillez tenir compte du fait que les données " +"peuvent avoir été modifiées depuis." -#: .\cookbook\templates\recipe_view.html:21 .\cookbook\templates\space.html:62 -#: .\cookbook\templates\stats.html:47 -msgid "Comments" -msgstr "Commentaires" +#: .\cookbook\templates\recipe_view.html:26 +msgid "by" +msgstr "par" -#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:118 -#: .\cookbook\views\edit.py:179 +#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:147 +#: .\cookbook\views\edit.py:180 msgid "Comment" msgstr "Commentaire" #: .\cookbook\templates\recipes_table.html:19 #: .\cookbook\templates\recipes_table.html:23 -#: .\cookbook\templates\url_import.html:440 +#: .\cookbook\templates\url_import.html:447 msgid "Recipe Image" msgstr "Image de la recette" #: .\cookbook\templates\recipes_table.html:51 -#: .\cookbook\templates\url_import.html:445 +#: .\cookbook\templates\url_import.html:452 msgid "Preparation time ca." msgstr "Temps moyen de préparation" #: .\cookbook\templates\recipes_table.html:57 -#: .\cookbook\templates\url_import.html:450 +#: .\cookbook\templates\url_import.html:457 msgid "Waiting time ca." msgstr "Temps moyen d'attente" @@ -1752,69 +1785,423 @@ msgstr "Marquer comme cuisiné" #: .\cookbook\templates\rest_framework\api.html:5 msgid "Recipe Home" -msgstr "Page d'accueil" +msgstr "Page d’accueil" -#: .\cookbook\templates\settings.html:25 +#: .\cookbook\templates\search_info.html:5 +#: .\cookbook\templates\search_info.html:9 +#: .\cookbook\templates\settings.html:172 +msgid "Search Settings" +msgstr "Paramètres de recherche" + +#: .\cookbook\templates\search_info.html:10 +msgid "" +"\n" +" Creating the best search experience is complicated and weighs " +"heavily on your personal configuration. \n" +" Changing any of the search settings can have significant impact on " +"the speed and quality of the results.\n" +" Search Methods, Trigrams and Full Text Search configurations are " +"only available if you are using Postgres for your database.\n" +" " +msgstr "" +"\n" +" La création d'une expérience de recherche optimale est complexe et " +"dépend fortement de votre configuration personnelle. \n" +" La modification de l'un des paramètres de recherche peut avoir un " +"impact significatif sur la vitesse et la qualité des résultats.\n" +" Les configurations Méthodes de recherche, Trigrammes et Recherche " +"texte intégral ne sont disponibles que si vous utilisez Postgres comme base " +"de données.\n" +" " + +#: .\cookbook\templates\search_info.html:19 +msgid "Search Methods" +msgstr "Méthodes de recherche" + +#: .\cookbook\templates\search_info.html:23 +msgid "" +" \n" +" Full text searches attempt to normalize the words provided to " +"match common variants. For example: 'forked', 'forking', 'forks' will all " +"normalize to 'fork'.\n" +" There are several methods available, described below, that will " +"control how the search behavior should react when multiple words are " +"searched.\n" +" Full technical details on how these operate can be viewed on Postgresql's website.\n" +" " +msgstr "" +" \n" +" Les recherches en texte intégral tentent de normaliser les mots " +"fournis pour qu'ils correspondent aux variantes courantes. Par exemple : " +"\"forked\", \"forking\", \"forks\" seront tous normalisés en \"fork\".\n" +" Il existe plusieurs méthodes, décrites ci-dessous, qui " +"permettent de contrôler la façon dont la recherche doit réagir lorsque " +"plusieurs mots sont recherchés.\n" +" Des détails techniques complets sur leur fonctionnement peuvent " +"être consultés sur le site Postgresql's website.\n" +" " + +#: .\cookbook\templates\search_info.html:29 +msgid "" +" \n" +" Simple searches ignore punctuation and common words such as " +"'the', 'a', 'and'. And will treat seperate words as required.\n" +" Searching for 'apple or flour' will return any recipe that " +"includes both 'apple' and 'flour' anywhere in the fields that have been " +"selected for a full text search.\n" +" " +msgstr "" +" \n" +" Les recherches simples ignorent la ponctuation et les mots " +"courants tels que \"le\", \"a\", \"et\", et traiteront les mots séparés " +"comme il se doit.\n" +" Si vous recherchez \"pomme ou farine\", vous obtiendrez toutes " +"les recettes qui contiennent à la fois \"pomme\" et \"farine\" dans les " +"champs sélectionnés pour la recherche en texte intégral.\n" +" " + +#: .\cookbook\templates\search_info.html:34 +msgid "" +" \n" +" Phrase searches ignore punctuation, but will search for all of " +"the words in the exact order provided.\n" +" Searching for 'apple or flour' will only return a recipe that " +"includes the exact phrase 'apple or flour' in any of the fields that have " +"been selected for a full text search.\n" +" " +msgstr "" +" \n" +" Les recherches de phrases ignorent la ponctuation, mais " +"recherchent tous les mots dans l'ordre exact indiqué.\n" +" La recherche de \"pomme ou farine\" ne donnera que les recettes " +"qui contiennent l'expression exacte \"pomme ou farine\" dans l'un des champs " +"sélectionnés pour la recherche en texte intégral.\n" +" " + +#: .\cookbook\templates\search_info.html:39 +msgid "" +" \n" +" Web searches simulate functionality found on many web search " +"sites supporting special syntax.\n" +" Placing quotes around several words will convert those words " +"into a phrase.\n" +" 'or' is recongized as searching for the word (or phrase) " +"immediately before 'or' OR the word (or phrase) directly after.\n" +" '-' is recognized as searching for recipes that do not include " +"the word (or phrase) that comes immediately after. \n" +" For example searching for 'apple pie' or cherry -butter will " +"return any recipe that includes the phrase 'apple pie' or the word " +"'cherry' \n" +" in any field included in the full text search but exclude any " +"recipe that has the word 'butter' in any field included.\n" +" " +msgstr "" +" \n" +" Les recherches sur le Web simulent la fonctionnalité que l'on " +"trouve sur de nombreux sites de recherche sur le Web qui prennent en charge " +"une syntaxe spéciale.\n" +" En plaçant des guillemets autour de plusieurs mots, ces derniers " +"seront convertis en une phrase.\n" +" Le terme \"ou\" signifie que l'on recherche le mot (ou " +"l'expression) qui précède immédiatement \"ou\" OU le mot (ou l'expression) " +"qui suit immédiatement.\n" +" Le signe \"-\" indique que la recherche porte sur des recettes " +"qui ne comprennent pas le mot (ou la phrase) qui suit immédiatement. \n" +" Par exemple, si vous recherchez \"tarte aux pommes\" ou cerise -" +"beurre, vous obtiendrez toutes les recettes contenant l'expression \"tarte " +"aux pommes\" ou le mot \"cerise\". \n" +" dans tous les champs inclus dans la recherche en texte intégral, " +"mais exclure toute recette comportant le mot \"beurre\" dans tous les champs " +"inclus.\n" +" " + +#: .\cookbook\templates\search_info.html:48 +msgid "" +" \n" +" Raw search is similar to Web except will take puncuation " +"operators such as '|', '&' and '()'\n" +" " +msgstr "" +" \n" +" La recherche brute est similaire à la recherche sur le Web, mais " +"elle prend en compte les opérateurs de ponctuation tels que \"|\", \"&\" et " +"\"()\".\n" +" " + +#: .\cookbook\templates\search_info.html:59 +msgid "" +" \n" +" Another approach to searching that also requires Postgresql is " +"fuzzy search or trigram similarity. A trigram is a group of three " +"consecutive characters.\n" +" For example searching for 'apple' will create x trigrams 'app', " +"'ppl', 'ple' and will create a score of how closely words match the " +"generated trigrams.\n" +" One benefit of searching trigams is that a search for 'sandwich' " +"will find mispelled words such as 'sandwhich' that would be missed by other " +"methods.\n" +" " +msgstr "" +" \n" +" Une autre approche de la recherche qui nécessite également " +"Postgresql est la recherche floue ou la similarité des trigrammes. Un " +"trigramme est un groupe de trois caractères consécutifs.\n" +" Par exemple, la recherche de \"apple\" créera x trigrammes \"app" +"\", \"ppl\", \"ple\" et créera un score de la proximité des mots avec les " +"trigrammes générés.\n" +" L'un des avantages de la recherche par trigamme est qu'une " +"recherche sur \"sandwich\" permet de trouver des mots mal orthographiés tels " +"que \"sandwhich\", qui ne seraient pas détectés par d'autres méthodes.\n" +" " + +#: .\cookbook\templates\search_info.html:69 +msgid "Search Fields" +msgstr "Champs de recherche" + +#: .\cookbook\templates\search_info.html:73 +msgid "" +" \n" +" Unaccent is a special case in that it enables searching a field " +"'unaccented' for each search style attempting to ignore accented values. \n" +" For example when you enable unaccent for 'Name' any search " +"(starts with, contains, trigram) will attempt the search ignoring accented " +"characters.\n" +" \n" +" For the other options, you can enable search on any or all " +"fields and they will be combined together with an assumed 'OR'.\n" +" For example enabling 'Name' for Starts With, 'Name' and " +"'Description' for Partial Match and 'Ingredients' and 'Keywords' for Full " +"Search\n" +" and searching for 'apple' will generate a search that will " +"return recipes that have:\n" +" - A recipe name that starts with 'apple'\n" +" - OR a recipe name that contains 'apple'\n" +" - OR a recipe description that contains 'apple'\n" +" - OR a recipe that will have a full text search match ('apple' " +"or 'apples') in ingredients\n" +" - OR a recipe that will have a full text search match in " +"Keywords\n" +"\n" +" Combining too many fields in too many types of search can have a " +"negative impact on performance, create duplicate results or return " +"unexpected results.\n" +" For example, enabling fuzzy search or partial matches will " +"interfere with web search methods. \n" +" Searching for 'apple -pie' with fuzzy search and full text " +"search will return the recipe Apple Pie. Though it is not included in the " +"full text results, it does match the trigram results.\n" +" " +msgstr "" +" \n" +" Unaccent est un cas particulier car il permet de rechercher un " +"champ \"non accentué\" pour chaque style de recherche qui tente d'ignorer " +"les valeurs accentuées. \n" +" Par exemple, si vous activez l'option \"non accentué\" pour \"Nom" +"\", toute recherche (commence par, contient, trigramme) tentera d'ignorer " +"les caractères accentués.\n" +" \n" +" Pour les autres options, vous pouvez activer la recherche sur un " +"ou tous les champs et ils seront combinés ensemble avec un 'OR' présumé.\n" +" Par exemple, si vous activez l'option \"Nom\" pour l'option " +"\"Commence par\", \"Nom\" et \"Description\" pour l'option \"Correspondance " +"partielle\" et \"Ingrédients\" et \"Mots-clés\" pour l'option \"Recherche " +"complète\".\n" +" et que vous recherchez \"pomme\", vous obtiendrez les recettes " +"qui ont.. :\n" +" - un nom de recette qui commence par \"pomme\".\n" +" - OU un nom de recette qui contient 'pomme'.\n" +" - OU une description de recette qui contient 'pomme'.\n" +" - OU une recette qui aura une correspondance de recherche en " +"texte intégral ('pomme' ou 'pommes') dans les ingrédients\n" +" - OU une recette qui aura une correspondance de recherche en " +"texte intégral dans les mots-clés.\n" +"\n" +" La combinaison d'un trop grand nombre de champs dans un trop " +"grand nombre de types de recherche peut avoir un impact négatif sur les " +"performances, créer des résultats en double ou renvoyer des résultats " +"inattendus.\n" +" Par exemple, l'activation de la recherche floue ou des " +"correspondances partielles interfère avec les méthodes de recherche sur le " +"Web. \n" +" La recherche de \"apple -pie\" à l'aide d'une recherche floue et " +"d'une recherche en texte intégral donnera la recette de la tarte aux " +"pommes. Bien qu'elle ne soit pas incluse dans les résultats du texte " +"intégral, elle correspond aux résultats de la recherche par trigramme.\n" +" " + +#: .\cookbook\templates\search_info.html:95 +msgid "Search Index" +msgstr "Index de recherche" + +#: .\cookbook\templates\search_info.html:99 +msgid "" +" \n" +" Trigram search and Full Text Search both rely on database " +"indexes to perform effectively. \n" +" You can rebuild the indexes on all fields in the Admin page for " +"Recipes and selecting all recipes and running 'rebuild index for selected " +"recipes'\n" +" You can also rebuild indexes at the command line by executing " +"the management command 'python manage.py rebuildindex'\n" +" " +msgstr "" +" \n" +" La recherche par trigramme et la recherche en texte intégral " +"reposent toutes deux sur les index de la base de données pour fonctionner " +"efficacement. \n" +" Vous pouvez reconstruire les index de tous les champs dans la " +"page d'administration des recettes, en sélectionnant toutes les recettes et " +"en exécutant la commande \"rebuild index for selected recipes\".\n" +" Vous pouvez également reconstruire les index en ligne de " +"commande en exécutant la commande de gestion \"python manage.py rebuildindex" +"\".\n" +" " + +#: .\cookbook\templates\settings.html:28 msgid "Account" msgstr "Compte" -#: .\cookbook\templates\settings.html:29 +#: .\cookbook\templates\settings.html:35 msgid "Preferences" msgstr "Préférences" -#: .\cookbook\templates\settings.html:33 +#: .\cookbook\templates\settings.html:42 msgid "API-Settings" -msgstr "Paramètres d'API" +msgstr "Paramètres d’API" -#: .\cookbook\templates\settings.html:41 +#: .\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:49 +#: .\cookbook\templates\settings.html:73 msgid "Account Settings" msgstr "Paramètres de compte" -#: .\cookbook\templates\settings.html:51 +#: .\cookbook\templates\settings.html:75 msgid "Emails" msgstr "Adresses mail" -#: .\cookbook\templates\settings.html:54 +#: .\cookbook\templates\settings.html:78 #: .\cookbook\templates\socialaccount\connections.html:11 msgid "Social" msgstr "Réseaux sociaux" -#: .\cookbook\templates\settings.html:66 +#: .\cookbook\templates\settings.html:91 msgid "Language" msgstr "Langue" -#: .\cookbook\templates\settings.html:96 +#: .\cookbook\templates\settings.html:121 msgid "Style" msgstr "Style" -#: .\cookbook\templates\settings.html:116 +#: .\cookbook\templates\settings.html:142 msgid "API Token" msgstr "Jeton API" -#: .\cookbook\templates\settings.html:117 +#: .\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." +"Vous pouvez utiliser à la fois l’authentification classique et l’" +"authentification par jeton pour accéder à l’API REST." -#: .\cookbook\templates\settings.html:134 +#: .\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'entête d'autorisation préfixé par le mot \"token\" " -"comme indiqué dans les exemples suivants :" +"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:136 +#: .\cookbook\templates\settings.html:162 msgid "or" msgstr "ou" +#: .\cookbook\templates\settings.html:173 +msgid "" +"There are many options to configure the search depending on your personal " +"preferences." +msgstr "" +"Il existe de nombreuses options pour configurer la recherche en fonction de " +"vos préférences personnelles." + +#: .\cookbook\templates\settings.html:174 +msgid "" +"Usually you do not need to configure any of them and can just stick " +"with either the default or one of the following presets." +msgstr "" +"En général, vous n’avez pas besoin de configurer l’un d’entre eux et " +"pouvez simplement vous en tenir à la valeur par défaut ou à l’un des " +"préréglages suivants." + +#: .\cookbook\templates\settings.html:175 +msgid "" +"If you do want to configure the search you can read about the different " +"options here." +msgstr "" +"Si vous souhaitez configurer la recherche, vous pouvez consulter les " +"différentes options ici." + +#: .\cookbook\templates\settings.html:180 +msgid "Fuzzy" +msgstr "Flou" + +#: .\cookbook\templates\settings.html:181 +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 "" +"Trouvez ce dont vous avez besoin même si votre recherche ou la recette " +"contient des fautes de frappe. Il se peut que vous obteniez plus de " +"résultats que nécessaire pour être sûr(e) de trouver ce que vous cherchez." + +#: .\cookbook\templates\settings.html:182 +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 +msgid "Apply" +msgstr "Appliquer" + +#: .\cookbook\templates\settings.html:188 +msgid "Precise" +msgstr "Préciser" + +#: .\cookbook\templates\settings.html:189 +msgid "" +"Allows fine control over search results but might not return results if too " +"many spelling mistakes are made." +msgstr "" +"Permet un contrôle fin des résultats de la recherche mais peut ne pas donner " +"de résultats si le texte saisi contient trop de fautes d’orthographe." + +#: .\cookbook\templates\settings.html:190 +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" @@ -1827,57 +2214,80 @@ msgstr "Paramètres" msgid "" "To start using this application you must first create a superuser account." msgstr "" -"Pour commencer à utiliser cette application, vous devez d'abord créer un " +"Pour commencer à utiliser cette application, vous devez d’abord créer un " "compte superutilisateur." #: .\cookbook\templates\setup.html:20 msgid "Create Superuser account" msgstr "Créer un compte superutilisateur" -#: .\cookbook\templates\shopping_list.html:79 +#: .\cookbook\templates\shopping_list.html:8 +#: .\cookbook\templates\shopping_list.html:29 +#: .\cookbook\templates\shopping_list.html:663 +msgid "Shopping List" +msgstr "Liste de courses" + +#: .\cookbook\templates\shopping_list.html:55 +msgid "Search Recipe" +msgstr "Rechercher une recette" + +#: .\cookbook\templates\shopping_list.html:72 msgid "Shopping Recipes" msgstr "Recettes dans le panier" -#: .\cookbook\templates\shopping_list.html:83 +#: .\cookbook\templates\shopping_list.html:74 msgid "No recipes selected" -msgstr "Pas de recettes sélectionnées" +msgstr "Aucune recette sélectionnée" -#: .\cookbook\templates\shopping_list.html:150 +#: .\cookbook\templates\shopping_list.html:131 msgid "Entry Mode" -msgstr "Mode d'ajout" +msgstr "Mode d’ajout" -#: .\cookbook\templates\shopping_list.html:158 +#: .\cookbook\templates\shopping_list.html:139 msgid "Add Entry" msgstr "Ajouter une entrée" -#: .\cookbook\templates\shopping_list.html:174 +#: .\cookbook\templates\shopping_list.html:152 msgid "Amount" msgstr "Quantité" -#: .\cookbook\templates\shopping_list.html:240 +#: .\cookbook\templates\shopping_list.html:164 +msgid "Select Unit" +msgstr "Sélectionnez l’unité" + +#: .\cookbook\templates\shopping_list.html:166 +#: .\cookbook\templates\shopping_list.html:189 +#: .\cookbook\templates\shopping_list.html:219 +#: .\cookbook\templates\shopping_list.html:243 +#: .\cookbook\templates\url_import.html:505 +#: .\cookbook\templates\url_import.html:537 +msgid "Select" +msgstr "Sélectionner" + +#: .\cookbook\templates\shopping_list.html:187 +msgid "Select Food" +msgstr "Sélectionner l’aliment" + +#: .\cookbook\templates\shopping_list.html:218 msgid "Select Supermarket" msgstr "Sélectionner un supermarché" -#: .\cookbook\templates\shopping_list.html:264 +#: .\cookbook\templates\shopping_list.html:242 msgid "Select User" msgstr "Sélectionnez un utilisateur" -#: .\cookbook\templates\shopping_list.html:283 +#: .\cookbook\templates\shopping_list.html:258 msgid "Finished" msgstr "Terminé" -#: .\cookbook\templates\shopping_list.html:296 +#: .\cookbook\templates\shopping_list.html:267 msgid "You are offline, shopping list might not syncronize." -msgstr "Vous êtes hors-ligne, la liste de courses n'est pas synchronisée." +msgstr "Vous êtes hors ligne, la liste de courses n’est pas synchronisée." -#: .\cookbook\templates\shopping_list.html:361 +#: .\cookbook\templates\shopping_list.html:318 msgid "Copy/Export" msgstr "Copier/exporter" -#: .\cookbook\templates\shopping_list.html:365 -msgid "List Prefix" -msgstr "Préfixe de la liste" - #: .\cookbook\templates\socialaccount\connections.html:4 #: .\cookbook\templates\socialaccount\connections.html:15 msgid "Account Connections" @@ -1888,14 +2298,14 @@ msgid "" "You can sign in to your account using any of the following third party\n" " accounts:" msgstr "" -"Vous pouvez vous connecter à votre compte en utilisant un des comptes tiers " -"suivants :" +"Vous pouvez vous connecter à votre compte en utilisant un des \n" +" comptes tiers suivants :" #: .\cookbook\templates\socialaccount\connections.html:52 msgid "" "You currently have no social network accounts connected to this account." msgstr "" -"Vous n'avez actuellement aucun compte de réseaux sociaux connecté à votre " +"Vous n’avez actuellement aucun compte de réseaux sociaux connecté à votre " "compte." #: .\cookbook\templates\socialaccount\connections.html:55 @@ -1904,7 +2314,7 @@ msgstr "Ajouter un compte tiers" #: .\cookbook\templates\socialaccount\signup.html:5 msgid "Signup" -msgstr "S'inscrire" +msgstr "S’inscrire" #: .\cookbook\templates\socialaccount\signup.html:10 #, python-format @@ -1913,9 +2323,10 @@ msgid "" " %(provider_name)s account to login to\n" " %(site_name)s. As a final step, please complete the following form:" msgstr "" -"Vous êtes sur le point d'utiliser votre compte %(provider_name)s pour vous " -"connecter à %(site_name)s. Pour finaliser la requête, veuillez compléter le " -"formulaire suivant :" +"Vous êtes sur le point d’utiliser\n" +" votre compte %(provider_name)s pour vous connecter à\n" +" %(site_name)s. Pour finaliser la requête, veuillez compléter le " +"formulaire suivant :" #: .\cookbook\templates\socialaccount\snippets\provider_list.html:23 #: .\cookbook\templates\socialaccount\snippets\provider_list.html:31 @@ -1934,91 +2345,91 @@ msgstr "" msgid "Sign in using" msgstr "Se connecter avec" -#: .\cookbook\templates\space.html:23 +#: .\cookbook\templates\space.html:25 msgid "Space:" -msgstr "Groupe :" +msgstr "Groupe :" -#: .\cookbook\templates\space.html:24 +#: .\cookbook\templates\space.html:26 msgid "Manage Subscription" -msgstr "Gérer l'abonnement" +msgstr "Gérer l’abonnement" -#: .\cookbook\templates\space.html:32 .\cookbook\templates\stats.html:19 +#: .\cookbook\templates\space.html:34 .\cookbook\templates\stats.html:19 msgid "Number of objects" -msgstr "Nombre d'objets" +msgstr "Nombre d’objets" -#: .\cookbook\templates\space.html:45 .\cookbook\templates\stats.html:30 +#: .\cookbook\templates\space.html:54 .\cookbook\templates\stats.html:30 msgid "Recipe Imports" msgstr "Recettes importées" -#: .\cookbook\templates\space.html:53 .\cookbook\templates\stats.html:38 +#: .\cookbook\templates\space.html:62 .\cookbook\templates\stats.html:38 msgid "Objects stats" -msgstr "Stats d'objets" +msgstr "Statistiques d’objets" -#: .\cookbook\templates\space.html:56 .\cookbook\templates\stats.html:41 +#: .\cookbook\templates\space.html:65 .\cookbook\templates\stats.html:41 msgid "Recipes without Keywords" msgstr "Recettes sans mots-clés" -#: .\cookbook\templates\space.html:58 .\cookbook\templates\stats.html:43 -msgid "External Recipes" -msgstr "Recettes externes" - -#: .\cookbook\templates\space.html:60 .\cookbook\templates\stats.html:45 +#: .\cookbook\templates\space.html:73 .\cookbook\templates\stats.html:45 msgid "Internal Recipes" msgstr "Recettes internes" -#: .\cookbook\templates\space.html:73 +#: .\cookbook\templates\space.html:89 msgid "Members" msgstr "Membres" -#: .\cookbook\templates\space.html:77 +#: .\cookbook\templates\space.html:95 msgid "Invite User" msgstr "Inviter un utilisateur" -#: .\cookbook\templates\space.html:88 +#: .\cookbook\templates\space.html:107 msgid "User" msgstr "Utilisateurs" -#: .\cookbook\templates\space.html:89 +#: .\cookbook\templates\space.html:108 msgid "Groups" msgstr "Groupes" -#: .\cookbook\templates\space.html:105 +#: .\cookbook\templates\space.html:119 msgid "admin" msgstr "administrateur" -#: .\cookbook\templates\space.html:106 +#: .\cookbook\templates\space.html:120 msgid "user" msgstr "utilisateur" -#: .\cookbook\templates\space.html:107 +#: .\cookbook\templates\space.html:121 msgid "guest" msgstr "invité" -#: .\cookbook\templates\space.html:108 +#: .\cookbook\templates\space.html:122 msgid "remove" msgstr "supprimer" -#: .\cookbook\templates\space.html:112 +#: .\cookbook\templates\space.html:126 msgid "Update" msgstr "Mettre à jour" -#: .\cookbook\templates\space.html:116 +#: .\cookbook\templates\space.html:130 msgid "You cannot edit yourself." msgstr "Vous ne pouvez pas modifier cela vous-même." -#: .\cookbook\templates\space.html:123 +#: .\cookbook\templates\space.html:136 msgid "There are no members in your space yet!" -msgstr "Il n'y a pas encore de membres dans votre groupe !" +msgstr "Votre groupe ne contient pas encore de membres !" -#: .\cookbook\templates\space.html:130 .\cookbook\templates\system.html:21 -#: .\cookbook\views\lists.py:115 +#: .\cookbook\templates\space.html:143 .\cookbook\templates\system.html:21 +#: .\cookbook\views\lists.py:85 msgid "Invite Links" -msgstr "Liens d'invitation" +msgstr "Liens d’invitation" #: .\cookbook\templates\stats.html:4 msgid "Stats" msgstr "Stats" +#: .\cookbook\templates\stats.html:10 +msgid "Statistics" +msgstr "Statistiques" + #: .\cookbook\templates\system.html:22 msgid "Show Links" msgstr "Afficher les liens" @@ -2070,14 +2481,15 @@ msgid "" msgstr "" "Publier les médias directement avec gunicorn/python n'est pas recommandé !\n" -"Veuillez suivre les étapes décrites ici pour mettre à jour votre installation.\n" +" Veuillez suivre les étapes décrites ici \n" +" pour mettre à jour votre installation.\n" " " #: .\cookbook\templates\system.html:57 .\cookbook\templates\system.html:73 #: .\cookbook\templates\system.html:88 .\cookbook\templates\system.html:102 msgid "Everything is fine!" -msgstr "Tout est en ordre !" +msgstr "Tout est en ordre !" #: .\cookbook\templates\system.html:62 msgid "Secret Key" @@ -2096,10 +2508,12 @@ msgid "" " " msgstr "" "\n" -" Vous n'avez pas de SECRET_KEY configurée dans votre " -"fichier.env. Django utilise par défaut la clé standard fournie " -"avec l'application qui est connue publiquement et non sécurisée ! Veuillez " -"définir SECRET_KEY dans le fichier.env\n" +" Vous n'avez pas de SECRET_KEY configuré dans votre " +"fichier.env. Django utilise par défaut\n" +" la clé standard fournie avec l'application qui est connue " +"publiquement et non sécurisée ! \n" +" Veuillez définir SECRET_KEY dans le fichier." +"env\n" " " #: .\cookbook\templates\system.html:78 @@ -2118,8 +2532,9 @@ msgid "" msgstr "" "\n" " Cette application est toujours en mode debug. Ce n'est sûrement " -"pas nécessaire. Désactivez le mode debug en définissant DEBUG=0 " -"dans le fichier .env.\n" +"pas nécessaire. Désactivez le mode debug\n" +" en définissant DEBUG=0 dans le fichier .env.\n" " " #: .\cookbook\templates\system.html:93 @@ -2140,152 +2555,177 @@ msgid "" msgstr "" "\n" " Cette application ne tourne pas sur une base de données " -"Postgres. Ce n'est pas grave mais déconseillé car certaines fonctionnalités " -"ne fonctionnent qu'avec une base de données Postgres.\n" +"Postgres. Ce n'est pas grave mais déconseillé\n" +" car certaines fonctionnalités ne fonctionnent qu'avec une base " +"de données Postgres.\n" " " -#: .\cookbook\templates\url_import.html:6 +#: .\cookbook\templates\url_import.html:8 msgid "URL Import" msgstr "Import URL" -#: .\cookbook\templates\url_import.html:31 +#: .\cookbook\templates\url_import.html:33 msgid "Drag me to your bookmarks to import recipes from anywhere" -msgstr "" -"Glissez-moi vers vos favoris pour importer des recettes de n'importe où" +msgstr "Glissez-moi vers vos favoris pour importer des recettes de n’importe où" -#: .\cookbook\templates\url_import.html:32 +#: .\cookbook\templates\url_import.html:34 msgid "Bookmark Me!" -msgstr "Mettez-moi en favori !" +msgstr "Ajoutez-moi aux favoris !" -#: .\cookbook\templates\url_import.html:61 +#: .\cookbook\templates\url_import.html:38 +msgid "URL" +msgstr "URL" + +#: .\cookbook\templates\url_import.html:40 +msgid "App" +msgstr "App" + +#: .\cookbook\templates\url_import.html:64 msgid "Enter website URL" -msgstr "Saisissez l'URL du site web" +msgstr "Saisissez l’URL du site web" -#: .\cookbook\templates\url_import.html:97 +#: .\cookbook\templates\url_import.html:104 msgid "Select recipe files to import or drop them here..." msgstr "Sélectionnez des fichiers de recettes à importer ou glissez-les ici…" -#: .\cookbook\templates\url_import.html:118 +#: .\cookbook\templates\url_import.html:125 msgid "Paste json or html source here to load recipe." msgstr "Collez une source json ou html pour charger la recette." -#: .\cookbook\templates\url_import.html:146 +#: .\cookbook\templates\url_import.html:153 msgid "Preview Recipe Data" msgstr "Prévisualiser les informations de la recette" -#: .\cookbook\templates\url_import.html:147 +#: .\cookbook\templates\url_import.html:154 msgid "Drag recipe attributes from the right into the appropriate box below." msgstr "" "Glissez les attributs de la recette depuis la droite dans la boîte " "appropriée ci-dessous." -#: .\cookbook\templates\url_import.html:156 -#: .\cookbook\templates\url_import.html:173 -#: .\cookbook\templates\url_import.html:190 -#: .\cookbook\templates\url_import.html:209 -#: .\cookbook\templates\url_import.html:227 -#: .\cookbook\templates\url_import.html:242 -#: .\cookbook\templates\url_import.html:257 -#: .\cookbook\templates\url_import.html:273 -#: .\cookbook\templates\url_import.html:300 -#: .\cookbook\templates\url_import.html:351 +#: .\cookbook\templates\url_import.html:163 +#: .\cookbook\templates\url_import.html:180 +#: .\cookbook\templates\url_import.html:197 +#: .\cookbook\templates\url_import.html:216 +#: .\cookbook\templates\url_import.html:234 +#: .\cookbook\templates\url_import.html:249 +#: .\cookbook\templates\url_import.html:264 +#: .\cookbook\templates\url_import.html:280 +#: .\cookbook\templates\url_import.html:307 +#: .\cookbook\templates\url_import.html:358 msgid "Clear Contents" msgstr "Effacer le contenu" -#: .\cookbook\templates\url_import.html:158 +#: .\cookbook\templates\url_import.html:165 msgid "Text dragged here will be appended to the name." msgstr "Le texte glissé ici sera ajouté au nom." -#: .\cookbook\templates\url_import.html:175 +#: .\cookbook\templates\url_import.html:178 +msgid "Description" +msgstr "Description" + +#: .\cookbook\templates\url_import.html:182 msgid "Text dragged here will be appended to the description." msgstr "Le texte glissé ici sera ajouté à la description." -#: .\cookbook\templates\url_import.html:192 +#: .\cookbook\templates\url_import.html:199 msgid "Keywords dragged here will be appended to current list" msgstr "Les mots-clés ajoutés ici seront ajoutés à la liste actuelle" -#: .\cookbook\templates\url_import.html:207 +#: .\cookbook\templates\url_import.html:214 msgid "Image" msgstr "Image" -#: .\cookbook\templates\url_import.html:239 +#: .\cookbook\templates\url_import.html:246 msgid "Prep Time" msgstr "Temps de préparation" -#: .\cookbook\templates\url_import.html:254 +#: .\cookbook\templates\url_import.html:261 msgid "Cook Time" msgstr "Temps de cuisson" -#: .\cookbook\templates\url_import.html:275 +#: .\cookbook\templates\url_import.html:282 msgid "Ingredients dragged here will be appended to current list." msgstr "Les ingrédients glissés ici seront ajoutés à la liste actuelle." -#: .\cookbook\templates\url_import.html:302 +#: .\cookbook\templates\url_import.html:304 +#: .\cookbook\templates\url_import.html:579 +msgid "Instructions" +msgstr "Instructions" + +#: .\cookbook\templates\url_import.html:309 msgid "" "Recipe instructions dragged here will be appended to current instructions." msgstr "" "Les instructions de recette glissés ici seront ajoutés aux instructions " "actuelles." -#: .\cookbook\templates\url_import.html:325 +#: .\cookbook\templates\url_import.html:332 msgid "Discovered Attributes" msgstr "Attributs découverts" -#: .\cookbook\templates\url_import.html:327 +#: .\cookbook\templates\url_import.html:334 msgid "" "Drag recipe attributes from below into the appropriate box on the left. " "Click any node to display its full properties." msgstr "" -"Glissez les attributs de recettes d'en-dessous vers la boîte appropriée à " +"Glissez les attributs de recettes d’en dessous vers la boîte appropriée à " "gauche. Cliquez sur un nœud pour voir toutes ses propriétés." -#: .\cookbook\templates\url_import.html:344 +#: .\cookbook\templates\url_import.html:351 msgid "Show Blank Field" msgstr "Afficher un champ vierge" -#: .\cookbook\templates\url_import.html:349 +#: .\cookbook\templates\url_import.html:356 msgid "Blank Field" msgstr "Champ vierge" -#: .\cookbook\templates\url_import.html:353 +#: .\cookbook\templates\url_import.html:360 msgid "Items dragged to Blank Field will be appended." msgstr "Les objets glissés dans le champ vierge seront ajoutés." -#: .\cookbook\templates\url_import.html:400 +#: .\cookbook\templates\url_import.html:407 msgid "Delete Text" msgstr "Supprimer le texte" -#: .\cookbook\templates\url_import.html:413 +#: .\cookbook\templates\url_import.html:420 msgid "Delete image" -msgstr "Supprimer l'image" +msgstr "Supprimer l’image" -#: .\cookbook\templates\url_import.html:429 +#: .\cookbook\templates\url_import.html:436 msgid "Recipe Name" msgstr "Nom de la recette" -#: .\cookbook\templates\url_import.html:433 +#: .\cookbook\templates\url_import.html:440 msgid "Recipe Description" msgstr "Description de la recette" -#: .\cookbook\templates\url_import.html:494 -#: .\cookbook\templates\url_import.html:526 -#: .\cookbook\templates\url_import.html:582 +#: .\cookbook\templates\url_import.html:504 +#: .\cookbook\templates\url_import.html:536 +#: .\cookbook\templates\url_import.html:596 msgid "Select one" msgstr "Faites votre choix" -#: .\cookbook\templates\url_import.html:596 +#: .\cookbook\templates\url_import.html:554 +msgid "Note" +msgstr "Notes" + +#: .\cookbook\templates\url_import.html:597 +msgid "Add Keyword" +msgstr "Ajouter un mot-clé" + +#: .\cookbook\templates\url_import.html:610 msgid "All Keywords" msgstr "Tous les mots-clés" -#: .\cookbook\templates\url_import.html:599 +#: .\cookbook\templates\url_import.html:613 msgid "Import all keywords, not only the ones already existing." msgstr "Importer tous les mots-clés, pas uniquement ceux déjà existant." -#: .\cookbook\templates\url_import.html:626 +#: .\cookbook\templates\url_import.html:640 msgid "Information" msgstr "Information" -#: .\cookbook\templates\url_import.html:628 +#: .\cookbook\templates\url_import.html:642 msgid "" " Only websites containing ld+json or microdata information can currently\n" " be imported. Most big recipe pages " @@ -2295,312 +2735,754 @@ msgid "" "data feel free to post an example in the\n" " github issues." msgstr "" -" Seuls les sites webs contenant des données ld+json ou microdatas peuvent " -"actuellement être importés.\n" -"C'est le cas de la plupart des grands sites web. Si votre site ne peut pas " -"être importé alors qu'il est censé disposer\n" +" Seuls les sites webs contenant des données ld+json ou microdatas peuvent\n" +" actuellement être importés.\n" +" C'est le cas de la plupart des " +"grands sites web. Si votre site ne peut pas être importé\n" +" alors qu'il est censé disposer " "de données correctement structurées,\n" -"n'hésitez pas à publier un exemple dans un ticket sur GitHub." +" n'hésitez pas à publier un " +"exemple dans un ticket sur GitHub." -#: .\cookbook\templates\url_import.html:636 +#: .\cookbook\templates\url_import.html:650 msgid "Google ld+json Info" msgstr "Informations Google ld+json" -#: .\cookbook\templates\url_import.html:639 +#: .\cookbook\templates\url_import.html:653 msgid "GitHub Issues" msgstr "Ticket GitHub" -#: .\cookbook\templates\url_import.html:641 +#: .\cookbook\templates\url_import.html:655 msgid "Recipe Markup Specification" -msgstr "Spécification Recipe Markup" +msgstr "Spécification Markup de recette" -#: .\cookbook\views\api.py:79 +#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:170 msgid "Parameter updated_at incorrectly formatted" -msgstr "Le paramètre « update_at » n'est pas correctement formatté" +msgstr "Le paramètre « update_at » n'est pas correctement formaté" -#: .\cookbook\views\api.py:580 .\cookbook\views\views.py:303 -msgid "This feature is not available in the demo version!" -msgstr "Cette fonctionnalité n'est pas disponible dans la version d'essai !" +#: .\cookbook\views\api.py:190 .\cookbook\views\api.py:291 +#, 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:603 +#: .\cookbook\views\api.py:194 +msgid "Cannot merge with the same object!" +msgstr "Impossible de fusionner un objet avec lui-même !" + +#: .\cookbook\views\api.py:201 +#, 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:206 +msgid "Cannot merge with child object!" +msgstr "Impossible de fusionner avec l’objet enfant !" + +#: .\cookbook\views\api.py:239 +#, 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:244 +#, 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:300 +#, 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:303 .\cookbook\views\api.py:321 +msgid "An error occurred attempting to move " +msgstr "Une erreur est survenue en essayant de déplacer " + +#: .\cookbook\views\api.py:306 +msgid "Cannot move an object to itself!" +msgstr "Impossible de déplacer un objet vers lui-même !" + +#: .\cookbook\views\api.py:312 +#, 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:318 +#, 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:470 +#, 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:475 .\cookbook\views\api.py:726 +#, 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:587 +msgid "ID of recipe a step is part of. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:588 +msgid "Query string matched (fuzzy) against object name." +msgstr "" + +#: .\cookbook\views\api.py:631 +msgid "" +"Query string matched (fuzzy) against recipe name. In the future also " +"fulltext search." +msgstr "" + +#: .\cookbook\views\api.py:632 +msgid "ID of keyword a recipe should have. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:633 +msgid "ID of food a recipe should have. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:634 +msgid "ID of unit a recipe should have." +msgstr "" + +#: .\cookbook\views\api.py:635 +msgid "Rating a recipe should have. [0 - 5]" +msgstr "" + +#: .\cookbook\views\api.py:636 +msgid "ID of book a recipe should be in. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:637 +msgid "" +"If recipe should have all (AND=false) or any (OR=true) of the " +"provided keywords." +msgstr "" + +#: .\cookbook\views\api.py:638 +msgid "" +"If recipe should have all (AND=false) or any (OR=true) of the " +"provided foods." +msgstr "" + +#: .\cookbook\views\api.py:639 +msgid "" +"If recipe should be in all (AND=false) or any (OR=true) of the " +"provided books." +msgstr "" + +#: .\cookbook\views\api.py:640 +msgid "If only internal recipes should be returned. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:641 +msgid "Returns the results in randomized order. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:642 +msgid "Returns new results first in search results. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:768 +msgid "" +"Returns the shopping list entry with a primary key of id. Multiple values " +"allowed." +msgstr "" + +#: .\cookbook\views\api.py:771 +msgid "" +"Filter shopping list entries on checked. [true, false, both, recent]
- recent includes unchecked items and recently completed items." +msgstr "" + +#: .\cookbook\views\api.py:773 +msgid "Returns the shopping list entries sorted by supermarket category order." +msgstr "" + +#: .\cookbook\views\api.py:922 .\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 "" +"Cette fonctionnalité n’est pas encore disponible dans la version hébergée de " +"Tandoor !" + +#: .\cookbook\views\api.py:944 msgid "Sync successful!" -msgstr "Synchro réussie !" +msgstr "Synchro réussie !" -#: .\cookbook\views\api.py:608 +#: .\cookbook\views\api.py:949 msgid "Error synchronizing with Storage" msgstr "Erreur lors de la synchronisation avec le stockage" -#: .\cookbook\views\api.py:686 +#: .\cookbook\views\api.py:1028 msgid "Nothing to do." msgstr "Rien à faire." -#: .\cookbook\views\api.py:701 +#: .\cookbook\views\api.py:1043 msgid "The requested site provided malformed data and cannot be read." msgstr "Le site web a renvoyé des données malformées et ne peut être lu." -#: .\cookbook\views\api.py:708 +#: .\cookbook\views\api.py:1050 msgid "The requested page could not be found." -msgstr "La page souhaitée n'a pas été trouvée." +msgstr "La page souhaitée est introuvable." -#: .\cookbook\views\api.py:717 +#: .\cookbook\views\api.py:1068 msgid "" "The requested site does not provide any recognized data format to import the " "recipe from." msgstr "" -"Le site web est dans un format qui ne permet pas d'importer automatiquement " +"Le site web est dans un format qui ne permet pas d’importer automatiquement " "la recette." -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:1082 +msgid "Connection Refused." +msgstr "Connexion refusée." + +#: .\cookbook\views\api.py:1091 msgid "No useable data could be found." msgstr "Aucune information utilisable n'a été trouvée." -#: .\cookbook\views\api.py:747 +#: .\cookbook\views\api.py:1107 msgid "I couldn't find anything to do." -msgstr "Je n'ai rien trouvé à faire." +msgstr "Je n’ai rien trouvé à faire." -#: .\cookbook\views\data.py:31 .\cookbook\views\data.py:122 -#: .\cookbook\views\edit.py:50 .\cookbook\views\import_export.py:67 -#: .\cookbook\views\new.py:32 +#: .\cookbook\views\data.py:34 .\cookbook\views\data.py:129 +#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:80 +#: .\cookbook\views\new.py:33 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\views\data.py:35 .\cookbook\views\data.py:126 -#: .\cookbook\views\edit.py:54 .\cookbook\views\import_export.py:71 -#: .\cookbook\views\new.py:36 +#: .\cookbook\views\data.py:38 .\cookbook\views\data.py:133 +#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:84 +#: .\cookbook\views\new.py:37 msgid "You have more users than allowed in your space." -msgstr "Vous avez plus d'utilisateurs qu'autorisés dans votre groupe." +msgstr "" +"Le nombre d’utilisateurs dans votre groupe dépasse le nombre d’utilisateurs " +"autorisé." -#: .\cookbook\views\data.py:104 +#: .\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] "" -"Modification en masse effectuée. %(count)d recette a été mise à jour." -msgstr[1] "" -"Modification en masse effectuée. %(count)drecettes ont été mises à jour." +msgstr[0] "Édition par lot effectuée. %(count)d recette a été mise à jour." +msgstr[1] "Édition par lot effectuée. %(count)d recettes ont été mises à jour." -#: .\cookbook\views\delete.py:72 +#: .\cookbook\views\delete.py:101 msgid "Monitor" msgstr "Surveiller" -#: .\cookbook\views\delete.py:96 .\cookbook\views\lists.py:102 -#: .\cookbook\views\new.py:98 +#: .\cookbook\views\delete.py:125 .\cookbook\views\lists.py:71 +#: .\cookbook\views\new.py:101 msgid "Storage Backend" msgstr "Espace de stockage" -#: .\cookbook\views\delete.py:106 +#: .\cookbook\views\delete.py:135 msgid "" "Could not delete this storage backend as it is used in at least one monitor." msgstr "" "Impossible de supprimer cet espace de stockage car il est utilisé dans au " "moins un dossier surveillé." -#: .\cookbook\views\delete.py:129 .\cookbook\views\edit.py:213 -#: .\cookbook\views\new.py:156 +#: .\cookbook\views\delete.py:158 msgid "Recipe Book" msgstr "Livre de recettes" -#: .\cookbook\views\delete.py:141 +#: .\cookbook\views\delete.py:170 msgid "Bookmarks" msgstr "Favoris" -#: .\cookbook\views\delete.py:163 .\cookbook\views\new.py:252 +#: .\cookbook\views\delete.py:192 .\cookbook\views\new.py:238 msgid "Invite Link" -msgstr "Lien d'invitation" +msgstr "Lien d’invitation" -#: .\cookbook\views\edit.py:119 -msgid "Food" -msgstr "Ingrédient" - -#: .\cookbook\views\edit.py:128 +#: .\cookbook\views\edit.py:125 msgid "You cannot edit this storage!" -msgstr "Vous ne pouvez pas modifier ce stockage !" +msgstr "Vous ne pouvez pas modifier ce stockage !" -#: .\cookbook\views\edit.py:148 +#: .\cookbook\views\edit.py:149 msgid "Storage saved!" -msgstr "Stockage sauvegardé !" +msgstr "Stockage sauvegardé !" -#: .\cookbook\views\edit.py:154 +#: .\cookbook\views\edit.py:155 msgid "There was an error updating this storage backend!" msgstr "" -"Une erreur s'est produite lors de la mise à jour de cet espace de stockage !" +"Une erreur est survenue lors de la mise à jour de cet espace de stockage !" -#: .\cookbook\views\edit.py:165 -msgid "Storage" -msgstr "Stockage" - -#: .\cookbook\views\edit.py:261 +#: .\cookbook\views\edit.py:248 msgid "Changes saved!" -msgstr "Modifications sauvegardées !" +msgstr "Modifications sauvegardées !" -#: .\cookbook\views\edit.py:265 +#: .\cookbook\views\edit.py:252 msgid "Error saving changes!" -msgstr "Erreur lors de la sauvegarde des modifications !" +msgstr "Erreur lors de la sauvegarde des modifications !" -#: .\cookbook\views\edit.py:299 -msgid "Units merged!" -msgstr "Unités fusionnées !" - -#: .\cookbook\views\edit.py:301 .\cookbook\views\edit.py:317 -msgid "Cannot merge with the same object!" -msgstr "Un objet ne peut être fusionné avec lui-même !" - -#: .\cookbook\views\edit.py:315 -msgid "Foods merged!" -msgstr "Ingrédient fusionné !" - -#: .\cookbook\views\import_export.py:93 +#: .\cookbook\views\import_export.py:106 msgid "Importing is not implemented for this provider" -msgstr "L'importation n'est pas implémentée pour ce fournisseur" +msgstr "L’importation n’est pas implémentée pour ce fournisseur" -#: .\cookbook\views\import_export.py:115 +#: .\cookbook\views\import_export.py:127 +msgid "" +"The PDF Exporter is not enabled on this instance as it is still in an " +"experimental state." +msgstr "" + +#: .\cookbook\views\import_export.py:132 msgid "Exporting is not implemented for this provider" -msgstr "L'exportation n'est pas implémentée pour ce fournisseur" +msgstr "L’exportation n’est pas implémentée pour ce fournisseur" -#: .\cookbook\views\lists.py:40 +#: .\cookbook\views\lists.py:25 msgid "Import Log" -msgstr "Historique d'import" +msgstr "Historique d’importation" -#: .\cookbook\views\lists.py:53 +#: .\cookbook\views\lists.py:38 msgid "Discovery" msgstr "Découverte" -#: .\cookbook\views\lists.py:85 +#: .\cookbook\views\lists.py:54 msgid "Shopping Lists" msgstr "Listes de course" -#: .\cookbook\views\new.py:123 -msgid "Imported new recipe!" -msgstr "Nouvelle recette importée !" +#: .\cookbook\views\lists.py:148 +msgid "Supermarkets" +msgstr "Supermarchés" + +#: .\cookbook\views\lists.py:164 +msgid "Shopping Categories" +msgstr "Catégories de courses" + +#: .\cookbook\views\lists.py:217 +msgid "Steps" +msgstr "Étapes" + +#: .\cookbook\views\lists.py:232 +msgid "New Shopping List" +msgstr "Nouvelle liste de courses" #: .\cookbook\views\new.py:126 -msgid "There was an error importing this recipe!" -msgstr "Une erreur s\\\\'est produite lors de l\\\\'import de cette recette !" +msgid "Imported new recipe!" +msgstr "Nouvelle recette importée !" -#: .\cookbook\views\new.py:226 +#: .\cookbook\views\new.py:129 +msgid "There was an error importing this recipe!" +msgstr "Une erreur est survenue lors de l’importation de cette recette !" + +#: .\cookbook\views\new.py:212 msgid "Hello" msgstr "Bonjour" -#: .\cookbook\views\new.py:226 +#: .\cookbook\views\new.py:212 msgid "You have been invited by " msgstr "Vous avez été invité par " -#: .\cookbook\views\new.py:227 +#: .\cookbook\views\new.py:213 msgid " to join their Tandoor Recipes space " msgstr " pour rejoindre leur groupe Tandoor Recipes " -#: .\cookbook\views\new.py:228 +#: .\cookbook\views\new.py:214 msgid "Click the following link to activate your account: " -msgstr "Cliquez le lien suivant pour activer votre compte : " +msgstr "Cliquez le lien suivant pour activer votre compte : " -#: .\cookbook\views\new.py:229 +#: .\cookbook\views\new.py:215 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 manuellement pour " -"rejoindre le groupe : " +"Si le lien ne fonctionne pas, utilisez le code suivant pour rejoindre le " +"groupe manuellement : " -#: .\cookbook\views\new.py:230 +#: .\cookbook\views\new.py:216 msgid "The invitation is valid until " -msgstr "L'invitation est valide jusqu'au " +msgstr "L’invitation est valide jusqu’au " -#: .\cookbook\views\new.py:231 +#: .\cookbook\views\new.py:217 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " msgstr "" -"Tandoor Recipes sont un gestionnaire de recettes open source. Venez-voir " +"Tandoor Recipes est un gestionnaire de recettes open source. Venez-voir " "notre Github " -#: .\cookbook\views\new.py:234 +#: .\cookbook\views\new.py:220 msgid "Tandoor Recipes Invite" msgstr "Invitation Tandoor Recipes" -#: .\cookbook\views\new.py:241 +#: .\cookbook\views\new.py:227 msgid "Invite link successfully send to user." -msgstr "Le lien d'invitation a été correctement envoyé à l'utilisateur." +msgstr "Le lien d’invitation a été envoyé à l’utilisateur avec succès." -#: .\cookbook\views\new.py:244 +#: .\cookbook\views\new.py:230 msgid "" "You have send to many emails, please share the link manually or wait a few " "hours." msgstr "" -"Vous avez envoyé trop de mails, partagez le lien manuellement ou attendez " +"Vous avez envoyé trop de mails, partagez le lien manuellement ou patientez " "quelques heures." -#: .\cookbook\views\new.py:246 +#: .\cookbook\views\new.py:232 msgid "Email to user could not be send, please share link manually." msgstr "" -"Le mail n'a pas pu être envoyé à l'utilisateur, veuillez envoyer le lien " +"Impossible d’envoyer le mail à l’utilisateur, veuillez partager le lien " "manuellement." -#: .\cookbook\views\views.py:129 +#: .\cookbook\views\views.py:126 msgid "" "You have successfully created your own recipe space. Start by adding some " "recipes or invite other people to join you." msgstr "" "Vous avez réussi à créer votre propre groupe de partage de recettes. " -"Commencez à ajoutez des recettes ou invitez d'autres personnes à vous " +"Commencez à ajoutez des recettes ou invitez d’autres personnes à vous " "rejoindre." -#: .\cookbook\views\views.py:177 +#: .\cookbook\views\views.py:174 msgid "You do not have the required permissions to perform this action!" -msgstr "Vous n'avez pas la permission d'effectuer cette action !" +msgstr "Vous n’êtes pas autorisé(e) à effectuer cette action !" -#: .\cookbook\views\views.py:188 +#: .\cookbook\views\views.py:185 msgid "Comment saved!" -msgstr "Commentaire enregistré !" +msgstr "Commentaire sauvegardé !" -#: .\cookbook\views\views.py:395 +#: .\cookbook\views\views.py:276 +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:335 +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:340 +msgid "" +"To use this search method you must select at least one full text search " +"field!" +msgstr "" +"Pour utiliser cette méthode de recherche, vous devez sélectionner au moins " +"un champ de recherche en texte intégral !" + +#: .\cookbook\views\views.py:344 +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:470 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 "" -"Cette page d'installation peut uniquement être utilisée pour créer le " -"premier utilisateur ! Si vous avez oublié vos identifiants de super-" +"Cette page d’installation peut uniquement être utilisée pour créer le " +"premier utilisateur ! Si vous avez oublié vos identifiants de super-" "utilisateur, counsultez la documentation Django pour savoir comment " "réinitialiser le mot de passe." -#: .\cookbook\views\views.py:402 +#: .\cookbook\views\views.py:477 msgid "Passwords dont match!" -msgstr "Les mots de passe ne correspondent pas !" +msgstr "Les mots de passe ne correspondent pas !" -#: .\cookbook\views\views.py:418 +#: .\cookbook\views\views.py:493 msgid "User has been created, please login!" -msgstr "L'utilisateur a été créé, veuillez vous connecter !" +msgstr "L’utilisateur a été créé, veuillez vous connecter !" -#: .\cookbook\views\views.py:434 +#: .\cookbook\views\views.py:509 msgid "Malformed Invite Link supplied!" -msgstr "Le lien d'invitation fourni est mal formé !" +msgstr "Le lien d’invitation fourni est mal formé !" -#: .\cookbook\views\views.py:441 +#: .\cookbook\views\views.py:516 msgid "You are already member of a space and therefore cannot join this one." msgstr "" -"Vous êtes déjà membre d'un groupe, ainsi, vous ne pouvez rejoindre celui-ci." +"Vous êtes déjà membre d’un groupe et ne pouvez donc pas rejoindre celui-ci." -#: .\cookbook\views\views.py:452 +#: .\cookbook\views\views.py:527 msgid "Successfully joined space." msgstr "Vous avez bien rejoint le groupe." -#: .\cookbook\views\views.py:458 +#: .\cookbook\views\views.py:533 msgid "Invite Link not valid or already used!" -msgstr "Le lien d'invitation est invalide ou déjà utilisé !" +msgstr "Le lien d’invitation est invalide ou déjà utilisé !" -#: .\cookbook\views\views.py:522 +#: .\cookbook\views\views.py:614 msgid "" "Reporting share links is not enabled for this instance. Please notify the " "page administrator to report problems." 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." +"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:528 +#: .\cookbook\views\views.py:620 msgid "" "Recipe sharing link has been disabled! For additional information please " "contact the page administrator." msgstr "" -"Les liens partagés de recettes ont été désactivés ! Pour plus " -"d'informations, veuillez contacter l'administrateur de la page." +"Le lien de partage de la recette a été désactivé ! Pour plus d’informations, " +"veuillez contacter l’administrateur de la page." + +#, python-brace-format +#~ msgid "No {self.basename} with id {child} exists" +#~ msgstr "Il n'existe pas de {self.basename} avec l'id {child}" + +#~ msgid "New Unit" +#~ msgstr "Nouvelle unité" + +#~ msgid "New unit that other gets replaced by." +#~ msgstr "La nouvelle unité qui remplacera l'autre." + +#~ msgid "Old Unit" +#~ msgstr "Ancienne unité" + +#~ msgid "Unit that should be replaced." +#~ msgstr "L'unité qui doit être remplacée." + +#~ msgid "New Food" +#~ msgstr "Nouvel aliment" + +#~ msgid "New food that other gets replaced by." +#~ msgstr "Nouvel aliment qui remplace les autres." + +#~ msgid "Old Food" +#~ msgstr "Ancien aliment" + +#~ msgid "New Entry" +#~ msgstr "Nouvelle ligne" + +#~ msgid "Title" +#~ msgstr "Titre" + +#~ msgid "Note (optional)" +#~ msgstr "Note (facultatif)" + +#~ msgid "" +#~ "You can use markdown to format this field. See the docs here" +#~ msgstr "" +#~ "Vous pouvez utiliser du markdown pour mettre en forme ce champ. Consultez " +#~ "la documentation ici" + +#~ msgid "Serving Count" +#~ msgstr "Nombre de parts" + +#~ msgid "Create only note" +#~ msgstr "Créer uniquement une note" + +#~ msgid "Plan" +#~ msgstr "Menu" + +#~ msgid "Number of Days" +#~ msgstr "Nombre de jours" + +#~ msgid "Weekday offset" +#~ msgstr "Décalage du jour" + +#~ msgid "" +#~ "Number of days starting from the first day of the week to offset the " +#~ "default view." +#~ msgstr "" +#~ "Permet de décaler le premier jour de la semaine dans la vue par défaut." + +#~ msgid "Edit plan types" +#~ msgstr "Modifier l'organisation du menu" + +#~ msgid "Show help" +#~ msgstr "Afficher l'aide" + +#~ msgid "Week iCal export" +#~ msgstr "Export iCal" + +#~ msgid "Add to Shopping" +#~ msgstr "Ajouter aux courses" + +#~ msgid "New meal type" +#~ msgstr "Nouveau type de repas" + +#~ msgid "Meal Plan Help" +#~ msgstr "Aide sur le menu de la semaine" + +#~ msgid "" +#~ "\n" +#~ "

The meal plan module allows planning of " +#~ "meals both with recipes and notes.

\n" +#~ "

Simply select a recipe from the list of " +#~ "recently viewed recipes or search the one you\n" +#~ " want and drag it to the desired plan " +#~ "position. You can also add a note and a title and\n" +#~ " then drag the recipe to create a plan " +#~ "entry with a custom title and note. Creating only\n" +#~ " Notes is possible by dragging the create " +#~ "note box into the plan.

\n" +#~ "

Click on a recipe in order to open the " +#~ "detailed view. There you can also add it to the\n" +#~ " shopping list. You can also add all " +#~ "recipes of a day to the shopping list by\n" +#~ " clicking the shopping cart at the top of " +#~ "the table.

\n" +#~ "

Since a common use case is to plan meals " +#~ "together you can define\n" +#~ " users you want to share your plan with in " +#~ "the settings.\n" +#~ "

\n" +#~ "

You can also edit the types of meals you " +#~ "want to plan. If you share your plan with\n" +#~ " someone with\n" +#~ " different meals, their meal types will " +#~ "appear in your list as well. To prevent\n" +#~ " duplicates (e.g. Other and Misc.)\n" +#~ " name your meal types the same as the " +#~ "users you share your meals with and they will be\n" +#~ " merged.

\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ "

Le module menu de la semaine permet de " +#~ "planifier les repas grâce à des recettes et des notes.

\n" +#~ "

Choisissez simplement une recette dans la liste des recettes récemment " +#~ "vues ou cherchez celle de votre choix et glissez-la à l'emplacement " +#~ "désiré. Vous pouvez aussi ajouter une notre et un titre puis glisser la " +#~ "recette pour créer une entrée personnalisée. Il est possible de " +#~ "n'utiliser que des notes en glissant la boîte de création de notes dans " +#~ "le menu.

\n" +#~ "

Cliquez sur une recette pour ouvrir la vue détaillée. Là, vous pouvez " +#~ "aussi l'ajouter à la liste de courses.Vous pouvez aussi ajouter toutes " +#~ "les recettes d'une journée à la liste de courses en cliquant sur le caddy " +#~ "en haut du tableau.

\n" +#~ "

Étant donné que les menus de la semaine sont souvent préparés " +#~ "ensemble, vous pouvez définir des utilisateurs avec qui partager votre " +#~ "menu dans les paramètres.

\n" +#~ "

Vous pouvez aussi modifier le type de repas que vous voulez planifier. " +#~ "Si vous partagez le menu avec quelqu'un qui a d'autres types de repas, " +#~ "leurs repas apparaîtront aussi dans votre liste. Pour éviter les " +#~ "doublons, nommez vos types de repas de la même façon que les utilisateurs " +#~ "avec qui vous l'avez partager afin qu'ils soient fusionnés.

\n" +#~ " " + +#~ msgid "Units merged!" +#~ msgstr "Unités fusionnées !" + +#~ msgid "Foods merged!" +#~ msgstr "Aliments fusionnés !" + +#~ msgid "Utensils" +#~ msgstr "Ustensiles" + +#~ msgid "Storage Data" +#~ msgstr "Données de stockage" + +#~ msgid "Storage Backends" +#~ msgstr "Espaces de stockage" + +#~ msgid "Configure Sync" +#~ msgstr "Configurer synchro" + +#~ msgid "Discovered Recipes" +#~ msgstr "Recettes découvertes" + +#~ msgid "Discovery Log" +#~ msgstr "Historique des découvertes" + +#~ msgid "Units & Ingredients" +#~ msgstr "Unités et ingrédients" + +#~ msgid "New Book" +#~ msgstr "Nouveau livre" + +#~ msgid "Toggle Recipes" +#~ msgstr "Afficher les recettes" + +#~ msgid "There are no recipes in this book yet." +#~ msgstr "Il n'y a pas encore de recettes dans ce livre." + +#~ msgid "Waiting Time" +#~ msgstr "Temps d'attente" + +#~ msgid "Servings Text" +#~ msgstr "Service" + +#~ msgid "Select Keywords" +#~ msgstr "Sélectionner des mots-clés" + +#~ msgid "Nutrition" +#~ msgstr "Informations nutritionnelles" + +#~ msgid "Delete Step" +#~ msgstr "Supprimer l'étape" + +#~ msgid "Calories" +#~ msgstr "Calories" + +#~ msgid "Carbohydrates" +#~ msgstr "Glucides" + +#~ msgid "Fats" +#~ msgstr "Matières grasses" + +#~ msgid "Proteins" +#~ msgstr "Protéines" + +#~ msgid "Step" +#~ msgstr "Étape" + +#~ msgid "Show as header" +#~ msgstr "Afficher en entête" + +#~ msgid "Hide as header" +#~ msgstr "Masquer en entête" + +#~ msgid "Move Up" +#~ msgstr "Remonter" + +#~ msgid "Move Down" +#~ msgstr "Descendre" + +#~ msgid "Step Name" +#~ msgstr "Nom de l'étape" + +#~ msgid "Step Type" +#~ msgstr "Type de l'étape" + +#~ msgid "Step time in Minutes" +#~ msgstr "Durée de l'étape en minutes" + +#~ msgid "Select File" +#~ msgstr "Sélectionner un fichier" + +#~ msgid "Select Recipe" +#~ msgstr "Sélectionner la recette" + +#~ msgid "Delete Ingredient" +#~ msgstr "Supprimer l'ingrédient" + +#~ msgid "Make Header" +#~ msgstr "Transformer en texte" + +#~ msgid "Make Ingredient" +#~ msgstr "Transformer en ingrédient" + +#~ msgid "Disable Amount" +#~ msgstr "Sans quantité" + +#~ msgid "Enable Amount" +#~ msgstr "Avec quantité" + +#~ msgid "Copy Template Reference" +#~ msgstr "Copier le modèle de référence" + +#~ msgid "Save & View" +#~ msgstr "Sauvegarder et afficher" + +#~ msgid "Add Step" +#~ msgstr "Ajouter une étape" + +#~ msgid "Add Nutrition" +#~ msgstr "Ajouter les informations nutritionnelles" + +#~ msgid "Remove Nutrition" +#~ msgstr "Supprimer les informations nutritionnelles" + +#~ msgid "View Recipe" +#~ msgstr "Afficher la recette" + +#~ msgid "Delete Recipe" +#~ msgstr "Supprimer la recette" #~ msgid "Password Settings" #~ msgstr "Paramètres de mots de passe" @@ -2608,9 +3490,6 @@ msgstr "" #~ msgid "Email Settings" #~ msgstr "Paramètres d'email" -#~ msgid "Manage Email Settings" -#~ msgstr "Gérer les paramètres de mails" - #~ msgid "Manage Social Accounts" #~ msgstr "Gérer les comptes de réseaux sociaux" diff --git a/cookbook/locale/hu_HU/LC_MESSAGES/django.mo b/cookbook/locale/hu_HU/LC_MESSAGES/django.mo index d22c2735..884a1106 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 93f38cb1..a0486f15 100644 --- a/cookbook/locale/hu_HU/LC_MESSAGES/django.po +++ b/cookbook/locale/hu_HU/LC_MESSAGES/django.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-08-17 08:44+0200\n" +"POT-Creation-Date: 2022-01-18 14:52+0100\n" "PO-Revision-Date: 2020-06-02 19:28+0000\n" "Last-Translator: igazka , 2020\n" "Language-Team: Hungarian (Hungary) (https://www.transifex.com/django-recipes/" @@ -22,15 +22,68 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: .\cookbook\filters.py:23 .\cookbook\templates\base.html:98 -#: .\cookbook\templates\forms\edit_internal_recipe.html:269 -#: .\cookbook\templates\forms\ingredients.html:34 -#: .\cookbook\templates\space.html:43 .\cookbook\templates\stats.html:28 -#: .\cookbook\templates\url_import.html:270 .\cookbook\views\lists.py:67 +#: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 +#: .\cookbook\templates\space.html:50 .\cookbook\templates\stats.html:28 +#: .\cookbook\templates\url_import.html:277 msgid "Ingredients" msgstr "Hozzávalók" -#: .\cookbook\forms.py:49 +#: .\cookbook\forms.py:56 +msgid "Default unit" +msgstr "" + +#: .\cookbook\forms.py:57 +msgid "Use fractions" +msgstr "" + +#: .\cookbook\forms.py:58 +msgid "Use KJ" +msgstr "" + +#: .\cookbook\forms.py:59 +msgid "Theme" +msgstr "" + +#: .\cookbook\forms.py:60 +msgid "Navbar color" +msgstr "" + +#: .\cookbook\forms.py:61 +msgid "Sticky navbar" +msgstr "" + +#: .\cookbook\forms.py:62 +msgid "Default page" +msgstr "" + +#: .\cookbook\forms.py:63 +msgid "Show recent recipes" +msgstr "" + +#: .\cookbook\forms.py:64 +msgid "Search style" +msgstr "" + +#: .\cookbook\forms.py:65 +msgid "Plan sharing" +msgstr "" + +#: .\cookbook\forms.py:66 +#, fuzzy +#| msgid "Ingredients" +msgid "Ingredient decimal places" +msgstr "Hozzávalók" + +#: .\cookbook\forms.py:67 +msgid "Shopping list auto sync period" +msgstr "" + +#: .\cookbook\forms.py:68 .\cookbook\templates\recipe_view.html:21 +#: .\cookbook\templates\space.html:77 .\cookbook\templates\stats.html:47 +msgid "Comments" +msgstr "" + +#: .\cookbook\forms.py:72 msgid "" "Color of the top navigation bar. Not all colors work with all themes, just " "try them out!" @@ -38,12 +91,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:51 +#: .\cookbook\forms.py:74 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:53 +#: .\cookbook\forms.py:76 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" @@ -51,25 +104,31 @@ 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:56 -msgid "" -"Users with whom newly created meal plan/shopping list entries should be " -"shared by default." +#: .\cookbook\forms.py:78 +msgid "Display nutritional energy amounts in joules instead of calories" msgstr "" -#: .\cookbook\forms.py:58 +#: .\cookbook\forms.py:79 +msgid "Users with whom newly created meal plans should be shared by default." +msgstr "" + +#: .\cookbook\forms.py:80 +msgid "Users with whom to share shopping lists." +msgstr "" + +#: .\cookbook\forms.py:82 msgid "Show recently viewed recipes on search page." msgstr "" -#: .\cookbook\forms.py:59 +#: .\cookbook\forms.py:83 msgid "Number of decimals to round ingredients." msgstr "" -#: .\cookbook\forms.py:60 +#: .\cookbook\forms.py:84 msgid "If you want to be able to create and see comments underneath recipes." msgstr "" -#: .\cookbook\forms.py:62 +#: .\cookbook\forms.py:86 .\cookbook\forms.py:493 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. " @@ -77,216 +136,375 @@ msgid "" "mobile data. If lower than instance limit it is reset when saving." msgstr "" -#: .\cookbook\forms.py:65 +#: .\cookbook\forms.py:89 msgid "Makes the navbar stick to the top of the page." msgstr "" -#: .\cookbook\forms.py:81 +#: .\cookbook\forms.py:90 .\cookbook\forms.py:496 +msgid "Automatically add meal plan ingredients to shopping list." +msgstr "" + +#: .\cookbook\forms.py:91 +msgid "Exclude ingredients that are on hand." +msgstr "" + +#: .\cookbook\forms.py:108 msgid "" "Both fields are optional. If none are given the username will be displayed " "instead" msgstr "" -#: .\cookbook\forms.py:102 .\cookbook\forms.py:331 -#: .\cookbook\templates\forms\edit_internal_recipe.html:49 -#: .\cookbook\templates\url_import.html:154 +#: .\cookbook\forms.py:129 .\cookbook\forms.py:298 +#: .\cookbook\templates\url_import.html:161 msgid "Name" msgstr "Név" -#: .\cookbook\forms.py:103 .\cookbook\forms.py:332 -#: .\cookbook\templates\base.html:108 .\cookbook\templates\base.html:169 -#: .\cookbook\templates\forms\edit_internal_recipe.html:85 -#: .\cookbook\templates\space.html:39 .\cookbook\templates\stats.html:24 -#: .\cookbook\templates\url_import.html:188 -#: .\cookbook\templates\url_import.html:573 +#: .\cookbook\forms.py:130 .\cookbook\forms.py:299 +#: .\cookbook\templates\space.html:44 .\cookbook\templates\stats.html:24 +#: .\cookbook\templates\url_import.html:195 +#: .\cookbook\templates\url_import.html:585 .\cookbook\views\lists.py:97 msgid "Keywords" msgstr "Kulcsszavak" -#: .\cookbook\forms.py:104 +#: .\cookbook\forms.py:131 msgid "Preparation time in minutes" msgstr "Előkészítési idő percben" -#: .\cookbook\forms.py:105 +#: .\cookbook\forms.py:132 msgid "Waiting time (cooking/baking) in minutes" msgstr "Várakozási idő (sütés/főzés) percben" -#: .\cookbook\forms.py:106 .\cookbook\forms.py:333 +#: .\cookbook\forms.py:133 .\cookbook\forms.py:267 .\cookbook\forms.py:300 msgid "Path" msgstr "Elérési útvonal" -#: .\cookbook\forms.py:107 +#: .\cookbook\forms.py:134 msgid "Storage UID" msgstr "Tárhely UID" -#: .\cookbook\forms.py:133 +#: .\cookbook\forms.py:164 msgid "Default" msgstr "" -#: .\cookbook\forms.py:144 .\cookbook\templates\url_import.html:90 +#: .\cookbook\forms.py:175 .\cookbook\templates\url_import.html:97 msgid "" "To prevent duplicates recipes with the same name as existing ones are " "ignored. Check this box to import everything." msgstr "" -#: .\cookbook\forms.py:164 -msgid "New Unit" -msgstr "Új Mértékegység" - -#: .\cookbook\forms.py:165 -msgid "New unit that other gets replaced by." -msgstr "" - -#: .\cookbook\forms.py:170 -msgid "Old Unit" -msgstr "Régi Mértékegység" - -#: .\cookbook\forms.py:171 -msgid "Unit that should be replaced." -msgstr "" - -#: .\cookbook\forms.py:187 -msgid "New Food" -msgstr "Új Étel" - -#: .\cookbook\forms.py:188 -msgid "New food that other gets replaced by." -msgstr "" - -#: .\cookbook\forms.py:193 -msgid "Old Food" -msgstr "Régi Étel" - -#: .\cookbook\forms.py:194 -msgid "Food that should be replaced." -msgstr "" - -#: .\cookbook\forms.py:212 +#: .\cookbook\forms.py:197 msgid "Add your comment: " msgstr "Add hozzá a kommented:" -#: .\cookbook\forms.py:253 +#: .\cookbook\forms.py:212 msgid "Leave empty for dropbox and enter app password for nextcloud." msgstr "" -#: .\cookbook\forms.py:260 +#: .\cookbook\forms.py:219 msgid "Leave empty for nextcloud and enter api token for dropbox." msgstr "" -#: .\cookbook\forms.py:269 +#: .\cookbook\forms.py:228 msgid "" "Leave empty for dropbox and enter only base url for nextcloud (/remote." "php/webdav/ is added automatically)" msgstr "" -#: .\cookbook\forms.py:307 +#: .\cookbook\forms.py:266 .\cookbook\views\edit.py:166 +msgid "Storage" +msgstr "" + +#: .\cookbook\forms.py:268 +msgid "Active" +msgstr "" + +#: .\cookbook\forms.py:274 msgid "Search String" msgstr "" -#: .\cookbook\forms.py:334 +#: .\cookbook\forms.py:301 msgid "File ID" msgstr "Fájl ID:" -#: .\cookbook\forms.py:370 +#: .\cookbook\forms.py:323 msgid "You must provide at least a recipe or a title." msgstr "" -#: .\cookbook\forms.py:383 +#: .\cookbook\forms.py:336 msgid "You can list default users to share recipes with in the settings." msgstr "" -#: .\cookbook\forms.py:384 -#: .\cookbook\templates\forms\edit_internal_recipe.html:427 +#: .\cookbook\forms.py:337 msgid "" "You can use markdown to format this field. See the docs here" msgstr "" -#: .\cookbook\forms.py:409 +#: .\cookbook\forms.py:363 msgid "Maximum number of users for this space reached." msgstr "" -#: .\cookbook\forms.py:415 +#: .\cookbook\forms.py:369 msgid "Email address already taken!" msgstr "" -#: .\cookbook\forms.py:423 +#: .\cookbook\forms.py:377 msgid "" -"An email address is not required but if present the invite link will be send " +"An email address is not required but if present the invite link will be sent " "to the user." msgstr "" -#: .\cookbook\forms.py:438 +#: .\cookbook\forms.py:392 msgid "Name already taken." msgstr "" -#: .\cookbook\forms.py:449 +#: .\cookbook\forms.py:403 msgid "Accept Terms and Privacy" msgstr "" +#: .\cookbook\forms.py:435 +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:445 +msgid "" +"Select type method of search. Click here for " +"full desciption of choices." +msgstr "" + +#: .\cookbook\forms.py:446 +msgid "" +"Use fuzzy matching on units, keywords and ingredients when editing and " +"importing recipes." +msgstr "" + +#: .\cookbook\forms.py:448 +msgid "" +"Fields to search ignoring accents. Selecting this option can improve or " +"degrade search quality depending on language" +msgstr "" + +#: .\cookbook\forms.py:450 +msgid "" +"Fields to search for partial matches. (e.g. searching for 'Pie' will return " +"'pie' and 'piece' and 'soapie')" +msgstr "" + +#: .\cookbook\forms.py:452 +msgid "" +"Fields to search for beginning of word matches. (e.g. searching for 'sa' " +"will return 'salad' and 'sandwich')" +msgstr "" + +#: .\cookbook\forms.py:454 +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:456 +msgid "" +"Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " +"only function with fulltext fields." +msgstr "" + +#: .\cookbook\forms.py:460 +msgid "Search Method" +msgstr "" + +#: .\cookbook\forms.py:461 +msgid "Fuzzy Lookups" +msgstr "" + +#: .\cookbook\forms.py:462 +msgid "Ignore Accent" +msgstr "" + +#: .\cookbook\forms.py:463 +msgid "Partial Match" +msgstr "" + +#: .\cookbook\forms.py:464 +msgid "Starts Wtih" +msgstr "" + +#: .\cookbook\forms.py:465 +msgid "Fuzzy Search" +msgstr "" + +#: .\cookbook\forms.py:466 +#, fuzzy +#| msgid "Text" +msgid "Full Text" +msgstr "Szöveg" + +#: .\cookbook\forms.py:491 +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:497 +msgid "" +"When adding a meal plan to the shopping list (manually or automatically), " +"include all related recipes." +msgstr "" + +#: .\cookbook\forms.py:498 +msgid "" +"When adding a meal plan to the shopping list (manually or automatically), " +"exclude ingredients that are on hand." +msgstr "" + +#: .\cookbook\forms.py:499 +msgid "Default number of hours to delay a shopping list entry." +msgstr "" + +#: .\cookbook\forms.py:500 +msgid "Filter shopping list to only include supermarket categories." +msgstr "" + +#: .\cookbook\forms.py:501 +msgid "Days of recent shopping list entries to display." +msgstr "" + +#: .\cookbook\forms.py:502 +msgid "Mark food 'On Hand' when checked off shopping list." +msgstr "" + +#: .\cookbook\forms.py:503 +msgid "Delimiter to use for CSV exports." +msgstr "" + +#: .\cookbook\forms.py:504 +msgid "Prefix to add when copying list to the clipboard." +msgstr "" + +#: .\cookbook\forms.py:508 +msgid "Share Shopping List" +msgstr "" + +#: .\cookbook\forms.py:509 +msgid "Autosync" +msgstr "" + +#: .\cookbook\forms.py:510 +msgid "Auto Add Meal Plan" +msgstr "" + +#: .\cookbook\forms.py:511 +msgid "Exclude On Hand" +msgstr "" + +#: .\cookbook\forms.py:512 +msgid "Include Related" +msgstr "" + +#: .\cookbook\forms.py:513 +msgid "Default Delay Hours" +msgstr "" + +#: .\cookbook\forms.py:514 +msgid "Filter to Supermarket" +msgstr "" + +#: .\cookbook\forms.py:515 +msgid "Recent Days" +msgstr "" + +#: .\cookbook\forms.py:516 +msgid "CSV Delimiter" +msgstr "" + +#: .\cookbook\forms.py:517 .\cookbook\templates\shopping_list.html:322 +msgid "List Prefix" +msgstr "" + +#: .\cookbook\forms.py:518 +msgid "Auto On Hand" +msgstr "" + +#: .\cookbook\forms.py:528 +msgid "Reset Food Inheritance" +msgstr "" + +#: .\cookbook\forms.py:529 +msgid "Reset all food to inherit the fields configured." +msgstr "" + +#: .\cookbook\forms.py:541 +msgid "Fields on food that should be inherited by default." +msgstr "" + +#: .\cookbook\forms.py:542 +msgid "Show recipe counts on search filters" +msgstr "" + #: .\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 "" -#: .\cookbook\helper\permission_helper.py:138 -#: .\cookbook\helper\permission_helper.py:161 .\cookbook\views\views.py:151 +#: .\cookbook\helper\permission_helper.py:136 +#: .\cookbook\helper\permission_helper.py:159 .\cookbook\views\views.py:148 msgid "You are not logged in and therefore cannot view this page!" msgstr "" -#: .\cookbook\helper\permission_helper.py:142 -#: .\cookbook\helper\permission_helper.py:148 -#: .\cookbook\helper\permission_helper.py:173 -#: .\cookbook\helper\permission_helper.py:218 -#: .\cookbook\helper\permission_helper.py:232 -#: .\cookbook\helper\permission_helper.py:243 -#: .\cookbook\helper\permission_helper.py:254 .\cookbook\views\data.py:40 -#: .\cookbook\views\views.py:162 .\cookbook\views\views.py:169 -#: .\cookbook\views\views.py:259 +#: .\cookbook\helper\permission_helper.py:140 +#: .\cookbook\helper\permission_helper.py:146 +#: .\cookbook\helper\permission_helper.py:171 +#: .\cookbook\helper\permission_helper.py:219 +#: .\cookbook\helper\permission_helper.py:233 +#: .\cookbook\helper\permission_helper.py:244 +#: .\cookbook\helper\permission_helper.py:255 .\cookbook\views\data.py:47 +#: .\cookbook\views\views.py:159 .\cookbook\views\views.py:166 +#: .\cookbook\views\views.py:232 msgid "You do not have the required permissions to view this page!" msgstr "" -#: .\cookbook\helper\permission_helper.py:166 -#: .\cookbook\helper\permission_helper.py:189 -#: .\cookbook\helper\permission_helper.py:204 +#: .\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 "" -#: .\cookbook\helper\template_helper.py:60 -#: .\cookbook\helper\template_helper.py:62 +#: .\cookbook\helper\recipe_search.py:473 +msgid "One of queryset or hash_key must be provided" +msgstr "" + +#: .\cookbook\helper\shopping_helper.py:54 +msgid "You must supply a recipe or mealplan" +msgstr "" + +#: .\cookbook\helper\shopping_helper.py:58 +msgid "You must supply a created_by" +msgstr "" + +#: .\cookbook\helper\template_helper.py:61 +#: .\cookbook\helper\template_helper.py:63 msgid "Could not parse template code." msgstr "" -#: .\cookbook\integration\integration.py:104 -#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 -#: .\cookbook\templates\import_response.html:7 -#: .\cookbook\templates\test.html:14 .\cookbook\templates\test.html:20 -#: .\cookbook\templates\url_import.html:27 -#: .\cookbook\templates\url_import.html:101 -#: .\cookbook\templates\url_import.html:123 -#: .\cookbook\templates\url_import.html:317 -#: .\cookbook\templates\url_import.html:604 .\cookbook\views\delete.py:60 -#: .\cookbook\views\edit.py:199 -msgid "Import" -msgstr "" - -#: .\cookbook\integration\integration.py:185 +#: .\cookbook\integration\integration.py:200 msgid "" "Importer expected a .zip file. Did you choose the correct importer type for " "your data ?" msgstr "" -#: .\cookbook\integration\integration.py:188 +#: .\cookbook\integration\integration.py:203 msgid "" "An unexpected error occurred during the import. Please make sure you have " "uploaded a valid file." msgstr "" -#: .\cookbook\integration\integration.py:192 +#: .\cookbook\integration\integration.py:208 msgid "The following recipes were ignored because they already existed:" msgstr "" -#: .\cookbook\integration\integration.py:196 +#: .\cookbook\integration\integration.py:212 #, python-format msgid "Imported %s recipes." msgstr "" @@ -299,37 +517,51 @@ msgstr "" msgid "Nutritional Information" msgstr "" -#: .\cookbook\integration\paprika.py:53 +#: .\cookbook\integration\paprika.py:53 .\cookbook\templates\url_import.html:42 msgid "Source" msgstr "" -#: .\cookbook\integration\safron.py:23 -#: .\cookbook\templates\forms\edit_internal_recipe.html:79 -#: .\cookbook\templates\include\log_cooking.html:16 -#: .\cookbook\templates\url_import.html:224 -#: .\cookbook\templates\url_import.html:455 +#: .\cookbook\integration\saffron.py:23 +#: .\cookbook\templates\include\log_cooking.html:18 +#: .\cookbook\templates\url_import.html:231 +#: .\cookbook\templates\url_import.html:462 msgid "Servings" msgstr "" -#: .\cookbook\integration\safron.py:25 +#: .\cookbook\integration\saffron.py:25 msgid "Waiting time" msgstr "" -#: .\cookbook\integration\safron.py:27 -#: .\cookbook\templates\forms\edit_internal_recipe.html:73 +#: .\cookbook\integration\saffron.py:27 msgid "Preparation Time" msgstr "" -#: .\cookbook\integration\safron.py:29 .\cookbook\templates\base.html:78 +#: .\cookbook\integration\saffron.py:29 .\cookbook\templates\base.html:78 #: .\cookbook\templates\forms\ingredients.html:7 #: .\cookbook\templates\index.html:7 msgid "Cookbook" msgstr "" -#: .\cookbook\integration\safron.py:31 +#: .\cookbook\integration\saffron.py:31 msgid "Section" msgstr "" +#: .\cookbook\management\commands\rebuildindex.py:14 +msgid "Rebuilds full text search index on Recipe" +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:18 +msgid "Only Postgress databases use full text search, no index to rebuild" +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:29 +msgid "Recipe index rebuild complete." +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:31 +msgid "Recipe index rebuild failed." +msgstr "" + #: .\cookbook\migrations\0047_auto_20200602_1133.py:14 msgid "Breakfast" msgstr "Reggeli" @@ -346,92 +578,149 @@ msgstr "Vacsora" msgid "Other" msgstr "" -#: .\cookbook\models.py:72 +#: .\cookbook\models.py:246 msgid "" "Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " "upload." msgstr "" -#: .\cookbook\models.py:123 .\cookbook\templates\search.html:7 -#: .\cookbook\templates\shopping_list.html:52 +#: .\cookbook\models.py:300 .\cookbook\templates\search.html:7 +#: .\cookbook\templates\shopping_list.html:53 msgid "Search" msgstr "" -#: .\cookbook\models.py:124 .\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 +#: .\cookbook\models.py:301 .\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 "" -#: .\cookbook\models.py:125 .\cookbook\templates\base.html:89 +#: .\cookbook\models.py:302 .\cookbook\templates\base.html:90 msgid "Books" msgstr "" -#: .\cookbook\models.py:133 +#: .\cookbook\models.py:310 msgid "Small" msgstr "" -#: .\cookbook\models.py:133 +#: .\cookbook\models.py:310 msgid "Large" msgstr "" -#: .\cookbook\models.py:133 .\cookbook\templates\generic\new_template.html:6 +#: .\cookbook\models.py:310 .\cookbook\templates\generic\new_template.html:6 #: .\cookbook\templates\generic\new_template.html:14 -#: .\cookbook\templates\meal_plan.html:323 msgid "New" msgstr "" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:202 +#: .\cookbook\models.py:512 +msgid " is part of a recipe step and cannot be deleted" +msgstr "" + +#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:44 msgid "Text" msgstr "Szöveg" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:203 +#: .\cookbook\models.py:586 msgid "Time" msgstr "" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:204 -#: .\cookbook\templates\forms\edit_internal_recipe.html:219 +#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:46 #, fuzzy #| msgid "File ID" msgid "File" msgstr "Fájl ID:" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:205 -#: .\cookbook\templates\forms\edit_internal_recipe.html:241 +#: .\cookbook\models.py:586 #: .\cookbook\templates\include\recipe_open_modal.html:7 -#: .\cookbook\templates\meal_plan.html:247 .\cookbook\views\delete.py:28 -#: .\cookbook\views\edit.py:273 .\cookbook\views\new.py:52 +#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260 +#: .\cookbook\views\new.py:53 msgid "Recipe" msgstr "" -#: .\cookbook\serializer.py:109 +#: .\cookbook\models.py:1041 .\cookbook\templates\search_info.html:28 +msgid "Simple" +msgstr "" + +#: .\cookbook\models.py:1042 .\cookbook\templates\search_info.html:33 +msgid "Phrase" +msgstr "" + +#: .\cookbook\models.py:1043 .\cookbook\templates\search_info.html:38 +msgid "Web" +msgstr "" + +#: .\cookbook\models.py:1044 .\cookbook\templates\search_info.html:47 +msgid "Raw" +msgstr "" + +#: .\cookbook\models.py:1082 +#, fuzzy +#| msgid "New Food" +msgid "Food Alias" +msgstr "Új Étel" + +#: .\cookbook\models.py:1082 +msgid "Unit Alias" +msgstr "" + +#: .\cookbook\models.py:1082 +#, fuzzy +#| msgid "Keywords" +msgid "Keyword Alias" +msgstr "Kulcsszavak" + +#: .\cookbook\serializer.py:175 +msgid "A user is required" +msgstr "" + +#: .\cookbook\serializer.py:195 msgid "File uploads are not enabled for this Space." msgstr "" -#: .\cookbook\serializer.py:117 +#: .\cookbook\serializer.py:206 msgid "You have reached your file upload limit." msgstr "" -#: .\cookbook\tables.py:35 .\cookbook\templates\books.html:36 -#: .\cookbook\templates\generic\edit_template.html:6 +#: .\cookbook\serializer.py:962 +msgid "Existing shopping list to update" +msgstr "" + +#: .\cookbook\serializer.py:964 +msgid "" +"List of ingredient IDs from the recipe to add, if not provided all " +"ingredients will be added." +msgstr "" + +#: .\cookbook\serializer.py:965 +msgid "" +"Providing a list_recipe ID and servings of 0 will delete that shopping list." +msgstr "" + +#: .\cookbook\serializer.py:973 +msgid "Amount of food to add to the shopping list" +msgstr "" + +#: .\cookbook\serializer.py:974 +msgid "ID of unit to use for the shopping list" +msgstr "" + +#: .\cookbook\serializer.py:975 +msgid "When set to true will delete all food from active shopping lists." +msgstr "" + +#: .\cookbook\tables.py:35 .\cookbook\templates\generic\edit_template.html:6 #: .\cookbook\templates\generic\edit_template.html:14 -#: .\cookbook\templates\meal_plan.html:281 #: .\cookbook\templates\recipes_table.html:82 -#: .\cookbook\templates\shopping_list.html:33 -#: .\cookbook\templates\space.html:90 +#: .\cookbook\templates\shopping_list.html:37 +#: .\cookbook\templates\space.html:109 msgid "Edit" msgstr "" -#: .\cookbook\tables.py:124 .\cookbook\tables.py:147 -#: .\cookbook\templates\books.html:38 -#: .\cookbook\templates\generic\delete_template.html:5 -#: .\cookbook\templates\generic\delete_template.html:13 -#: .\cookbook\templates\generic\edit_template.html:27 -#: .\cookbook\templates\meal_plan.html:277 +#: .\cookbook\tables.py:115 .\cookbook\tables.py:138 +#: .\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 "" @@ -460,7 +749,7 @@ 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:154 .\cookbook\templates\settings.html:6 +#: .\cookbook\templates\base.html:257 .\cookbook\templates\settings.html:6 #: .\cookbook\templates\settings.html:17 #: .\cookbook\templates\socialaccount\connections.html:10 msgid "Settings" @@ -495,6 +784,7 @@ msgid "Re-send Verification" msgstr "" #: .\cookbook\templates\account\email.html:50 +#: .\cookbook\templates\generic\delete_template.html:56 #: .\cookbook\templates\socialaccount\connections.html:44 msgid "Remove" msgstr "" @@ -536,7 +826,7 @@ msgid "" msgstr "" #: .\cookbook\templates\account\email_confirm.html:22 -#: .\cookbook\templates\generic\delete_template.html:21 +#: .\cookbook\templates\generic\delete_template.html:71 msgid "Confirm" msgstr "" @@ -548,7 +838,7 @@ msgid "" "request." msgstr "" -#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:189 +#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:289 msgid "Login" msgstr "" @@ -559,27 +849,27 @@ msgstr "" msgid "Sign In" msgstr "" -#: .\cookbook\templates\account\login.html:32 +#: .\cookbook\templates\account\login.html:34 #: .\cookbook\templates\socialaccount\signup.html:8 #: .\cookbook\templates\socialaccount\signup.html:57 msgid "Sign Up" msgstr "" -#: .\cookbook\templates\account\login.html:36 -#: .\cookbook\templates\account\login.html:37 +#: .\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:37 +#: .\cookbook\templates\account\login.html:40 msgid "Lost your password?" msgstr "" -#: .\cookbook\templates\account\login.html:48 +#: .\cookbook\templates\account\login.html:52 msgid "Social Login" msgstr "" -#: .\cookbook\templates\account\login.html:49 +#: .\cookbook\templates\account\login.html:53 msgid "You can use any of the following providers to sign in." msgstr "" @@ -596,12 +886,16 @@ msgstr "" #: .\cookbook\templates\account\password_change.html:6 #: .\cookbook\templates\account\password_change.html:16 #: .\cookbook\templates\account\password_change.html:21 +#: .\cookbook\templates\account\password_reset_from_key.html:7 +#: .\cookbook\templates\account\password_reset_from_key.html:13 +#: .\cookbook\templates\account\password_reset_from_key_done.html:7 +#: .\cookbook\templates\account\password_reset_from_key_done.html:13 msgid "Change Password" msgstr "" #: .\cookbook\templates\account\password_change.html:12 #: .\cookbook\templates\account\password_set.html:12 -#: .\cookbook\templates\settings.html:52 +#: .\cookbook\templates\settings.html:76 msgid "Password" msgstr "" @@ -632,6 +926,28 @@ msgid "" "within a few minutes." msgstr "" +#: .\cookbook\templates\account\password_reset_from_key.html:13 +msgid "Bad Token" +msgstr "" + +#: .\cookbook\templates\account\password_reset_from_key.html:25 +#, python-format +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used.\n" +" Please request a new " +"password reset." +msgstr "" + +#: .\cookbook\templates\account\password_reset_from_key.html:33 +msgid "change password" +msgstr "" + +#: .\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 "" + #: .\cookbook\templates\account\password_set.html:6 #: .\cookbook\templates\account\password_set.html:16 #: .\cookbook\templates\account\password_set.html:21 @@ -683,98 +999,114 @@ msgstr "" msgid "We are sorry, but the sign up is currently closed." msgstr "" -#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:179 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:279 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "" -#: .\cookbook\templates\base.html:85 -msgid "Utensils" -msgstr "" - -#: .\cookbook\templates\base.html:95 +#: .\cookbook\templates\base.html:86 msgid "Shopping" msgstr "" -#: .\cookbook\templates\base.html:101 -#: .\cookbook\templates\shopping_list.html:230 +#: .\cookbook\templates\base.html:113 +msgid "Keyword" +msgstr "" + +#: .\cookbook\templates\base.html:125 .\cookbook\views\lists.py:114 +#, fuzzy +#| msgid "New Food" +msgid "Foods" +msgstr "Új Étel" + +#: .\cookbook\templates\base.html:137 +#: .\cookbook\templates\forms\ingredients.html:24 +#: .\cookbook\templates\space.html:47 .\cookbook\templates\stats.html:26 +#: .\cookbook\views\lists.py:131 +msgid "Units" +msgstr "" + +#: .\cookbook\templates\base.html:151 +#: .\cookbook\templates\shopping_list.html:208 #: .\cookbook\templates\supermarket.html:7 msgid "Supermarket" msgstr "" -#: .\cookbook\templates\base.html:112 .\cookbook\views\delete.py:84 -#: .\cookbook\views\edit.py:102 .\cookbook\views\lists.py:26 -#: .\cookbook\views\new.py:78 -msgid "Keyword" +#: .\cookbook\templates\base.html:163 +msgid "Supermarket Category" msgstr "" -#: .\cookbook\templates\base.html:114 +#: .\cookbook\templates\base.html:175 .\cookbook\views\lists.py:180 +msgid "Automations" +msgstr "" + +#: .\cookbook\templates\base.html:189 .\cookbook\views\lists.py:200 +#, fuzzy +#| msgid "File ID" +msgid "Files" +msgstr "Fájl ID:" + +#: .\cookbook\templates\base.html:201 msgid "Batch Edit" msgstr "" -#: .\cookbook\templates\base.html:119 -msgid "Storage Data" -msgstr "" - -#: .\cookbook\templates\base.html:123 -msgid "Storage Backends" -msgstr "" - -#: .\cookbook\templates\base.html:125 -msgid "Configure Sync" -msgstr "" - -#: .\cookbook\templates\base.html:127 -msgid "Discovered Recipes" -msgstr "" - -#: .\cookbook\templates\base.html:129 -msgid "Discovery Log" -msgstr "" - -#: .\cookbook\templates\base.html:131 .\cookbook\templates\stats.html:10 -msgid "Statistics" -msgstr "" - -#: .\cookbook\templates\base.html:133 -msgid "Units & Ingredients" -msgstr "" - -#: .\cookbook\templates\base.html:135 .\cookbook\templates\index.html:47 -msgid "Import Recipe" -msgstr "" - -#: .\cookbook\templates\base.html:156 .\cookbook\templates\history.html:6 +#: .\cookbook\templates\base.html:213 .\cookbook\templates\history.html:6 #: .\cookbook\templates\history.html:14 msgid "History" msgstr "" -#: .\cookbook\templates\base.html:159 .\cookbook\templates\space.html:7 -#: .\cookbook\templates\space.html:19 +#: .\cookbook\templates\base.html:228 .\cookbook\templates\export.html:14 +#: .\cookbook\templates\export.html:20 +#: .\cookbook\templates\shopping_list.html:310 +#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 +msgid "Export" +msgstr "" + +#: .\cookbook\templates\base.html:244 .\cookbook\templates\index.html:47 +msgid "Import Recipe" +msgstr "" + +#: .\cookbook\templates\base.html:246 +#: .\cookbook\templates\shopping_list.html:165 +#: .\cookbook\templates\shopping_list.html:188 +msgid "Create" +msgstr "" + +#: .\cookbook\templates\base.html:259 +#: .\cookbook\templates\generic\list_template.html:14 +#: .\cookbook\templates\space.html:69 .\cookbook\templates\stats.html:43 +msgid "External Recipes" +msgstr "" + +#: .\cookbook\templates\base.html:262 .\cookbook\templates\space.html:8 +#: .\cookbook\templates\space.html:20 .\cookbook\templates\space.html:150 msgid "Space Settings" msgstr "" -#: .\cookbook\templates\base.html:163 .\cookbook\templates\system.html:13 +#: .\cookbook\templates\base.html:267 .\cookbook\templates\system.html:13 msgid "System" msgstr "" -#: .\cookbook\templates\base.html:165 .\cookbook\templates\base.html:171 +#: .\cookbook\templates\base.html:269 msgid "Admin" msgstr "" -#: .\cookbook\templates\base.html:175 +#: .\cookbook\templates\base.html:273 msgid "Markdown Guide" msgstr "" -#: .\cookbook\templates\base.html:177 +#: .\cookbook\templates\base.html:275 msgid "GitHub" msgstr "" -#: .\cookbook\templates\base.html:181 +#: .\cookbook\templates\base.html:277 +msgid "Translate Tandoor" +msgstr "" + +#: .\cookbook\templates\base.html:281 msgid "API Browser" msgstr "" -#: .\cookbook\templates\base.html:184 +#: .\cookbook\templates\base.html:284 msgid "Log out" msgstr "" @@ -790,7 +1122,7 @@ msgstr "" msgid "Add the specified keywords to all recipes containing a word" msgstr "" -#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:85 +#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:82 msgid "Sync" msgstr "" @@ -808,10 +1140,36 @@ msgstr "" msgid "The path must be in the following format" msgstr "" -#: .\cookbook\templates\batch\monitor.html:27 +#: .\cookbook\templates\batch\monitor.html:20 +#: .\cookbook\templates\forms\edit_import_recipe.html:14 +#: .\cookbook\templates\generic\edit_template.html:23 +#: .\cookbook\templates\generic\new_template.html:23 +#: .\cookbook\templates\include\log_cooking.html:30 +#: .\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\shopping_list.html:311 +#: .\cookbook\templates\space.html:155 +msgid "Save" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:21 +msgid "Manage External Storage" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:28 msgid "Sync Now!" msgstr "" +#: .\cookbook\templates\batch\monitor.html:29 +msgid "Show Recipes" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:30 +msgid "Show Log" +msgstr "" + #: .\cookbook\templates\batch\waiting.html:4 #: .\cookbook\templates\batch\waiting.html:10 msgid "Importing Recipes" @@ -823,261 +1181,23 @@ msgid "" "please wait." msgstr "" -#: .\cookbook\templates\books.html:5 .\cookbook\templates\books.html:11 +#: .\cookbook\templates\books.html:7 msgid "Recipe Books" msgstr "" -#: .\cookbook\templates\books.html:15 -msgid "New Book" -msgstr "" - -#: .\cookbook\templates\books.html:27 .\cookbook\templates\recipe_view.html:26 -msgid "by" -msgstr "" - -#: .\cookbook\templates\books.html:34 -msgid "Toggle Recipes" -msgstr "" - -#: .\cookbook\templates\books.html:54 -#: .\cookbook\templates\meal_plan_entry.html:48 -#: .\cookbook\templates\recipes_table.html:64 -msgid "Last cooked" -msgstr "" - -#: .\cookbook\templates\books.html:71 -msgid "There are no recipes in this book yet." -msgstr "" - #: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6 msgid "Export Recipes" msgstr "" -#: .\cookbook\templates\export.html:14 .\cookbook\templates\export.html:20 -#: .\cookbook\templates\shopping_list.html:351 -#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 -msgid "Export" -msgstr "" - -#: .\cookbook\templates\files.html:7 -#, fuzzy -#| msgid "File ID" -msgid "Files" -msgstr "Fájl ID:" - #: .\cookbook\templates\forms\edit_import_recipe.html:5 #: .\cookbook\templates\forms\edit_import_recipe.html:9 msgid "Import new Recipe" msgstr "" -#: .\cookbook\templates\forms\edit_import_recipe.html:14 -#: .\cookbook\templates\forms\edit_internal_recipe.html:439 -#: .\cookbook\templates\forms\edit_internal_recipe.html:471 -#: .\cookbook\templates\generic\edit_template.html:23 -#: .\cookbook\templates\generic\new_template.html:23 -#: .\cookbook\templates\include\log_cooking.html:28 -#: .\cookbook\templates\meal_plan.html:325 -#: .\cookbook\templates\settings.html:46 .\cookbook\templates\settings.html:87 -#: .\cookbook\templates\settings.html:105 -#: .\cookbook\templates\shopping_list.html:353 -msgid "Save" -msgstr "" - #: .\cookbook\templates\forms\edit_internal_recipe.html:7 -#: .\cookbook\templates\forms\edit_internal_recipe.html:34 msgid "Edit Recipe" msgstr "" -#: .\cookbook\templates\forms\edit_internal_recipe.html:56 -#: .\cookbook\templates\url_import.html:171 -msgid "Description" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:76 -msgid "Waiting Time" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:82 -msgid "Servings Text" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:93 -msgid "Select Keywords" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:94 -#: .\cookbook\templates\url_import.html:583 -#, fuzzy -#| msgid "Keywords" -msgid "Add Keyword" -msgstr "Kulcsszavak" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:112 -msgid "Nutrition" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:116 -#: .\cookbook\templates\forms\edit_internal_recipe.html:166 -msgid "Delete Step" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:120 -msgid "Calories" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:123 -msgid "Carbohydrates" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:126 -msgid "Fats" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:128 -msgid "Proteins" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:150 -#: .\cookbook\templates\forms\edit_internal_recipe.html:504 -msgid "Step" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:171 -msgid "Show as header" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:177 -msgid "Hide as header" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:182 -msgid "Move Up" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:187 -msgid "Move Down" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:196 -msgid "Step Name" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:200 -msgid "Step Type" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:213 -msgid "Step time in Minutes" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:229 -msgid "Select File" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:230 -#: .\cookbook\templates\forms\edit_internal_recipe.html:252 -#: .\cookbook\templates\forms\edit_internal_recipe.html:313 -#: .\cookbook\templates\forms\edit_internal_recipe.html:337 -#: .\cookbook\templates\shopping_list.html:189 -#: .\cookbook\templates\shopping_list.html:211 -#: .\cookbook\templates\shopping_list.html:241 -#: .\cookbook\templates\shopping_list.html:265 -#: .\cookbook\templates\url_import.html:495 -#: .\cookbook\templates\url_import.html:527 -msgid "Select" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:251 -msgid "Select Recipe" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:311 -#: .\cookbook\templates\shopping_list.html:187 -msgid "Select Unit" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:312 -#: .\cookbook\templates\forms\edit_internal_recipe.html:336 -#: .\cookbook\templates\shopping_list.html:188 -#: .\cookbook\templates\shopping_list.html:210 -msgid "Create" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:335 -#: .\cookbook\templates\shopping_list.html:209 -msgid "Select Food" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:352 -#: .\cookbook\templates\meal_plan.html:256 -#: .\cookbook\templates\url_import.html:542 -msgid "Note" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:369 -msgid "Delete Ingredient" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:375 -msgid "Make Header" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:381 -msgid "Make Ingredient" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:387 -msgid "Disable Amount" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:393 -msgid "Enable Amount" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:398 -msgid "Copy Template Reference" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:424 -#: .\cookbook\templates\url_import.html:297 -#: .\cookbook\templates\url_import.html:567 -msgid "Instructions" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:437 -#: .\cookbook\templates\forms\edit_internal_recipe.html:468 -msgid "Save & View" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:441 -#: .\cookbook\templates\forms\edit_internal_recipe.html:474 -msgid "Add Step" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:444 -#: .\cookbook\templates\forms\edit_internal_recipe.html:478 -msgid "Add Nutrition" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:446 -#: .\cookbook\templates\forms\edit_internal_recipe.html:480 -msgid "Remove Nutrition" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:448 -#: .\cookbook\templates\forms\edit_internal_recipe.html:483 -msgid "View Recipe" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:450 -#: .\cookbook\templates\forms\edit_internal_recipe.html:485 -msgid "Delete Recipe" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:491 -msgid "Steps" -msgstr "" - #: .\cookbook\templates\forms\ingredients.html:15 msgid "Edit Ingredients" msgstr "" @@ -1093,11 +1213,6 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\forms\ingredients.html:24 -#: .\cookbook\templates\space.html:41 .\cookbook\templates\stats.html:26 -msgid "Units" -msgstr "" - #: .\cookbook\templates\forms\ingredients.html:26 msgid "Are you sure that you want to merge these two units?" msgstr "" @@ -1111,29 +1226,46 @@ msgstr "" msgid "Are you sure that you want to merge these two ingredients?" msgstr "" -#: .\cookbook\templates\generic\delete_template.html:18 +#: .\cookbook\templates\generic\delete_template.html:21 #, python-format msgid "Are you sure you want to delete the %(title)s: %(object)s " msgstr "" -#: .\cookbook\templates\generic\edit_template.html:30 +#: .\cookbook\templates\generic\delete_template.html:26 +msgid "Protected" +msgstr "" + +#: .\cookbook\templates\generic\delete_template.html:41 +msgid "Cascade" +msgstr "" + +#: .\cookbook\templates\generic\delete_template.html:72 +msgid "Cancel" +msgstr "" + +#: .\cookbook\templates\generic\edit_template.html:32 msgid "View" msgstr "" -#: .\cookbook\templates\generic\edit_template.html:34 +#: .\cookbook\templates\generic\edit_template.html:36 msgid "Delete original file" msgstr "" #: .\cookbook\templates\generic\list_template.html:6 -#: .\cookbook\templates\generic\list_template.html:12 +#: .\cookbook\templates\generic\list_template.html:22 msgid "List" msgstr "" -#: .\cookbook\templates\generic\list_template.html:25 +#: .\cookbook\templates\generic\list_template.html:33 +#: .\cookbook\templates\shopping_list.html:33 +msgid "Try the new shopping list" +msgstr "" + +#: .\cookbook\templates\generic\list_template.html:45 msgid "Filter" msgstr "" -#: .\cookbook\templates\generic\list_template.html:30 +#: .\cookbook\templates\generic\list_template.html:50 msgid "Import all" msgstr "" @@ -1159,23 +1291,32 @@ msgstr "" msgid "Import Recipes" msgstr "" -#: .\cookbook\templates\include\log_cooking.html:7 +#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 +#: .\cookbook\templates\import_response.html:7 +#: .\cookbook\templates\test.html:14 .\cookbook\templates\test.html:20 +#: .\cookbook\templates\url_import.html:29 +#: .\cookbook\templates\url_import.html:108 +#: .\cookbook\templates\url_import.html:130 +#: .\cookbook\templates\url_import.html:324 +#: .\cookbook\templates\url_import.html:618 .\cookbook\views\delete.py:89 +#: .\cookbook\views\edit.py:200 +msgid "Import" +msgstr "" + +#: .\cookbook\templates\include\log_cooking.html:9 msgid "Log Recipe Cooking" msgstr "" -#: .\cookbook\templates\include\log_cooking.html:13 +#: .\cookbook\templates\include\log_cooking.html:15 msgid "All fields are optional and can be left empty." msgstr "" -#: .\cookbook\templates\include\log_cooking.html:19 +#: .\cookbook\templates\include\log_cooking.html:21 msgid "Rating" msgstr "" -#: .\cookbook\templates\include\log_cooking.html:27 +#: .\cookbook\templates\include\log_cooking.html:29 #: .\cookbook\templates\include\recipe_open_modal.html:18 -#: .\cookbook\templates\meal_plan.html:283 -#: .\cookbook\templates\meal_plan.html:327 -#: .\cookbook\templates\meal_plan.html:366 msgid "Close" msgstr "" @@ -1220,8 +1361,8 @@ msgstr "" msgid "Last viewed" msgstr "" -#: .\cookbook\templates\index.html:87 .\cookbook\templates\meal_plan.html:178 -#: .\cookbook\templates\space.html:35 .\cookbook\templates\stats.html:22 +#: .\cookbook\templates\index.html:87 .\cookbook\templates\space.html:37 +#: .\cookbook\templates\stats.html:22 msgid "Recipes" msgstr "" @@ -1364,145 +1505,22 @@ msgstr "" msgid "Cell" msgstr "" -#: .\cookbook\templates\meal_plan.html:101 -msgid "New Entry" +#: .\cookbook\templates\meal_plan_entry.html:6 +msgid "Meal Plan View" msgstr "" -#: .\cookbook\templates\meal_plan.html:113 -#: .\cookbook\templates\shopping_list.html:56 -msgid "Search Recipe" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:139 -msgid "Title" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:141 -msgid "Note (optional)" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:143 -msgid "" -"You can use markdown to format this field. See the docs here" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:147 -#: .\cookbook\templates\meal_plan.html:251 -msgid "Serving Count" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:153 -msgid "Create only note" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:168 -#: .\cookbook\templates\shopping_list.html:7 -#: .\cookbook\templates\shopping_list.html:29 -#: .\cookbook\templates\shopping_list.html:714 -msgid "Shopping List" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:172 -msgid "Shopping list currently empty" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:175 -msgid "Open Shopping List" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:189 -msgid "Plan" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:196 -msgid "Number of Days" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:206 -msgid "Weekday offset" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:209 -msgid "" -"Number of days starting from the first day of the week to offset the default " -"view." -msgstr "" - -#: .\cookbook\templates\meal_plan.html:217 -#: .\cookbook\templates\meal_plan.html:294 -msgid "Edit plan types" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:219 -msgid "Show help" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:220 -msgid "Week iCal export" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:264 #: .\cookbook\templates\meal_plan_entry.html:18 msgid "Created by" msgstr "" -#: .\cookbook\templates\meal_plan.html:270 #: .\cookbook\templates\meal_plan_entry.html:20 -#: .\cookbook\templates\shopping_list.html:254 +#: .\cookbook\templates\shopping_list.html:232 msgid "Shared with" msgstr "" -#: .\cookbook\templates\meal_plan.html:280 -msgid "Add to Shopping" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:323 -msgid "New meal type" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:338 -msgid "Meal Plan Help" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:344 -msgid "" -"\n" -"

The meal plan module allows planning of meals " -"both with recipes and notes.

\n" -"

Simply select a recipe from the list of " -"recently viewed recipes or search the one you\n" -" want and drag it to the desired plan " -"position. You can also add a note and a title and\n" -" then drag the recipe to create a plan entry " -"with a custom title and note. Creating only\n" -" Notes is possible by dragging the create " -"note box into the plan.

\n" -"

Click on a recipe in order to open the " -"detailed view. There you can also add it to the\n" -" shopping list. You can also add all recipes " -"of a day to the shopping list by\n" -" clicking the shopping cart at the top of the " -"table.

\n" -"

Since a common use case is to plan meals " -"together you can define\n" -" users you want to share your plan with in " -"the settings.\n" -"

\n" -"

You can also edit the types of meals you want " -"to plan. If you share your plan with\n" -" someone with\n" -" different meals, their meal types will " -"appear in your list as well. To prevent\n" -" duplicates (e.g. Other and Misc.)\n" -" name your meal types the same as the users " -"you share your meals with and they will be\n" -" merged.

\n" -" " -msgstr "" - -#: .\cookbook\templates\meal_plan_entry.html:6 -msgid "Meal Plan View" +#: .\cookbook\templates\meal_plan_entry.html:48 +#: .\cookbook\templates\recipes_table.html:64 +msgid "Last cooked" msgstr "" #: .\cookbook\templates\meal_plan_entry.html:50 @@ -1596,29 +1614,28 @@ msgid "" "recently viewed them. Keep in mind that data might be outdated." msgstr "" -#: .\cookbook\templates\recipe_view.html:21 .\cookbook\templates\space.html:62 -#: .\cookbook\templates\stats.html:47 -msgid "Comments" +#: .\cookbook\templates\recipe_view.html:26 +msgid "by" msgstr "" -#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:118 -#: .\cookbook\views\edit.py:179 +#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:147 +#: .\cookbook\views\edit.py:180 msgid "Comment" msgstr "" #: .\cookbook\templates\recipes_table.html:19 #: .\cookbook\templates\recipes_table.html:23 -#: .\cookbook\templates\url_import.html:440 +#: .\cookbook\templates\url_import.html:447 msgid "Recipe Image" msgstr "" #: .\cookbook\templates\recipes_table.html:51 -#: .\cookbook\templates\url_import.html:445 +#: .\cookbook\templates\url_import.html:452 msgid "Preparation time ca." msgstr "" #: .\cookbook\templates\recipes_table.html:57 -#: .\cookbook\templates\url_import.html:450 +#: .\cookbook\templates\url_import.html:457 msgid "Waiting time ca." msgstr "" @@ -1634,63 +1651,284 @@ msgstr "" msgid "Recipe Home" msgstr "" -#: .\cookbook\templates\settings.html:25 +#: .\cookbook\templates\search_info.html:5 +#: .\cookbook\templates\search_info.html:9 +#: .\cookbook\templates\settings.html:172 +msgid "Search Settings" +msgstr "" + +#: .\cookbook\templates\search_info.html:10 +msgid "" +"\n" +" Creating the best search experience is complicated and weighs " +"heavily on your personal configuration. \n" +" Changing any of the search settings can have significant impact on " +"the speed and quality of the results.\n" +" Search Methods, Trigrams and Full Text Search configurations are " +"only available if you are using Postgres for your database.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:19 +msgid "Search Methods" +msgstr "" + +#: .\cookbook\templates\search_info.html:23 +msgid "" +" \n" +" Full text searches attempt to normalize the words provided to " +"match common variants. For example: 'forked', 'forking', 'forks' will all " +"normalize to 'fork'.\n" +" There are several methods available, described below, that will " +"control how the search behavior should react when multiple words are " +"searched.\n" +" Full technical details on how these operate can be viewed on Postgresql's website.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:29 +msgid "" +" \n" +" Simple searches ignore punctuation and common words such as " +"'the', 'a', 'and'. And will treat seperate words as required.\n" +" Searching for 'apple or flour' will return any recipe that " +"includes both 'apple' and 'flour' anywhere in the fields that have been " +"selected for a full text search.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:34 +msgid "" +" \n" +" Phrase searches ignore punctuation, but will search for all of " +"the words in the exact order provided.\n" +" Searching for 'apple or flour' will only return a recipe that " +"includes the exact phrase 'apple or flour' in any of the fields that have " +"been selected for a full text search.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:39 +msgid "" +" \n" +" Web searches simulate functionality found on many web search " +"sites supporting special syntax.\n" +" Placing quotes around several words will convert those words " +"into a phrase.\n" +" 'or' is recongized as searching for the word (or phrase) " +"immediately before 'or' OR the word (or phrase) directly after.\n" +" '-' is recognized as searching for recipes that do not include " +"the word (or phrase) that comes immediately after. \n" +" For example searching for 'apple pie' or cherry -butter will " +"return any recipe that includes the phrase 'apple pie' or the word " +"'cherry' \n" +" in any field included in the full text search but exclude any " +"recipe that has the word 'butter' in any field included.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:48 +msgid "" +" \n" +" Raw search is similar to Web except will take puncuation " +"operators such as '|', '&' and '()'\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:59 +msgid "" +" \n" +" Another approach to searching that also requires Postgresql is " +"fuzzy search or trigram similarity. A trigram is a group of three " +"consecutive characters.\n" +" For example searching for 'apple' will create x trigrams 'app', " +"'ppl', 'ple' and will create a score of how closely words match the " +"generated trigrams.\n" +" One benefit of searching trigams is that a search for 'sandwich' " +"will find mispelled words such as 'sandwhich' that would be missed by other " +"methods.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:69 +msgid "Search Fields" +msgstr "" + +#: .\cookbook\templates\search_info.html:73 +msgid "" +" \n" +" Unaccent is a special case in that it enables searching a field " +"'unaccented' for each search style attempting to ignore accented values. \n" +" For example when you enable unaccent for 'Name' any search " +"(starts with, contains, trigram) will attempt the search ignoring accented " +"characters.\n" +" \n" +" For the other options, you can enable search on any or all " +"fields and they will be combined together with an assumed 'OR'.\n" +" For example enabling 'Name' for Starts With, 'Name' and " +"'Description' for Partial Match and 'Ingredients' and 'Keywords' for Full " +"Search\n" +" and searching for 'apple' will generate a search that will " +"return recipes that have:\n" +" - A recipe name that starts with 'apple'\n" +" - OR a recipe name that contains 'apple'\n" +" - OR a recipe description that contains 'apple'\n" +" - OR a recipe that will have a full text search match ('apple' " +"or 'apples') in ingredients\n" +" - OR a recipe that will have a full text search match in " +"Keywords\n" +"\n" +" Combining too many fields in too many types of search can have a " +"negative impact on performance, create duplicate results or return " +"unexpected results.\n" +" For example, enabling fuzzy search or partial matches will " +"interfere with web search methods. \n" +" Searching for 'apple -pie' with fuzzy search and full text " +"search will return the recipe Apple Pie. Though it is not included in the " +"full text results, it does match the trigram results.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:95 +msgid "Search Index" +msgstr "" + +#: .\cookbook\templates\search_info.html:99 +msgid "" +" \n" +" Trigram search and Full Text Search both rely on database " +"indexes to perform effectively. \n" +" You can rebuild the indexes on all fields in the Admin page for " +"Recipes and selecting all recipes and running 'rebuild index for selected " +"recipes'\n" +" You can also rebuild indexes at the command line by executing " +"the management command 'python manage.py rebuildindex'\n" +" " +msgstr "" + +#: .\cookbook\templates\settings.html:28 msgid "Account" msgstr "" -#: .\cookbook\templates\settings.html:29 +#: .\cookbook\templates\settings.html:35 msgid "Preferences" msgstr "" -#: .\cookbook\templates\settings.html:33 +#: .\cookbook\templates\settings.html:42 msgid "API-Settings" msgstr "" -#: .\cookbook\templates\settings.html:41 +#: .\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:49 +#: .\cookbook\templates\settings.html:73 msgid "Account Settings" msgstr "" -#: .\cookbook\templates\settings.html:51 +#: .\cookbook\templates\settings.html:75 msgid "Emails" msgstr "" -#: .\cookbook\templates\settings.html:54 +#: .\cookbook\templates\settings.html:78 #: .\cookbook\templates\socialaccount\connections.html:11 msgid "Social" msgstr "" -#: .\cookbook\templates\settings.html:66 +#: .\cookbook\templates\settings.html:91 msgid "Language" msgstr "" -#: .\cookbook\templates\settings.html:96 +#: .\cookbook\templates\settings.html:121 msgid "Style" msgstr "" -#: .\cookbook\templates\settings.html:116 +#: .\cookbook\templates\settings.html:142 msgid "API Token" msgstr "" -#: .\cookbook\templates\settings.html:117 +#: .\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:134 +#: .\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:136 +#: .\cookbook\templates\settings.html:162 msgid "or" msgstr "" +#: .\cookbook\templates\settings.html:173 +msgid "" +"There are many options to configure the search depending on your personal " +"preferences." +msgstr "" + +#: .\cookbook\templates\settings.html:174 +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 +msgid "" +"If you do want to configure the search you can read about the different " +"options here." +msgstr "" + +#: .\cookbook\templates\settings.html:180 +msgid "Fuzzy" +msgstr "" + +#: .\cookbook\templates\settings.html:181 +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 +msgid "This is the default behavior" +msgstr "" + +#: .\cookbook\templates\settings.html:183 +#: .\cookbook\templates\settings.html:191 +msgid "Apply" +msgstr "" + +#: .\cookbook\templates\settings.html:188 +msgid "Precise" +msgstr "" + +#: .\cookbook\templates\settings.html:189 +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 +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 "" @@ -1708,50 +1946,73 @@ msgstr "" msgid "Create Superuser account" msgstr "" -#: .\cookbook\templates\shopping_list.html:79 +#: .\cookbook\templates\shopping_list.html:8 +#: .\cookbook\templates\shopping_list.html:29 +#: .\cookbook\templates\shopping_list.html:663 +msgid "Shopping List" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:55 +msgid "Search Recipe" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:72 msgid "Shopping Recipes" msgstr "" -#: .\cookbook\templates\shopping_list.html:83 +#: .\cookbook\templates\shopping_list.html:74 msgid "No recipes selected" msgstr "" -#: .\cookbook\templates\shopping_list.html:150 +#: .\cookbook\templates\shopping_list.html:131 msgid "Entry Mode" msgstr "" -#: .\cookbook\templates\shopping_list.html:158 +#: .\cookbook\templates\shopping_list.html:139 msgid "Add Entry" msgstr "" -#: .\cookbook\templates\shopping_list.html:174 +#: .\cookbook\templates\shopping_list.html:152 msgid "Amount" msgstr "" -#: .\cookbook\templates\shopping_list.html:240 +#: .\cookbook\templates\shopping_list.html:164 +msgid "Select Unit" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:166 +#: .\cookbook\templates\shopping_list.html:189 +#: .\cookbook\templates\shopping_list.html:219 +#: .\cookbook\templates\shopping_list.html:243 +#: .\cookbook\templates\url_import.html:505 +#: .\cookbook\templates\url_import.html:537 +msgid "Select" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:187 +msgid "Select Food" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:218 msgid "Select Supermarket" msgstr "" -#: .\cookbook\templates\shopping_list.html:264 +#: .\cookbook\templates\shopping_list.html:242 msgid "Select User" msgstr "" -#: .\cookbook\templates\shopping_list.html:283 +#: .\cookbook\templates\shopping_list.html:258 msgid "Finished" msgstr "" -#: .\cookbook\templates\shopping_list.html:296 +#: .\cookbook\templates\shopping_list.html:267 msgid "You are offline, shopping list might not syncronize." msgstr "" -#: .\cookbook\templates\shopping_list.html:361 +#: .\cookbook\templates\shopping_list.html:318 msgid "Copy/Export" msgstr "" -#: .\cookbook\templates\shopping_list.html:365 -msgid "List Prefix" -msgstr "" - #: .\cookbook\templates\socialaccount\connections.html:4 #: .\cookbook\templates\socialaccount\connections.html:15 msgid "Account Connections" @@ -1801,84 +2062,80 @@ msgstr "" msgid "Sign in using" msgstr "" -#: .\cookbook\templates\space.html:23 +#: .\cookbook\templates\space.html:25 msgid "Space:" msgstr "" -#: .\cookbook\templates\space.html:24 +#: .\cookbook\templates\space.html:26 msgid "Manage Subscription" msgstr "" -#: .\cookbook\templates\space.html:32 .\cookbook\templates\stats.html:19 +#: .\cookbook\templates\space.html:34 .\cookbook\templates\stats.html:19 msgid "Number of objects" msgstr "" -#: .\cookbook\templates\space.html:45 .\cookbook\templates\stats.html:30 +#: .\cookbook\templates\space.html:54 .\cookbook\templates\stats.html:30 msgid "Recipe Imports" msgstr "" -#: .\cookbook\templates\space.html:53 .\cookbook\templates\stats.html:38 +#: .\cookbook\templates\space.html:62 .\cookbook\templates\stats.html:38 msgid "Objects stats" msgstr "" -#: .\cookbook\templates\space.html:56 .\cookbook\templates\stats.html:41 +#: .\cookbook\templates\space.html:65 .\cookbook\templates\stats.html:41 msgid "Recipes without Keywords" msgstr "" -#: .\cookbook\templates\space.html:58 .\cookbook\templates\stats.html:43 -msgid "External Recipes" -msgstr "" - -#: .\cookbook\templates\space.html:60 .\cookbook\templates\stats.html:45 +#: .\cookbook\templates\space.html:73 .\cookbook\templates\stats.html:45 msgid "Internal Recipes" msgstr "" -#: .\cookbook\templates\space.html:73 +#: .\cookbook\templates\space.html:89 msgid "Members" msgstr "" -#: .\cookbook\templates\space.html:77 +#: .\cookbook\templates\space.html:95 msgid "Invite User" msgstr "" -#: .\cookbook\templates\space.html:88 +#: .\cookbook\templates\space.html:107 msgid "User" msgstr "" -#: .\cookbook\templates\space.html:89 +#: .\cookbook\templates\space.html:108 msgid "Groups" msgstr "" -#: .\cookbook\templates\space.html:105 +#: .\cookbook\templates\space.html:119 msgid "admin" msgstr "" -#: .\cookbook\templates\space.html:106 +#: .\cookbook\templates\space.html:120 msgid "user" msgstr "" -#: .\cookbook\templates\space.html:107 +#: .\cookbook\templates\space.html:121 msgid "guest" msgstr "" -#: .\cookbook\templates\space.html:108 +#: .\cookbook\templates\space.html:122 msgid "remove" msgstr "" -#: .\cookbook\templates\space.html:112 +#: .\cookbook\templates\space.html:126 msgid "Update" msgstr "" -#: .\cookbook\templates\space.html:116 +#: .\cookbook\templates\space.html:130 msgid "You cannot edit yourself." msgstr "" -#: .\cookbook\templates\space.html:123 +#: .\cookbook\templates\space.html:136 msgid "There are no members in your space yet!" msgstr "" -#: .\cookbook\templates\space.html:130 .\cookbook\templates\system.html:21 -#: .\cookbook\views\lists.py:115 +#: .\cookbook\templates\space.html:143 .\cookbook\templates\system.html:21 +#: .\cookbook\views\lists.py:85 msgid "Invite Links" msgstr "" @@ -1886,6 +2143,10 @@ msgstr "" msgid "Stats" msgstr "" +#: .\cookbook\templates\stats.html:10 +msgid "Statistics" +msgstr "" + #: .\cookbook\templates\system.html:22 msgid "Show Links" msgstr "" @@ -1983,141 +2244,168 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\url_import.html:6 +#: .\cookbook\templates\url_import.html:8 msgid "URL Import" msgstr "" -#: .\cookbook\templates\url_import.html:31 +#: .\cookbook\templates\url_import.html:33 msgid "Drag me to your bookmarks to import recipes from anywhere" msgstr "" -#: .\cookbook\templates\url_import.html:32 +#: .\cookbook\templates\url_import.html:34 msgid "Bookmark Me!" msgstr "" -#: .\cookbook\templates\url_import.html:61 +#: .\cookbook\templates\url_import.html:38 +msgid "URL" +msgstr "" + +#: .\cookbook\templates\url_import.html:40 +msgid "App" +msgstr "" + +#: .\cookbook\templates\url_import.html:64 msgid "Enter website URL" msgstr "" -#: .\cookbook\templates\url_import.html:97 +#: .\cookbook\templates\url_import.html:104 msgid "Select recipe files to import or drop them here..." msgstr "" -#: .\cookbook\templates\url_import.html:118 +#: .\cookbook\templates\url_import.html:125 msgid "Paste json or html source here to load recipe." msgstr "" -#: .\cookbook\templates\url_import.html:146 +#: .\cookbook\templates\url_import.html:153 msgid "Preview Recipe Data" msgstr "" -#: .\cookbook\templates\url_import.html:147 +#: .\cookbook\templates\url_import.html:154 msgid "Drag recipe attributes from the right into the appropriate box below." msgstr "" -#: .\cookbook\templates\url_import.html:156 -#: .\cookbook\templates\url_import.html:173 -#: .\cookbook\templates\url_import.html:190 -#: .\cookbook\templates\url_import.html:209 -#: .\cookbook\templates\url_import.html:227 -#: .\cookbook\templates\url_import.html:242 -#: .\cookbook\templates\url_import.html:257 -#: .\cookbook\templates\url_import.html:273 -#: .\cookbook\templates\url_import.html:300 -#: .\cookbook\templates\url_import.html:351 +#: .\cookbook\templates\url_import.html:163 +#: .\cookbook\templates\url_import.html:180 +#: .\cookbook\templates\url_import.html:197 +#: .\cookbook\templates\url_import.html:216 +#: .\cookbook\templates\url_import.html:234 +#: .\cookbook\templates\url_import.html:249 +#: .\cookbook\templates\url_import.html:264 +#: .\cookbook\templates\url_import.html:280 +#: .\cookbook\templates\url_import.html:307 +#: .\cookbook\templates\url_import.html:358 msgid "Clear Contents" msgstr "" -#: .\cookbook\templates\url_import.html:158 +#: .\cookbook\templates\url_import.html:165 msgid "Text dragged here will be appended to the name." msgstr "" -#: .\cookbook\templates\url_import.html:175 +#: .\cookbook\templates\url_import.html:178 +msgid "Description" +msgstr "" + +#: .\cookbook\templates\url_import.html:182 msgid "Text dragged here will be appended to the description." msgstr "" -#: .\cookbook\templates\url_import.html:192 +#: .\cookbook\templates\url_import.html:199 msgid "Keywords dragged here will be appended to current list" msgstr "" -#: .\cookbook\templates\url_import.html:207 +#: .\cookbook\templates\url_import.html:214 msgid "Image" msgstr "" -#: .\cookbook\templates\url_import.html:239 +#: .\cookbook\templates\url_import.html:246 msgid "Prep Time" msgstr "" -#: .\cookbook\templates\url_import.html:254 +#: .\cookbook\templates\url_import.html:261 msgid "Cook Time" msgstr "" -#: .\cookbook\templates\url_import.html:275 +#: .\cookbook\templates\url_import.html:282 msgid "Ingredients dragged here will be appended to current list." msgstr "" -#: .\cookbook\templates\url_import.html:302 +#: .\cookbook\templates\url_import.html:304 +#: .\cookbook\templates\url_import.html:579 +msgid "Instructions" +msgstr "" + +#: .\cookbook\templates\url_import.html:309 msgid "" "Recipe instructions dragged here will be appended to current instructions." msgstr "" -#: .\cookbook\templates\url_import.html:325 +#: .\cookbook\templates\url_import.html:332 msgid "Discovered Attributes" msgstr "" -#: .\cookbook\templates\url_import.html:327 +#: .\cookbook\templates\url_import.html:334 msgid "" "Drag recipe attributes from below into the appropriate box on the left. " "Click any node to display its full properties." msgstr "" -#: .\cookbook\templates\url_import.html:344 +#: .\cookbook\templates\url_import.html:351 msgid "Show Blank Field" msgstr "" -#: .\cookbook\templates\url_import.html:349 +#: .\cookbook\templates\url_import.html:356 msgid "Blank Field" msgstr "" -#: .\cookbook\templates\url_import.html:353 +#: .\cookbook\templates\url_import.html:360 msgid "Items dragged to Blank Field will be appended." msgstr "" -#: .\cookbook\templates\url_import.html:400 +#: .\cookbook\templates\url_import.html:407 msgid "Delete Text" msgstr "" -#: .\cookbook\templates\url_import.html:413 +#: .\cookbook\templates\url_import.html:420 msgid "Delete image" msgstr "" -#: .\cookbook\templates\url_import.html:429 +#: .\cookbook\templates\url_import.html:436 msgid "Recipe Name" msgstr "" -#: .\cookbook\templates\url_import.html:433 +#: .\cookbook\templates\url_import.html:440 msgid "Recipe Description" msgstr "" -#: .\cookbook\templates\url_import.html:494 -#: .\cookbook\templates\url_import.html:526 -#: .\cookbook\templates\url_import.html:582 +#: .\cookbook\templates\url_import.html:504 +#: .\cookbook\templates\url_import.html:536 +#: .\cookbook\templates\url_import.html:596 msgid "Select one" msgstr "" -#: .\cookbook\templates\url_import.html:596 +#: .\cookbook\templates\url_import.html:554 +msgid "Note" +msgstr "" + +#: .\cookbook\templates\url_import.html:597 +#, fuzzy +#| msgid "Keywords" +msgid "Add Keyword" +msgstr "Kulcsszavak" + +#: .\cookbook\templates\url_import.html:610 msgid "All Keywords" msgstr "" -#: .\cookbook\templates\url_import.html:599 +#: .\cookbook\templates\url_import.html:613 msgid "Import all keywords, not only the ones already existing." msgstr "" -#: .\cookbook\templates\url_import.html:626 +#: .\cookbook\templates\url_import.html:640 msgid "Information" msgstr "" -#: .\cookbook\templates\url_import.html:628 +#: .\cookbook\templates\url_import.html:642 msgid "" " Only websites containing ld+json or microdata information can currently\n" " be imported. Most big recipe pages " @@ -2128,275 +2416,452 @@ msgid "" " github issues." msgstr "" -#: .\cookbook\templates\url_import.html:636 +#: .\cookbook\templates\url_import.html:650 msgid "Google ld+json Info" msgstr "" -#: .\cookbook\templates\url_import.html:639 +#: .\cookbook\templates\url_import.html:653 msgid "GitHub Issues" msgstr "" -#: .\cookbook\templates\url_import.html:641 +#: .\cookbook\templates\url_import.html:655 msgid "Recipe Markup Specification" msgstr "" -#: .\cookbook\views\api.py:79 +#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:170 msgid "Parameter updated_at incorrectly formatted" msgstr "" -#: .\cookbook\views\api.py:580 .\cookbook\views\views.py:303 -msgid "This feature is not available in the demo version!" +#: .\cookbook\views\api.py:190 .\cookbook\views\api.py:291 +#, python-brace-format +msgid "No {self.basename} with id {pk} exists" msgstr "" -#: .\cookbook\views\api.py:603 +#: .\cookbook\views\api.py:194 +msgid "Cannot merge with the same object!" +msgstr "" + +#: .\cookbook\views\api.py:201 +#, python-brace-format +msgid "No {self.basename} with id {target} exists" +msgstr "" + +#: .\cookbook\views\api.py:206 +msgid "Cannot merge with child object!" +msgstr "" + +#: .\cookbook\views\api.py:239 +#, python-brace-format +msgid "{source.name} was merged successfully with {target.name}" +msgstr "" + +#: .\cookbook\views\api.py:244 +#, python-brace-format +msgid "An error occurred attempting to merge {source.name} with {target.name}" +msgstr "" + +#: .\cookbook\views\api.py:300 +#, python-brace-format +msgid "{child.name} was moved successfully to the root." +msgstr "" + +#: .\cookbook\views\api.py:303 .\cookbook\views\api.py:321 +msgid "An error occurred attempting to move " +msgstr "" + +#: .\cookbook\views\api.py:306 +msgid "Cannot move an object to itself!" +msgstr "" + +#: .\cookbook\views\api.py:312 +#, python-brace-format +msgid "No {self.basename} with id {parent} exists" +msgstr "" + +#: .\cookbook\views\api.py:318 +#, python-brace-format +msgid "{child.name} was moved successfully to parent {parent.name}" +msgstr "" + +#: .\cookbook\views\api.py:470 +#, python-brace-format +msgid "{obj.name} was removed from the shopping list." +msgstr "" + +#: .\cookbook\views\api.py:475 .\cookbook\views\api.py:726 +#, python-brace-format +msgid "{obj.name} was added to the shopping list." +msgstr "" + +#: .\cookbook\views\api.py:587 +msgid "ID of recipe a step is part of. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:588 +msgid "Query string matched (fuzzy) against object name." +msgstr "" + +#: .\cookbook\views\api.py:631 +msgid "" +"Query string matched (fuzzy) against recipe name. In the future also " +"fulltext search." +msgstr "" + +#: .\cookbook\views\api.py:632 +msgid "ID of keyword a recipe should have. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:633 +msgid "ID of food a recipe should have. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:634 +msgid "ID of unit a recipe should have." +msgstr "" + +#: .\cookbook\views\api.py:635 +msgid "Rating a recipe should have. [0 - 5]" +msgstr "" + +#: .\cookbook\views\api.py:636 +msgid "ID of book a recipe should be in. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:637 +msgid "" +"If recipe should have all (AND=false) or any (OR=true) of the " +"provided keywords." +msgstr "" + +#: .\cookbook\views\api.py:638 +msgid "" +"If recipe should have all (AND=false) or any (OR=true) of the " +"provided foods." +msgstr "" + +#: .\cookbook\views\api.py:639 +msgid "" +"If recipe should be in all (AND=false) or any (OR=true) of the " +"provided books." +msgstr "" + +#: .\cookbook\views\api.py:640 +msgid "If only internal recipes should be returned. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:641 +msgid "Returns the results in randomized order. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:642 +msgid "Returns new results first in search results. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:768 +msgid "" +"Returns the shopping list entry with a primary key of id. Multiple values " +"allowed." +msgstr "" + +#: .\cookbook\views\api.py:771 +msgid "" +"Filter shopping list entries on checked. [true, false, both, recent]
- recent includes unchecked items and recently completed items." +msgstr "" + +#: .\cookbook\views\api.py:773 +msgid "Returns the shopping list entries sorted by supermarket category order." +msgstr "" + +#: .\cookbook\views\api.py:922 .\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 "" + +#: .\cookbook\views\api.py:944 msgid "Sync successful!" msgstr "" -#: .\cookbook\views\api.py:608 +#: .\cookbook\views\api.py:949 msgid "Error synchronizing with Storage" msgstr "" -#: .\cookbook\views\api.py:686 +#: .\cookbook\views\api.py:1028 msgid "Nothing to do." msgstr "" -#: .\cookbook\views\api.py:701 +#: .\cookbook\views\api.py:1043 msgid "The requested site provided malformed data and cannot be read." msgstr "" -#: .\cookbook\views\api.py:708 +#: .\cookbook\views\api.py:1050 msgid "The requested page could not be found." msgstr "" -#: .\cookbook\views\api.py:717 +#: .\cookbook\views\api.py:1068 msgid "" "The requested site does not provide any recognized data format to import the " "recipe from." msgstr "" -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:1082 +msgid "Connection Refused." +msgstr "" + +#: .\cookbook\views\api.py:1091 msgid "No useable data could be found." msgstr "" -#: .\cookbook\views\api.py:747 +#: .\cookbook\views\api.py:1107 msgid "I couldn't find anything to do." msgstr "" -#: .\cookbook\views\data.py:31 .\cookbook\views\data.py:122 -#: .\cookbook\views\edit.py:50 .\cookbook\views\import_export.py:67 -#: .\cookbook\views\new.py:32 +#: .\cookbook\views\data.py:34 .\cookbook\views\data.py:129 +#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:80 +#: .\cookbook\views\new.py:33 msgid "You have reached the maximum number of recipes for your space." msgstr "" -#: .\cookbook\views\data.py:35 .\cookbook\views\data.py:126 -#: .\cookbook\views\edit.py:54 .\cookbook\views\import_export.py:71 -#: .\cookbook\views\new.py:36 +#: .\cookbook\views\data.py:38 .\cookbook\views\data.py:133 +#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:84 +#: .\cookbook\views\new.py:37 msgid "You have more users than allowed in your space." msgstr "" -#: .\cookbook\views\data.py:104 +#: .\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] "" -#: .\cookbook\views\delete.py:72 +#: .\cookbook\views\delete.py:101 msgid "Monitor" msgstr "" -#: .\cookbook\views\delete.py:96 .\cookbook\views\lists.py:102 -#: .\cookbook\views\new.py:98 +#: .\cookbook\views\delete.py:125 .\cookbook\views\lists.py:71 +#: .\cookbook\views\new.py:101 msgid "Storage Backend" msgstr "" -#: .\cookbook\views\delete.py:106 +#: .\cookbook\views\delete.py:135 msgid "" "Could not delete this storage backend as it is used in at least one monitor." msgstr "" -#: .\cookbook\views\delete.py:129 .\cookbook\views\edit.py:213 -#: .\cookbook\views\new.py:156 +#: .\cookbook\views\delete.py:158 msgid "Recipe Book" msgstr "" -#: .\cookbook\views\delete.py:141 +#: .\cookbook\views\delete.py:170 msgid "Bookmarks" msgstr "" -#: .\cookbook\views\delete.py:163 .\cookbook\views\new.py:252 +#: .\cookbook\views\delete.py:192 .\cookbook\views\new.py:238 msgid "Invite Link" msgstr "" -#: .\cookbook\views\edit.py:119 -msgid "Food" -msgstr "" - -#: .\cookbook\views\edit.py:128 +#: .\cookbook\views\edit.py:125 msgid "You cannot edit this storage!" msgstr "" -#: .\cookbook\views\edit.py:148 +#: .\cookbook\views\edit.py:149 msgid "Storage saved!" msgstr "" -#: .\cookbook\views\edit.py:154 +#: .\cookbook\views\edit.py:155 msgid "There was an error updating this storage backend!" msgstr "" -#: .\cookbook\views\edit.py:165 -msgid "Storage" -msgstr "" - -#: .\cookbook\views\edit.py:261 +#: .\cookbook\views\edit.py:248 msgid "Changes saved!" msgstr "" -#: .\cookbook\views\edit.py:265 +#: .\cookbook\views\edit.py:252 msgid "Error saving changes!" msgstr "" -#: .\cookbook\views\edit.py:299 -msgid "Units merged!" -msgstr "" - -#: .\cookbook\views\edit.py:301 .\cookbook\views\edit.py:317 -msgid "Cannot merge with the same object!" -msgstr "" - -#: .\cookbook\views\edit.py:315 -msgid "Foods merged!" -msgstr "" - -#: .\cookbook\views\import_export.py:93 +#: .\cookbook\views\import_export.py:106 msgid "Importing is not implemented for this provider" msgstr "" -#: .\cookbook\views\import_export.py:115 +#: .\cookbook\views\import_export.py:127 +msgid "" +"The PDF Exporter is not enabled on this instance as it is still in an " +"experimental state." +msgstr "" + +#: .\cookbook\views\import_export.py:132 msgid "Exporting is not implemented for this provider" msgstr "" -#: .\cookbook\views\lists.py:40 +#: .\cookbook\views\lists.py:25 msgid "Import Log" msgstr "" -#: .\cookbook\views\lists.py:53 +#: .\cookbook\views\lists.py:38 msgid "Discovery" msgstr "" -#: .\cookbook\views\lists.py:85 +#: .\cookbook\views\lists.py:54 msgid "Shopping Lists" msgstr "" -#: .\cookbook\views\new.py:123 -msgid "Imported new recipe!" +#: .\cookbook\views\lists.py:148 +msgid "Supermarkets" +msgstr "" + +#: .\cookbook\views\lists.py:164 +msgid "Shopping Categories" +msgstr "" + +#: .\cookbook\views\lists.py:217 +msgid "Steps" +msgstr "" + +#: .\cookbook\views\lists.py:232 +msgid "New Shopping List" msgstr "" #: .\cookbook\views\new.py:126 +msgid "Imported new recipe!" +msgstr "" + +#: .\cookbook\views\new.py:129 msgid "There was an error importing this recipe!" msgstr "" -#: .\cookbook\views\new.py:226 +#: .\cookbook\views\new.py:212 msgid "Hello" msgstr "" -#: .\cookbook\views\new.py:226 +#: .\cookbook\views\new.py:212 msgid "You have been invited by " msgstr "" -#: .\cookbook\views\new.py:227 +#: .\cookbook\views\new.py:213 msgid " to join their Tandoor Recipes space " msgstr "" -#: .\cookbook\views\new.py:228 +#: .\cookbook\views\new.py:214 msgid "Click the following link to activate your account: " msgstr "" -#: .\cookbook\views\new.py:229 +#: .\cookbook\views\new.py:215 msgid "" "If the link does not work use the following code to manually join the space: " msgstr "" -#: .\cookbook\views\new.py:230 +#: .\cookbook\views\new.py:216 msgid "The invitation is valid until " msgstr "" -#: .\cookbook\views\new.py:231 +#: .\cookbook\views\new.py:217 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " msgstr "" -#: .\cookbook\views\new.py:234 +#: .\cookbook\views\new.py:220 msgid "Tandoor Recipes Invite" msgstr "" -#: .\cookbook\views\new.py:241 +#: .\cookbook\views\new.py:227 msgid "Invite link successfully send to user." msgstr "" -#: .\cookbook\views\new.py:244 +#: .\cookbook\views\new.py:230 msgid "" "You have send to many emails, please share the link manually or wait a few " "hours." msgstr "" -#: .\cookbook\views\new.py:246 +#: .\cookbook\views\new.py:232 msgid "Email to user could not be send, please share link manually." msgstr "" -#: .\cookbook\views\views.py:129 +#: .\cookbook\views\views.py:126 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:177 +#: .\cookbook\views\views.py:174 msgid "You do not have the required permissions to perform this action!" msgstr "" -#: .\cookbook\views\views.py:188 +#: .\cookbook\views\views.py:185 msgid "Comment saved!" msgstr "" -#: .\cookbook\views\views.py:395 +#: .\cookbook\views\views.py:276 +msgid "This feature is not available in the demo version!" +msgstr "" + +#: .\cookbook\views\views.py:335 +msgid "You must select at least one field to search!" +msgstr "" + +#: .\cookbook\views\views.py:340 +msgid "" +"To use this search method you must select at least one full text search " +"field!" +msgstr "" + +#: .\cookbook\views\views.py:344 +msgid "Fuzzy search is not compatible with this search method!" +msgstr "" + +#: .\cookbook\views\views.py:470 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:402 +#: .\cookbook\views\views.py:477 msgid "Passwords dont match!" msgstr "" -#: .\cookbook\views\views.py:418 +#: .\cookbook\views\views.py:493 msgid "User has been created, please login!" msgstr "" -#: .\cookbook\views\views.py:434 +#: .\cookbook\views\views.py:509 msgid "Malformed Invite Link supplied!" msgstr "" -#: .\cookbook\views\views.py:441 +#: .\cookbook\views\views.py:516 msgid "You are already member of a space and therefore cannot join this one." msgstr "" -#: .\cookbook\views\views.py:452 +#: .\cookbook\views\views.py:527 msgid "Successfully joined space." msgstr "" -#: .\cookbook\views\views.py:458 +#: .\cookbook\views\views.py:533 msgid "Invite Link not valid or already used!" msgstr "" -#: .\cookbook\views\views.py:522 +#: .\cookbook\views\views.py:614 msgid "" "Reporting share links is not enabled for this instance. Please notify the " "page administrator to report problems." msgstr "" -#: .\cookbook\views\views.py:528 +#: .\cookbook\views\views.py:620 msgid "" "Recipe sharing link has been disabled! For additional information please " "contact the page administrator." msgstr "" + +#~ msgid "New Unit" +#~ msgstr "Új Mértékegység" + +#~ msgid "Old Unit" +#~ msgstr "Régi Mértékegység" + +#~ msgid "New Food" +#~ msgstr "Új Étel" + +#~ msgid "Old Food" +#~ msgstr "Régi Étel" diff --git a/cookbook/locale/hy/LC_MESSAGES/django.mo b/cookbook/locale/hy/LC_MESSAGES/django.mo index 852dca01..30fefc01 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 225651f2..968c6aa9 100644 --- a/cookbook/locale/hy/LC_MESSAGES/django.po +++ b/cookbook/locale/hy/LC_MESSAGES/django.po @@ -11,7 +11,7 @@ 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-04-12 20:22+0000\n" +"PO-Revision-Date: 2021-10-13 12:50+0000\n" "Last-Translator: Hrachya Kocharyan \n" "Language-Team: Armenian \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.5.3\n" +"X-Generator: Weblate 4.8\n" #: .\cookbook\filters.py:22 .\cookbook\templates\base.html:87 #: .\cookbook\templates\forms\edit_internal_recipe.html:219 @@ -79,7 +79,7 @@ msgid "" "mobile data. If lower than instance limit it is reset when saving." msgstr "" "0-ն կանջատի ավտոմատ սինքրոնացումը։ Գնումների ցուցակը թարմացվում է " -"յուրաքանչյուր սահմանված վարկյանը մեկ, մեկ ուրիշի կատարած փոփոխությունները " +"յուրաքանչյուր սահմանված վարկյանը մեկ, ուրիշի կատարած փոփոխությունները " "սինքրոնացնելու համար։ Հարմար է, երբ մեկից ավել մարդ է կատարում գնումները, " "բայց կարող է օգտագործել բջջային ինտերնետ։" diff --git a/cookbook/locale/it/LC_MESSAGES/django.mo b/cookbook/locale/it/LC_MESSAGES/django.mo index d3dc38b4..411bfbd0 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 920e4775..32bbc645 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: 2021-08-17 08:44+0200\n" -"PO-Revision-Date: 2021-08-31 23:31+0000\n" +"POT-Creation-Date: 2022-01-18 14:52+0100\n" +"PO-Revision-Date: 2022-01-17 07:56+0000\n" "Last-Translator: Oliver Cervera \n" "Language-Team: Italian \n" @@ -21,17 +21,68 @@ 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.7.2\n" +"X-Generator: Weblate 4.8\n" -#: .\cookbook\filters.py:23 .\cookbook\templates\base.html:98 -#: .\cookbook\templates\forms\edit_internal_recipe.html:269 -#: .\cookbook\templates\forms\ingredients.html:34 -#: .\cookbook\templates\space.html:43 .\cookbook\templates\stats.html:28 -#: .\cookbook\templates\url_import.html:270 .\cookbook\views\lists.py:67 +#: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 +#: .\cookbook\templates\space.html:50 .\cookbook\templates\stats.html:28 +#: .\cookbook\templates\url_import.html:277 msgid "Ingredients" msgstr "Ingredienti" -#: .\cookbook\forms.py:49 +#: .\cookbook\forms.py:56 +msgid "Default unit" +msgstr "Unità predefinita" + +#: .\cookbook\forms.py:57 +msgid "Use fractions" +msgstr "Usa frazioni" + +#: .\cookbook\forms.py:58 +msgid "Use KJ" +msgstr "Usa KJ" + +#: .\cookbook\forms.py:59 +msgid "Theme" +msgstr "Tema" + +#: .\cookbook\forms.py:60 +msgid "Navbar color" +msgstr "Colore barra di navigazione" + +#: .\cookbook\forms.py:61 +msgid "Sticky navbar" +msgstr "Barra di navigazione persistente" + +#: .\cookbook\forms.py:62 +msgid "Default page" +msgstr "Pagina predefinita" + +#: .\cookbook\forms.py:63 +msgid "Show recent recipes" +msgstr "Mostra ricette recenti" + +#: .\cookbook\forms.py:64 +msgid "Search style" +msgstr "Cerca stile" + +#: .\cookbook\forms.py:65 +msgid "Plan sharing" +msgstr "Condivisione piano" + +#: .\cookbook\forms.py:66 +msgid "Ingredient decimal places" +msgstr "Posizioni decimali degli ingredienti" + +#: .\cookbook\forms.py:67 +msgid "Shopping list auto sync period" +msgstr "Frequenza di sincronizzazione automatica della lista della spesa" + +#: .\cookbook\forms.py:68 .\cookbook\templates\recipe_view.html:21 +#: .\cookbook\templates\space.html:77 .\cookbook\templates\stats.html:47 +msgid "Comments" +msgstr "Commenti" + +#: .\cookbook\forms.py:72 msgid "" "Color of the top navigation bar. Not all colors work with all themes, just " "try them out!" @@ -39,13 +90,13 @@ msgstr "" "Colore della barra di navigazione in alto. Non tutti i colori funzionano con " "tutti i temi, provali e basta!" -#: .\cookbook\forms.py:51 +#: .\cookbook\forms.py:74 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:53 +#: .\cookbook\forms.py:76 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" @@ -53,28 +104,40 @@ msgstr "" "Abilita il supporto alle frazioni per le quantità degli ingredienti (ad " "esempio converte i decimali in frazioni automaticamente)" -#: .\cookbook\forms.py:56 -msgid "" -"Users with whom newly created meal plan/shopping list entries should be " -"shared by default." +#: .\cookbook\forms.py:78 +msgid "Display nutritional energy amounts in joules instead of calories" +msgstr "Mostra le informazioni nutrizionali in Joule invece che in calorie" + +#: .\cookbook\forms.py:79 +#, fuzzy +#| msgid "" +#| "Users with whom newly created meal plan/shopping list entries should be " +#| "shared by default." +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." -#: .\cookbook\forms.py:58 +#: .\cookbook\forms.py:80 +#, fuzzy +#| msgid "Try the new shopping list" +msgid "Users with whom to share shopping lists." +msgstr "Prova la nuova lista della spesa" + +#: .\cookbook\forms.py:82 msgid "Show recently viewed recipes on search page." msgstr "Mostra le ricette visualizzate di recente nella pagina di ricerca." -#: .\cookbook\forms.py:59 +#: .\cookbook\forms.py:83 msgid "Number of decimals to round ingredients." msgstr "Numero di decimali per approssimare gli ingredienti." -#: .\cookbook\forms.py:60 +#: .\cookbook\forms.py:84 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:62 +#: .\cookbook\forms.py:86 .\cookbook\forms.py:493 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. " @@ -85,14 +148,22 @@ msgstr "" "visualizza una lista della spesa, la lista viene aggiornata ogni tot secondi " "impostati per sincronizzare le modifiche che qualcun altro potrebbe aver " "fatto. Utile per gli acquisti con più persone, ma potrebbe utilizzare un po' " -"di dati mobili. Se inferiore al limite di istanza viene ripristinato durante " -"il salvataggio." +"di dati mobili. Se inferiore al limite della istanza viene ripristinato " +"durante il salvataggio." -#: .\cookbook\forms.py:65 +#: .\cookbook\forms.py:89 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:81 +#: .\cookbook\forms.py:90 .\cookbook\forms.py:496 +msgid "Automatically add meal plan ingredients to shopping list." +msgstr "" + +#: .\cookbook\forms.py:91 +msgid "Exclude ingredients that are on hand." +msgstr "" + +#: .\cookbook\forms.py:108 msgid "" "Both fields are optional. If none are given the username will be displayed " "instead" @@ -100,42 +171,39 @@ msgstr "" "Entrambi i campi sono facoltativi. Se non viene fornito, verrà visualizzato " "il nome utente" -#: .\cookbook\forms.py:102 .\cookbook\forms.py:331 -#: .\cookbook\templates\forms\edit_internal_recipe.html:49 -#: .\cookbook\templates\url_import.html:154 +#: .\cookbook\forms.py:129 .\cookbook\forms.py:298 +#: .\cookbook\templates\url_import.html:161 msgid "Name" msgstr "Nome" -#: .\cookbook\forms.py:103 .\cookbook\forms.py:332 -#: .\cookbook\templates\base.html:108 .\cookbook\templates\base.html:169 -#: .\cookbook\templates\forms\edit_internal_recipe.html:85 -#: .\cookbook\templates\space.html:39 .\cookbook\templates\stats.html:24 -#: .\cookbook\templates\url_import.html:188 -#: .\cookbook\templates\url_import.html:573 +#: .\cookbook\forms.py:130 .\cookbook\forms.py:299 +#: .\cookbook\templates\space.html:44 .\cookbook\templates\stats.html:24 +#: .\cookbook\templates\url_import.html:195 +#: .\cookbook\templates\url_import.html:585 .\cookbook\views\lists.py:97 msgid "Keywords" msgstr "Parole chiave" -#: .\cookbook\forms.py:104 +#: .\cookbook\forms.py:131 msgid "Preparation time in minutes" msgstr "Tempo di preparazione in minuti" -#: .\cookbook\forms.py:105 +#: .\cookbook\forms.py:132 msgid "Waiting time (cooking/baking) in minutes" msgstr "Tempo di attesa (cottura) in minuti" -#: .\cookbook\forms.py:106 .\cookbook\forms.py:333 +#: .\cookbook\forms.py:133 .\cookbook\forms.py:267 .\cookbook\forms.py:300 msgid "Path" msgstr "Percorso" -#: .\cookbook\forms.py:107 +#: .\cookbook\forms.py:134 msgid "Storage UID" msgstr "UID di archiviazione" -#: .\cookbook\forms.py:133 +#: .\cookbook\forms.py:164 msgid "Default" msgstr "Predefinito" -#: .\cookbook\forms.py:144 .\cookbook\templates\url_import.html:90 +#: .\cookbook\forms.py:175 .\cookbook\templates\url_import.html:97 msgid "" "To prevent duplicates recipes with the same name as existing ones are " "ignored. Check this box to import everything." @@ -143,52 +211,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:164 -msgid "New Unit" -msgstr "Nuova unità di misura" - -#: .\cookbook\forms.py:165 -msgid "New unit that other gets replaced by." -msgstr "Nuova unità di misura che sostituisce le altre." - -#: .\cookbook\forms.py:170 -msgid "Old Unit" -msgstr "Vecchia unità di misura" - -#: .\cookbook\forms.py:171 -msgid "Unit that should be replaced." -msgstr "Unità di misura che dovrebbe essere rimpiazzata." - -#: .\cookbook\forms.py:187 -msgid "New Food" -msgstr "Nuovo alimento" - -#: .\cookbook\forms.py:188 -msgid "New food that other gets replaced by." -msgstr "Nuovo alimento che sostituisce gli altri." - -#: .\cookbook\forms.py:193 -msgid "Old Food" -msgstr "Vecchio alimento" - -#: .\cookbook\forms.py:194 -msgid "Food that should be replaced." -msgstr "Alimento che dovrebbe essere rimpiazzato." - -#: .\cookbook\forms.py:212 +#: .\cookbook\forms.py:197 msgid "Add your comment: " msgstr "Aggiungi il tuo commento: " -#: .\cookbook\forms.py:253 +#: .\cookbook\forms.py:212 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:260 +#: .\cookbook\forms.py:219 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:269 +#: .\cookbook\forms.py:228 msgid "" "Leave empty for dropbox and enter only base url for nextcloud (/remote." "php/webdav/ is added automatically)" @@ -196,26 +232,33 @@ msgstr "" "Lascia vuoto per dropbox e inserisci solo l'url base per nextcloud (/" "remote.php/webdav/ è aggiunto automaticamente)" -#: .\cookbook\forms.py:307 +#: .\cookbook\forms.py:266 .\cookbook\views\edit.py:166 +msgid "Storage" +msgstr "Archiviazione" + +#: .\cookbook\forms.py:268 +msgid "Active" +msgstr "Attivo" + +#: .\cookbook\forms.py:274 msgid "Search String" msgstr "Stringa di Ricerca" -#: .\cookbook\forms.py:334 +#: .\cookbook\forms.py:301 msgid "File ID" msgstr "ID del File" -#: .\cookbook\forms.py:370 +#: .\cookbook\forms.py:323 msgid "You must provide at least a recipe or a title." msgstr "Devi fornire almeno una ricetta o un titolo." -#: .\cookbook\forms.py:383 +#: .\cookbook\forms.py:336 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:384 -#: .\cookbook\templates\forms\edit_internal_recipe.html:427 +#: .\cookbook\forms.py:337 msgid "" "You can use markdown to format this field. See the docs here" @@ -223,30 +266,218 @@ msgstr "" "Puoi usare markdown per formattare questo campo. Guarda la documentazione qui" -#: .\cookbook\forms.py:409 +#: .\cookbook\forms.py:363 msgid "Maximum number of users for this space reached." msgstr "È stato raggiunto il numero massimo di utenti per questa istanza." -#: .\cookbook\forms.py:415 +#: .\cookbook\forms.py:369 msgid "Email address already taken!" msgstr "Questo indirizzo email è già in uso!" -#: .\cookbook\forms.py:423 +#: .\cookbook\forms.py:377 msgid "" -"An email address is not required but if present the invite link will be send " +"An email address is not required but if present the invite link will be sent " "to the user." msgstr "" "Non è obbligatorio specificare l'indirizzo email, ma se presente verrà " "utilizzato per mandare all'utente un link di invito." -#: .\cookbook\forms.py:438 +#: .\cookbook\forms.py:392 msgid "Name already taken." msgstr "Nome già in uso." -#: .\cookbook\forms.py:449 +#: .\cookbook\forms.py:403 msgid "Accept Terms and Privacy" msgstr "Accetta i Termini d'uso e Privacy" +#: .\cookbook\forms.py:435 +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:445 +msgid "" +"Select type method of search. Click here for " +"full desciption of choices." +msgstr "" +"Seleziona il metodo di ricerca. Clicca qui " +"per avere maggiori informazioni." + +#: .\cookbook\forms.py:446 +msgid "" +"Use fuzzy matching on units, keywords and ingredients when editing and " +"importing recipes." +msgstr "" + +#: .\cookbook\forms.py:448 +msgid "" +"Fields to search ignoring accents. Selecting this option can improve or " +"degrade search quality depending on language" +msgstr "" + +#: .\cookbook\forms.py:450 +msgid "" +"Fields to search for partial matches. (e.g. searching for 'Pie' will return " +"'pie' and 'piece' and 'soapie')" +msgstr "" + +#: .\cookbook\forms.py:452 +msgid "" +"Fields to search for beginning of word matches. (e.g. searching for 'sa' " +"will return 'salad' and 'sandwich')" +msgstr "" + +#: .\cookbook\forms.py:454 +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:456 +msgid "" +"Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " +"only function with fulltext fields." +msgstr "" + +#: .\cookbook\forms.py:460 +msgid "Search Method" +msgstr "Metodo di ricerca" + +#: .\cookbook\forms.py:461 +msgid "Fuzzy Lookups" +msgstr "" + +#: .\cookbook\forms.py:462 +msgid "Ignore Accent" +msgstr "Ignora accento" + +#: .\cookbook\forms.py:463 +msgid "Partial Match" +msgstr "Corrispondenza parziale" + +#: .\cookbook\forms.py:464 +msgid "Starts Wtih" +msgstr "Inizia con" + +#: .\cookbook\forms.py:465 +msgid "Fuzzy Search" +msgstr "Ricerca Fuzzy" + +#: .\cookbook\forms.py:466 +msgid "Full Text" +msgstr "Full Text" + +#: .\cookbook\forms.py:491 +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:497 +msgid "" +"When adding a meal plan to the shopping list (manually or automatically), " +"include all related recipes." +msgstr "" + +#: .\cookbook\forms.py:498 +msgid "" +"When adding a meal plan to the shopping list (manually or automatically), " +"exclude ingredients that are on hand." +msgstr "" + +#: .\cookbook\forms.py:499 +msgid "Default number of hours to delay a shopping list entry." +msgstr "" + +#: .\cookbook\forms.py:500 +msgid "Filter shopping list to only include supermarket categories." +msgstr "" + +#: .\cookbook\forms.py:501 +msgid "Days of recent shopping list entries to display." +msgstr "" + +#: .\cookbook\forms.py:502 +msgid "Mark food 'On Hand' when checked off shopping list." +msgstr "" + +#: .\cookbook\forms.py:503 +msgid "Delimiter to use for CSV exports." +msgstr "" + +#: .\cookbook\forms.py:504 +msgid "Prefix to add when copying list to the clipboard." +msgstr "" + +#: .\cookbook\forms.py:508 +#, fuzzy +#| msgid "New Shopping List" +msgid "Share Shopping List" +msgstr "Nuova lista della spesa" + +#: .\cookbook\forms.py:509 +msgid "Autosync" +msgstr "" + +#: .\cookbook\forms.py:510 +msgid "Auto Add Meal Plan" +msgstr "" + +#: .\cookbook\forms.py:511 +msgid "Exclude On Hand" +msgstr "" + +#: .\cookbook\forms.py:512 +msgid "Include Related" +msgstr "" + +#: .\cookbook\forms.py:513 +msgid "Default Delay Hours" +msgstr "" + +#: .\cookbook\forms.py:514 +#, fuzzy +#| msgid "Select Supermarket" +msgid "Filter to Supermarket" +msgstr "Seleziona supermercato" + +#: .\cookbook\forms.py:515 +msgid "Recent Days" +msgstr "" + +#: .\cookbook\forms.py:516 +msgid "CSV Delimiter" +msgstr "" + +#: .\cookbook\forms.py:517 .\cookbook\templates\shopping_list.html:322 +msgid "List Prefix" +msgstr "Prefisso lista" + +#: .\cookbook\forms.py:518 +msgid "Auto On Hand" +msgstr "" + +#: .\cookbook\forms.py:528 +msgid "Reset Food Inheritance" +msgstr "" + +#: .\cookbook\forms.py:529 +msgid "Reset all food to inherit the fields configured." +msgstr "" + +#: .\cookbook\forms.py:541 +#, fuzzy +#| msgid "Food that should be replaced." +msgid "Fields on food that should be inherited by default." +msgstr "Alimento che dovrebbe essere rimpiazzato." + +#: .\cookbook\forms.py:542 +#, fuzzy +#| msgid "Show recently viewed recipes on search page." +msgid "Show recipe counts on search filters" +msgstr "Mostra le ricette visualizzate di recente nella pagina di ricerca." + #: .\cookbook\helper\AllAuthCustomAdapter.py:36 msgid "" "In order to prevent spam, the requested email was not send. Please wait a " @@ -255,48 +486,49 @@ msgstr "" "Per evitare spam, la mail non è stata inviata. Aspetta qualche minuto e " "riprova." -#: .\cookbook\helper\permission_helper.py:138 -#: .\cookbook\helper\permission_helper.py:161 .\cookbook\views\views.py:151 +#: .\cookbook\helper\permission_helper.py:136 +#: .\cookbook\helper\permission_helper.py:159 .\cookbook\views\views.py:148 msgid "You are not logged in and therefore cannot view this page!" -msgstr "Non hai fatto l'accesso e quindi non puoi visualizzare questa pagina!" +msgstr "Non sei loggato e quindi non puoi visualizzare questa pagina!" -#: .\cookbook\helper\permission_helper.py:142 -#: .\cookbook\helper\permission_helper.py:148 -#: .\cookbook\helper\permission_helper.py:173 -#: .\cookbook\helper\permission_helper.py:218 -#: .\cookbook\helper\permission_helper.py:232 -#: .\cookbook\helper\permission_helper.py:243 -#: .\cookbook\helper\permission_helper.py:254 .\cookbook\views\data.py:40 -#: .\cookbook\views\views.py:162 .\cookbook\views\views.py:169 -#: .\cookbook\views\views.py:259 +#: .\cookbook\helper\permission_helper.py:140 +#: .\cookbook\helper\permission_helper.py:146 +#: .\cookbook\helper\permission_helper.py:171 +#: .\cookbook\helper\permission_helper.py:219 +#: .\cookbook\helper\permission_helper.py:233 +#: .\cookbook\helper\permission_helper.py:244 +#: .\cookbook\helper\permission_helper.py:255 .\cookbook\views\data.py:47 +#: .\cookbook\views\views.py:159 .\cookbook\views\views.py:166 +#: .\cookbook\views\views.py:232 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:166 -#: .\cookbook\helper\permission_helper.py:189 -#: .\cookbook\helper\permission_helper.py:204 +#: .\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 "Non puoi interagire con questo oggetto perché non ne hai i diritti!" -#: .\cookbook\helper\template_helper.py:60 -#: .\cookbook\helper\template_helper.py:62 +#: .\cookbook\helper\recipe_search.py:473 +msgid "One of queryset or hash_key must be provided" +msgstr "" + +#: .\cookbook\helper\shopping_helper.py:54 +#, fuzzy +#| msgid "You must provide at least a recipe or a title." +msgid "You must supply a recipe or mealplan" +msgstr "Devi fornire almeno una ricetta o un titolo." + +#: .\cookbook\helper\shopping_helper.py:58 +msgid "You must supply a created_by" +msgstr "" + +#: .\cookbook\helper\template_helper.py:61 +#: .\cookbook\helper\template_helper.py:63 msgid "Could not parse template code." msgstr "Impossibile elaborare il codice del template." -#: .\cookbook\integration\integration.py:104 -#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 -#: .\cookbook\templates\import_response.html:7 -#: .\cookbook\templates\test.html:14 .\cookbook\templates\test.html:20 -#: .\cookbook\templates\url_import.html:27 -#: .\cookbook\templates\url_import.html:101 -#: .\cookbook\templates\url_import.html:123 -#: .\cookbook\templates\url_import.html:317 -#: .\cookbook\templates\url_import.html:604 .\cookbook\views\delete.py:60 -#: .\cookbook\views\edit.py:199 -msgid "Import" -msgstr "Importa" - -#: .\cookbook\integration\integration.py:185 +#: .\cookbook\integration\integration.py:200 msgid "" "Importer expected a .zip file. Did you choose the correct importer type for " "your data ?" @@ -304,7 +536,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:188 +#: .\cookbook\integration\integration.py:203 msgid "" "An unexpected error occurred during the import. Please make sure you have " "uploaded a valid file." @@ -312,11 +544,11 @@ msgstr "" "Un errore imprevisto si è verificato durante l'importazione. Assicurati di " "aver caricato un file valido." -#: .\cookbook\integration\integration.py:192 +#: .\cookbook\integration\integration.py:208 msgid "The following recipes were ignored because they already existed:" msgstr "Le seguenti ricette sono state ignorate perché già esistenti:" -#: .\cookbook\integration\integration.py:196 +#: .\cookbook\integration\integration.py:212 #, python-format msgid "Imported %s recipes." msgstr "Importate %s ricette." @@ -329,37 +561,53 @@ msgstr "Note" msgid "Nutritional Information" msgstr "Informazioni nutrizionali" -#: .\cookbook\integration\paprika.py:53 +#: .\cookbook\integration\paprika.py:53 .\cookbook\templates\url_import.html:42 msgid "Source" msgstr "Fonte" -#: .\cookbook\integration\safron.py:23 -#: .\cookbook\templates\forms\edit_internal_recipe.html:79 -#: .\cookbook\templates\include\log_cooking.html:16 -#: .\cookbook\templates\url_import.html:224 -#: .\cookbook\templates\url_import.html:455 +#: .\cookbook\integration\saffron.py:23 +#: .\cookbook\templates\include\log_cooking.html:18 +#: .\cookbook\templates\url_import.html:231 +#: .\cookbook\templates\url_import.html:462 msgid "Servings" msgstr "Porzioni" -#: .\cookbook\integration\safron.py:25 +#: .\cookbook\integration\saffron.py:25 msgid "Waiting time" msgstr "Tempo di cottura" -#: .\cookbook\integration\safron.py:27 -#: .\cookbook\templates\forms\edit_internal_recipe.html:73 +#: .\cookbook\integration\saffron.py:27 msgid "Preparation Time" msgstr "Tempo di preparazione" -#: .\cookbook\integration\safron.py:29 .\cookbook\templates\base.html:78 +#: .\cookbook\integration\saffron.py:29 .\cookbook\templates\base.html:78 #: .\cookbook\templates\forms\ingredients.html:7 #: .\cookbook\templates\index.html:7 msgid "Cookbook" -msgstr "Ricettario" +msgstr "Ricette" -#: .\cookbook\integration\safron.py:31 +#: .\cookbook\integration\saffron.py:31 msgid "Section" msgstr "Selezione" +#: .\cookbook\management\commands\rebuildindex.py:14 +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 +msgid "Only Postgress databases use full text search, no index to rebuild" +msgstr "" +"Solo i database Postgres usano l'indice di ricerca full text, non ci sono " +"indici da ricostruire" + +#: .\cookbook\management\commands\rebuildindex.py:29 +msgid "Recipe index rebuild complete." +msgstr "È stato ricostruito l'indice della ricetta." + +#: .\cookbook\management\commands\rebuildindex.py:31 +msgid "Recipe index rebuild failed." +msgstr "Non è stato possibile ricostruire l'indice della ricetta." + #: .\cookbook\migrations\0047_auto_20200602_1133.py:14 msgid "Breakfast" msgstr "Colazione" @@ -376,7 +624,7 @@ msgstr "Cena" msgid "Other" msgstr "Altro" -#: .\cookbook\models.py:72 +#: .\cookbook\models.py:246 msgid "" "Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " "upload." @@ -384,84 +632,137 @@ msgstr "" "Archiviazione massima in MB. 0 per illimitata, -1 per disabilitare il " "caricamento dei file." -#: .\cookbook\models.py:123 .\cookbook\templates\search.html:7 -#: .\cookbook\templates\shopping_list.html:52 +#: .\cookbook\models.py:300 .\cookbook\templates\search.html:7 +#: .\cookbook\templates\shopping_list.html:53 msgid "Search" msgstr "Cerca" -#: .\cookbook\models.py:124 .\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 +#: .\cookbook\models.py:301 .\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 "Piano alimentare" -#: .\cookbook\models.py:125 .\cookbook\templates\base.html:89 +#: .\cookbook\models.py:302 .\cookbook\templates\base.html:90 msgid "Books" msgstr "Libri" -#: .\cookbook\models.py:133 +#: .\cookbook\models.py:310 msgid "Small" msgstr "Piccolo" -#: .\cookbook\models.py:133 +#: .\cookbook\models.py:310 msgid "Large" msgstr "Grande" -#: .\cookbook\models.py:133 .\cookbook\templates\generic\new_template.html:6 +#: .\cookbook\models.py:310 .\cookbook\templates\generic\new_template.html:6 #: .\cookbook\templates\generic\new_template.html:14 -#: .\cookbook\templates\meal_plan.html:323 msgid "New" msgstr "Nuovo" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:202 +#: .\cookbook\models.py:512 +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:586 .\cookbook\templates\url_import.html:44 msgid "Text" msgstr "Testo" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:203 +#: .\cookbook\models.py:586 msgid "Time" msgstr "Tempo" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:204 -#: .\cookbook\templates\forms\edit_internal_recipe.html:219 +#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:46 msgid "File" msgstr "File" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:205 -#: .\cookbook\templates\forms\edit_internal_recipe.html:241 +#: .\cookbook\models.py:586 #: .\cookbook\templates\include\recipe_open_modal.html:7 -#: .\cookbook\templates\meal_plan.html:247 .\cookbook\views\delete.py:28 -#: .\cookbook\views\edit.py:273 .\cookbook\views\new.py:52 +#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260 +#: .\cookbook\views\new.py:53 msgid "Recipe" msgstr "Ricetta" -#: .\cookbook\serializer.py:109 +#: .\cookbook\models.py:1041 .\cookbook\templates\search_info.html:28 +msgid "Simple" +msgstr "Semplice" + +#: .\cookbook\models.py:1042 .\cookbook\templates\search_info.html:33 +msgid "Phrase" +msgstr "Frase" + +#: .\cookbook\models.py:1043 .\cookbook\templates\search_info.html:38 +msgid "Web" +msgstr "Web" + +#: .\cookbook\models.py:1044 .\cookbook\templates\search_info.html:47 +msgid "Raw" +msgstr "Raw" + +#: .\cookbook\models.py:1082 +msgid "Food Alias" +msgstr "Alias Alimento" + +#: .\cookbook\models.py:1082 +msgid "Unit Alias" +msgstr "Alias Unità" + +#: .\cookbook\models.py:1082 +msgid "Keyword Alias" +msgstr "Alias Parola Chiave" + +#: .\cookbook\serializer.py:175 +msgid "A user is required" +msgstr "" + +#: .\cookbook\serializer.py:195 msgid "File uploads are not enabled for this Space." msgstr "Il caricamento dei file non è abilitato in questa istanza." -#: .\cookbook\serializer.py:117 +#: .\cookbook\serializer.py:206 msgid "You have reached your file upload limit." msgstr "Hai raggiungo il limite per il caricamento dei file." -#: .\cookbook\tables.py:35 .\cookbook\templates\books.html:36 -#: .\cookbook\templates\generic\edit_template.html:6 +#: .\cookbook\serializer.py:962 +msgid "Existing shopping list to update" +msgstr "" + +#: .\cookbook\serializer.py:964 +msgid "" +"List of ingredient IDs from the recipe to add, if not provided all " +"ingredients will be added." +msgstr "" + +#: .\cookbook\serializer.py:965 +msgid "" +"Providing a list_recipe ID and servings of 0 will delete that shopping list." +msgstr "" + +#: .\cookbook\serializer.py:973 +msgid "Amount of food to add to the shopping list" +msgstr "" + +#: .\cookbook\serializer.py:974 +msgid "ID of unit to use for the shopping list" +msgstr "" + +#: .\cookbook\serializer.py:975 +msgid "When set to true will delete all food from active shopping lists." +msgstr "" + +#: .\cookbook\tables.py:35 .\cookbook\templates\generic\edit_template.html:6 #: .\cookbook\templates\generic\edit_template.html:14 -#: .\cookbook\templates\meal_plan.html:281 #: .\cookbook\templates\recipes_table.html:82 -#: .\cookbook\templates\shopping_list.html:33 -#: .\cookbook\templates\space.html:90 +#: .\cookbook\templates\shopping_list.html:37 +#: .\cookbook\templates\space.html:109 msgid "Edit" msgstr "Modifica" -#: .\cookbook\tables.py:124 .\cookbook\tables.py:147 -#: .\cookbook\templates\books.html:38 -#: .\cookbook\templates\generic\delete_template.html:5 -#: .\cookbook\templates\generic\delete_template.html:13 -#: .\cookbook\templates\generic\edit_template.html:27 -#: .\cookbook\templates\meal_plan.html:277 +#: .\cookbook\tables.py:115 .\cookbook\tables.py:138 +#: .\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" @@ -490,7 +791,7 @@ 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:154 .\cookbook\templates\settings.html:6 +#: .\cookbook\templates\base.html:257 .\cookbook\templates\settings.html:6 #: .\cookbook\templates\settings.html:17 #: .\cookbook\templates\socialaccount\connections.html:10 msgid "Settings" @@ -525,15 +826,14 @@ msgid "Re-send Verification" msgstr "Invia verifica di nuovo" #: .\cookbook\templates\account\email.html:50 +#: .\cookbook\templates\generic\delete_template.html:56 #: .\cookbook\templates\socialaccount\connections.html:44 msgid "Remove" msgstr "Rimuovi" #: .\cookbook\templates\account\email.html:58 -#, fuzzy -#| msgid "Warning" msgid "Warning:" -msgstr "Avviso" +msgstr "Avviso:" #: .\cookbook\templates\account\email.html:58 msgid "" @@ -574,7 +874,7 @@ msgstr "" " ." #: .\cookbook\templates\account\email_confirm.html:22 -#: .\cookbook\templates\generic\delete_template.html:21 +#: .\cookbook\templates\generic\delete_template.html:71 msgid "Confirm" msgstr "Conferma" @@ -586,10 +886,10 @@ msgid "" "request." msgstr "" "Questo link di conferma è scaduto o non è valido. Puoi\n" -" richiedere un nuovo link di " -"conferma." +" richiedere un nuovo link di conferma." -#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:189 +#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:289 msgid "Login" msgstr "Login" @@ -600,27 +900,27 @@ msgstr "Login" msgid "Sign In" msgstr "Accedi" -#: .\cookbook\templates\account\login.html:32 +#: .\cookbook\templates\account\login.html:34 #: .\cookbook\templates\socialaccount\signup.html:8 #: .\cookbook\templates\socialaccount\signup.html:57 msgid "Sign Up" msgstr "Iscriviti" -#: .\cookbook\templates\account\login.html:36 -#: .\cookbook\templates\account\login.html:37 +#: .\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:37 +#: .\cookbook\templates\account\login.html:40 msgid "Lost your password?" msgstr "Hai dimenticato la password?" -#: .\cookbook\templates\account\login.html:48 +#: .\cookbook\templates\account\login.html:52 msgid "Social Login" msgstr "Login con social network" -#: .\cookbook\templates\account\login.html:49 +#: .\cookbook\templates\account\login.html:53 msgid "You can use any of the following providers to sign in." msgstr "Puoi usare uno dei seguenti provider per accedere." @@ -637,18 +937,18 @@ msgstr "Sei sicuro di voler uscire?" #: .\cookbook\templates\account\password_change.html:6 #: .\cookbook\templates\account\password_change.html:16 #: .\cookbook\templates\account\password_change.html:21 -#, fuzzy -#| msgid "Changes saved!" +#: .\cookbook\templates\account\password_reset_from_key.html:7 +#: .\cookbook\templates\account\password_reset_from_key.html:13 +#: .\cookbook\templates\account\password_reset_from_key_done.html:7 +#: .\cookbook\templates\account\password_reset_from_key_done.html:13 msgid "Change Password" -msgstr "Modifiche salvate!" +msgstr "Cambia Password" #: .\cookbook\templates\account\password_change.html:12 #: .\cookbook\templates\account\password_set.html:12 -#: .\cookbook\templates\settings.html:52 -#, fuzzy -#| msgid "Password Reset" +#: .\cookbook\templates\settings.html:76 msgid "Password" -msgstr "Recupero password" +msgstr "Password" #: .\cookbook\templates\account\password_change.html:22 msgid "Forgot Password?" @@ -670,10 +970,8 @@ msgstr "" "email con le istruzioni per il reset." #: .\cookbook\templates\account\password_reset.html:32 -#, fuzzy -#| msgid "Password reset is not implemented for the time being!" msgid "Password reset is disabled on this instance." -msgstr "Il recupero della password non è stato ancora implementato!" +msgstr "Il recupero della password è disabilitato in questa istanza." #: .\cookbook\templates\account\password_reset_done.html:16 msgid "" @@ -683,13 +981,37 @@ msgstr "" "Ti abbiamo mandato una mail. Contattaci se non la ricevi entro qualche " "minuto." +#: .\cookbook\templates\account\password_reset_from_key.html:13 +msgid "Bad Token" +msgstr "Token non valido" + +#: .\cookbook\templates\account\password_reset_from_key.html:25 +#, python-format +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used.\n" +" Please request a new " +"password reset." +msgstr "" +"Il link per il reset della password non è corretto, probabilmente perché è " +"stato già utilizzato.\n" +" Puoi richiedere un nuovo reset della password." + +#: .\cookbook\templates\account\password_reset_from_key.html:33 +msgid "change password" +msgstr "cambia password" + +#: .\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 "La tua password è stata aggiornata." + #: .\cookbook\templates\account\password_set.html:6 #: .\cookbook\templates\account\password_set.html:16 #: .\cookbook\templates\account\password_set.html:21 -#, fuzzy -#| msgid "Password Reset" msgid "Set Password" -msgstr "Recupero password" +msgstr "Imposta password" #: .\cookbook\templates\account\signup.html:6 msgid "Register" @@ -736,100 +1058,110 @@ 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:179 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:279 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "Documentazione API" -#: .\cookbook\templates\base.html:85 -msgid "Utensils" -msgstr "Strumenti" - -#: .\cookbook\templates\base.html:95 +#: .\cookbook\templates\base.html:86 msgid "Shopping" msgstr "Spesa" -#: .\cookbook\templates\base.html:101 -#: .\cookbook\templates\shopping_list.html:230 +#: .\cookbook\templates\base.html:113 +msgid "Keyword" +msgstr "Parola chiave" + +#: .\cookbook\templates\base.html:125 .\cookbook\views\lists.py:114 +msgid "Foods" +msgstr "Alimenti" + +#: .\cookbook\templates\base.html:137 +#: .\cookbook\templates\forms\ingredients.html:24 +#: .\cookbook\templates\space.html:47 .\cookbook\templates\stats.html:26 +#: .\cookbook\views\lists.py:131 +msgid "Units" +msgstr "Unità di misura" + +#: .\cookbook\templates\base.html:151 +#: .\cookbook\templates\shopping_list.html:208 #: .\cookbook\templates\supermarket.html:7 msgid "Supermarket" msgstr "Supermercato" -#: .\cookbook\templates\base.html:112 .\cookbook\views\delete.py:84 -#: .\cookbook\views\edit.py:102 .\cookbook\views\lists.py:26 -#: .\cookbook\views\new.py:78 -msgid "Keyword" -msgstr "Parola chiave" +#: .\cookbook\templates\base.html:163 +msgid "Supermarket Category" +msgstr "Categoria Supermercato" -#: .\cookbook\templates\base.html:114 +#: .\cookbook\templates\base.html:175 .\cookbook\views\lists.py:180 +msgid "Automations" +msgstr "Automazioni" + +#: .\cookbook\templates\base.html:189 .\cookbook\views\lists.py:200 +msgid "Files" +msgstr "File" + +#: .\cookbook\templates\base.html:201 msgid "Batch Edit" msgstr "Modifica in blocco" -#: .\cookbook\templates\base.html:119 -msgid "Storage Data" -msgstr "Dati e Archiviazione" - -#: .\cookbook\templates\base.html:123 -msgid "Storage Backends" -msgstr "Backend Archiviazione" - -#: .\cookbook\templates\base.html:125 -msgid "Configure Sync" -msgstr "Configura Sincronizzazione" - -#: .\cookbook\templates\base.html:127 -msgid "Discovered Recipes" -msgstr "Ricette trovate" - -#: .\cookbook\templates\base.html:129 -msgid "Discovery Log" -msgstr "Registro ricette trovate" - -#: .\cookbook\templates\base.html:131 .\cookbook\templates\stats.html:10 -msgid "Statistics" -msgstr "Statistiche" - -#: .\cookbook\templates\base.html:133 -msgid "Units & Ingredients" -msgstr "Unità di misura & Ingredienti" - -#: .\cookbook\templates\base.html:135 .\cookbook\templates\index.html:47 -msgid "Import Recipe" -msgstr "Importa Ricetta" - -#: .\cookbook\templates\base.html:156 .\cookbook\templates\history.html:6 +#: .\cookbook\templates\base.html:213 .\cookbook\templates\history.html:6 #: .\cookbook\templates\history.html:14 msgid "History" msgstr "Cronologia" -#: .\cookbook\templates\base.html:159 .\cookbook\templates\space.html:7 -#: .\cookbook\templates\space.html:19 -#, fuzzy -#| msgid "Settings" -msgid "Space Settings" -msgstr "Impostazioni" +#: .\cookbook\templates\base.html:228 .\cookbook\templates\export.html:14 +#: .\cookbook\templates\export.html:20 +#: .\cookbook\templates\shopping_list.html:310 +#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 +msgid "Export" +msgstr "Esporta" -#: .\cookbook\templates\base.html:163 .\cookbook\templates\system.html:13 +#: .\cookbook\templates\base.html:244 .\cookbook\templates\index.html:47 +msgid "Import Recipe" +msgstr "Importa Ricetta" + +#: .\cookbook\templates\base.html:246 +#: .\cookbook\templates\shopping_list.html:165 +#: .\cookbook\templates\shopping_list.html:188 +msgid "Create" +msgstr "Crea" + +#: .\cookbook\templates\base.html:259 +#: .\cookbook\templates\generic\list_template.html:14 +#: .\cookbook\templates\space.html:69 .\cookbook\templates\stats.html:43 +msgid "External Recipes" +msgstr "Ricette esterne" + +#: .\cookbook\templates\base.html:262 .\cookbook\templates\space.html:8 +#: .\cookbook\templates\space.html:20 .\cookbook\templates\space.html:150 +msgid "Space Settings" +msgstr "Impostazioni istanza" + +#: .\cookbook\templates\base.html:267 .\cookbook\templates\system.html:13 msgid "System" msgstr "Sistema" -#: .\cookbook\templates\base.html:165 .\cookbook\templates\base.html:171 +#: .\cookbook\templates\base.html:269 msgid "Admin" msgstr "Amministratore" -#: .\cookbook\templates\base.html:175 +#: .\cookbook\templates\base.html:273 msgid "Markdown Guide" msgstr "Informazioni su Markdown" -#: .\cookbook\templates\base.html:177 +#: .\cookbook\templates\base.html:275 msgid "GitHub" msgstr "GitHub" -#: .\cookbook\templates\base.html:181 +#: .\cookbook\templates\base.html:277 +msgid "Translate Tandoor" +msgstr "Traduci Tandoor" + +#: .\cookbook\templates\base.html:281 msgid "API Browser" msgstr "Browser API" -#: .\cookbook\templates\base.html:184 +#: .\cookbook\templates\base.html:284 msgid "Log out" msgstr "Esci" @@ -847,7 +1179,7 @@ msgstr "" "Aggiungi le parole chiave che desideri a tutte le ricette che contengono una " "determinata stringa" -#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:85 +#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:82 msgid "Sync" msgstr "Sincronizza" @@ -867,10 +1199,36 @@ msgstr "" msgid "The path must be in the following format" msgstr "Il percorso deve essere nel formato seguente" -#: .\cookbook\templates\batch\monitor.html:27 +#: .\cookbook\templates\batch\monitor.html:20 +#: .\cookbook\templates\forms\edit_import_recipe.html:14 +#: .\cookbook\templates\generic\edit_template.html:23 +#: .\cookbook\templates\generic\new_template.html:23 +#: .\cookbook\templates\include\log_cooking.html:30 +#: .\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\shopping_list.html:311 +#: .\cookbook\templates\space.html:155 +msgid "Save" +msgstr "Salva" + +#: .\cookbook\templates\batch\monitor.html:21 +msgid "Manage External Storage" +msgstr "Gestisci archiviazione esterna" + +#: .\cookbook\templates\batch\monitor.html:28 msgid "Sync Now!" msgstr "Sincronizza Ora!" +#: .\cookbook\templates\batch\monitor.html:29 +msgid "Show Recipes" +msgstr "Mostra ricette" + +#: .\cookbook\templates\batch\monitor.html:30 +msgid "Show Log" +msgstr "Mostra registro" + #: .\cookbook\templates\batch\waiting.html:4 #: .\cookbook\templates\batch\waiting.html:10 msgid "Importing Recipes" @@ -884,263 +1242,23 @@ msgstr "" "Questa operazione può richiedere alcuni minuti, a seconda del numero di " "ricette sincronizzate, attendere prego." -#: .\cookbook\templates\books.html:5 .\cookbook\templates\books.html:11 +#: .\cookbook\templates\books.html:7 msgid "Recipe Books" msgstr "Libri di Ricette" -#: .\cookbook\templates\books.html:15 -msgid "New Book" -msgstr "Nuovo Libro" - -#: .\cookbook\templates\books.html:27 .\cookbook\templates\recipe_view.html:26 -msgid "by" -msgstr "di" - -#: .\cookbook\templates\books.html:34 -msgid "Toggle Recipes" -msgstr "Attiva/Disattiva Ricette" - -#: .\cookbook\templates\books.html:54 -#: .\cookbook\templates\meal_plan_entry.html:48 -#: .\cookbook\templates\recipes_table.html:64 -msgid "Last cooked" -msgstr "Cucinato ultimamente" - -#: .\cookbook\templates\books.html:71 -msgid "There are no recipes in this book yet." -msgstr "Non ci sono ancora ricette in questo libro." - #: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6 msgid "Export Recipes" msgstr "Esporta Ricette" -#: .\cookbook\templates\export.html:14 .\cookbook\templates\export.html:20 -#: .\cookbook\templates\shopping_list.html:351 -#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 -msgid "Export" -msgstr "Esporta" - -#: .\cookbook\templates\files.html:7 -#, fuzzy -#| msgid "File ID" -msgid "Files" -msgstr "ID del File" - #: .\cookbook\templates\forms\edit_import_recipe.html:5 #: .\cookbook\templates\forms\edit_import_recipe.html:9 msgid "Import new Recipe" msgstr "Importa nuova Ricetta" -#: .\cookbook\templates\forms\edit_import_recipe.html:14 -#: .\cookbook\templates\forms\edit_internal_recipe.html:439 -#: .\cookbook\templates\forms\edit_internal_recipe.html:471 -#: .\cookbook\templates\generic\edit_template.html:23 -#: .\cookbook\templates\generic\new_template.html:23 -#: .\cookbook\templates\include\log_cooking.html:28 -#: .\cookbook\templates\meal_plan.html:325 -#: .\cookbook\templates\settings.html:46 .\cookbook\templates\settings.html:87 -#: .\cookbook\templates\settings.html:105 -#: .\cookbook\templates\shopping_list.html:353 -msgid "Save" -msgstr "Salva" - #: .\cookbook\templates\forms\edit_internal_recipe.html:7 -#: .\cookbook\templates\forms\edit_internal_recipe.html:34 msgid "Edit Recipe" msgstr "Modifica Ricetta" -#: .\cookbook\templates\forms\edit_internal_recipe.html:56 -#: .\cookbook\templates\url_import.html:171 -msgid "Description" -msgstr "Descrizione" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:76 -msgid "Waiting Time" -msgstr "Tempo di cottura" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:82 -msgid "Servings Text" -msgstr "Nome delle porzioni" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:93 -msgid "Select Keywords" -msgstr "Seleziona parole chiave" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:94 -#: .\cookbook\templates\url_import.html:583 -msgid "Add Keyword" -msgstr "Aggiungi parole chiave" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:112 -msgid "Nutrition" -msgstr "Nutrienti" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:116 -#: .\cookbook\templates\forms\edit_internal_recipe.html:166 -msgid "Delete Step" -msgstr "Elimina Step" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:120 -msgid "Calories" -msgstr "Calorie" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:123 -msgid "Carbohydrates" -msgstr "Carboidrati" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:126 -msgid "Fats" -msgstr "Grassi" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:128 -msgid "Proteins" -msgstr "Proteine" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:150 -#: .\cookbook\templates\forms\edit_internal_recipe.html:504 -msgid "Step" -msgstr "Step" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:171 -msgid "Show as header" -msgstr "Mostra come intestazione" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:177 -msgid "Hide as header" -msgstr "Nascondi come intestazione" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:182 -msgid "Move Up" -msgstr "Sposta Sopra" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:187 -msgid "Move Down" -msgstr "Sposta Sotto" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:196 -msgid "Step Name" -msgstr "Nome dello Step" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:200 -msgid "Step Type" -msgstr "Tipo dello Step" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:213 -msgid "Step time in Minutes" -msgstr "Tempo dello step in minuti" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:229 -#, fuzzy -#| msgid "Select one" -msgid "Select File" -msgstr "Seleziona un elemento" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:230 -#: .\cookbook\templates\forms\edit_internal_recipe.html:252 -#: .\cookbook\templates\forms\edit_internal_recipe.html:313 -#: .\cookbook\templates\forms\edit_internal_recipe.html:337 -#: .\cookbook\templates\shopping_list.html:189 -#: .\cookbook\templates\shopping_list.html:211 -#: .\cookbook\templates\shopping_list.html:241 -#: .\cookbook\templates\shopping_list.html:265 -#: .\cookbook\templates\url_import.html:495 -#: .\cookbook\templates\url_import.html:527 -msgid "Select" -msgstr "Seleziona" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:251 -#, fuzzy -#| msgid "Delete Recipe" -msgid "Select Recipe" -msgstr "Elimina Ricetta" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:311 -#: .\cookbook\templates\shopping_list.html:187 -msgid "Select Unit" -msgstr "Seleziona unità di misura" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:312 -#: .\cookbook\templates\forms\edit_internal_recipe.html:336 -#: .\cookbook\templates\shopping_list.html:188 -#: .\cookbook\templates\shopping_list.html:210 -msgid "Create" -msgstr "Crea" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:335 -#: .\cookbook\templates\shopping_list.html:209 -msgid "Select Food" -msgstr "Seleziona alimento" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:352 -#: .\cookbook\templates\meal_plan.html:256 -#: .\cookbook\templates\url_import.html:542 -msgid "Note" -msgstr "Nota" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:369 -msgid "Delete Ingredient" -msgstr "Elimina Ingredienti" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:375 -msgid "Make Header" -msgstr "Crea Intestazione" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:381 -msgid "Make Ingredient" -msgstr "Crea Ingrediente" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:387 -msgid "Disable Amount" -msgstr "Disabilita Quantità" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:393 -msgid "Enable Amount" -msgstr "Abilita Quantità" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:398 -msgid "Copy Template Reference" -msgstr "Copia riferimento template" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:424 -#: .\cookbook\templates\url_import.html:297 -#: .\cookbook\templates\url_import.html:567 -msgid "Instructions" -msgstr "Istruzioni" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:437 -#: .\cookbook\templates\forms\edit_internal_recipe.html:468 -msgid "Save & View" -msgstr "Salva & Mostra" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:441 -#: .\cookbook\templates\forms\edit_internal_recipe.html:474 -msgid "Add Step" -msgstr "Aggiungi Step" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:444 -#: .\cookbook\templates\forms\edit_internal_recipe.html:478 -msgid "Add Nutrition" -msgstr "Aggiungi nutrienti" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:446 -#: .\cookbook\templates\forms\edit_internal_recipe.html:480 -msgid "Remove Nutrition" -msgstr "Rimuovi nutrienti" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:448 -#: .\cookbook\templates\forms\edit_internal_recipe.html:483 -msgid "View Recipe" -msgstr "Mostra ricetta" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:450 -#: .\cookbook\templates\forms\edit_internal_recipe.html:485 -msgid "Delete Recipe" -msgstr "Elimina Ricetta" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:491 -msgid "Steps" -msgstr "Step" - #: .\cookbook\templates\forms\ingredients.html:15 msgid "Edit Ingredients" msgstr "Modifica Ingredienti" @@ -1162,11 +1280,6 @@ msgstr "" "Unisce due unità di misura o ingredienti e aggiorna tutte le ricette che li " "utilizzano." -#: .\cookbook\templates\forms\ingredients.html:24 -#: .\cookbook\templates\space.html:41 .\cookbook\templates\stats.html:26 -msgid "Units" -msgstr "Unità di misura" - #: .\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?" @@ -1180,29 +1293,46 @@ msgstr "Unisci" 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:18 +#: .\cookbook\templates\generic\delete_template.html:21 #, python-format msgid "Are you sure you want to delete the %(title)s: %(object)s " msgstr "Sei sicuro di volere eliminare %(title)s: %(object)s" -#: .\cookbook\templates\generic\edit_template.html:30 +#: .\cookbook\templates\generic\delete_template.html:26 +msgid "Protected" +msgstr "Protetto" + +#: .\cookbook\templates\generic\delete_template.html:41 +msgid "Cascade" +msgstr "Cascata" + +#: .\cookbook\templates\generic\delete_template.html:72 +msgid "Cancel" +msgstr "Annulla" + +#: .\cookbook\templates\generic\edit_template.html:32 msgid "View" msgstr "Mostra" -#: .\cookbook\templates\generic\edit_template.html:34 +#: .\cookbook\templates\generic\edit_template.html:36 msgid "Delete original file" msgstr "Elimina il file originale" #: .\cookbook\templates\generic\list_template.html:6 -#: .\cookbook\templates\generic\list_template.html:12 +#: .\cookbook\templates\generic\list_template.html:22 msgid "List" msgstr "Elenco" -#: .\cookbook\templates\generic\list_template.html:25 +#: .\cookbook\templates\generic\list_template.html:33 +#: .\cookbook\templates\shopping_list.html:33 +msgid "Try the new shopping list" +msgstr "Prova la nuova lista della spesa" + +#: .\cookbook\templates\generic\list_template.html:45 msgid "Filter" msgstr "Filtro" -#: .\cookbook\templates\generic\list_template.html:30 +#: .\cookbook\templates\generic\list_template.html:50 msgid "Import all" msgstr "Importa tutto" @@ -1228,23 +1358,32 @@ msgstr "Registro di cottura" msgid "Import Recipes" msgstr "Importa Ricette" -#: .\cookbook\templates\include\log_cooking.html:7 +#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 +#: .\cookbook\templates\import_response.html:7 +#: .\cookbook\templates\test.html:14 .\cookbook\templates\test.html:20 +#: .\cookbook\templates\url_import.html:29 +#: .\cookbook\templates\url_import.html:108 +#: .\cookbook\templates\url_import.html:130 +#: .\cookbook\templates\url_import.html:324 +#: .\cookbook\templates\url_import.html:618 .\cookbook\views\delete.py:89 +#: .\cookbook\views\edit.py:200 +msgid "Import" +msgstr "Importa" + +#: .\cookbook\templates\include\log_cooking.html:9 msgid "Log Recipe Cooking" msgstr "Aggiungi al registro delle ricette cucinate" -#: .\cookbook\templates\include\log_cooking.html:13 +#: .\cookbook\templates\include\log_cooking.html:15 msgid "All fields are optional and can be left empty." msgstr "Tutti i campi sono opzionali e possono essere lasciati vuoti." -#: .\cookbook\templates\include\log_cooking.html:19 +#: .\cookbook\templates\include\log_cooking.html:21 msgid "Rating" msgstr "Valutazione" -#: .\cookbook\templates\include\log_cooking.html:27 +#: .\cookbook\templates\include\log_cooking.html:29 #: .\cookbook\templates\include\recipe_open_modal.html:18 -#: .\cookbook\templates\meal_plan.html:283 -#: .\cookbook\templates\meal_plan.html:327 -#: .\cookbook\templates\meal_plan.html:366 msgid "Close" msgstr "Chiudi" @@ -1295,8 +1434,8 @@ msgstr "Ripristina Ricerca" msgid "Last viewed" msgstr "Recenti" -#: .\cookbook\templates\index.html:87 .\cookbook\templates\meal_plan.html:178 -#: .\cookbook\templates\space.html:35 .\cookbook\templates\stats.html:22 +#: .\cookbook\templates\index.html:87 .\cookbook\templates\space.html:37 +#: .\cookbook\templates\stats.html:22 msgid "Recipes" msgstr "Ricette" @@ -1441,7 +1580,7 @@ msgid "" msgstr "" "Le tabelle in markdown sono difficili da creare a mano. Si raccomanda " "l'utilizzo di un editor di come questo." +"markdown_tables\" rel=\"noreferrer noopener\" target=\"_blank\">questo." #: .\cookbook\templates\markdown_info.html:155 #: .\cookbook\templates\markdown_info.html:157 @@ -1460,175 +1599,23 @@ msgstr "Intestazione" msgid "Cell" msgstr "Cella" -#: .\cookbook\templates\meal_plan.html:101 -msgid "New Entry" -msgstr "Nuovo Campo" +#: .\cookbook\templates\meal_plan_entry.html:6 +msgid "Meal Plan View" +msgstr "Mostra il piano alimentare" -#: .\cookbook\templates\meal_plan.html:113 -#: .\cookbook\templates\shopping_list.html:56 -msgid "Search Recipe" -msgstr "Cerca Ricetta" - -#: .\cookbook\templates\meal_plan.html:139 -msgid "Title" -msgstr "Titolo" - -#: .\cookbook\templates\meal_plan.html:141 -msgid "Note (optional)" -msgstr "Nota (opzionale)" - -#: .\cookbook\templates\meal_plan.html:143 -msgid "" -"You can use markdown to format this field. See the docs here" -msgstr "" -"Puoi usare markdown per formattare questo campo. Guarda la documentazione " -"qui" - -#: .\cookbook\templates\meal_plan.html:147 -#: .\cookbook\templates\meal_plan.html:251 -msgid "Serving Count" -msgstr "Numero di porzioni" - -#: .\cookbook\templates\meal_plan.html:153 -msgid "Create only note" -msgstr "Crea solo una nota" - -#: .\cookbook\templates\meal_plan.html:168 -#: .\cookbook\templates\shopping_list.html:7 -#: .\cookbook\templates\shopping_list.html:29 -#: .\cookbook\templates\shopping_list.html:714 -msgid "Shopping List" -msgstr "Lista della spesa" - -#: .\cookbook\templates\meal_plan.html:172 -msgid "Shopping list currently empty" -msgstr "La lista della spesa è vuota" - -#: .\cookbook\templates\meal_plan.html:175 -msgid "Open Shopping List" -msgstr "Apri lista della spesa" - -#: .\cookbook\templates\meal_plan.html:189 -msgid "Plan" -msgstr "Piano" - -#: .\cookbook\templates\meal_plan.html:196 -msgid "Number of Days" -msgstr "Numero di giorni" - -#: .\cookbook\templates\meal_plan.html:206 -msgid "Weekday offset" -msgstr "Correzione giorni feriali" - -#: .\cookbook\templates\meal_plan.html:209 -msgid "" -"Number of days starting from the first day of the week to offset the default " -"view." -msgstr "" -"Numero di giorni a partire dal primo giorno della settimana per correggere " -"la visualizzazione predefinita." - -#: .\cookbook\templates\meal_plan.html:217 -#: .\cookbook\templates\meal_plan.html:294 -msgid "Edit plan types" -msgstr "Modifica i tipi di piano" - -#: .\cookbook\templates\meal_plan.html:219 -msgid "Show help" -msgstr "Mostra aiuto" - -#: .\cookbook\templates\meal_plan.html:220 -msgid "Week iCal export" -msgstr "Esporta iCall settimanale" - -#: .\cookbook\templates\meal_plan.html:264 #: .\cookbook\templates\meal_plan_entry.html:18 msgid "Created by" msgstr "Creato da" -#: .\cookbook\templates\meal_plan.html:270 #: .\cookbook\templates\meal_plan_entry.html:20 -#: .\cookbook\templates\shopping_list.html:254 +#: .\cookbook\templates\shopping_list.html:232 msgid "Shared with" msgstr "Condiviso con" -#: .\cookbook\templates\meal_plan.html:280 -msgid "Add to Shopping" -msgstr "Aggiunti a lista della spesa" - -#: .\cookbook\templates\meal_plan.html:323 -msgid "New meal type" -msgstr "Nuovo tipo di pasto" - -#: .\cookbook\templates\meal_plan.html:338 -msgid "Meal Plan Help" -msgstr "Aiuto per il piano alimentare" - -#: .\cookbook\templates\meal_plan.html:344 -msgid "" -"\n" -"

The meal plan module allows planning of meals " -"both with recipes and notes.

\n" -"

Simply select a recipe from the list of " -"recently viewed recipes or search the one you\n" -" want and drag it to the desired plan " -"position. You can also add a note and a title and\n" -" then drag the recipe to create a plan entry " -"with a custom title and note. Creating only\n" -" Notes is possible by dragging the create " -"note box into the plan.

\n" -"

Click on a recipe in order to open the " -"detailed view. There you can also add it to the\n" -" shopping list. You can also add all recipes " -"of a day to the shopping list by\n" -" clicking the shopping cart at the top of the " -"table.

\n" -"

Since a common use case is to plan meals " -"together you can define\n" -" users you want to share your plan with in " -"the settings.\n" -"

\n" -"

You can also edit the types of meals you want " -"to plan. If you share your plan with\n" -" someone with\n" -" different meals, their meal types will " -"appear in your list as well. To prevent\n" -" duplicates (e.g. Other and Misc.)\n" -" name your meal types the same as the users " -"you share your meals with and they will be\n" -" merged.

\n" -" " -msgstr "" -"\n" -"

Il modulo del piano alimentare consente di pianificare i pasti sia con " -"ricette che con semplici note.

\n" -"

Seleziona una ricetta dalla lista delle ricette recenti o cercane una,\n" -"quindi spostala sulla posizione desiderata. Puoi anche aggiungere una nota e " -"un titolo e\n" -"poi trascinare la ricetta per creare una voce nel piano con un titolo e una " -"nota personalizzata. Si possono anche creare\n" -"delle note trascinando la casella della nota nel piano.

\n" -"

Clicca su una ricetta per aprire la vista dettagliata. Qui potrai anche " -"aggiungerla alla lista della spesa. Puoi anche aggiungere tutte le ricette " -"di un giorno alla lista della spesa, basterà cliccare sul carrello sopra la " -"tabella.

\n" -"

Dato che è comune pianificare i pasti con altre persone, nelle " -"impostazioni puoi scegliere gli utenti con i quali condividere il tuo piano." -"

\n" -"

Puoi anche modificare i tipi di pasto che vuoi pianificare. Se condividi " -"il piano con\n" -"qualcuno\n" -"con pasti differenti, i loro tipi di pasto appariranno anche nella tua " -"lista. Per evitare\n" -"duplicati (es. Altri e Varie)\n" -"dai nomi ai tuoi tipi di pasto uguali ai tuoi utenti in modo che verranno " -"uniti.

" - -#: .\cookbook\templates\meal_plan_entry.html:6 -msgid "Meal Plan View" -msgstr "Mostra il piano alimentare" +#: .\cookbook\templates\meal_plan_entry.html:48 +#: .\cookbook\templates\recipes_table.html:64 +msgid "Last cooked" +msgstr "Cucinato ultimamente" #: .\cookbook\templates\meal_plan_entry.html:50 msgid "Never cooked before." @@ -1664,7 +1651,7 @@ msgid "" "action." msgstr "" "Non hai i permessi necessari per visualizzare questa pagina o completare " -"l'operazione!" +"l'operazione." #: .\cookbook\templates\no_space_info.html:6 #: .\cookbook\templates\no_space_info.html:13 @@ -1703,10 +1690,8 @@ msgstr "" #: .\cookbook\templates\no_space_info.html:48 #: .\cookbook\templates\no_space_info.html:56 -#, fuzzy -#| msgid "Create User" msgid "Create Space" -msgstr "Crea utente" +msgstr "Crea Istanza" #: .\cookbook\templates\no_space_info.html:51 msgid "Create your own recipe space." @@ -1734,29 +1719,28 @@ msgstr "" "offline perché le hai aperte di recente. Ricorda che queste informazioni " "potrebbero non essere aggiornate." -#: .\cookbook\templates\recipe_view.html:21 .\cookbook\templates\space.html:62 -#: .\cookbook\templates\stats.html:47 -msgid "Comments" -msgstr "Commenti" +#: .\cookbook\templates\recipe_view.html:26 +msgid "by" +msgstr "di" -#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:118 -#: .\cookbook\views\edit.py:179 +#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:147 +#: .\cookbook\views\edit.py:180 msgid "Comment" msgstr "Commento" #: .\cookbook\templates\recipes_table.html:19 #: .\cookbook\templates\recipes_table.html:23 -#: .\cookbook\templates\url_import.html:440 +#: .\cookbook\templates\url_import.html:447 msgid "Recipe Image" msgstr "Immagine ricetta" #: .\cookbook\templates\recipes_table.html:51 -#: .\cookbook\templates\url_import.html:445 +#: .\cookbook\templates\url_import.html:452 msgid "Preparation time ca." msgstr "Tempo di preparazione circa" #: .\cookbook\templates\recipes_table.html:57 -#: .\cookbook\templates\url_import.html:450 +#: .\cookbook\templates\url_import.html:457 msgid "Waiting time ca." msgstr "Tempo di cottura circa" @@ -1766,54 +1750,229 @@ msgstr "Esterna" #: .\cookbook\templates\recipes_table.html:86 msgid "Log Cooking" -msgstr "Registo ricette cucinate" +msgstr "Registro ricette cucinate" #: .\cookbook\templates\rest_framework\api.html:5 msgid "Recipe Home" msgstr "Pagina iniziale ricette" -#: .\cookbook\templates\settings.html:25 +#: .\cookbook\templates\search_info.html:5 +#: .\cookbook\templates\search_info.html:9 +#: .\cookbook\templates\settings.html:172 +msgid "Search Settings" +msgstr "Impostazioni di ricerca" + +#: .\cookbook\templates\search_info.html:10 +msgid "" +"\n" +" Creating the best search experience is complicated and weighs " +"heavily on your personal configuration. \n" +" Changing any of the search settings can have significant impact on " +"the speed and quality of the results.\n" +" Search Methods, Trigrams and Full Text Search configurations are " +"only available if you are using Postgres for your database.\n" +" " +msgstr "" +"\n" +" Creare la migliore esperienza di ricerca è complicato e pesa molto " +"sulla tua configurazione. \n" +" Cambiare una delle opzioni di ricerca può avere impatto " +"significativo sulla velocità e qualità dei risultati.\n" +" Metodi di ricerca, Trigrams e ricerca Full Text sono disponibili " +"solo se stati usando un database Postgres.\n" +" " + +#: .\cookbook\templates\search_info.html:19 +msgid "Search Methods" +msgstr "Metodi di ricerca" + +#: .\cookbook\templates\search_info.html:23 +msgid "" +" \n" +" Full text searches attempt to normalize the words provided to " +"match common variants. For example: 'forked', 'forking', 'forks' will all " +"normalize to 'fork'.\n" +" There are several methods available, described below, that will " +"control how the search behavior should react when multiple words are " +"searched.\n" +" Full technical details on how these operate can be viewed on Postgresql's website.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:29 +msgid "" +" \n" +" Simple searches ignore punctuation and common words such as " +"'the', 'a', 'and'. And will treat seperate words as required.\n" +" Searching for 'apple or flour' will return any recipe that " +"includes both 'apple' and 'flour' anywhere in the fields that have been " +"selected for a full text search.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:34 +msgid "" +" \n" +" Phrase searches ignore punctuation, but will search for all of " +"the words in the exact order provided.\n" +" Searching for 'apple or flour' will only return a recipe that " +"includes the exact phrase 'apple or flour' in any of the fields that have " +"been selected for a full text search.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:39 +msgid "" +" \n" +" Web searches simulate functionality found on many web search " +"sites supporting special syntax.\n" +" Placing quotes around several words will convert those words " +"into a phrase.\n" +" 'or' is recongized as searching for the word (or phrase) " +"immediately before 'or' OR the word (or phrase) directly after.\n" +" '-' is recognized as searching for recipes that do not include " +"the word (or phrase) that comes immediately after. \n" +" For example searching for 'apple pie' or cherry -butter will " +"return any recipe that includes the phrase 'apple pie' or the word " +"'cherry' \n" +" in any field included in the full text search but exclude any " +"recipe that has the word 'butter' in any field included.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:48 +msgid "" +" \n" +" Raw search is similar to Web except will take puncuation " +"operators such as '|', '&' and '()'\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:59 +msgid "" +" \n" +" Another approach to searching that also requires Postgresql is " +"fuzzy search or trigram similarity. A trigram is a group of three " +"consecutive characters.\n" +" For example searching for 'apple' will create x trigrams 'app', " +"'ppl', 'ple' and will create a score of how closely words match the " +"generated trigrams.\n" +" One benefit of searching trigams is that a search for 'sandwich' " +"will find mispelled words such as 'sandwhich' that would be missed by other " +"methods.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:69 +msgid "Search Fields" +msgstr "Campi di ricerca" + +#: .\cookbook\templates\search_info.html:73 +msgid "" +" \n" +" Unaccent is a special case in that it enables searching a field " +"'unaccented' for each search style attempting to ignore accented values. \n" +" For example when you enable unaccent for 'Name' any search " +"(starts with, contains, trigram) will attempt the search ignoring accented " +"characters.\n" +" \n" +" For the other options, you can enable search on any or all " +"fields and they will be combined together with an assumed 'OR'.\n" +" For example enabling 'Name' for Starts With, 'Name' and " +"'Description' for Partial Match and 'Ingredients' and 'Keywords' for Full " +"Search\n" +" and searching for 'apple' will generate a search that will " +"return recipes that have:\n" +" - A recipe name that starts with 'apple'\n" +" - OR a recipe name that contains 'apple'\n" +" - OR a recipe description that contains 'apple'\n" +" - OR a recipe that will have a full text search match ('apple' " +"or 'apples') in ingredients\n" +" - OR a recipe that will have a full text search match in " +"Keywords\n" +"\n" +" Combining too many fields in too many types of search can have a " +"negative impact on performance, create duplicate results or return " +"unexpected results.\n" +" For example, enabling fuzzy search or partial matches will " +"interfere with web search methods. \n" +" Searching for 'apple -pie' with fuzzy search and full text " +"search will return the recipe Apple Pie. Though it is not included in the " +"full text results, it does match the trigram results.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:95 +msgid "Search Index" +msgstr "Indice di ricerca" + +#: .\cookbook\templates\search_info.html:99 +msgid "" +" \n" +" Trigram search and Full Text Search both rely on database " +"indexes to perform effectively. \n" +" You can rebuild the indexes on all fields in the Admin page for " +"Recipes and selecting all recipes and running 'rebuild index for selected " +"recipes'\n" +" You can also rebuild indexes at the command line by executing " +"the management command 'python manage.py rebuildindex'\n" +" " +msgstr "" + +#: .\cookbook\templates\settings.html:28 msgid "Account" msgstr "Account" -#: .\cookbook\templates\settings.html:29 +#: .\cookbook\templates\settings.html:35 msgid "Preferences" msgstr "Preferenze" -#: .\cookbook\templates\settings.html:33 +#: .\cookbook\templates\settings.html:42 msgid "API-Settings" msgstr "Impostazioni API" -#: .\cookbook\templates\settings.html:41 +#: .\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:49 +#: .\cookbook\templates\settings.html:73 msgid "Account Settings" msgstr "Impostazioni Account" -#: .\cookbook\templates\settings.html:51 +#: .\cookbook\templates\settings.html:75 msgid "Emails" msgstr "Email" -#: .\cookbook\templates\settings.html:54 +#: .\cookbook\templates\settings.html:78 #: .\cookbook\templates\socialaccount\connections.html:11 msgid "Social" msgstr "Social" -#: .\cookbook\templates\settings.html:66 +#: .\cookbook\templates\settings.html:91 msgid "Language" msgstr "Lingua" -#: .\cookbook\templates\settings.html:96 +#: .\cookbook\templates\settings.html:121 msgid "Style" msgstr "Stile" -#: .\cookbook\templates\settings.html:116 +#: .\cookbook\templates\settings.html:142 msgid "API Token" msgstr "Token API" -#: .\cookbook\templates\settings.html:117 +#: .\cookbook\templates\settings.html:143 msgid "" "You can use both basic authentication and token based authentication to " "access the REST API." @@ -1821,7 +1980,7 @@ msgstr "" "Per accedere alle API REST puoi usare sia l'autenticazione base sia quella " "tramite token." -#: .\cookbook\templates\settings.html:134 +#: .\cookbook\templates\settings.html:160 msgid "" "Use the token as an Authorization header prefixed by the word token as shown " "in the following examples:" @@ -1829,13 +1988,80 @@ msgstr "" "Usa il token come header Authorization preceduto dalla parola Token come " "negli esempi seguenti:" -#: .\cookbook\templates\settings.html:136 +#: .\cookbook\templates\settings.html:162 msgid "or" msgstr "o" +#: .\cookbook\templates\settings.html:173 +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 +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 "" +"Normalmente non c'è bisogno di configurare queste voci e puoi " +"continuare a usare le impostazioni predefinite oppure scegliere una delle " +"seguenti modalità." + +#: .\cookbook\templates\settings.html:175 +msgid "" +"If you do want to configure the search you can read about the different " +"options here." +msgstr "" +"Se vuoi comunque configurare la ricerca, puoi informarti riguardo le opzioni " +"disponibili qui." + +#: .\cookbook\templates\settings.html:180 +msgid "Fuzzy" +msgstr "Fuzzy" + +#: .\cookbook\templates\settings.html:181 +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 "" +"Cerca quello che ti serve anche se la ricerca o la ricetta contengono " +"errori. Potrebbe mostrare più risultati di quelli necessari per mostrarti " +"quello che stai cercando." + +#: .\cookbook\templates\settings.html:182 +msgid "This is the default behavior" +msgstr "È il comportamento predefinito" + +#: .\cookbook\templates\settings.html:183 +#: .\cookbook\templates\settings.html:191 +msgid "Apply" +msgstr "Applica" + +#: .\cookbook\templates\settings.html:188 +msgid "Precise" +msgstr "Preciso" + +#: .\cookbook\templates\settings.html:189 +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 +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" + #: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5 msgid "Cookbook Setup" -msgstr "Configurazione del ricettario" +msgstr "Configurazione Recipes" #: .\cookbook\templates\setup.html:14 msgid "Setup" @@ -1851,50 +2077,73 @@ msgstr "" msgid "Create Superuser account" msgstr "Crea super utente" -#: .\cookbook\templates\shopping_list.html:79 +#: .\cookbook\templates\shopping_list.html:8 +#: .\cookbook\templates\shopping_list.html:29 +#: .\cookbook\templates\shopping_list.html:663 +msgid "Shopping List" +msgstr "Lista della spesa" + +#: .\cookbook\templates\shopping_list.html:55 +msgid "Search Recipe" +msgstr "Cerca Ricetta" + +#: .\cookbook\templates\shopping_list.html:72 msgid "Shopping Recipes" msgstr "Ricette per la spesa" -#: .\cookbook\templates\shopping_list.html:83 +#: .\cookbook\templates\shopping_list.html:74 msgid "No recipes selected" msgstr "Nessuna ricetta selezionata" -#: .\cookbook\templates\shopping_list.html:150 +#: .\cookbook\templates\shopping_list.html:131 msgid "Entry Mode" msgstr "Modalità di inserimento" -#: .\cookbook\templates\shopping_list.html:158 +#: .\cookbook\templates\shopping_list.html:139 msgid "Add Entry" msgstr "Aggiungi voce" -#: .\cookbook\templates\shopping_list.html:174 +#: .\cookbook\templates\shopping_list.html:152 msgid "Amount" msgstr "Quantità" -#: .\cookbook\templates\shopping_list.html:240 +#: .\cookbook\templates\shopping_list.html:164 +msgid "Select Unit" +msgstr "Seleziona unità di misura" + +#: .\cookbook\templates\shopping_list.html:166 +#: .\cookbook\templates\shopping_list.html:189 +#: .\cookbook\templates\shopping_list.html:219 +#: .\cookbook\templates\shopping_list.html:243 +#: .\cookbook\templates\url_import.html:505 +#: .\cookbook\templates\url_import.html:537 +msgid "Select" +msgstr "Seleziona" + +#: .\cookbook\templates\shopping_list.html:187 +msgid "Select Food" +msgstr "Seleziona alimento" + +#: .\cookbook\templates\shopping_list.html:218 msgid "Select Supermarket" msgstr "Seleziona supermercato" -#: .\cookbook\templates\shopping_list.html:264 +#: .\cookbook\templates\shopping_list.html:242 msgid "Select User" msgstr "Seleziona utente" -#: .\cookbook\templates\shopping_list.html:283 +#: .\cookbook\templates\shopping_list.html:258 msgid "Finished" msgstr "Completato" -#: .\cookbook\templates\shopping_list.html:296 +#: .\cookbook\templates\shopping_list.html:267 msgid "You are offline, shopping list might not syncronize." msgstr "Sei offline: la lista della spesa potrebbe non sincronizzarsi." -#: .\cookbook\templates\shopping_list.html:361 +#: .\cookbook\templates\shopping_list.html:318 msgid "Copy/Export" msgstr "Copia/Esporta" -#: .\cookbook\templates\shopping_list.html:365 -msgid "List Prefix" -msgstr "Prefisso lista" - #: .\cookbook\templates\socialaccount\connections.html:4 #: .\cookbook\templates\socialaccount\connections.html:15 msgid "Account Connections" @@ -1917,10 +2166,8 @@ msgid "Add a 3rd Party Account" msgstr "Aggiungi un account di terze parti" #: .\cookbook\templates\socialaccount\signup.html:5 -#, fuzzy -#| msgid "Sign In" msgid "Signup" -msgstr "Accedi" +msgstr "Iscriviti" #: .\cookbook\templates\socialaccount\signup.html:10 #, python-format @@ -1930,7 +2177,7 @@ msgid "" " %(site_name)s. As a final step, please complete the following form:" msgstr "" "Stai per usare il tuo:\n" -" Account %(provider_name)s per fare l'accesso a\n" +" account %(provider_name)s per fare l'accesso a\n" " %(site_name)s. Per finire, completa il modulo qui sotto:" #: .\cookbook\templates\socialaccount\snippets\provider_list.html:23 @@ -1947,99 +2194,83 @@ msgstr "" #: .\cookbook\templates\socialaccount\snippets\provider_list.html:111 #: .\cookbook\templates\socialaccount\snippets\provider_list.html:119 #: .\cookbook\templates\socialaccount\snippets\provider_list.html:127 -#, fuzzy -#| msgid "Sign In" msgid "Sign in using" -msgstr "Accedi" +msgstr "Accedi usando" -#: .\cookbook\templates\space.html:23 +#: .\cookbook\templates\space.html:25 msgid "Space:" msgstr "Istanza:" -#: .\cookbook\templates\space.html:24 -#, fuzzy -#| msgid "Description" +#: .\cookbook\templates\space.html:26 msgid "Manage Subscription" -msgstr "Descrizione" +msgstr "Gestisci iscrizione" -#: .\cookbook\templates\space.html:32 .\cookbook\templates\stats.html:19 +#: .\cookbook\templates\space.html:34 .\cookbook\templates\stats.html:19 msgid "Number of objects" msgstr "Numero di oggetti" -#: .\cookbook\templates\space.html:45 .\cookbook\templates\stats.html:30 +#: .\cookbook\templates\space.html:54 .\cookbook\templates\stats.html:30 msgid "Recipe Imports" msgstr "Ricette importate" -#: .\cookbook\templates\space.html:53 .\cookbook\templates\stats.html:38 +#: .\cookbook\templates\space.html:62 .\cookbook\templates\stats.html:38 msgid "Objects stats" msgstr "Statistiche degli oggetti" -#: .\cookbook\templates\space.html:56 .\cookbook\templates\stats.html:41 +#: .\cookbook\templates\space.html:65 .\cookbook\templates\stats.html:41 msgid "Recipes without Keywords" msgstr "Ricette senza parole chiave" -#: .\cookbook\templates\space.html:58 .\cookbook\templates\stats.html:43 -msgid "External Recipes" -msgstr "Ricette esterne" - -#: .\cookbook\templates\space.html:60 .\cookbook\templates\stats.html:45 +#: .\cookbook\templates\space.html:73 .\cookbook\templates\stats.html:45 msgid "Internal Recipes" msgstr "Ricette interne" -#: .\cookbook\templates\space.html:73 +#: .\cookbook\templates\space.html:89 msgid "Members" msgstr "Membri" -#: .\cookbook\templates\space.html:77 -#, fuzzy -#| msgid "Invite Links" +#: .\cookbook\templates\space.html:95 msgid "Invite User" -msgstr "Link di invito" +msgstr "Invita utente" -#: .\cookbook\templates\space.html:88 +#: .\cookbook\templates\space.html:107 msgid "User" msgstr "Utente" -#: .\cookbook\templates\space.html:89 +#: .\cookbook\templates\space.html:108 msgid "Groups" msgstr "Gruppi" -#: .\cookbook\templates\space.html:105 -#, fuzzy -#| msgid "Admin" +#: .\cookbook\templates\space.html:119 msgid "admin" -msgstr "Amministratore" +msgstr "admin" -#: .\cookbook\templates\space.html:106 +#: .\cookbook\templates\space.html:120 msgid "user" msgstr "utente" -#: .\cookbook\templates\space.html:107 +#: .\cookbook\templates\space.html:121 msgid "guest" msgstr "ospite" -#: .\cookbook\templates\space.html:108 -#, fuzzy -#| msgid "Remove" +#: .\cookbook\templates\space.html:122 msgid "remove" -msgstr "Rimuovi" +msgstr "rimuovi" -#: .\cookbook\templates\space.html:112 +#: .\cookbook\templates\space.html:126 msgid "Update" msgstr "Aggiorna" -#: .\cookbook\templates\space.html:116 -#, fuzzy -#| msgid "You cannot edit this storage!" +#: .\cookbook\templates\space.html:130 msgid "You cannot edit yourself." -msgstr "Non puoi modificare questo backend!" +msgstr "Non puoi modificare te stesso." -#: .\cookbook\templates\space.html:123 +#: .\cookbook\templates\space.html:136 msgid "There are no members in your space yet!" msgstr "Non ci sono ancora ricette in questa istanza!" -#: .\cookbook\templates\space.html:130 .\cookbook\templates\system.html:21 -#: .\cookbook\views\lists.py:115 +#: .\cookbook\templates\space.html:143 .\cookbook\templates\system.html:21 +#: .\cookbook\views\lists.py:85 msgid "Invite Links" msgstr "Link di invito" @@ -2047,6 +2278,10 @@ msgstr "Link di invito" msgid "Stats" msgstr "Statistiche" +#: .\cookbook\templates\stats.html:10 +msgid "Statistics" +msgstr "Statistiche" + #: .\cookbook\templates\system.html:22 msgid "Show Links" msgstr "Mostra link" @@ -2168,145 +2403,170 @@ msgstr "" "raccomandato perché alcune\n" "funzionalità sono disponibili solo con un database Posgres." -#: .\cookbook\templates\url_import.html:6 +#: .\cookbook\templates\url_import.html:8 msgid "URL Import" msgstr "Importa da URL" -#: .\cookbook\templates\url_import.html:31 +#: .\cookbook\templates\url_import.html:33 msgid "Drag me to your bookmarks to import recipes from anywhere" msgstr "Spostami nei tuoi segnalibri per importare facilmente le ricette" -#: .\cookbook\templates\url_import.html:32 +#: .\cookbook\templates\url_import.html:34 msgid "Bookmark Me!" msgstr "Salvami nei preferiti!" -#: .\cookbook\templates\url_import.html:61 +#: .\cookbook\templates\url_import.html:38 +msgid "URL" +msgstr "URL" + +#: .\cookbook\templates\url_import.html:40 +msgid "App" +msgstr "App" + +#: .\cookbook\templates\url_import.html:64 msgid "Enter website URL" msgstr "Inserisci l'indirizzo del sito web" -#: .\cookbook\templates\url_import.html:97 +#: .\cookbook\templates\url_import.html:104 msgid "Select recipe files to import or drop them here..." msgstr "Seleziona i file delle ricette da importare o spostarli qui..." -#: .\cookbook\templates\url_import.html:118 +#: .\cookbook\templates\url_import.html:125 msgid "Paste json or html source here to load recipe." msgstr "Incolla qui il codice html o json per caricare una ricetta." -#: .\cookbook\templates\url_import.html:146 -#, fuzzy -#| msgid "View Recipe" +#: .\cookbook\templates\url_import.html:153 msgid "Preview Recipe Data" -msgstr "Mostra ricetta" +msgstr "Anteprima dati della ricetta" -#: .\cookbook\templates\url_import.html:147 +#: .\cookbook\templates\url_import.html:154 msgid "Drag recipe attributes from the right into the appropriate box below." -msgstr "" +msgstr "Trascina gli attributi della ricetta da destra nella casella in basso." -#: .\cookbook\templates\url_import.html:156 -#: .\cookbook\templates\url_import.html:173 -#: .\cookbook\templates\url_import.html:190 -#: .\cookbook\templates\url_import.html:209 -#: .\cookbook\templates\url_import.html:227 -#: .\cookbook\templates\url_import.html:242 -#: .\cookbook\templates\url_import.html:257 -#: .\cookbook\templates\url_import.html:273 -#: .\cookbook\templates\url_import.html:300 -#: .\cookbook\templates\url_import.html:351 +#: .\cookbook\templates\url_import.html:163 +#: .\cookbook\templates\url_import.html:180 +#: .\cookbook\templates\url_import.html:197 +#: .\cookbook\templates\url_import.html:216 +#: .\cookbook\templates\url_import.html:234 +#: .\cookbook\templates\url_import.html:249 +#: .\cookbook\templates\url_import.html:264 +#: .\cookbook\templates\url_import.html:280 +#: .\cookbook\templates\url_import.html:307 +#: .\cookbook\templates\url_import.html:358 msgid "Clear Contents" msgstr "Cancella il contenuto" -#: .\cookbook\templates\url_import.html:158 +#: .\cookbook\templates\url_import.html:165 msgid "Text dragged here will be appended to the name." -msgstr "" +msgstr "Il testo trascinato qui sarà aggiunto al nome." -#: .\cookbook\templates\url_import.html:175 +#: .\cookbook\templates\url_import.html:178 +msgid "Description" +msgstr "Descrizione" + +#: .\cookbook\templates\url_import.html:182 msgid "Text dragged here will be appended to the description." -msgstr "" +msgstr "Il testo trascinato qui sarà aggiunto alla descrizione." -#: .\cookbook\templates\url_import.html:192 +#: .\cookbook\templates\url_import.html:199 msgid "Keywords dragged here will be appended to current list" -msgstr "" +msgstr "Le parole chiave trascinate qui saranno aggiunte alla lista corrente" -#: .\cookbook\templates\url_import.html:207 +#: .\cookbook\templates\url_import.html:214 msgid "Image" msgstr "Immagine" -#: .\cookbook\templates\url_import.html:239 +#: .\cookbook\templates\url_import.html:246 msgid "Prep Time" msgstr "Tempo di preparazione" -#: .\cookbook\templates\url_import.html:254 +#: .\cookbook\templates\url_import.html:261 msgid "Cook Time" msgstr "Tempo di cottura" -#: .\cookbook\templates\url_import.html:275 +#: .\cookbook\templates\url_import.html:282 msgid "Ingredients dragged here will be appended to current list." -msgstr "" +msgstr "Gli ingredienti trascinati qui saranno aggiunti alla lista corrente." -#: .\cookbook\templates\url_import.html:302 +#: .\cookbook\templates\url_import.html:304 +#: .\cookbook\templates\url_import.html:579 +msgid "Instructions" +msgstr "Istruzioni" + +#: .\cookbook\templates\url_import.html:309 msgid "" "Recipe instructions dragged here will be appended to current instructions." msgstr "" +"Le istruzioni per la ricetta trascinate qui saranno aggiunte alle istruzioni " +"correnti." -#: .\cookbook\templates\url_import.html:325 -#, fuzzy -#| msgid "Discovered Recipes" +#: .\cookbook\templates\url_import.html:332 msgid "Discovered Attributes" -msgstr "Ricette trovate" +msgstr "Attributi trovati" -#: .\cookbook\templates\url_import.html:327 +#: .\cookbook\templates\url_import.html:334 msgid "" "Drag recipe attributes from below into the appropriate box on the left. " "Click any node to display its full properties." msgstr "" +"Trascina gli attributi delle ricette dal basso nella casella sulla sinistra. " +"Clicca su qualsiasi nodo per mostrare le sue proprietà complete." -#: .\cookbook\templates\url_import.html:344 +#: .\cookbook\templates\url_import.html:351 msgid "Show Blank Field" msgstr "Mostra campo vuoto" -#: .\cookbook\templates\url_import.html:349 +#: .\cookbook\templates\url_import.html:356 msgid "Blank Field" msgstr "Campo vuoto" -#: .\cookbook\templates\url_import.html:353 +#: .\cookbook\templates\url_import.html:360 msgid "Items dragged to Blank Field will be appended." -msgstr "" +msgstr "Gli elementi trascinati nel campo vuoto saranno ignorati." -#: .\cookbook\templates\url_import.html:400 +#: .\cookbook\templates\url_import.html:407 msgid "Delete Text" msgstr "Elimina testo" -#: .\cookbook\templates\url_import.html:413 +#: .\cookbook\templates\url_import.html:420 msgid "Delete image" msgstr "Elimina immagine" -#: .\cookbook\templates\url_import.html:429 +#: .\cookbook\templates\url_import.html:436 msgid "Recipe Name" msgstr "Nome Ricetta" -#: .\cookbook\templates\url_import.html:433 +#: .\cookbook\templates\url_import.html:440 msgid "Recipe Description" msgstr "Descrizione ricetta" -#: .\cookbook\templates\url_import.html:494 -#: .\cookbook\templates\url_import.html:526 -#: .\cookbook\templates\url_import.html:582 +#: .\cookbook\templates\url_import.html:504 +#: .\cookbook\templates\url_import.html:536 +#: .\cookbook\templates\url_import.html:596 msgid "Select one" msgstr "Seleziona un elemento" -#: .\cookbook\templates\url_import.html:596 +#: .\cookbook\templates\url_import.html:554 +msgid "Note" +msgstr "Nota" + +#: .\cookbook\templates\url_import.html:597 +msgid "Add Keyword" +msgstr "Aggiungi parole chiave" + +#: .\cookbook\templates\url_import.html:610 msgid "All Keywords" msgstr "Tutte le parole chiave" -#: .\cookbook\templates\url_import.html:599 +#: .\cookbook\templates\url_import.html:613 msgid "Import all keywords, not only the ones already existing." msgstr "Importa tutte le parole chiave, non solo quelle che già esistono." -#: .\cookbook\templates\url_import.html:626 +#: .\cookbook\templates\url_import.html:640 msgid "Information" msgstr "Informazioni" -#: .\cookbook\templates\url_import.html:628 +#: .\cookbook\templates\url_import.html:642 msgid "" " Only websites containing ld+json or microdata information can currently\n" " be imported. Most big recipe pages " @@ -2316,55 +2576,201 @@ msgid "" "data feel free to post an example in the\n" " github issues." msgstr "" -"Possono essere importati solo i siti che contengono informazioni Id+json o " +" Possono essere importati solo i siti che contengono informazioni Id+json o " "microdata.\n" -"I maggiori siti di ricette di solito sono supportati.\n" -"Se questo sito non può essere importato ma credi che abbia una qualche tipo " -"di struttura dati, puoi inviare un esempio nella sezione Issues su GitHub." +" I maggiori siti di ricette di solito " +"sono supportati. Se questo sito non può essere importato ma \n" +" credi che abbia una qualche tipo di " +"struttura dati, puoi inviare un esempio nella sezione Issues \n" +" su GitHub." -#: .\cookbook\templates\url_import.html:636 +#: .\cookbook\templates\url_import.html:650 msgid "Google ld+json Info" msgstr "Info Google Id+json" -#: .\cookbook\templates\url_import.html:639 +#: .\cookbook\templates\url_import.html:653 msgid "GitHub Issues" msgstr "Issues (Problemi aperti) su GitHub" -#: .\cookbook\templates\url_import.html:641 +#: .\cookbook\templates\url_import.html:655 msgid "Recipe Markup Specification" msgstr "Specifica di Markup della ricetta" -#: .\cookbook\views\api.py:79 +#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:170 msgid "Parameter updated_at incorrectly formatted" msgstr "Il parametro updated_at non è formattato correttamente" -#: .\cookbook\views\api.py:580 .\cookbook\views\views.py:303 -msgid "This feature is not available in the demo version!" -msgstr "Questa funzione non è disponibile nella versione demo!" +#: .\cookbook\views\api.py:190 .\cookbook\views\api.py:291 +#, python-brace-format +msgid "No {self.basename} with id {pk} exists" +msgstr "Non esiste nessun {self.basename} con id {pk}" -#: .\cookbook\views\api.py:603 +#: .\cookbook\views\api.py:194 +msgid "Cannot merge with the same object!" +msgstr "Non è possibile unirlo con lo stesso oggetto!" + +#: .\cookbook\views\api.py:201 +#, python-brace-format +msgid "No {self.basename} with id {target} exists" +msgstr "Non esiste nessun {self.basename} con id {target}" + +#: .\cookbook\views\api.py:206 +msgid "Cannot merge with child object!" +msgstr "Non è possibile unirlo con un oggetto secondario!" + +#: .\cookbook\views\api.py:239 +#, 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:244 +#, 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:300 +#, 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:303 .\cookbook\views\api.py:321 +msgid "An error occurred attempting to move " +msgstr "Si è verificato un errore durante lo spostamento " + +#: .\cookbook\views\api.py:306 +msgid "Cannot move an object to itself!" +msgstr "Non è possibile muovere un oggetto a sé stesso!" + +#: .\cookbook\views\api.py:312 +#, python-brace-format +msgid "No {self.basename} with id {parent} exists" +msgstr "Non esiste nessun {self.basename} con id {parent}" + +#: .\cookbook\views\api.py:318 +#, 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:470 +#, python-brace-format +msgid "{obj.name} was removed from the shopping list." +msgstr "" + +#: .\cookbook\views\api.py:475 .\cookbook\views\api.py:726 +#, python-brace-format +msgid "{obj.name} was added to the shopping list." +msgstr "" + +#: .\cookbook\views\api.py:587 +msgid "ID of recipe a step is part of. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:588 +msgid "Query string matched (fuzzy) against object name." +msgstr "" + +#: .\cookbook\views\api.py:631 +msgid "" +"Query string matched (fuzzy) against recipe name. In the future also " +"fulltext search." +msgstr "" + +#: .\cookbook\views\api.py:632 +msgid "ID of keyword a recipe should have. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:633 +msgid "ID of food a recipe should have. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:634 +msgid "ID of unit a recipe should have." +msgstr "" + +#: .\cookbook\views\api.py:635 +msgid "Rating a recipe should have. [0 - 5]" +msgstr "" + +#: .\cookbook\views\api.py:636 +msgid "ID of book a recipe should be in. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:637 +msgid "" +"If recipe should have all (AND=false) or any (OR=true) of the " +"provided keywords." +msgstr "" + +#: .\cookbook\views\api.py:638 +msgid "" +"If recipe should have all (AND=false) or any (OR=true) of the " +"provided foods." +msgstr "" + +#: .\cookbook\views\api.py:639 +msgid "" +"If recipe should be in all (AND=false) or any (OR=true) of the " +"provided books." +msgstr "" + +#: .\cookbook\views\api.py:640 +msgid "If only internal recipes should be returned. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:641 +msgid "Returns the results in randomized order. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:642 +msgid "Returns new results first in search results. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:768 +msgid "" +"Returns the shopping list entry with a primary key of id. Multiple values " +"allowed." +msgstr "" + +#: .\cookbook\views\api.py:771 +msgid "" +"Filter shopping list entries on checked. [true, false, both, recent]
- recent includes unchecked items and recently completed items." +msgstr "" + +#: .\cookbook\views\api.py:773 +msgid "Returns the shopping list entries sorted by supermarket category order." +msgstr "" + +#: .\cookbook\views\api.py:922 .\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 "" +"Questa funzione non è ancora disponibile nella versione hostata di Tandor!" + +#: .\cookbook\views\api.py:944 msgid "Sync successful!" msgstr "Sincronizzazione completata con successo!" -#: .\cookbook\views\api.py:608 +#: .\cookbook\views\api.py:949 msgid "Error synchronizing with Storage" msgstr "Errore di sincronizzazione con questo backend" -#: .\cookbook\views\api.py:686 +#: .\cookbook\views\api.py:1028 msgid "Nothing to do." msgstr "Nulla da fare." -#: .\cookbook\views\api.py:701 +#: .\cookbook\views\api.py:1043 msgid "The requested site provided malformed data and cannot be read." msgstr "" "Il sito richiesto ha fornito dati in formato non corretto e non può essere " "letto." -#: .\cookbook\views\api.py:708 +#: .\cookbook\views\api.py:1050 msgid "The requested page could not be found." msgstr "La pagina richiesta non è stata trovata." -#: .\cookbook\views\api.py:717 +#: .\cookbook\views\api.py:1068 msgid "" "The requested site does not provide any recognized data format to import the " "recipe from." @@ -2372,29 +2778,31 @@ msgstr "" "Il sito richiesto non fornisce un formato di dati riconosciuto da cui " "importare la ricetta." -#: .\cookbook\views\api.py:731 -#, fuzzy -#| msgid "The requested page could not be found." -msgid "No useable data could be found." -msgstr "La pagina richiesta non è stata trovata." +#: .\cookbook\views\api.py:1082 +msgid "Connection Refused." +msgstr "" -#: .\cookbook\views\api.py:747 +#: .\cookbook\views\api.py:1091 +msgid "No useable data could be found." +msgstr "Nessuna informazione utilizzabile è stata trovata." + +#: .\cookbook\views\api.py:1107 msgid "I couldn't find anything to do." msgstr "Non è stato trovato nulla da fare." -#: .\cookbook\views\data.py:31 .\cookbook\views\data.py:122 -#: .\cookbook\views\edit.py:50 .\cookbook\views\import_export.py:67 -#: .\cookbook\views\new.py:32 +#: .\cookbook\views\data.py:34 .\cookbook\views\data.py:129 +#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:80 +#: .\cookbook\views\new.py:33 msgid "You have reached the maximum number of recipes for your space." msgstr "Hai raggiunto il numero massimo di ricette nella tua istanza." -#: .\cookbook\views\data.py:35 .\cookbook\views\data.py:126 -#: .\cookbook\views\edit.py:54 .\cookbook\views\import_export.py:71 -#: .\cookbook\views\new.py:36 +#: .\cookbook\views\data.py:38 .\cookbook\views\data.py:133 +#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:84 +#: .\cookbook\views\new.py:37 msgid "You have more users than allowed in your space." msgstr "Hai più utenti di quanti permessi nella tua istanza." -#: .\cookbook\views\data.py:104 +#: .\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." @@ -2402,168 +2810,199 @@ msgstr[0] "Modifica di massa completata. %(count)d ricetta è stata aggiornata." msgstr[1] "" "Modifica in blocco completata. %(count)d ricette sono state aggiornate." -#: .\cookbook\views\delete.py:72 +#: .\cookbook\views\delete.py:101 msgid "Monitor" msgstr "Monitoraggio" -#: .\cookbook\views\delete.py:96 .\cookbook\views\lists.py:102 -#: .\cookbook\views\new.py:98 +#: .\cookbook\views\delete.py:125 .\cookbook\views\lists.py:71 +#: .\cookbook\views\new.py:101 msgid "Storage Backend" msgstr "Backend di archiviazione" -#: .\cookbook\views\delete.py:106 +#: .\cookbook\views\delete.py:135 msgid "" "Could not delete this storage backend as it is used in at least one monitor." msgstr "" "Non è possibile eliminare questo backend di archiviazione perchè è usato in " "almeno un monitoraggio." -#: .\cookbook\views\delete.py:129 .\cookbook\views\edit.py:213 -#: .\cookbook\views\new.py:156 +#: .\cookbook\views\delete.py:158 msgid "Recipe Book" msgstr "Libro delle ricette" -#: .\cookbook\views\delete.py:141 +#: .\cookbook\views\delete.py:170 msgid "Bookmarks" msgstr "Preferiti" -#: .\cookbook\views\delete.py:163 .\cookbook\views\new.py:252 +#: .\cookbook\views\delete.py:192 .\cookbook\views\new.py:238 msgid "Invite Link" msgstr "Link di invito" -#: .\cookbook\views\edit.py:119 -msgid "Food" -msgstr "Alimento" - -#: .\cookbook\views\edit.py:128 +#: .\cookbook\views\edit.py:125 msgid "You cannot edit this storage!" msgstr "Non puoi modificare questo backend!" -#: .\cookbook\views\edit.py:148 +#: .\cookbook\views\edit.py:149 msgid "Storage saved!" msgstr "Backend salvato!" -#: .\cookbook\views\edit.py:154 +#: .\cookbook\views\edit.py:155 msgid "There was an error updating this storage backend!" msgstr "" "Si è verificato un errore durante l'aggiornamento di questo backend di " "archiviazione!" -#: .\cookbook\views\edit.py:165 -msgid "Storage" -msgstr "Archiviazione" - -#: .\cookbook\views\edit.py:261 +#: .\cookbook\views\edit.py:248 msgid "Changes saved!" msgstr "Modifiche salvate!" -#: .\cookbook\views\edit.py:265 +#: .\cookbook\views\edit.py:252 msgid "Error saving changes!" msgstr "Si è verificato un errore durante il salvataggio delle modifiche!" -#: .\cookbook\views\edit.py:299 -msgid "Units merged!" -msgstr "Le unità sono state unite!" - -#: .\cookbook\views\edit.py:301 .\cookbook\views\edit.py:317 -msgid "Cannot merge with the same object!" -msgstr "Non è possibile unirlo con lo stesso oggetto!" - -#: .\cookbook\views\edit.py:315 -msgid "Foods merged!" -msgstr "Gli alimenti sono stati uniti!" - -#: .\cookbook\views\import_export.py:93 +#: .\cookbook\views\import_export.py:106 msgid "Importing is not implemented for this provider" msgstr "Questo provider non permette l'importazione" -#: .\cookbook\views\import_export.py:115 +#: .\cookbook\views\import_export.py:127 +msgid "" +"The PDF Exporter is not enabled on this instance as it is still in an " +"experimental state." +msgstr "" + +#: .\cookbook\views\import_export.py:132 msgid "Exporting is not implemented for this provider" msgstr "Questo provider non permette l'esportazione" -#: .\cookbook\views\lists.py:40 +#: .\cookbook\views\lists.py:25 msgid "Import Log" msgstr "Registro importazioni" -#: .\cookbook\views\lists.py:53 +#: .\cookbook\views\lists.py:38 msgid "Discovery" msgstr "Trovate" -#: .\cookbook\views\lists.py:85 +#: .\cookbook\views\lists.py:54 msgid "Shopping Lists" msgstr "Liste della spesa" -#: .\cookbook\views\new.py:123 +#: .\cookbook\views\lists.py:148 +msgid "Supermarkets" +msgstr "Supermercati" + +#: .\cookbook\views\lists.py:164 +msgid "Shopping Categories" +msgstr "Categorie della spesa" + +#: .\cookbook\views\lists.py:217 +msgid "Steps" +msgstr "Step" + +#: .\cookbook\views\lists.py:232 +msgid "New Shopping List" +msgstr "Nuova lista della spesa" + +#: .\cookbook\views\new.py:126 msgid "Imported new recipe!" msgstr "La nuova ricetta è stata importata!" -#: .\cookbook\views\new.py:126 +#: .\cookbook\views\new.py:129 msgid "There was an error importing this recipe!" msgstr "Si è verificato un errore durante l'importazione di questa ricetta!" -#: .\cookbook\views\new.py:226 +#: .\cookbook\views\new.py:212 msgid "Hello" -msgstr "" +msgstr "Ciao" -#: .\cookbook\views\new.py:226 +#: .\cookbook\views\new.py:212 msgid "You have been invited by " -msgstr "" +msgstr "Sei stato invitato da " -#: .\cookbook\views\new.py:227 +#: .\cookbook\views\new.py:213 msgid " to join their Tandoor Recipes space " -msgstr "" +msgstr " per entrare nella sua istanza di Tandoor Recipes " -#: .\cookbook\views\new.py:228 +#: .\cookbook\views\new.py:214 msgid "Click the following link to activate your account: " -msgstr "" +msgstr "Clicca il link qui di seguito per attivare il tuo account: " -#: .\cookbook\views\new.py:229 +#: .\cookbook\views\new.py:215 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\views\new.py:230 +#: .\cookbook\views\new.py:216 msgid "The invitation is valid until " -msgstr "" +msgstr "L'invito è valido fino al " -#: .\cookbook\views\new.py:231 +#: .\cookbook\views\new.py:217 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\views\new.py:234 +#: .\cookbook\views\new.py:220 msgid "Tandoor Recipes Invite" -msgstr "" +msgstr "Invito per Tandoor Recipes" -#: .\cookbook\views\new.py:241 +#: .\cookbook\views\new.py:227 msgid "Invite link successfully send to user." -msgstr "" +msgstr "Link di invito inviato con successo all'utente." -#: .\cookbook\views\new.py:244 +#: .\cookbook\views\new.py:230 msgid "" "You have send to many emails, please share the link manually or wait a few " "hours." msgstr "" +"Hai mandato troppe email, condividi il link manualmente o aspetta qualche " +"ora." -#: .\cookbook\views\new.py:246 +#: .\cookbook\views\new.py:232 msgid "Email to user could not be send, please share link manually." msgstr "" +"Non è stato possibile inviare l'email all'utente, condividi il link " +"manualmente." -#: .\cookbook\views\views.py:129 +#: .\cookbook\views\views.py:126 msgid "" "You have successfully created your own recipe space. Start by adding some " "recipes or invite other people to join you." 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:177 +#: .\cookbook\views\views.py:174 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:188 +#: .\cookbook\views\views.py:185 msgid "Comment saved!" msgstr "Commento salvato!" -#: .\cookbook\views\views.py:395 +#: .\cookbook\views\views.py:276 +msgid "This feature is not available in the demo version!" +msgstr "Questa funzione non è disponibile nella versione demo!" + +#: .\cookbook\views\views.py:335 +msgid "You must select at least one field to search!" +msgstr "Devi selezionare almeno un campo da cercare!" + +#: .\cookbook\views\views.py:340 +msgid "" +"To use this search method you must select at least one full text search " +"field!" +msgstr "" +"Per utilizzare questo metodo di ricerca devi selezionare almeno un campo di " +"ricerca full text!" + +#: .\cookbook\views\views.py:344 +msgid "Fuzzy search is not compatible with this search method!" +msgstr "La ricerca Fuzzy non è compatibile con questo metodo di ricerca!" + +#: .\cookbook\views\views.py:470 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 " @@ -2571,45 +3010,319 @@ msgid "" msgstr "" "La pagina di configurazione può essere usata solo per creare il primo " "utente! Se hai dimenticato le credenziali del tuo super utente controlla la " -"documentazione di Django per resettare le password. " +"documentazione di Django per resettare le password." -#: .\cookbook\views\views.py:402 +#: .\cookbook\views\views.py:477 msgid "Passwords dont match!" msgstr "Le password non combaciano!" -#: .\cookbook\views\views.py:418 +#: .\cookbook\views\views.py:493 msgid "User has been created, please login!" msgstr "L'utente è stato creato e ora può essere usato per il login!" -#: .\cookbook\views\views.py:434 +#: .\cookbook\views\views.py:509 msgid "Malformed Invite Link supplied!" msgstr "È stato fornito un link di invito non valido!" -#: .\cookbook\views\views.py:441 -#, fuzzy -#| msgid "You are not logged in and therefore cannot view this page!" +#: .\cookbook\views\views.py:516 msgid "You are already member of a space and therefore cannot join this one." -msgstr "Non hai fatto l'accesso e quindi non puoi visualizzare questa pagina!" - -#: .\cookbook\views\views.py:452 -msgid "Successfully joined space." msgstr "" +"Sei già membro di una istanza e quindi non puoi entrare in quest'altra." -#: .\cookbook\views\views.py:458 +#: .\cookbook\views\views.py:527 +msgid "Successfully joined space." +msgstr "Sei entrato a far parte di questa istanza." + +#: .\cookbook\views\views.py:533 msgid "Invite Link not valid or already used!" msgstr "Il link di invito non è valido o è stato già usato!" -#: .\cookbook\views\views.py:522 +#: .\cookbook\views\views.py:614 msgid "" "Reporting share links is not enabled for this instance. Please notify the " "page administrator to report problems." msgstr "" +"La segnalazione dei link di condivisione non è abilitata per questa istanza. " +"Notifica l'amministratore per segnalare i problemi." -#: .\cookbook\views\views.py:528 +#: .\cookbook\views\views.py:620 msgid "" "Recipe sharing link has been disabled! For additional information please " "contact the page administrator." msgstr "" +"Il link per la condivisione delle ricette è stato disabilitato! Per maggiori " +"informazioni contatta l'amministratore." + +#, python-brace-format +#~ msgid "No {self.basename} with id {child} exists" +#~ msgstr "Non esiste nessun {self.basename} con id {child}" + +#~ msgid "New Unit" +#~ msgstr "Nuova unità di misura" + +#~ msgid "New unit that other gets replaced by." +#~ msgstr "Nuova unità di misura che sostituisce le altre." + +#~ msgid "Old Unit" +#~ msgstr "Vecchia unità di misura" + +#~ msgid "Unit that should be replaced." +#~ msgstr "Unità di misura che dovrebbe essere rimpiazzata." + +#~ msgid "New Food" +#~ msgstr "Nuovo alimento" + +#~ msgid "New food that other gets replaced by." +#~ msgstr "Nuovo alimento che sostituisce gli altri." + +#~ msgid "Old Food" +#~ msgstr "Vecchio alimento" + +#~ msgid "New Entry" +#~ msgstr "Nuovo Campo" + +#~ msgid "Title" +#~ msgstr "Titolo" + +#~ msgid "Note (optional)" +#~ msgstr "Nota (opzionale)" + +#~ msgid "" +#~ "You can use markdown to format this field. See the docs here" +#~ msgstr "" +#~ "Puoi usare markdown per formattare questo campo. Guarda la documentazione qui" + +#~ msgid "Serving Count" +#~ msgstr "Numero di porzioni" + +#~ msgid "Create only note" +#~ msgstr "Crea solo una nota" + +#~ msgid "Plan" +#~ msgstr "Piano" + +#~ msgid "Number of Days" +#~ msgstr "Numero di giorni" + +#~ msgid "Weekday offset" +#~ msgstr "Correzione giorni feriali" + +#~ msgid "" +#~ "Number of days starting from the first day of the week to offset the " +#~ "default view." +#~ msgstr "" +#~ "Numero di giorni a partire dal primo giorno della settimana per " +#~ "correggere la visualizzazione predefinita." + +#~ msgid "Edit plan types" +#~ msgstr "Modifica i tipi di piano" + +#~ msgid "Show help" +#~ msgstr "Mostra aiuto" + +#~ msgid "Week iCal export" +#~ msgstr "Esporta iCall settimanale" + +#~ msgid "Add to Shopping" +#~ msgstr "Aggiunti a lista della spesa" + +#~ msgid "New meal type" +#~ msgstr "Nuovo tipo di pasto" + +#~ msgid "Meal Plan Help" +#~ msgstr "Aiuto per il piano alimentare" + +#~ msgid "" +#~ "\n" +#~ "

The meal plan module allows planning of " +#~ "meals both with recipes and notes.

\n" +#~ "

Simply select a recipe from the list of " +#~ "recently viewed recipes or search the one you\n" +#~ " want and drag it to the desired plan " +#~ "position. You can also add a note and a title and\n" +#~ " then drag the recipe to create a plan " +#~ "entry with a custom title and note. Creating only\n" +#~ " Notes is possible by dragging the create " +#~ "note box into the plan.

\n" +#~ "

Click on a recipe in order to open the " +#~ "detailed view. There you can also add it to the\n" +#~ " shopping list. You can also add all " +#~ "recipes of a day to the shopping list by\n" +#~ " clicking the shopping cart at the top of " +#~ "the table.

\n" +#~ "

Since a common use case is to plan meals " +#~ "together you can define\n" +#~ " users you want to share your plan with in " +#~ "the settings.\n" +#~ "

\n" +#~ "

You can also edit the types of meals you " +#~ "want to plan. If you share your plan with\n" +#~ " someone with\n" +#~ " different meals, their meal types will " +#~ "appear in your list as well. To prevent\n" +#~ " duplicates (e.g. Other and Misc.)\n" +#~ " name your meal types the same as the " +#~ "users you share your meals with and they will be\n" +#~ " merged.

\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ "

Il modulo del piano alimentare consente di pianificare i pasti sia con " +#~ "ricette che con semplici note.

\n" +#~ "

Seleziona una ricetta dalla lista delle ricette recenti o cercane " +#~ "una,\n" +#~ "quindi spostala sulla posizione desiderata. Puoi anche aggiungere una " +#~ "nota e un titolo e\n" +#~ "poi trascinare la ricetta per creare una voce nel piano con un titolo e " +#~ "una nota personalizzata. Si possono anche creare\n" +#~ "delle note trascinando la casella della nota nel piano.

\n" +#~ "

Clicca su una ricetta per aprire la vista dettagliata. Qui potrai " +#~ "anche aggiungerla alla lista della spesa. Puoi anche aggiungere tutte le " +#~ "ricette di un giorno alla lista della spesa, basterà cliccare sul " +#~ "carrello sopra la tabella.

\n" +#~ "

Dato che è comune pianificare i pasti con altre persone, nelle " +#~ "impostazioni puoi scegliere gli utenti con i quali condividere il tuo " +#~ "piano.

\n" +#~ "

Puoi anche modificare i tipi di pasto che vuoi pianificare. Se " +#~ "condividi il piano con\n" +#~ "qualcuno\n" +#~ "con pasti differenti, i loro tipi di pasto appariranno anche nella tua " +#~ "lista. Per evitare\n" +#~ "duplicati (es. Altri e Varie)\n" +#~ "dai nomi ai tuoi tipi di pasto uguali ai tuoi utenti in modo che verranno " +#~ "uniti.

" + +#~ msgid "Units merged!" +#~ msgstr "Le unità sono state unite!" + +#~ msgid "Foods merged!" +#~ msgstr "Gli alimenti sono stati uniti!" + +#~ msgid "Utensils" +#~ msgstr "Strumenti" + +#~ msgid "Storage Data" +#~ msgstr "Dati e Archiviazione" + +#~ msgid "Storage Backends" +#~ msgstr "Backend Archiviazione" + +#~ msgid "Configure Sync" +#~ msgstr "Configura Sincronizzazione" + +#~ msgid "Discovered Recipes" +#~ msgstr "Ricette trovate" + +#~ msgid "Discovery Log" +#~ msgstr "Registro ricette trovate" + +#~ msgid "Units & Ingredients" +#~ msgstr "Unità di misura & Ingredienti" + +#~ msgid "New Book" +#~ msgstr "Nuovo Libro" + +#~ msgid "Toggle Recipes" +#~ msgstr "Attiva/Disattiva Ricette" + +#~ msgid "There are no recipes in this book yet." +#~ msgstr "Non ci sono ancora ricette in questo libro." + +#~ msgid "Waiting Time" +#~ msgstr "Tempo di cottura" + +#~ msgid "Servings Text" +#~ msgstr "Nome delle porzioni" + +#~ msgid "Select Keywords" +#~ msgstr "Seleziona parole chiave" + +#~ msgid "Nutrition" +#~ msgstr "Nutrienti" + +#~ msgid "Delete Step" +#~ msgstr "Elimina Step" + +#~ msgid "Calories" +#~ msgstr "Calorie" + +#~ msgid "Carbohydrates" +#~ msgstr "Carboidrati" + +#~ msgid "Fats" +#~ msgstr "Grassi" + +#~ msgid "Proteins" +#~ msgstr "Proteine" + +#~ msgid "Step" +#~ msgstr "Step" + +#~ msgid "Show as header" +#~ msgstr "Mostra come intestazione" + +#~ msgid "Hide as header" +#~ msgstr "Nascondi come intestazione" + +#~ msgid "Move Up" +#~ msgstr "Sposta Sopra" + +#~ msgid "Move Down" +#~ msgstr "Sposta Sotto" + +#~ msgid "Step Name" +#~ msgstr "Nome dello Step" + +#~ msgid "Step Type" +#~ msgstr "Tipo dello Step" + +#~ msgid "Step time in Minutes" +#~ msgstr "Tempo dello step in minuti" + +#~ msgid "Select File" +#~ msgstr "Seleziona file" + +#~ msgid "Select Recipe" +#~ msgstr "Seleziona ricetta" + +#~ msgid "Delete Ingredient" +#~ msgstr "Elimina Ingredienti" + +#~ msgid "Make Header" +#~ msgstr "Crea Intestazione" + +#~ msgid "Make Ingredient" +#~ msgstr "Crea Ingrediente" + +#~ msgid "Disable Amount" +#~ msgstr "Disabilita Quantità" + +#~ msgid "Enable Amount" +#~ msgstr "Abilita Quantità" + +#~ msgid "Copy Template Reference" +#~ msgstr "Copia riferimento template" + +#~ msgid "Save & View" +#~ msgstr "Salva & Mostra" + +#~ msgid "Add Step" +#~ msgstr "Aggiungi Step" + +#~ msgid "Add Nutrition" +#~ msgstr "Aggiungi nutrienti" + +#~ msgid "Remove Nutrition" +#~ msgstr "Rimuovi nutrienti" + +#~ msgid "View Recipe" +#~ msgstr "Mostra ricetta" + +#~ msgid "Delete Recipe" +#~ msgstr "Elimina Ricetta" #, fuzzy #~| msgid "Password Reset" diff --git a/cookbook/locale/lv/LC_MESSAGES/django.mo b/cookbook/locale/lv/LC_MESSAGES/django.mo index 4c4b6926..5371b295 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 30de1574..38bc5d75 100644 --- a/cookbook/locale/lv/LC_MESSAGES/django.po +++ b/cookbook/locale/lv/LC_MESSAGES/django.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-08-17 08:44+0200\n" +"POT-Creation-Date: 2022-01-18 14:52+0100\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/" @@ -23,15 +23,76 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " "2);\n" -#: .\cookbook\filters.py:23 .\cookbook\templates\base.html:98 -#: .\cookbook\templates\forms\edit_internal_recipe.html:269 -#: .\cookbook\templates\forms\ingredients.html:34 -#: .\cookbook\templates\space.html:43 .\cookbook\templates\stats.html:28 -#: .\cookbook\templates\url_import.html:270 .\cookbook\views\lists.py:67 +#: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 +#: .\cookbook\templates\space.html:50 .\cookbook\templates\stats.html:28 +#: .\cookbook\templates\url_import.html:277 msgid "Ingredients" msgstr "Sastāvdaļas" -#: .\cookbook\forms.py:49 +#: .\cookbook\forms.py:56 +msgid "Default unit" +msgstr "" + +#: .\cookbook\forms.py:57 +#, fuzzy +#| msgid "System Information" +msgid "Use fractions" +msgstr "Sistēmas informācija" + +#: .\cookbook\forms.py:58 +msgid "Use KJ" +msgstr "" + +#: .\cookbook\forms.py:59 +msgid "Theme" +msgstr "" + +#: .\cookbook\forms.py:60 +msgid "Navbar color" +msgstr "" + +#: .\cookbook\forms.py:61 +msgid "Sticky navbar" +msgstr "" + +#: .\cookbook\forms.py:62 +msgid "Default page" +msgstr "" + +#: .\cookbook\forms.py:63 +#, fuzzy +#| msgid "Shopping Recipes" +msgid "Show recent recipes" +msgstr "Iepirkšanās receptes" + +#: .\cookbook\forms.py:64 +#, fuzzy +#| msgid "Search" +msgid "Search style" +msgstr "Meklēt" + +#: .\cookbook\forms.py:65 +msgid "Plan sharing" +msgstr "" + +#: .\cookbook\forms.py:66 +#, fuzzy +#| msgid "Ingredients" +msgid "Ingredient decimal places" +msgstr "Sastāvdaļas" + +#: .\cookbook\forms.py:67 +#, fuzzy +#| msgid "Shopping list currently empty" +msgid "Shopping list auto sync period" +msgstr "Iepirkumu saraksts pašlaik ir tukšs" + +#: .\cookbook\forms.py:68 .\cookbook\templates\recipe_view.html:21 +#: .\cookbook\templates\space.html:77 .\cookbook\templates\stats.html:47 +msgid "Comments" +msgstr "Komentāri" + +#: .\cookbook\forms.py:72 msgid "" "Color of the top navigation bar. Not all colors work with all themes, just " "try them out!" @@ -39,11 +100,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:51 +#: .\cookbook\forms.py:74 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:53 +#: .\cookbook\forms.py:76 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" @@ -51,28 +112,40 @@ 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:56 -msgid "" -"Users with whom newly created meal plan/shopping list entries should be " -"shared by default." +#: .\cookbook\forms.py:78 +msgid "Display nutritional energy amounts in joules instead of calories" +msgstr "" + +#: .\cookbook\forms.py:79 +#, fuzzy +#| msgid "" +#| "Users with whom newly created meal plan/shopping list entries should be " +#| "shared by default." +msgid "Users with whom newly created meal plans should be shared by default." msgstr "" "Lietotāji, ar kuriem jaunizveidotie maltīšu saraksti/iepirkumu saraksti tiks " "kopīgoti pēc noklusējuma." -#: .\cookbook\forms.py:58 +#: .\cookbook\forms.py:80 +#, fuzzy +#| msgid "Open Shopping List" +msgid "Users with whom to share shopping lists." +msgstr "Atvērt iepirkumu sarakstu" + +#: .\cookbook\forms.py:82 msgid "Show recently viewed recipes on search page." msgstr "Parādīt nesen skatītās receptes meklēšanas lapā." -#: .\cookbook\forms.py:59 +#: .\cookbook\forms.py:83 msgid "Number of decimals to round ingredients." msgstr "Ciparu skaits pēc komata decimāldaļām sastāvdaļās." -#: .\cookbook\forms.py:60 +#: .\cookbook\forms.py:84 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:62 +#: .\cookbook\forms.py:86 .\cookbook\forms.py:493 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. " @@ -86,11 +159,19 @@ msgstr "" "Ja tas ir zemāks par instances ierobežojumu, tas tiek atiestatīts, " "saglabājot." -#: .\cookbook\forms.py:65 +#: .\cookbook\forms.py:89 msgid "Makes the navbar stick to the top of the page." msgstr "" -#: .\cookbook\forms.py:81 +#: .\cookbook\forms.py:90 .\cookbook\forms.py:496 +msgid "Automatically add meal plan ingredients to shopping list." +msgstr "" + +#: .\cookbook\forms.py:91 +msgid "Exclude ingredients that are on hand." +msgstr "" + +#: .\cookbook\forms.py:108 msgid "" "Both fields are optional. If none are given the username will be displayed " "instead" @@ -98,92 +179,57 @@ msgstr "" "Abi lauki nav obligāti. Ja neviens nav norādīts, tā vietā tiks parādīts " "lietotājvārds" -#: .\cookbook\forms.py:102 .\cookbook\forms.py:331 -#: .\cookbook\templates\forms\edit_internal_recipe.html:49 -#: .\cookbook\templates\url_import.html:154 +#: .\cookbook\forms.py:129 .\cookbook\forms.py:298 +#: .\cookbook\templates\url_import.html:161 msgid "Name" msgstr "Vārds" -#: .\cookbook\forms.py:103 .\cookbook\forms.py:332 -#: .\cookbook\templates\base.html:108 .\cookbook\templates\base.html:169 -#: .\cookbook\templates\forms\edit_internal_recipe.html:85 -#: .\cookbook\templates\space.html:39 .\cookbook\templates\stats.html:24 -#: .\cookbook\templates\url_import.html:188 -#: .\cookbook\templates\url_import.html:573 +#: .\cookbook\forms.py:130 .\cookbook\forms.py:299 +#: .\cookbook\templates\space.html:44 .\cookbook\templates\stats.html:24 +#: .\cookbook\templates\url_import.html:195 +#: .\cookbook\templates\url_import.html:585 .\cookbook\views\lists.py:97 msgid "Keywords" msgstr "Atslēgvārdi" -#: .\cookbook\forms.py:104 +#: .\cookbook\forms.py:131 msgid "Preparation time in minutes" msgstr "Pagatavošanas laiks minūtēs" -#: .\cookbook\forms.py:105 +#: .\cookbook\forms.py:132 msgid "Waiting time (cooking/baking) in minutes" msgstr "Gaidīšanas laiks (vārīšana / cepšana) minūtēs" -#: .\cookbook\forms.py:106 .\cookbook\forms.py:333 +#: .\cookbook\forms.py:133 .\cookbook\forms.py:267 .\cookbook\forms.py:300 msgid "Path" msgstr "Ceļš" -#: .\cookbook\forms.py:107 +#: .\cookbook\forms.py:134 msgid "Storage UID" msgstr "Krātuves UID" -#: .\cookbook\forms.py:133 +#: .\cookbook\forms.py:164 msgid "Default" msgstr "" -#: .\cookbook\forms.py:144 .\cookbook\templates\url_import.html:90 +#: .\cookbook\forms.py:175 .\cookbook\templates\url_import.html:97 msgid "" "To prevent duplicates recipes with the same name as existing ones are " "ignored. Check this box to import everything." msgstr "" -#: .\cookbook\forms.py:164 -msgid "New Unit" -msgstr "Jaunā vienība" - -#: .\cookbook\forms.py:165 -msgid "New unit that other gets replaced by." -msgstr "Jauna vienība, ar kuru cits tiek aizstāts." - -#: .\cookbook\forms.py:170 -msgid "Old Unit" -msgstr "Vecā vienība" - -#: .\cookbook\forms.py:171 -msgid "Unit that should be replaced." -msgstr "Vienība, kas jāaizstāj." - -#: .\cookbook\forms.py:187 -msgid "New Food" -msgstr "Jauns ēdiens" - -#: .\cookbook\forms.py:188 -msgid "New food that other gets replaced by." -msgstr "Jauns ēdiens, ar kuru citi tiek aizstāti." - -#: .\cookbook\forms.py:193 -msgid "Old Food" -msgstr "Vecais ēdiens" - -#: .\cookbook\forms.py:194 -msgid "Food that should be replaced." -msgstr "Ēdiens, kas būtu jāaizstāj." - -#: .\cookbook\forms.py:212 +#: .\cookbook\forms.py:197 msgid "Add your comment: " msgstr "Pievienot komentāru: " -#: .\cookbook\forms.py:253 +#: .\cookbook\forms.py:212 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:260 +#: .\cookbook\forms.py:219 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:269 +#: .\cookbook\forms.py:228 msgid "" "Leave empty for dropbox and enter only base url for nextcloud (/remote." "php/webdav/ is added automatically)" @@ -191,26 +237,33 @@ msgstr "" "Atstājiet tukšu Dropbox un ievadiet tikai Nextcloud bāzes URL ( /" "remote.php/webdav/
tiek pievienots automātiski)" -#: .\cookbook\forms.py:307 +#: .\cookbook\forms.py:266 .\cookbook\views\edit.py:166 +msgid "Storage" +msgstr "Krātuve" + +#: .\cookbook\forms.py:268 +msgid "Active" +msgstr "" + +#: .\cookbook\forms.py:274 msgid "Search String" msgstr "Meklēšanas virkne" -#: .\cookbook\forms.py:334 +#: .\cookbook\forms.py:301 msgid "File ID" msgstr "Faila ID" -#: .\cookbook\forms.py:370 +#: .\cookbook\forms.py:323 msgid "You must provide at least a recipe or a title." msgstr "Jums jānorāda vismaz recepte vai nosaukums." -#: .\cookbook\forms.py:383 +#: .\cookbook\forms.py:336 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:384 -#: .\cookbook\templates\forms\edit_internal_recipe.html:427 +#: .\cookbook\forms.py:337 msgid "" "You can use markdown to format this field. See the docs here" @@ -218,92 +271,283 @@ msgstr "" "Lai formatētu šo lauku, varat izmantot Markdown. Skatiet dokumentus šeit " -#: .\cookbook\forms.py:409 +#: .\cookbook\forms.py:363 msgid "Maximum number of users for this space reached." msgstr "" -#: .\cookbook\forms.py:415 +#: .\cookbook\forms.py:369 msgid "Email address already taken!" msgstr "" -#: .\cookbook\forms.py:423 +#: .\cookbook\forms.py:377 msgid "" -"An email address is not required but if present the invite link will be send " +"An email address is not required but if present the invite link will be sent " "to the user." msgstr "" -#: .\cookbook\forms.py:438 +#: .\cookbook\forms.py:392 msgid "Name already taken." msgstr "" -#: .\cookbook\forms.py:449 +#: .\cookbook\forms.py:403 msgid "Accept Terms and Privacy" msgstr "" +#: .\cookbook\forms.py:435 +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:445 +msgid "" +"Select type method of search. Click here for " +"full desciption of choices." +msgstr "" + +#: .\cookbook\forms.py:446 +msgid "" +"Use fuzzy matching on units, keywords and ingredients when editing and " +"importing recipes." +msgstr "" + +#: .\cookbook\forms.py:448 +msgid "" +"Fields to search ignoring accents. Selecting this option can improve or " +"degrade search quality depending on language" +msgstr "" + +#: .\cookbook\forms.py:450 +msgid "" +"Fields to search for partial matches. (e.g. searching for 'Pie' will return " +"'pie' and 'piece' and 'soapie')" +msgstr "" + +#: .\cookbook\forms.py:452 +msgid "" +"Fields to search for beginning of word matches. (e.g. searching for 'sa' " +"will return 'salad' and 'sandwich')" +msgstr "" + +#: .\cookbook\forms.py:454 +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:456 +msgid "" +"Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " +"only function with fulltext fields." +msgstr "" + +#: .\cookbook\forms.py:460 +#, fuzzy +#| msgid "Search" +msgid "Search Method" +msgstr "Meklēt" + +#: .\cookbook\forms.py:461 +msgid "Fuzzy Lookups" +msgstr "" + +#: .\cookbook\forms.py:462 +msgid "Ignore Accent" +msgstr "" + +#: .\cookbook\forms.py:463 +msgid "Partial Match" +msgstr "" + +#: .\cookbook\forms.py:464 +msgid "Starts Wtih" +msgstr "" + +#: .\cookbook\forms.py:465 +#, fuzzy +#| msgid "Search" +msgid "Fuzzy Search" +msgstr "Meklēt" + +#: .\cookbook\forms.py:466 +#, fuzzy +#| msgid "Text" +msgid "Full Text" +msgstr "Teskts" + +#: .\cookbook\forms.py:491 +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:497 +msgid "" +"When adding a meal plan to the shopping list (manually or automatically), " +"include all related recipes." +msgstr "" + +#: .\cookbook\forms.py:498 +msgid "" +"When adding a meal plan to the shopping list (manually or automatically), " +"exclude ingredients that are on hand." +msgstr "" + +#: .\cookbook\forms.py:499 +msgid "Default number of hours to delay a shopping list entry." +msgstr "" + +#: .\cookbook\forms.py:500 +msgid "Filter shopping list to only include supermarket categories." +msgstr "" + +#: .\cookbook\forms.py:501 +msgid "Days of recent shopping list entries to display." +msgstr "" + +#: .\cookbook\forms.py:502 +msgid "Mark food 'On Hand' when checked off shopping list." +msgstr "" + +#: .\cookbook\forms.py:503 +msgid "Delimiter to use for CSV exports." +msgstr "" + +#: .\cookbook\forms.py:504 +msgid "Prefix to add when copying list to the clipboard." +msgstr "" + +#: .\cookbook\forms.py:508 +#, fuzzy +#| msgid "Shopping List" +msgid "Share Shopping List" +msgstr "Iepirkumu saraksts" + +#: .\cookbook\forms.py:509 +msgid "Autosync" +msgstr "" + +#: .\cookbook\forms.py:510 +msgid "Auto Add Meal Plan" +msgstr "" + +#: .\cookbook\forms.py:511 +msgid "Exclude On Hand" +msgstr "" + +#: .\cookbook\forms.py:512 +msgid "Include Related" +msgstr "" + +#: .\cookbook\forms.py:513 +msgid "Default Delay Hours" +msgstr "" + +#: .\cookbook\forms.py:514 +msgid "Filter to Supermarket" +msgstr "" + +#: .\cookbook\forms.py:515 +msgid "Recent Days" +msgstr "" + +#: .\cookbook\forms.py:516 +msgid "CSV Delimiter" +msgstr "" + +#: .\cookbook\forms.py:517 .\cookbook\templates\shopping_list.html:322 +msgid "List Prefix" +msgstr "Saraksta prefikss" + +#: .\cookbook\forms.py:518 +msgid "Auto On Hand" +msgstr "" + +#: .\cookbook\forms.py:528 +msgid "Reset Food Inheritance" +msgstr "" + +#: .\cookbook\forms.py:529 +msgid "Reset all food to inherit the fields configured." +msgstr "" + +#: .\cookbook\forms.py:541 +#, 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:542 +#, 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 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:138 -#: .\cookbook\helper\permission_helper.py:161 .\cookbook\views\views.py:151 +#: .\cookbook\helper\permission_helper.py:136 +#: .\cookbook\helper\permission_helper.py:159 .\cookbook\views\views.py:148 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:142 -#: .\cookbook\helper\permission_helper.py:148 -#: .\cookbook\helper\permission_helper.py:173 -#: .\cookbook\helper\permission_helper.py:218 -#: .\cookbook\helper\permission_helper.py:232 -#: .\cookbook\helper\permission_helper.py:243 -#: .\cookbook\helper\permission_helper.py:254 .\cookbook\views\data.py:40 -#: .\cookbook\views\views.py:162 .\cookbook\views\views.py:169 -#: .\cookbook\views\views.py:259 +#: .\cookbook\helper\permission_helper.py:140 +#: .\cookbook\helper\permission_helper.py:146 +#: .\cookbook\helper\permission_helper.py:171 +#: .\cookbook\helper\permission_helper.py:219 +#: .\cookbook\helper\permission_helper.py:233 +#: .\cookbook\helper\permission_helper.py:244 +#: .\cookbook\helper\permission_helper.py:255 .\cookbook\views\data.py:47 +#: .\cookbook\views\views.py:159 .\cookbook\views\views.py:166 +#: .\cookbook\views\views.py:232 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:166 -#: .\cookbook\helper\permission_helper.py:189 -#: .\cookbook\helper\permission_helper.py:204 +#: .\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 "Jūs nevarat mainīt šo objektu, jo tas nepieder jums!" -#: .\cookbook\helper\template_helper.py:60 -#: .\cookbook\helper\template_helper.py:62 +#: .\cookbook\helper\recipe_search.py:473 +msgid "One of queryset or hash_key must be provided" +msgstr "" + +#: .\cookbook\helper\shopping_helper.py:54 +#, fuzzy +#| msgid "You must provide at least a recipe or a title." +msgid "You must supply a recipe or mealplan" +msgstr "Jums jānorāda vismaz recepte vai nosaukums." + +#: .\cookbook\helper\shopping_helper.py:58 +msgid "You must supply a created_by" +msgstr "" + +#: .\cookbook\helper\template_helper.py:61 +#: .\cookbook\helper\template_helper.py:63 msgid "Could not parse template code." msgstr "" -#: .\cookbook\integration\integration.py:104 -#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 -#: .\cookbook\templates\import_response.html:7 -#: .\cookbook\templates\test.html:14 .\cookbook\templates\test.html:20 -#: .\cookbook\templates\url_import.html:27 -#: .\cookbook\templates\url_import.html:101 -#: .\cookbook\templates\url_import.html:123 -#: .\cookbook\templates\url_import.html:317 -#: .\cookbook\templates\url_import.html:604 .\cookbook\views\delete.py:60 -#: .\cookbook\views\edit.py:199 -msgid "Import" -msgstr "Importēt" - -#: .\cookbook\integration\integration.py:185 +#: .\cookbook\integration\integration.py:200 msgid "" "Importer expected a .zip file. Did you choose the correct importer type for " "your data ?" msgstr "" -#: .\cookbook\integration\integration.py:188 +#: .\cookbook\integration\integration.py:203 msgid "" "An unexpected error occurred during the import. Please make sure you have " "uploaded a valid file." msgstr "" -#: .\cookbook\integration\integration.py:192 +#: .\cookbook\integration\integration.py:208 msgid "The following recipes were ignored because they already existed:" msgstr "" -#: .\cookbook\integration\integration.py:196 +#: .\cookbook\integration\integration.py:212 #, fuzzy, python-format #| msgid "Imported new recipe!" msgid "Imported %s recipes." @@ -321,37 +565,51 @@ msgstr "Piezīme" msgid "Nutritional Information" msgstr "Informācija" -#: .\cookbook\integration\paprika.py:53 +#: .\cookbook\integration\paprika.py:53 .\cookbook\templates\url_import.html:42 msgid "Source" msgstr "" -#: .\cookbook\integration\safron.py:23 -#: .\cookbook\templates\forms\edit_internal_recipe.html:79 -#: .\cookbook\templates\include\log_cooking.html:16 -#: .\cookbook\templates\url_import.html:224 -#: .\cookbook\templates\url_import.html:455 +#: .\cookbook\integration\saffron.py:23 +#: .\cookbook\templates\include\log_cooking.html:18 +#: .\cookbook\templates\url_import.html:231 +#: .\cookbook\templates\url_import.html:462 msgid "Servings" msgstr "Porciju skaits" -#: .\cookbook\integration\safron.py:25 +#: .\cookbook\integration\saffron.py:25 msgid "Waiting time" msgstr "" -#: .\cookbook\integration\safron.py:27 -#: .\cookbook\templates\forms\edit_internal_recipe.html:73 +#: .\cookbook\integration\saffron.py:27 msgid "Preparation Time" msgstr "Pagatavošanas laiks" -#: .\cookbook\integration\safron.py:29 .\cookbook\templates\base.html:78 +#: .\cookbook\integration\saffron.py:29 .\cookbook\templates\base.html:78 #: .\cookbook\templates\forms\ingredients.html:7 #: .\cookbook\templates\index.html:7 msgid "Cookbook" msgstr "Pavārgrāmata" -#: .\cookbook\integration\safron.py:31 +#: .\cookbook\integration\saffron.py:31 msgid "Section" msgstr "" +#: .\cookbook\management\commands\rebuildindex.py:14 +msgid "Rebuilds full text search index on Recipe" +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:18 +msgid "Only Postgress databases use full text search, no index to rebuild" +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:29 +msgid "Recipe index rebuild complete." +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:31 +msgid "Recipe index rebuild failed." +msgstr "" + #: .\cookbook\migrations\0047_auto_20200602_1133.py:14 msgid "Breakfast" msgstr "Brokastis" @@ -368,92 +626,151 @@ msgstr "Vakariņas" msgid "Other" msgstr "Cits" -#: .\cookbook\models.py:72 +#: .\cookbook\models.py:246 msgid "" "Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " "upload." msgstr "" -#: .\cookbook\models.py:123 .\cookbook\templates\search.html:7 -#: .\cookbook\templates\shopping_list.html:52 +#: .\cookbook\models.py:300 .\cookbook\templates\search.html:7 +#: .\cookbook\templates\shopping_list.html:53 msgid "Search" msgstr "Meklēt" -#: .\cookbook\models.py:124 .\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 +#: .\cookbook\models.py:301 .\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 "Maltīšu plāns" -#: .\cookbook\models.py:125 .\cookbook\templates\base.html:89 +#: .\cookbook\models.py:302 .\cookbook\templates\base.html:90 msgid "Books" msgstr "Grāmatas" -#: .\cookbook\models.py:133 +#: .\cookbook\models.py:310 msgid "Small" msgstr "Mazs" -#: .\cookbook\models.py:133 +#: .\cookbook\models.py:310 msgid "Large" msgstr "Liels" -#: .\cookbook\models.py:133 .\cookbook\templates\generic\new_template.html:6 +#: .\cookbook\models.py:310 .\cookbook\templates\generic\new_template.html:6 #: .\cookbook\templates\generic\new_template.html:14 -#: .\cookbook\templates\meal_plan.html:323 msgid "New" msgstr "Jauns" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:202 +#: .\cookbook\models.py:512 +msgid " is part of a recipe step and cannot be deleted" +msgstr "" + +#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:44 msgid "Text" msgstr "Teskts" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:203 +#: .\cookbook\models.py:586 msgid "Time" msgstr "Laiks" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:204 -#: .\cookbook\templates\forms\edit_internal_recipe.html:219 +#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:46 #, fuzzy #| msgid "File ID" msgid "File" msgstr "Faila ID" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:205 -#: .\cookbook\templates\forms\edit_internal_recipe.html:241 +#: .\cookbook\models.py:586 #: .\cookbook\templates\include\recipe_open_modal.html:7 -#: .\cookbook\templates\meal_plan.html:247 .\cookbook\views\delete.py:28 -#: .\cookbook\views\edit.py:273 .\cookbook\views\new.py:52 +#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260 +#: .\cookbook\views\new.py:53 msgid "Recipe" msgstr "Recepte" -#: .\cookbook\serializer.py:109 +#: .\cookbook\models.py:1041 .\cookbook\templates\search_info.html:28 +msgid "Simple" +msgstr "" + +#: .\cookbook\models.py:1042 .\cookbook\templates\search_info.html:33 +msgid "Phrase" +msgstr "" + +#: .\cookbook\models.py:1043 .\cookbook\templates\search_info.html:38 +msgid "Web" +msgstr "" + +#: .\cookbook\models.py:1044 .\cookbook\templates\search_info.html:47 +msgid "Raw" +msgstr "" + +#: .\cookbook\models.py:1082 +#, fuzzy +#| msgid "Food" +msgid "Food Alias" +msgstr "Ēdiens" + +#: .\cookbook\models.py:1082 +#, fuzzy +#| msgid "Units" +msgid "Unit Alias" +msgstr "Vienības" + +#: .\cookbook\models.py:1082 +#, fuzzy +#| msgid "Keywords" +msgid "Keyword Alias" +msgstr "Atslēgvārdi" + +#: .\cookbook\serializer.py:175 +msgid "A user is required" +msgstr "" + +#: .\cookbook\serializer.py:195 msgid "File uploads are not enabled for this Space." msgstr "" -#: .\cookbook\serializer.py:117 +#: .\cookbook\serializer.py:206 msgid "You have reached your file upload limit." msgstr "" -#: .\cookbook\tables.py:35 .\cookbook\templates\books.html:36 -#: .\cookbook\templates\generic\edit_template.html:6 +#: .\cookbook\serializer.py:962 +msgid "Existing shopping list to update" +msgstr "" + +#: .\cookbook\serializer.py:964 +msgid "" +"List of ingredient IDs from the recipe to add, if not provided all " +"ingredients will be added." +msgstr "" + +#: .\cookbook\serializer.py:965 +msgid "" +"Providing a list_recipe ID and servings of 0 will delete that shopping list." +msgstr "" + +#: .\cookbook\serializer.py:973 +msgid "Amount of food to add to the shopping list" +msgstr "" + +#: .\cookbook\serializer.py:974 +msgid "ID of unit to use for the shopping list" +msgstr "" + +#: .\cookbook\serializer.py:975 +msgid "When set to true will delete all food from active shopping lists." +msgstr "" + +#: .\cookbook\tables.py:35 .\cookbook\templates\generic\edit_template.html:6 #: .\cookbook\templates\generic\edit_template.html:14 -#: .\cookbook\templates\meal_plan.html:281 #: .\cookbook\templates\recipes_table.html:82 -#: .\cookbook\templates\shopping_list.html:33 -#: .\cookbook\templates\space.html:90 +#: .\cookbook\templates\shopping_list.html:37 +#: .\cookbook\templates\space.html:109 msgid "Edit" msgstr "Rediģēt" -#: .\cookbook\tables.py:124 .\cookbook\tables.py:147 -#: .\cookbook\templates\books.html:38 -#: .\cookbook\templates\generic\delete_template.html:5 -#: .\cookbook\templates\generic\delete_template.html:13 -#: .\cookbook\templates\generic\edit_template.html:27 -#: .\cookbook\templates\meal_plan.html:277 +#: .\cookbook\tables.py:115 .\cookbook\tables.py:138 +#: .\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" @@ -482,7 +799,7 @@ 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:154 .\cookbook\templates\settings.html:6 +#: .\cookbook\templates\base.html:257 .\cookbook\templates\settings.html:6 #: .\cookbook\templates\settings.html:17 #: .\cookbook\templates\socialaccount\connections.html:10 msgid "Settings" @@ -519,6 +836,7 @@ msgid "Re-send Verification" msgstr "" #: .\cookbook\templates\account\email.html:50 +#: .\cookbook\templates\generic\delete_template.html:56 #: .\cookbook\templates\socialaccount\connections.html:44 msgid "Remove" msgstr "" @@ -562,7 +880,7 @@ msgid "" msgstr "" #: .\cookbook\templates\account\email_confirm.html:22 -#: .\cookbook\templates\generic\delete_template.html:21 +#: .\cookbook\templates\generic\delete_template.html:71 msgid "Confirm" msgstr "Apstiprināt" @@ -574,7 +892,7 @@ msgid "" "request." msgstr "" -#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:189 +#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:289 msgid "Login" msgstr "Pieslēgties" @@ -585,27 +903,27 @@ msgstr "Pieslēgties" msgid "Sign In" msgstr "" -#: .\cookbook\templates\account\login.html:32 +#: .\cookbook\templates\account\login.html:34 #: .\cookbook\templates\socialaccount\signup.html:8 #: .\cookbook\templates\socialaccount\signup.html:57 msgid "Sign Up" msgstr "" -#: .\cookbook\templates\account\login.html:36 -#: .\cookbook\templates\account\login.html:37 +#: .\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:37 +#: .\cookbook\templates\account\login.html:40 msgid "Lost your password?" msgstr "" -#: .\cookbook\templates\account\login.html:48 +#: .\cookbook\templates\account\login.html:52 msgid "Social Login" msgstr "" -#: .\cookbook\templates\account\login.html:49 +#: .\cookbook\templates\account\login.html:53 msgid "You can use any of the following providers to sign in." msgstr "" @@ -622,6 +940,10 @@ msgstr "" #: .\cookbook\templates\account\password_change.html:6 #: .\cookbook\templates\account\password_change.html:16 #: .\cookbook\templates\account\password_change.html:21 +#: .\cookbook\templates\account\password_reset_from_key.html:7 +#: .\cookbook\templates\account\password_reset_from_key.html:13 +#: .\cookbook\templates\account\password_reset_from_key_done.html:7 +#: .\cookbook\templates\account\password_reset_from_key_done.html:13 #, fuzzy #| msgid "Changes saved!" msgid "Change Password" @@ -629,7 +951,7 @@ msgstr "Izmaiņas saglabātas!" #: .\cookbook\templates\account\password_change.html:12 #: .\cookbook\templates\account\password_set.html:12 -#: .\cookbook\templates\settings.html:52 +#: .\cookbook\templates\settings.html:76 #, fuzzy #| msgid "Settings" msgid "Password" @@ -662,6 +984,32 @@ msgid "" "within a few minutes." msgstr "" +#: .\cookbook\templates\account\password_reset_from_key.html:13 +#, fuzzy +#| msgid "API Token" +msgid "Bad Token" +msgstr "API Tokens" + +#: .\cookbook\templates\account\password_reset_from_key.html:25 +#, python-format +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used.\n" +" Please request a new " +"password reset." +msgstr "" + +#: .\cookbook\templates\account\password_reset_from_key.html:33 +#, fuzzy +#| msgid "Changes saved!" +msgid "change password" +msgstr "Izmaiņas saglabātas!" + +#: .\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 "" + #: .\cookbook\templates\account\password_set.html:6 #: .\cookbook\templates\account\password_set.html:16 #: .\cookbook\templates\account\password_set.html:21 @@ -715,100 +1063,120 @@ msgstr "" msgid "We are sorry, but the sign up is currently closed." msgstr "" -#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:179 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:279 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "API dokumentācija" -#: .\cookbook\templates\base.html:85 -msgid "Utensils" -msgstr "Piederumi" - -#: .\cookbook\templates\base.html:95 +#: .\cookbook\templates\base.html:86 msgid "Shopping" msgstr "Iepirkšanās" -#: .\cookbook\templates\base.html:101 -#: .\cookbook\templates\shopping_list.html:230 +#: .\cookbook\templates\base.html:113 +msgid "Keyword" +msgstr "Atslēgvārds" + +#: .\cookbook\templates\base.html:125 .\cookbook\views\lists.py:114 +#, fuzzy +#| msgid "Food" +msgid "Foods" +msgstr "Ēdiens" + +#: .\cookbook\templates\base.html:137 +#: .\cookbook\templates\forms\ingredients.html:24 +#: .\cookbook\templates\space.html:47 .\cookbook\templates\stats.html:26 +#: .\cookbook\views\lists.py:131 +msgid "Units" +msgstr "Vienības" + +#: .\cookbook\templates\base.html:151 +#: .\cookbook\templates\shopping_list.html:208 #: .\cookbook\templates\supermarket.html:7 msgid "Supermarket" msgstr "" -#: .\cookbook\templates\base.html:112 .\cookbook\views\delete.py:84 -#: .\cookbook\views\edit.py:102 .\cookbook\views\lists.py:26 -#: .\cookbook\views\new.py:78 -msgid "Keyword" -msgstr "Atslēgvārds" +#: .\cookbook\templates\base.html:163 +#, fuzzy +#| msgid "Batch edit Category" +msgid "Supermarket Category" +msgstr "Rediģēt vairākas kategorijas uzreiz" -#: .\cookbook\templates\base.html:114 +#: .\cookbook\templates\base.html:175 .\cookbook\views\lists.py:180 +#, fuzzy +#| msgid "Information" +msgid "Automations" +msgstr "Informācija" + +#: .\cookbook\templates\base.html:189 .\cookbook\views\lists.py:200 +#, fuzzy +#| msgid "File ID" +msgid "Files" +msgstr "Faila ID" + +#: .\cookbook\templates\base.html:201 msgid "Batch Edit" msgstr "Rediģēt vairākus" -#: .\cookbook\templates\base.html:119 -msgid "Storage Data" -msgstr "Krātuves dati" - -#: .\cookbook\templates\base.html:123 -msgid "Storage Backends" -msgstr "Krātuves backendi" - -#: .\cookbook\templates\base.html:125 -msgid "Configure Sync" -msgstr "Konfigurēt sinhronizāciju" - -#: .\cookbook\templates\base.html:127 -msgid "Discovered Recipes" -msgstr "Atrastās receptes" - -#: .\cookbook\templates\base.html:129 -msgid "Discovery Log" -msgstr "Atrastās žurnāls" - -#: .\cookbook\templates\base.html:131 .\cookbook\templates\stats.html:10 -msgid "Statistics" -msgstr "Statistika" - -#: .\cookbook\templates\base.html:133 -msgid "Units & Ingredients" -msgstr "Vienības un sastāvdaļas" - -#: .\cookbook\templates\base.html:135 .\cookbook\templates\index.html:47 -msgid "Import Recipe" -msgstr "Importēt recepti" - -#: .\cookbook\templates\base.html:156 .\cookbook\templates\history.html:6 +#: .\cookbook\templates\base.html:213 .\cookbook\templates\history.html:6 #: .\cookbook\templates\history.html:14 msgid "History" msgstr "Vēsture" -#: .\cookbook\templates\base.html:159 .\cookbook\templates\space.html:7 -#: .\cookbook\templates\space.html:19 +#: .\cookbook\templates\base.html:228 .\cookbook\templates\export.html:14 +#: .\cookbook\templates\export.html:20 +#: .\cookbook\templates\shopping_list.html:310 +#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 +msgid "Export" +msgstr "Eksportēt" + +#: .\cookbook\templates\base.html:244 .\cookbook\templates\index.html:47 +msgid "Import Recipe" +msgstr "Importēt recepti" + +#: .\cookbook\templates\base.html:246 +#: .\cookbook\templates\shopping_list.html:165 +#: .\cookbook\templates\shopping_list.html:188 +msgid "Create" +msgstr "Izveidot" + +#: .\cookbook\templates\base.html:259 +#: .\cookbook\templates\generic\list_template.html:14 +#: .\cookbook\templates\space.html:69 .\cookbook\templates\stats.html:43 +msgid "External Recipes" +msgstr "Ārējās receptes" + +#: .\cookbook\templates\base.html:262 .\cookbook\templates\space.html:8 +#: .\cookbook\templates\space.html:20 .\cookbook\templates\space.html:150 #, fuzzy #| msgid "Settings" msgid "Space Settings" msgstr "Iestatījumi" -#: .\cookbook\templates\base.html:163 .\cookbook\templates\system.html:13 +#: .\cookbook\templates\base.html:267 .\cookbook\templates\system.html:13 msgid "System" msgstr "Sistēma" -#: .\cookbook\templates\base.html:165 .\cookbook\templates\base.html:171 +#: .\cookbook\templates\base.html:269 msgid "Admin" msgstr "Administrators" -#: .\cookbook\templates\base.html:175 +#: .\cookbook\templates\base.html:273 msgid "Markdown Guide" msgstr "Markdown rokasgrāmata" -#: .\cookbook\templates\base.html:177 +#: .\cookbook\templates\base.html:275 msgid "GitHub" msgstr "Github" -#: .\cookbook\templates\base.html:181 +#: .\cookbook\templates\base.html:277 +msgid "Translate Tandoor" +msgstr "" + +#: .\cookbook\templates\base.html:281 msgid "API Browser" msgstr "API pārlūks" -#: .\cookbook\templates\base.html:184 +#: .\cookbook\templates\base.html:284 msgid "Log out" msgstr "" @@ -825,7 +1193,7 @@ msgid "Add the specified keywords to all recipes containing a word" msgstr "" "Pievienojiet norādītos atslēgvārdus visām receptēm, kurās ir atrodams vārds" -#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:85 +#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:82 msgid "Sync" msgstr "Sinhronizēt" @@ -845,10 +1213,40 @@ msgstr "" msgid "The path must be in the following format" msgstr "Ceļam jābūt šādā formātā" -#: .\cookbook\templates\batch\monitor.html:27 +#: .\cookbook\templates\batch\monitor.html:20 +#: .\cookbook\templates\forms\edit_import_recipe.html:14 +#: .\cookbook\templates\generic\edit_template.html:23 +#: .\cookbook\templates\generic\new_template.html:23 +#: .\cookbook\templates\include\log_cooking.html:30 +#: .\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\shopping_list.html:311 +#: .\cookbook\templates\space.html:155 +msgid "Save" +msgstr "Saglabāt" + +#: .\cookbook\templates\batch\monitor.html:21 +msgid "Manage External Storage" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:28 msgid "Sync Now!" msgstr "Sinhronizēt tagad!" +#: .\cookbook\templates\batch\monitor.html:29 +#, fuzzy +#| msgid "Shopping Recipes" +msgid "Show Recipes" +msgstr "Iepirkšanās receptes" + +#: .\cookbook\templates\batch\monitor.html:30 +#, fuzzy +#| msgid "Show Links" +msgid "Show Log" +msgstr "Rādīt saites" + #: .\cookbook\templates\batch\waiting.html:4 #: .\cookbook\templates\batch\waiting.html:10 msgid "Importing Recipes" @@ -862,265 +1260,23 @@ msgstr "" "Tas var aizņemt dažas minūtes, atkarībā no sinhronizēto recepšu skaita, " "lūdzu, uzgaidiet." -#: .\cookbook\templates\books.html:5 .\cookbook\templates\books.html:11 +#: .\cookbook\templates\books.html:7 msgid "Recipe Books" msgstr "Recepšu grāmatas" -#: .\cookbook\templates\books.html:15 -msgid "New Book" -msgstr "Jauna grāmata" - -#: .\cookbook\templates\books.html:27 .\cookbook\templates\recipe_view.html:26 -msgid "by" -msgstr "pēc" - -#: .\cookbook\templates\books.html:34 -msgid "Toggle Recipes" -msgstr "Pārslēgt receptes" - -#: .\cookbook\templates\books.html:54 -#: .\cookbook\templates\meal_plan_entry.html:48 -#: .\cookbook\templates\recipes_table.html:64 -msgid "Last cooked" -msgstr "Pēdējoreiz gatavots" - -#: .\cookbook\templates\books.html:71 -msgid "There are no recipes in this book yet." -msgstr "Šajā grāmatā vēl nav receptes." - #: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6 msgid "Export Recipes" msgstr "Eksportēt receptes" -#: .\cookbook\templates\export.html:14 .\cookbook\templates\export.html:20 -#: .\cookbook\templates\shopping_list.html:351 -#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 -msgid "Export" -msgstr "Eksportēt" - -#: .\cookbook\templates\files.html:7 -#, fuzzy -#| msgid "File ID" -msgid "Files" -msgstr "Faila ID" - #: .\cookbook\templates\forms\edit_import_recipe.html:5 #: .\cookbook\templates\forms\edit_import_recipe.html:9 msgid "Import new Recipe" msgstr "Importēt jaunu recepti" -#: .\cookbook\templates\forms\edit_import_recipe.html:14 -#: .\cookbook\templates\forms\edit_internal_recipe.html:439 -#: .\cookbook\templates\forms\edit_internal_recipe.html:471 -#: .\cookbook\templates\generic\edit_template.html:23 -#: .\cookbook\templates\generic\new_template.html:23 -#: .\cookbook\templates\include\log_cooking.html:28 -#: .\cookbook\templates\meal_plan.html:325 -#: .\cookbook\templates\settings.html:46 .\cookbook\templates\settings.html:87 -#: .\cookbook\templates\settings.html:105 -#: .\cookbook\templates\shopping_list.html:353 -msgid "Save" -msgstr "Saglabāt" - #: .\cookbook\templates\forms\edit_internal_recipe.html:7 -#: .\cookbook\templates\forms\edit_internal_recipe.html:34 msgid "Edit Recipe" msgstr "Rediģēt recepti" -#: .\cookbook\templates\forms\edit_internal_recipe.html:56 -#: .\cookbook\templates\url_import.html:171 -msgid "Description" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:76 -msgid "Waiting Time" -msgstr "Gaidīšanas laiks" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:82 -msgid "Servings Text" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:93 -msgid "Select Keywords" -msgstr "Atlasīt atslēgvārdus" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:94 -#: .\cookbook\templates\url_import.html:583 -#, fuzzy -#| msgid "All Keywords" -msgid "Add Keyword" -msgstr "Visi atslēgvārdi" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:112 -msgid "Nutrition" -msgstr "Uzturs" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:116 -#: .\cookbook\templates\forms\edit_internal_recipe.html:166 -msgid "Delete Step" -msgstr "Dzēst soli" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:120 -msgid "Calories" -msgstr "Kalorijas" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:123 -msgid "Carbohydrates" -msgstr "Ogļhidrāti" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:126 -msgid "Fats" -msgstr "Tauki" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:128 -msgid "Proteins" -msgstr "Olbaltumvielas" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:150 -#: .\cookbook\templates\forms\edit_internal_recipe.html:504 -msgid "Step" -msgstr "Solis" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:171 -msgid "Show as header" -msgstr "Rādīt kā galveni" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:177 -msgid "Hide as header" -msgstr "Slēpt kā galveni" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:182 -msgid "Move Up" -msgstr "Pārvietot uz augšu" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:187 -msgid "Move Down" -msgstr "Pārvietot uz leju" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:196 -msgid "Step Name" -msgstr "Soļa nosaukums" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:200 -msgid "Step Type" -msgstr "Soļa tips" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:213 -msgid "Step time in Minutes" -msgstr "Soļa laiks minūtēs" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:229 -#, fuzzy -#| msgid "Select one" -msgid "Select File" -msgstr "Izvēlies vienu" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:230 -#: .\cookbook\templates\forms\edit_internal_recipe.html:252 -#: .\cookbook\templates\forms\edit_internal_recipe.html:313 -#: .\cookbook\templates\forms\edit_internal_recipe.html:337 -#: .\cookbook\templates\shopping_list.html:189 -#: .\cookbook\templates\shopping_list.html:211 -#: .\cookbook\templates\shopping_list.html:241 -#: .\cookbook\templates\shopping_list.html:265 -#: .\cookbook\templates\url_import.html:495 -#: .\cookbook\templates\url_import.html:527 -msgid "Select" -msgstr "Atlasīt" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:251 -#, fuzzy -#| msgid "Delete Recipe" -msgid "Select Recipe" -msgstr "Dzēst recepti" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:311 -#: .\cookbook\templates\shopping_list.html:187 -msgid "Select Unit" -msgstr "Atlasiet vienību" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:312 -#: .\cookbook\templates\forms\edit_internal_recipe.html:336 -#: .\cookbook\templates\shopping_list.html:188 -#: .\cookbook\templates\shopping_list.html:210 -msgid "Create" -msgstr "Izveidot" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:335 -#: .\cookbook\templates\shopping_list.html:209 -msgid "Select Food" -msgstr "Atlasīt ēdienu" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:352 -#: .\cookbook\templates\meal_plan.html:256 -#: .\cookbook\templates\url_import.html:542 -msgid "Note" -msgstr "Piezīme" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:369 -msgid "Delete Ingredient" -msgstr "Dzēst sastāvdaļu" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:375 -msgid "Make Header" -msgstr "Izveidot galveni" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:381 -msgid "Make Ingredient" -msgstr "Pagatavot sastāvdaļu" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:387 -msgid "Disable Amount" -msgstr "Atspējot summu" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:393 -msgid "Enable Amount" -msgstr "Iespējot summu" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:398 -msgid "Copy Template Reference" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:424 -#: .\cookbook\templates\url_import.html:297 -#: .\cookbook\templates\url_import.html:567 -msgid "Instructions" -msgstr "Instrukcijas" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:437 -#: .\cookbook\templates\forms\edit_internal_recipe.html:468 -msgid "Save & View" -msgstr "Saglabāt un skatīt" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:441 -#: .\cookbook\templates\forms\edit_internal_recipe.html:474 -msgid "Add Step" -msgstr "Pievienot soli" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:444 -#: .\cookbook\templates\forms\edit_internal_recipe.html:478 -msgid "Add Nutrition" -msgstr "Pievienot uzturu" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:446 -#: .\cookbook\templates\forms\edit_internal_recipe.html:480 -msgid "Remove Nutrition" -msgstr "Noņemt uzturu" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:448 -#: .\cookbook\templates\forms\edit_internal_recipe.html:483 -msgid "View Recipe" -msgstr "Skatīt recepti" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:450 -#: .\cookbook\templates\forms\edit_internal_recipe.html:485 -msgid "Delete Recipe" -msgstr "Dzēst recepti" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:491 -msgid "Steps" -msgstr "Soļi" - #: .\cookbook\templates\forms\ingredients.html:15 msgid "Edit Ingredients" msgstr "Rediģēt sastāvdaļas" @@ -1143,11 +1299,6 @@ msgstr "" "receptes, kas izmanto tās.\n" " " -#: .\cookbook\templates\forms\ingredients.html:24 -#: .\cookbook\templates\space.html:41 .\cookbook\templates\stats.html:26 -msgid "Units" -msgstr "Vienības" - #: .\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?" @@ -1161,29 +1312,48 @@ 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?" -#: .\cookbook\templates\generic\delete_template.html:18 +#: .\cookbook\templates\generic\delete_template.html:21 #, python-format msgid "Are you sure you want to delete the %(title)s: %(object)s " msgstr "Vai tiešām vēlaties izdzēst %(title)s: %(object)s " -#: .\cookbook\templates\generic\edit_template.html:30 +#: .\cookbook\templates\generic\delete_template.html:26 +msgid "Protected" +msgstr "" + +#: .\cookbook\templates\generic\delete_template.html:41 +msgid "Cascade" +msgstr "" + +#: .\cookbook\templates\generic\delete_template.html:72 +msgid "Cancel" +msgstr "" + +#: .\cookbook\templates\generic\edit_template.html:32 msgid "View" msgstr "Skatīt" -#: .\cookbook\templates\generic\edit_template.html:34 +#: .\cookbook\templates\generic\edit_template.html:36 msgid "Delete original file" msgstr "Dzēst sākotnējo failu" #: .\cookbook\templates\generic\list_template.html:6 -#: .\cookbook\templates\generic\list_template.html:12 +#: .\cookbook\templates\generic\list_template.html:22 msgid "List" msgstr "Saraksts" -#: .\cookbook\templates\generic\list_template.html:25 +#: .\cookbook\templates\generic\list_template.html:33 +#: .\cookbook\templates\shopping_list.html:33 +#, fuzzy +#| msgid "Open Shopping List" +msgid "Try the new shopping list" +msgstr "Atvērt iepirkumu sarakstu" + +#: .\cookbook\templates\generic\list_template.html:45 msgid "Filter" msgstr "Filtrs" -#: .\cookbook\templates\generic\list_template.html:30 +#: .\cookbook\templates\generic\list_template.html:50 msgid "Import all" msgstr "Importēt visu" @@ -1209,23 +1379,32 @@ msgstr "Pagatavošanas žurnāls" msgid "Import Recipes" msgstr "Importēt receptes" -#: .\cookbook\templates\include\log_cooking.html:7 +#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 +#: .\cookbook\templates\import_response.html:7 +#: .\cookbook\templates\test.html:14 .\cookbook\templates\test.html:20 +#: .\cookbook\templates\url_import.html:29 +#: .\cookbook\templates\url_import.html:108 +#: .\cookbook\templates\url_import.html:130 +#: .\cookbook\templates\url_import.html:324 +#: .\cookbook\templates\url_import.html:618 .\cookbook\views\delete.py:89 +#: .\cookbook\views\edit.py:200 +msgid "Import" +msgstr "Importēt" + +#: .\cookbook\templates\include\log_cooking.html:9 msgid "Log Recipe Cooking" msgstr "Saglabāt recepšu pagatavošanu žurnālā" -#: .\cookbook\templates\include\log_cooking.html:13 +#: .\cookbook\templates\include\log_cooking.html:15 msgid "All fields are optional and can be left empty." msgstr "Visi lauki nav obligāti, un tos var atstāt tukšus." -#: .\cookbook\templates\include\log_cooking.html:19 +#: .\cookbook\templates\include\log_cooking.html:21 msgid "Rating" msgstr "Vērtējums" -#: .\cookbook\templates\include\log_cooking.html:27 +#: .\cookbook\templates\include\log_cooking.html:29 #: .\cookbook\templates\include\recipe_open_modal.html:18 -#: .\cookbook\templates\meal_plan.html:283 -#: .\cookbook\templates\meal_plan.html:327 -#: .\cookbook\templates\meal_plan.html:366 msgid "Close" msgstr "Aizvērt" @@ -1279,8 +1458,8 @@ msgstr "Atiestatīt meklēšanu" msgid "Last viewed" msgstr "Pēdējoreiz skatīts" -#: .\cookbook\templates\index.html:87 .\cookbook\templates\meal_plan.html:178 -#: .\cookbook\templates\space.html:35 .\cookbook\templates\stats.html:22 +#: .\cookbook\templates\index.html:87 .\cookbook\templates\space.html:37 +#: .\cookbook\templates\stats.html:22 msgid "Recipes" msgstr "Receptes" @@ -1441,150 +1620,23 @@ msgstr "Galvene" msgid "Cell" msgstr "Šūna" -#: .\cookbook\templates\meal_plan.html:101 -msgid "New Entry" -msgstr "Jauns ieraksts" +#: .\cookbook\templates\meal_plan_entry.html:6 +msgid "Meal Plan View" +msgstr "Maltītes plāna skats" -#: .\cookbook\templates\meal_plan.html:113 -#: .\cookbook\templates\shopping_list.html:56 -msgid "Search Recipe" -msgstr "Meklēt recepti" - -#: .\cookbook\templates\meal_plan.html:139 -msgid "Title" -msgstr "Virsraksts" - -#: .\cookbook\templates\meal_plan.html:141 -msgid "Note (optional)" -msgstr "Piezīme (neobligāti)" - -#: .\cookbook\templates\meal_plan.html:143 -msgid "" -"You can use markdown to format this field. See the docs here" -msgstr "" -"Lai formatētu šo lauku, varat izmantot Markdown. Skatiet dokumentāciju " -"šeit" - -#: .\cookbook\templates\meal_plan.html:147 -#: .\cookbook\templates\meal_plan.html:251 -msgid "Serving Count" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:153 -msgid "Create only note" -msgstr "Izveidot tikai piezīmi" - -#: .\cookbook\templates\meal_plan.html:168 -#: .\cookbook\templates\shopping_list.html:7 -#: .\cookbook\templates\shopping_list.html:29 -#: .\cookbook\templates\shopping_list.html:714 -msgid "Shopping List" -msgstr "Iepirkumu saraksts" - -#: .\cookbook\templates\meal_plan.html:172 -msgid "Shopping list currently empty" -msgstr "Iepirkumu saraksts pašlaik ir tukšs" - -#: .\cookbook\templates\meal_plan.html:175 -msgid "Open Shopping List" -msgstr "Atvērt iepirkumu sarakstu" - -#: .\cookbook\templates\meal_plan.html:189 -msgid "Plan" -msgstr "Plāns" - -#: .\cookbook\templates\meal_plan.html:196 -msgid "Number of Days" -msgstr "Dienu skaits" - -#: .\cookbook\templates\meal_plan.html:206 -msgid "Weekday offset" -msgstr "Nedēļas dienas nobīde" - -#: .\cookbook\templates\meal_plan.html:209 -msgid "" -"Number of days starting from the first day of the week to offset the default " -"view." -msgstr "" -"Dienu skaits, sākot no nedēļas pirmās dienas, lai nobīdītu noklusējuma skatu." - -#: .\cookbook\templates\meal_plan.html:217 -#: .\cookbook\templates\meal_plan.html:294 -msgid "Edit plan types" -msgstr "Rediģēt plānu veidus" - -#: .\cookbook\templates\meal_plan.html:219 -msgid "Show help" -msgstr "Parādīt palīdzību" - -#: .\cookbook\templates\meal_plan.html:220 -msgid "Week iCal export" -msgstr "Nedēļas iCal eksports" - -#: .\cookbook\templates\meal_plan.html:264 #: .\cookbook\templates\meal_plan_entry.html:18 msgid "Created by" msgstr "Izveidojis" -#: .\cookbook\templates\meal_plan.html:270 #: .\cookbook\templates\meal_plan_entry.html:20 -#: .\cookbook\templates\shopping_list.html:254 +#: .\cookbook\templates\shopping_list.html:232 msgid "Shared with" msgstr "Kopīgots ar" -#: .\cookbook\templates\meal_plan.html:280 -msgid "Add to Shopping" -msgstr "Pievienot iepirkumiem" - -#: .\cookbook\templates\meal_plan.html:323 -msgid "New meal type" -msgstr "Jauns maltītes veids" - -#: .\cookbook\templates\meal_plan.html:338 -msgid "Meal Plan Help" -msgstr "Ēdienreižu plāna palīdzība" - -#: .\cookbook\templates\meal_plan.html:344 -msgid "" -"\n" -"

The meal plan module allows planning of meals " -"both with recipes and notes.

\n" -"

Simply select a recipe from the list of " -"recently viewed recipes or search the one you\n" -" want and drag it to the desired plan " -"position. You can also add a note and a title and\n" -" then drag the recipe to create a plan entry " -"with a custom title and note. Creating only\n" -" Notes is possible by dragging the create " -"note box into the plan.

\n" -"

Click on a recipe in order to open the " -"detailed view. There you can also add it to the\n" -" shopping list. You can also add all recipes " -"of a day to the shopping list by\n" -" clicking the shopping cart at the top of the " -"table.

\n" -"

Since a common use case is to plan meals " -"together you can define\n" -" users you want to share your plan with in " -"the settings.\n" -"

\n" -"

You can also edit the types of meals you want " -"to plan. If you share your plan with\n" -" someone with\n" -" different meals, their meal types will " -"appear in your list as well. To prevent\n" -" duplicates (e.g. Other and Misc.)\n" -" name your meal types the same as the users " -"you share your meals with and they will be\n" -" merged.

\n" -" " -msgstr "" - -#: .\cookbook\templates\meal_plan_entry.html:6 -msgid "Meal Plan View" -msgstr "Maltītes plāna skats" +#: .\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." @@ -1683,29 +1735,28 @@ msgid "" "recently viewed them. Keep in mind that data might be outdated." msgstr "" -#: .\cookbook\templates\recipe_view.html:21 .\cookbook\templates\space.html:62 -#: .\cookbook\templates\stats.html:47 -msgid "Comments" -msgstr "Komentāri" +#: .\cookbook\templates\recipe_view.html:26 +msgid "by" +msgstr "pēc" -#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:118 -#: .\cookbook\views\edit.py:179 +#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:147 +#: .\cookbook\views\edit.py:180 msgid "Comment" msgstr "Komentēt" #: .\cookbook\templates\recipes_table.html:19 #: .\cookbook\templates\recipes_table.html:23 -#: .\cookbook\templates\url_import.html:440 +#: .\cookbook\templates\url_import.html:447 msgid "Recipe Image" msgstr "Receptes attēls" #: .\cookbook\templates\recipes_table.html:51 -#: .\cookbook\templates\url_import.html:445 +#: .\cookbook\templates\url_import.html:452 msgid "Preparation time ca." msgstr "Pagatavošanas laiks apm." #: .\cookbook\templates\recipes_table.html:57 -#: .\cookbook\templates\url_import.html:450 +#: .\cookbook\templates\url_import.html:457 msgid "Waiting time ca." msgstr "Gaidīšanas laiks apm." @@ -1721,56 +1772,233 @@ msgstr "Veikt ierakstus pagatavošanas žurnālā" msgid "Recipe Home" msgstr "Recepšu Sākums" -#: .\cookbook\templates\settings.html:25 +#: .\cookbook\templates\search_info.html:5 +#: .\cookbook\templates\search_info.html:9 +#: .\cookbook\templates\settings.html:172 +#, fuzzy +#| msgid "Search String" +msgid "Search Settings" +msgstr "Meklēšanas virkne" + +#: .\cookbook\templates\search_info.html:10 +msgid "" +"\n" +" Creating the best search experience is complicated and weighs " +"heavily on your personal configuration. \n" +" Changing any of the search settings can have significant impact on " +"the speed and quality of the results.\n" +" Search Methods, Trigrams and Full Text Search configurations are " +"only available if you are using Postgres for your database.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:19 +#, fuzzy +#| msgid "Search" +msgid "Search Methods" +msgstr "Meklēt" + +#: .\cookbook\templates\search_info.html:23 +msgid "" +" \n" +" Full text searches attempt to normalize the words provided to " +"match common variants. For example: 'forked', 'forking', 'forks' will all " +"normalize to 'fork'.\n" +" There are several methods available, described below, that will " +"control how the search behavior should react when multiple words are " +"searched.\n" +" Full technical details on how these operate can be viewed on Postgresql's website.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:29 +msgid "" +" \n" +" Simple searches ignore punctuation and common words such as " +"'the', 'a', 'and'. And will treat seperate words as required.\n" +" Searching for 'apple or flour' will return any recipe that " +"includes both 'apple' and 'flour' anywhere in the fields that have been " +"selected for a full text search.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:34 +msgid "" +" \n" +" Phrase searches ignore punctuation, but will search for all of " +"the words in the exact order provided.\n" +" Searching for 'apple or flour' will only return a recipe that " +"includes the exact phrase 'apple or flour' in any of the fields that have " +"been selected for a full text search.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:39 +msgid "" +" \n" +" Web searches simulate functionality found on many web search " +"sites supporting special syntax.\n" +" Placing quotes around several words will convert those words " +"into a phrase.\n" +" 'or' is recongized as searching for the word (or phrase) " +"immediately before 'or' OR the word (or phrase) directly after.\n" +" '-' is recognized as searching for recipes that do not include " +"the word (or phrase) that comes immediately after. \n" +" For example searching for 'apple pie' or cherry -butter will " +"return any recipe that includes the phrase 'apple pie' or the word " +"'cherry' \n" +" in any field included in the full text search but exclude any " +"recipe that has the word 'butter' in any field included.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:48 +msgid "" +" \n" +" Raw search is similar to Web except will take puncuation " +"operators such as '|', '&' and '()'\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:59 +msgid "" +" \n" +" Another approach to searching that also requires Postgresql is " +"fuzzy search or trigram similarity. A trigram is a group of three " +"consecutive characters.\n" +" For example searching for 'apple' will create x trigrams 'app', " +"'ppl', 'ple' and will create a score of how closely words match the " +"generated trigrams.\n" +" One benefit of searching trigams is that a search for 'sandwich' " +"will find mispelled words such as 'sandwhich' that would be missed by other " +"methods.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:69 +#, fuzzy +#| msgid "Search Recipe" +msgid "Search Fields" +msgstr "Meklēt recepti" + +#: .\cookbook\templates\search_info.html:73 +msgid "" +" \n" +" Unaccent is a special case in that it enables searching a field " +"'unaccented' for each search style attempting to ignore accented values. \n" +" For example when you enable unaccent for 'Name' any search " +"(starts with, contains, trigram) will attempt the search ignoring accented " +"characters.\n" +" \n" +" For the other options, you can enable search on any or all " +"fields and they will be combined together with an assumed 'OR'.\n" +" For example enabling 'Name' for Starts With, 'Name' and " +"'Description' for Partial Match and 'Ingredients' and 'Keywords' for Full " +"Search\n" +" and searching for 'apple' will generate a search that will " +"return recipes that have:\n" +" - A recipe name that starts with 'apple'\n" +" - OR a recipe name that contains 'apple'\n" +" - OR a recipe description that contains 'apple'\n" +" - OR a recipe that will have a full text search match ('apple' " +"or 'apples') in ingredients\n" +" - OR a recipe that will have a full text search match in " +"Keywords\n" +"\n" +" Combining too many fields in too many types of search can have a " +"negative impact on performance, create duplicate results or return " +"unexpected results.\n" +" For example, enabling fuzzy search or partial matches will " +"interfere with web search methods. \n" +" Searching for 'apple -pie' with fuzzy search and full text " +"search will return the recipe Apple Pie. Though it is not included in the " +"full text results, it does match the trigram results.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:95 +#, fuzzy +#| msgid "Search" +msgid "Search Index" +msgstr "Meklēt" + +#: .\cookbook\templates\search_info.html:99 +msgid "" +" \n" +" Trigram search and Full Text Search both rely on database " +"indexes to perform effectively. \n" +" You can rebuild the indexes on all fields in the Admin page for " +"Recipes and selecting all recipes and running 'rebuild index for selected " +"recipes'\n" +" You can also rebuild indexes at the command line by executing " +"the management command 'python manage.py rebuildindex'\n" +" " +msgstr "" + +#: .\cookbook\templates\settings.html:28 msgid "Account" msgstr "Konts" -#: .\cookbook\templates\settings.html:29 +#: .\cookbook\templates\settings.html:35 msgid "Preferences" msgstr "" -#: .\cookbook\templates\settings.html:33 +#: .\cookbook\templates\settings.html:42 #, fuzzy #| msgid "Settings" msgid "API-Settings" msgstr "Iestatījumi" -#: .\cookbook\templates\settings.html:41 +#: .\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:49 +#: .\cookbook\templates\settings.html:73 #, fuzzy #| msgid "Settings" msgid "Account Settings" msgstr "Iestatījumi" -#: .\cookbook\templates\settings.html:51 +#: .\cookbook\templates\settings.html:75 #, fuzzy #| msgid "Settings" msgid "Emails" msgstr "Iestatījumi" -#: .\cookbook\templates\settings.html:54 +#: .\cookbook\templates\settings.html:78 #: .\cookbook\templates\socialaccount\connections.html:11 msgid "Social" msgstr "" -#: .\cookbook\templates\settings.html:66 +#: .\cookbook\templates\settings.html:91 msgid "Language" msgstr "Valoda" -#: .\cookbook\templates\settings.html:96 +#: .\cookbook\templates\settings.html:121 msgid "Style" msgstr "Stils" -#: .\cookbook\templates\settings.html:116 +#: .\cookbook\templates\settings.html:142 msgid "API Token" msgstr "API Tokens" -#: .\cookbook\templates\settings.html:117 +#: .\cookbook\templates\settings.html:143 msgid "" "You can use both basic authentication and token based authentication to " "access the REST API." @@ -1778,7 +2006,7 @@ msgstr "" "Lai piekļūtu REST API, varat izmantot gan pamata autentifikāciju, gan tokena " "autentifikāciju." -#: .\cookbook\templates\settings.html:134 +#: .\cookbook\templates\settings.html:160 msgid "" "Use the token as an Authorization header prefixed by the word token as shown " "in the following examples:" @@ -1786,10 +2014,68 @@ msgstr "" "Izmantojiet token, kā Authorization header, kas pievienota vārdam token, kā " "parādīts šajos piemēros:" -#: .\cookbook\templates\settings.html:136 +#: .\cookbook\templates\settings.html:162 msgid "or" msgstr "vai" +#: .\cookbook\templates\settings.html:173 +msgid "" +"There are many options to configure the search depending on your personal " +"preferences." +msgstr "" + +#: .\cookbook\templates\settings.html:174 +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 +msgid "" +"If you do want to configure the search you can read about the different " +"options here." +msgstr "" + +#: .\cookbook\templates\settings.html:180 +msgid "Fuzzy" +msgstr "" + +#: .\cookbook\templates\settings.html:181 +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 +msgid "This is the default behavior" +msgstr "" + +#: .\cookbook\templates\settings.html:183 +#: .\cookbook\templates\settings.html:191 +msgid "Apply" +msgstr "" + +#: .\cookbook\templates\settings.html:188 +msgid "Precise" +msgstr "" + +#: .\cookbook\templates\settings.html:189 +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 +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" @@ -1809,50 +2095,73 @@ msgstr "" msgid "Create Superuser account" msgstr "Izveidojiet superlietotāja kontu" -#: .\cookbook\templates\shopping_list.html:79 +#: .\cookbook\templates\shopping_list.html:8 +#: .\cookbook\templates\shopping_list.html:29 +#: .\cookbook\templates\shopping_list.html:663 +msgid "Shopping List" +msgstr "Iepirkumu saraksts" + +#: .\cookbook\templates\shopping_list.html:55 +msgid "Search Recipe" +msgstr "Meklēt recepti" + +#: .\cookbook\templates\shopping_list.html:72 msgid "Shopping Recipes" msgstr "Iepirkšanās receptes" -#: .\cookbook\templates\shopping_list.html:83 +#: .\cookbook\templates\shopping_list.html:74 msgid "No recipes selected" msgstr "Nav izvēlēta neviena recepte" -#: .\cookbook\templates\shopping_list.html:150 +#: .\cookbook\templates\shopping_list.html:131 msgid "Entry Mode" msgstr "" -#: .\cookbook\templates\shopping_list.html:158 +#: .\cookbook\templates\shopping_list.html:139 msgid "Add Entry" msgstr "" -#: .\cookbook\templates\shopping_list.html:174 +#: .\cookbook\templates\shopping_list.html:152 msgid "Amount" msgstr "Summa" -#: .\cookbook\templates\shopping_list.html:240 +#: .\cookbook\templates\shopping_list.html:164 +msgid "Select Unit" +msgstr "Atlasiet vienību" + +#: .\cookbook\templates\shopping_list.html:166 +#: .\cookbook\templates\shopping_list.html:189 +#: .\cookbook\templates\shopping_list.html:219 +#: .\cookbook\templates\shopping_list.html:243 +#: .\cookbook\templates\url_import.html:505 +#: .\cookbook\templates\url_import.html:537 +msgid "Select" +msgstr "Atlasīt" + +#: .\cookbook\templates\shopping_list.html:187 +msgid "Select Food" +msgstr "Atlasīt ēdienu" + +#: .\cookbook\templates\shopping_list.html:218 msgid "Select Supermarket" msgstr "" -#: .\cookbook\templates\shopping_list.html:264 +#: .\cookbook\templates\shopping_list.html:242 msgid "Select User" msgstr "Atlasīt lietotāju" -#: .\cookbook\templates\shopping_list.html:283 +#: .\cookbook\templates\shopping_list.html:258 msgid "Finished" msgstr "Pabeigts" -#: .\cookbook\templates\shopping_list.html:296 +#: .\cookbook\templates\shopping_list.html:267 msgid "You are offline, shopping list might not syncronize." msgstr "Jūs esat bezsaistē. Iepirkumu saraksts netiek sinhronizēts." -#: .\cookbook\templates\shopping_list.html:361 +#: .\cookbook\templates\shopping_list.html:318 msgid "Copy/Export" msgstr "Kopēt/eksportēt" -#: .\cookbook\templates\shopping_list.html:365 -msgid "List Prefix" -msgstr "Saraksta prefikss" - #: .\cookbook\templates\socialaccount\connections.html:4 #: .\cookbook\templates\socialaccount\connections.html:15 msgid "Account Connections" @@ -1902,92 +2211,88 @@ msgstr "" msgid "Sign in using" msgstr "" -#: .\cookbook\templates\space.html:23 +#: .\cookbook\templates\space.html:25 msgid "Space:" msgstr "" -#: .\cookbook\templates\space.html:24 +#: .\cookbook\templates\space.html:26 msgid "Manage Subscription" msgstr "" -#: .\cookbook\templates\space.html:32 .\cookbook\templates\stats.html:19 +#: .\cookbook\templates\space.html:34 .\cookbook\templates\stats.html:19 msgid "Number of objects" msgstr "Objektu skaits" -#: .\cookbook\templates\space.html:45 .\cookbook\templates\stats.html:30 +#: .\cookbook\templates\space.html:54 .\cookbook\templates\stats.html:30 msgid "Recipe Imports" msgstr "Recepšu imports" -#: .\cookbook\templates\space.html:53 .\cookbook\templates\stats.html:38 +#: .\cookbook\templates\space.html:62 .\cookbook\templates\stats.html:38 msgid "Objects stats" msgstr "Objektu statistika" -#: .\cookbook\templates\space.html:56 .\cookbook\templates\stats.html:41 +#: .\cookbook\templates\space.html:65 .\cookbook\templates\stats.html:41 msgid "Recipes without Keywords" msgstr "Receptes bez atslēgas vārdiem" -#: .\cookbook\templates\space.html:58 .\cookbook\templates\stats.html:43 -msgid "External Recipes" -msgstr "Ārējās receptes" - -#: .\cookbook\templates\space.html:60 .\cookbook\templates\stats.html:45 +#: .\cookbook\templates\space.html:73 .\cookbook\templates\stats.html:45 msgid "Internal Recipes" msgstr "Iekšējās receptes" -#: .\cookbook\templates\space.html:73 +#: .\cookbook\templates\space.html:89 msgid "Members" msgstr "" -#: .\cookbook\templates\space.html:77 +#: .\cookbook\templates\space.html:95 #, fuzzy #| msgid "Invite Links" msgid "Invite User" msgstr "Uzaicinājuma saites" -#: .\cookbook\templates\space.html:88 +#: .\cookbook\templates\space.html:107 msgid "User" msgstr "" -#: .\cookbook\templates\space.html:89 +#: .\cookbook\templates\space.html:108 msgid "Groups" msgstr "" -#: .\cookbook\templates\space.html:105 +#: .\cookbook\templates\space.html:119 #, fuzzy #| msgid "Admin" msgid "admin" msgstr "Administrators" -#: .\cookbook\templates\space.html:106 +#: .\cookbook\templates\space.html:120 msgid "user" msgstr "" -#: .\cookbook\templates\space.html:107 +#: .\cookbook\templates\space.html:121 msgid "guest" msgstr "" -#: .\cookbook\templates\space.html:108 +#: .\cookbook\templates\space.html:122 msgid "remove" msgstr "" -#: .\cookbook\templates\space.html:112 +#: .\cookbook\templates\space.html:126 msgid "Update" msgstr "" -#: .\cookbook\templates\space.html:116 +#: .\cookbook\templates\space.html:130 #, fuzzy #| msgid "You cannot edit this storage!" msgid "You cannot edit yourself." msgstr "Jūs nevarat rediģēt šo krātuvi!" -#: .\cookbook\templates\space.html:123 +#: .\cookbook\templates\space.html:136 #, fuzzy #| msgid "There are no recipes in this book yet." msgid "There are no members in your space yet!" msgstr "Šajā grāmatā vēl nav receptes." -#: .\cookbook\templates\space.html:130 .\cookbook\templates\system.html:21 -#: .\cookbook\views\lists.py:115 +#: .\cookbook\templates\space.html:143 .\cookbook\templates\system.html:21 +#: .\cookbook\views\lists.py:85 msgid "Invite Links" msgstr "Uzaicinājuma saites" @@ -1995,6 +2300,10 @@ msgstr "Uzaicinājuma saites" msgid "Stats" msgstr "Statistika" +#: .\cookbook\templates\stats.html:10 +msgid "Statistics" +msgstr "Statistika" + #: .\cookbook\templates\system.html:22 msgid "Show Links" msgstr "Rādīt saites" @@ -2126,159 +2435,186 @@ msgstr "" " funkcijas darbojas tikai ar Postgres datu bāzēm.\n" " " -#: .\cookbook\templates\url_import.html:6 +#: .\cookbook\templates\url_import.html:8 msgid "URL Import" msgstr "URL importēšana" -#: .\cookbook\templates\url_import.html:31 +#: .\cookbook\templates\url_import.html:33 msgid "Drag me to your bookmarks to import recipes from anywhere" msgstr "" -#: .\cookbook\templates\url_import.html:32 +#: .\cookbook\templates\url_import.html:34 #, fuzzy #| msgid "Bookmark saved!" msgid "Bookmark Me!" msgstr "Grāmatzīme saglabāta!" -#: .\cookbook\templates\url_import.html:61 +#: .\cookbook\templates\url_import.html:38 +msgid "URL" +msgstr "" + +#: .\cookbook\templates\url_import.html:40 +msgid "App" +msgstr "" + +#: .\cookbook\templates\url_import.html:64 msgid "Enter website URL" msgstr "Ievadiet vietnes URL" -#: .\cookbook\templates\url_import.html:97 +#: .\cookbook\templates\url_import.html:104 msgid "Select recipe files to import or drop them here..." msgstr "" -#: .\cookbook\templates\url_import.html:118 +#: .\cookbook\templates\url_import.html:125 msgid "Paste json or html source here to load recipe." msgstr "" -#: .\cookbook\templates\url_import.html:146 +#: .\cookbook\templates\url_import.html:153 #, fuzzy #| msgid "View Recipe" msgid "Preview Recipe Data" msgstr "Skatīt recepti" -#: .\cookbook\templates\url_import.html:147 +#: .\cookbook\templates\url_import.html:154 msgid "Drag recipe attributes from the right into the appropriate box below." msgstr "" -#: .\cookbook\templates\url_import.html:156 -#: .\cookbook\templates\url_import.html:173 -#: .\cookbook\templates\url_import.html:190 -#: .\cookbook\templates\url_import.html:209 -#: .\cookbook\templates\url_import.html:227 -#: .\cookbook\templates\url_import.html:242 -#: .\cookbook\templates\url_import.html:257 -#: .\cookbook\templates\url_import.html:273 -#: .\cookbook\templates\url_import.html:300 -#: .\cookbook\templates\url_import.html:351 +#: .\cookbook\templates\url_import.html:163 +#: .\cookbook\templates\url_import.html:180 +#: .\cookbook\templates\url_import.html:197 +#: .\cookbook\templates\url_import.html:216 +#: .\cookbook\templates\url_import.html:234 +#: .\cookbook\templates\url_import.html:249 +#: .\cookbook\templates\url_import.html:264 +#: .\cookbook\templates\url_import.html:280 +#: .\cookbook\templates\url_import.html:307 +#: .\cookbook\templates\url_import.html:358 msgid "Clear Contents" msgstr "" -#: .\cookbook\templates\url_import.html:158 +#: .\cookbook\templates\url_import.html:165 msgid "Text dragged here will be appended to the name." msgstr "" -#: .\cookbook\templates\url_import.html:175 +#: .\cookbook\templates\url_import.html:178 +msgid "Description" +msgstr "" + +#: .\cookbook\templates\url_import.html:182 msgid "Text dragged here will be appended to the description." msgstr "" -#: .\cookbook\templates\url_import.html:192 +#: .\cookbook\templates\url_import.html:199 msgid "Keywords dragged here will be appended to current list" msgstr "" -#: .\cookbook\templates\url_import.html:207 +#: .\cookbook\templates\url_import.html:214 msgid "Image" msgstr "" -#: .\cookbook\templates\url_import.html:239 +#: .\cookbook\templates\url_import.html:246 #, fuzzy #| msgid "Preparation Time" msgid "Prep Time" msgstr "Pagatavošanas laiks" -#: .\cookbook\templates\url_import.html:254 +#: .\cookbook\templates\url_import.html:261 #, fuzzy #| msgid "Time" msgid "Cook Time" msgstr "Laiks" -#: .\cookbook\templates\url_import.html:275 +#: .\cookbook\templates\url_import.html:282 msgid "Ingredients dragged here will be appended to current list." msgstr "" -#: .\cookbook\templates\url_import.html:302 +#: .\cookbook\templates\url_import.html:304 +#: .\cookbook\templates\url_import.html:579 +msgid "Instructions" +msgstr "Instrukcijas" + +#: .\cookbook\templates\url_import.html:309 msgid "" "Recipe instructions dragged here will be appended to current instructions." msgstr "" -#: .\cookbook\templates\url_import.html:325 +#: .\cookbook\templates\url_import.html:332 #, fuzzy #| msgid "Discovered Recipes" msgid "Discovered Attributes" msgstr "Atrastās receptes" -#: .\cookbook\templates\url_import.html:327 +#: .\cookbook\templates\url_import.html:334 msgid "" "Drag recipe attributes from below into the appropriate box on the left. " "Click any node to display its full properties." msgstr "" -#: .\cookbook\templates\url_import.html:344 +#: .\cookbook\templates\url_import.html:351 #, fuzzy #| msgid "Show as header" msgid "Show Blank Field" msgstr "Rādīt kā galveni" -#: .\cookbook\templates\url_import.html:349 +#: .\cookbook\templates\url_import.html:356 msgid "Blank Field" msgstr "" -#: .\cookbook\templates\url_import.html:353 +#: .\cookbook\templates\url_import.html:360 msgid "Items dragged to Blank Field will be appended." msgstr "" -#: .\cookbook\templates\url_import.html:400 +#: .\cookbook\templates\url_import.html:407 #, fuzzy #| msgid "Delete Step" msgid "Delete Text" msgstr "Dzēst soli" -#: .\cookbook\templates\url_import.html:413 +#: .\cookbook\templates\url_import.html:420 #, fuzzy #| msgid "Delete Recipe" msgid "Delete image" msgstr "Dzēst recepti" -#: .\cookbook\templates\url_import.html:429 +#: .\cookbook\templates\url_import.html:436 msgid "Recipe Name" msgstr "Receptes nosaukums" -#: .\cookbook\templates\url_import.html:433 +#: .\cookbook\templates\url_import.html:440 #, fuzzy #| msgid "Recipe Markup Specification" msgid "Recipe Description" msgstr "Recepšu Markup specifikācija" -#: .\cookbook\templates\url_import.html:494 -#: .\cookbook\templates\url_import.html:526 -#: .\cookbook\templates\url_import.html:582 +#: .\cookbook\templates\url_import.html:504 +#: .\cookbook\templates\url_import.html:536 +#: .\cookbook\templates\url_import.html:596 msgid "Select one" msgstr "Izvēlies vienu" -#: .\cookbook\templates\url_import.html:596 +#: .\cookbook\templates\url_import.html:554 +msgid "Note" +msgstr "Piezīme" + +#: .\cookbook\templates\url_import.html:597 +#, fuzzy +#| msgid "All Keywords" +msgid "Add Keyword" +msgstr "Visi atslēgvārdi" + +#: .\cookbook\templates\url_import.html:610 msgid "All Keywords" msgstr "Visi atslēgvārdi" -#: .\cookbook\templates\url_import.html:599 +#: .\cookbook\templates\url_import.html:613 msgid "Import all keywords, not only the ones already existing." msgstr "Importējiet visus atslēgvārdus, ne tikai jau esošos." -#: .\cookbook\templates\url_import.html:626 +#: .\cookbook\templates\url_import.html:640 msgid "Information" msgstr "Informācija" -#: .\cookbook\templates\url_import.html:628 +#: .\cookbook\templates\url_import.html:642 msgid "" " Only websites containing ld+json or microdata information can currently\n" " be imported. Most big recipe pages " @@ -2297,49 +2633,191 @@ msgstr "" "nekautrējieties ievietot piemēru\n" " Github." -#: .\cookbook\templates\url_import.html:636 +#: .\cookbook\templates\url_import.html:650 msgid "Google ld+json Info" msgstr "Google ld+json informācija" -#: .\cookbook\templates\url_import.html:639 +#: .\cookbook\templates\url_import.html:653 msgid "GitHub Issues" msgstr "GitHub Issues" -#: .\cookbook\templates\url_import.html:641 +#: .\cookbook\templates\url_import.html:655 msgid "Recipe Markup Specification" msgstr "Recepšu Markup specifikācija" -#: .\cookbook\views\api.py:79 +#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:170 #, 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:580 .\cookbook\views\views.py:303 -msgid "This feature is not available in the demo version!" +#: .\cookbook\views\api.py:190 .\cookbook\views\api.py:291 +#, python-brace-format +msgid "No {self.basename} with id {pk} exists" msgstr "" -#: .\cookbook\views\api.py:603 +#: .\cookbook\views\api.py:194 +msgid "Cannot merge with the same object!" +msgstr "" + +#: .\cookbook\views\api.py:201 +#, python-brace-format +msgid "No {self.basename} with id {target} exists" +msgstr "" + +#: .\cookbook\views\api.py:206 +msgid "Cannot merge with child object!" +msgstr "" + +#: .\cookbook\views\api.py:239 +#, python-brace-format +msgid "{source.name} was merged successfully with {target.name}" +msgstr "" + +#: .\cookbook\views\api.py:244 +#, python-brace-format +msgid "An error occurred attempting to merge {source.name} with {target.name}" +msgstr "" + +#: .\cookbook\views\api.py:300 +#, python-brace-format +msgid "{child.name} was moved successfully to the root." +msgstr "" + +#: .\cookbook\views\api.py:303 .\cookbook\views\api.py:321 +msgid "An error occurred attempting to move " +msgstr "" + +#: .\cookbook\views\api.py:306 +msgid "Cannot move an object to itself!" +msgstr "" + +#: .\cookbook\views\api.py:312 +#, python-brace-format +msgid "No {self.basename} with id {parent} exists" +msgstr "" + +#: .\cookbook\views\api.py:318 +#, python-brace-format +msgid "{child.name} was moved successfully to parent {parent.name}" +msgstr "" + +#: .\cookbook\views\api.py:470 +#, python-brace-format +msgid "{obj.name} was removed from the shopping list." +msgstr "" + +#: .\cookbook\views\api.py:475 .\cookbook\views\api.py:726 +#, python-brace-format +msgid "{obj.name} was added to the shopping list." +msgstr "" + +#: .\cookbook\views\api.py:587 +msgid "ID of recipe a step is part of. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:588 +msgid "Query string matched (fuzzy) against object name." +msgstr "" + +#: .\cookbook\views\api.py:631 +msgid "" +"Query string matched (fuzzy) against recipe name. In the future also " +"fulltext search." +msgstr "" + +#: .\cookbook\views\api.py:632 +msgid "ID of keyword a recipe should have. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:633 +msgid "ID of food a recipe should have. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:634 +msgid "ID of unit a recipe should have." +msgstr "" + +#: .\cookbook\views\api.py:635 +msgid "Rating a recipe should have. [0 - 5]" +msgstr "" + +#: .\cookbook\views\api.py:636 +msgid "ID of book a recipe should be in. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:637 +msgid "" +"If recipe should have all (AND=false) or any (OR=true) of the " +"provided keywords." +msgstr "" + +#: .\cookbook\views\api.py:638 +msgid "" +"If recipe should have all (AND=false) or any (OR=true) of the " +"provided foods." +msgstr "" + +#: .\cookbook\views\api.py:639 +msgid "" +"If recipe should be in all (AND=false) or any (OR=true) of the " +"provided books." +msgstr "" + +#: .\cookbook\views\api.py:640 +msgid "If only internal recipes should be returned. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:641 +msgid "Returns the results in randomized order. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:642 +msgid "Returns new results first in search results. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:768 +msgid "" +"Returns the shopping list entry with a primary key of id. Multiple values " +"allowed." +msgstr "" + +#: .\cookbook\views\api.py:771 +msgid "" +"Filter shopping list entries on checked. [true, false, both, recent]
- recent includes unchecked items and recently completed items." +msgstr "" + +#: .\cookbook\views\api.py:773 +msgid "Returns the shopping list entries sorted by supermarket category order." +msgstr "" + +#: .\cookbook\views\api.py:922 .\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 "" + +#: .\cookbook\views\api.py:944 msgid "Sync successful!" msgstr "Sinhronizācija ir veiksmīga!" -#: .\cookbook\views\api.py:608 +#: .\cookbook\views\api.py:949 msgid "Error synchronizing with Storage" msgstr "Sinhronizējot ar krātuvi, radās kļūda" -#: .\cookbook\views\api.py:686 +#: .\cookbook\views\api.py:1028 msgid "Nothing to do." msgstr "" -#: .\cookbook\views\api.py:701 +#: .\cookbook\views\api.py:1043 msgid "The requested site provided malformed data and cannot be read." msgstr "Pieprasītā vietne sniedza nepareizus datus, kurus nevar nolasīt." -#: .\cookbook\views\api.py:708 +#: .\cookbook\views\api.py:1050 msgid "The requested page could not be found." msgstr "Pieprasīto lapu nevarēja atrast." -#: .\cookbook\views\api.py:717 +#: .\cookbook\views\api.py:1068 msgid "" "The requested site does not provide any recognized data format to import the " "recipe from." @@ -2347,29 +2825,33 @@ msgstr "" "Pieprasītajā vietnē nav norādīts atzīts datu formāts, no kura varētu " "importēt recepti." -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:1082 +msgid "Connection Refused." +msgstr "" + +#: .\cookbook\views\api.py:1091 #, fuzzy #| msgid "The requested page could not be found." msgid "No useable data could be found." msgstr "Pieprasīto lapu nevarēja atrast." -#: .\cookbook\views\api.py:747 +#: .\cookbook\views\api.py:1107 msgid "I couldn't find anything to do." msgstr "" -#: .\cookbook\views\data.py:31 .\cookbook\views\data.py:122 -#: .\cookbook\views\edit.py:50 .\cookbook\views\import_export.py:67 -#: .\cookbook\views\new.py:32 +#: .\cookbook\views\data.py:34 .\cookbook\views\data.py:129 +#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:80 +#: .\cookbook\views\new.py:33 msgid "You have reached the maximum number of recipes for your space." msgstr "" -#: .\cookbook\views\data.py:35 .\cookbook\views\data.py:126 -#: .\cookbook\views\edit.py:54 .\cookbook\views\import_export.py:71 -#: .\cookbook\views\new.py:36 +#: .\cookbook\views\data.py:38 .\cookbook\views\data.py:133 +#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:84 +#: .\cookbook\views\new.py:37 msgid "You have more users than allowed in your space." msgstr "" -#: .\cookbook\views\data.py:104 +#: .\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." @@ -2377,166 +2859,189 @@ msgstr[0] "Partijas rediģēšana pabeigta. %(count)d recepte tika atjaunināta. msgstr[1] "Partijas rediģēšana pabeigta. %(count)d receptes tika atjauninātas." msgstr[2] "Partijas rediģēšana pabeigta. %(count)d receptes tika atjauninātas." -#: .\cookbook\views\delete.py:72 +#: .\cookbook\views\delete.py:101 msgid "Monitor" msgstr "Uzraudzīt" -#: .\cookbook\views\delete.py:96 .\cookbook\views\lists.py:102 -#: .\cookbook\views\new.py:98 +#: .\cookbook\views\delete.py:125 .\cookbook\views\lists.py:71 +#: .\cookbook\views\new.py:101 msgid "Storage Backend" msgstr "Krātuves aizmugursistēma" -#: .\cookbook\views\delete.py:106 +#: .\cookbook\views\delete.py:135 msgid "" "Could not delete this storage backend as it is used in at least one monitor." msgstr "" "Nevarēja izdzēst šo krātuves aizmugursistēmu, jo tā tiek izmantota vismaz " "vienā uzraugā." -#: .\cookbook\views\delete.py:129 .\cookbook\views\edit.py:213 -#: .\cookbook\views\new.py:156 +#: .\cookbook\views\delete.py:158 msgid "Recipe Book" msgstr "Recepšu grāmata" -#: .\cookbook\views\delete.py:141 +#: .\cookbook\views\delete.py:170 msgid "Bookmarks" msgstr "Grāmatzīmes" -#: .\cookbook\views\delete.py:163 .\cookbook\views\new.py:252 +#: .\cookbook\views\delete.py:192 .\cookbook\views\new.py:238 msgid "Invite Link" msgstr "Uzaicinājuma saite" -#: .\cookbook\views\edit.py:119 -msgid "Food" -msgstr "Ēdiens" - -#: .\cookbook\views\edit.py:128 +#: .\cookbook\views\edit.py:125 msgid "You cannot edit this storage!" msgstr "Jūs nevarat rediģēt šo krātuvi!" -#: .\cookbook\views\edit.py:148 +#: .\cookbook\views\edit.py:149 msgid "Storage saved!" msgstr "Krātuve saglabāta!" -#: .\cookbook\views\edit.py:154 +#: .\cookbook\views\edit.py:155 msgid "There was an error updating this storage backend!" msgstr "Atjauninot šo krātuves aizmugursistēmu, radās kļūda!" -#: .\cookbook\views\edit.py:165 -msgid "Storage" -msgstr "Krātuve" - -#: .\cookbook\views\edit.py:261 +#: .\cookbook\views\edit.py:248 msgid "Changes saved!" msgstr "Izmaiņas saglabātas!" -#: .\cookbook\views\edit.py:265 +#: .\cookbook\views\edit.py:252 msgid "Error saving changes!" msgstr "Saglabājot izmaiņas, radās kļūda!" -#: .\cookbook\views\edit.py:299 -msgid "Units merged!" -msgstr "Vienības ir apvienotas!" - -#: .\cookbook\views\edit.py:301 .\cookbook\views\edit.py:317 -msgid "Cannot merge with the same object!" -msgstr "" - -#: .\cookbook\views\edit.py:315 -msgid "Foods merged!" -msgstr "Ēdieni apvienoti!" - -#: .\cookbook\views\import_export.py:93 +#: .\cookbook\views\import_export.py:106 msgid "Importing is not implemented for this provider" msgstr "" -#: .\cookbook\views\import_export.py:115 +#: .\cookbook\views\import_export.py:127 +msgid "" +"The PDF Exporter is not enabled on this instance as it is still in an " +"experimental state." +msgstr "" + +#: .\cookbook\views\import_export.py:132 msgid "Exporting is not implemented for this provider" msgstr "" -#: .\cookbook\views\lists.py:40 +#: .\cookbook\views\lists.py:25 msgid "Import Log" msgstr "Importēšanas žurnāls" -#: .\cookbook\views\lists.py:53 +#: .\cookbook\views\lists.py:38 msgid "Discovery" msgstr "Atklāšana" -#: .\cookbook\views\lists.py:85 +#: .\cookbook\views\lists.py:54 msgid "Shopping Lists" msgstr "Iepirkšanās saraksti" -#: .\cookbook\views\new.py:123 +#: .\cookbook\views\lists.py:148 +msgid "Supermarkets" +msgstr "" + +#: .\cookbook\views\lists.py:164 +#, fuzzy +#| msgid "Shopping Recipes" +msgid "Shopping Categories" +msgstr "Iepirkšanās receptes" + +#: .\cookbook\views\lists.py:217 +msgid "Steps" +msgstr "Soļi" + +#: .\cookbook\views\lists.py:232 +#, fuzzy +#| msgid "Shopping List" +msgid "New Shopping List" +msgstr "Iepirkumu saraksts" + +#: .\cookbook\views\new.py:126 msgid "Imported new recipe!" msgstr "Importēta jauna recepte!" -#: .\cookbook\views\new.py:126 +#: .\cookbook\views\new.py:129 msgid "There was an error importing this recipe!" msgstr "Importējot šo recepti, radās kļūda!" -#: .\cookbook\views\new.py:226 +#: .\cookbook\views\new.py:212 msgid "Hello" msgstr "" -#: .\cookbook\views\new.py:226 +#: .\cookbook\views\new.py:212 msgid "You have been invited by " msgstr "" -#: .\cookbook\views\new.py:227 +#: .\cookbook\views\new.py:213 msgid " to join their Tandoor Recipes space " msgstr "" -#: .\cookbook\views\new.py:228 +#: .\cookbook\views\new.py:214 msgid "Click the following link to activate your account: " msgstr "" -#: .\cookbook\views\new.py:229 +#: .\cookbook\views\new.py:215 msgid "" "If the link does not work use the following code to manually join the space: " msgstr "" -#: .\cookbook\views\new.py:230 +#: .\cookbook\views\new.py:216 msgid "The invitation is valid until " msgstr "" -#: .\cookbook\views\new.py:231 +#: .\cookbook\views\new.py:217 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " msgstr "" -#: .\cookbook\views\new.py:234 +#: .\cookbook\views\new.py:220 msgid "Tandoor Recipes Invite" msgstr "" -#: .\cookbook\views\new.py:241 +#: .\cookbook\views\new.py:227 msgid "Invite link successfully send to user." msgstr "" -#: .\cookbook\views\new.py:244 +#: .\cookbook\views\new.py:230 msgid "" "You have send to many emails, please share the link manually or wait a few " "hours." msgstr "" -#: .\cookbook\views\new.py:246 +#: .\cookbook\views\new.py:232 msgid "Email to user could not be send, please share link manually." msgstr "" -#: .\cookbook\views\views.py:129 +#: .\cookbook\views\views.py:126 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:177 +#: .\cookbook\views\views.py:174 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:188 +#: .\cookbook\views\views.py:185 msgid "Comment saved!" msgstr "Komentārs saglabāts!" -#: .\cookbook\views\views.py:395 +#: .\cookbook\views\views.py:276 +msgid "This feature is not available in the demo version!" +msgstr "" + +#: .\cookbook\views\views.py:335 +msgid "You must select at least one field to search!" +msgstr "" + +#: .\cookbook\views\views.py:340 +msgid "" +"To use this search method you must select at least one full text search " +"field!" +msgstr "" + +#: .\cookbook\views\views.py:344 +msgid "Fuzzy search is not compatible with this search method!" +msgstr "" + +#: .\cookbook\views\views.py:470 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 " @@ -2546,44 +3051,246 @@ msgstr "" "aizmirsis sava superlietotāja informāciju, lūdzu, skatiet Django " "dokumentāciju par paroļu atiestatīšanu." -#: .\cookbook\views\views.py:402 +#: .\cookbook\views\views.py:477 msgid "Passwords dont match!" msgstr "Paroles nesakrīt!" -#: .\cookbook\views\views.py:418 +#: .\cookbook\views\views.py:493 msgid "User has been created, please login!" msgstr "Lietotājs ir izveidots, lūdzu, piesakieties!" -#: .\cookbook\views\views.py:434 +#: .\cookbook\views\views.py:509 msgid "Malformed Invite Link supplied!" msgstr "Nepareiza uzaicinājuma saite!" -#: .\cookbook\views\views.py:441 +#: .\cookbook\views\views.py:516 #, fuzzy #| msgid "You are not logged in and therefore cannot view this page!" msgid "You are already member of a space and therefore cannot join this one." msgstr "Jūs neesat pieteicies un tāpēc nevarat skatīt šo lapu!" -#: .\cookbook\views\views.py:452 +#: .\cookbook\views\views.py:527 msgid "Successfully joined space." msgstr "" -#: .\cookbook\views\views.py:458 +#: .\cookbook\views\views.py:533 msgid "Invite Link not valid or already used!" msgstr "Uzaicinājuma saite nav derīga vai jau izmantota!" -#: .\cookbook\views\views.py:522 +#: .\cookbook\views\views.py:614 msgid "" "Reporting share links is not enabled for this instance. Please notify the " "page administrator to report problems." msgstr "" -#: .\cookbook\views\views.py:528 +#: .\cookbook\views\views.py:620 msgid "" "Recipe sharing link has been disabled! For additional information please " "contact the page administrator." msgstr "" +#~ msgid "New Unit" +#~ msgstr "Jaunā vienība" + +#~ msgid "New unit that other gets replaced by." +#~ msgstr "Jauna vienība, ar kuru cits tiek aizstāts." + +#~ msgid "Old Unit" +#~ msgstr "Vecā vienība" + +#~ msgid "Unit that should be replaced." +#~ msgstr "Vienība, kas jāaizstāj." + +#~ msgid "New Food" +#~ msgstr "Jauns ēdiens" + +#~ msgid "New food that other gets replaced by." +#~ msgstr "Jauns ēdiens, ar kuru citi tiek aizstāti." + +#~ msgid "Old Food" +#~ msgstr "Vecais ēdiens" + +#~ msgid "New Entry" +#~ msgstr "Jauns ieraksts" + +#~ msgid "Title" +#~ msgstr "Virsraksts" + +#~ msgid "Note (optional)" +#~ msgstr "Piezīme (neobligāti)" + +#~ msgid "" +#~ "You can use markdown to format this field. See the docs here" +#~ msgstr "" +#~ "Lai formatētu šo lauku, varat izmantot Markdown. Skatiet dokumentāciju " +#~ "šeit" + +#~ msgid "Create only note" +#~ msgstr "Izveidot tikai piezīmi" + +#~ msgid "Plan" +#~ msgstr "Plāns" + +#~ msgid "Number of Days" +#~ msgstr "Dienu skaits" + +#~ msgid "Weekday offset" +#~ msgstr "Nedēļas dienas nobīde" + +#~ msgid "" +#~ "Number of days starting from the first day of the week to offset the " +#~ "default view." +#~ msgstr "" +#~ "Dienu skaits, sākot no nedēļas pirmās dienas, lai nobīdītu noklusējuma " +#~ "skatu." + +#~ msgid "Edit plan types" +#~ msgstr "Rediģēt plānu veidus" + +#~ msgid "Show help" +#~ msgstr "Parādīt palīdzību" + +#~ msgid "Week iCal export" +#~ msgstr "Nedēļas iCal eksports" + +#~ msgid "Add to Shopping" +#~ msgstr "Pievienot iepirkumiem" + +#~ msgid "New meal type" +#~ msgstr "Jauns maltītes veids" + +#~ msgid "Meal Plan Help" +#~ msgstr "Ēdienreižu plāna palīdzība" + +#~ msgid "Units merged!" +#~ msgstr "Vienības ir apvienotas!" + +#~ msgid "Foods merged!" +#~ msgstr "Ēdieni apvienoti!" + +#~ msgid "Utensils" +#~ msgstr "Piederumi" + +#~ msgid "Storage Data" +#~ msgstr "Krātuves dati" + +#~ msgid "Storage Backends" +#~ msgstr "Krātuves backendi" + +#~ msgid "Configure Sync" +#~ msgstr "Konfigurēt sinhronizāciju" + +#~ msgid "Discovered Recipes" +#~ msgstr "Atrastās receptes" + +#~ msgid "Discovery Log" +#~ msgstr "Atrastās žurnāls" + +#~ msgid "Units & Ingredients" +#~ msgstr "Vienības un sastāvdaļas" + +#~ msgid "New Book" +#~ msgstr "Jauna grāmata" + +#~ msgid "Toggle Recipes" +#~ msgstr "Pārslēgt receptes" + +#~ msgid "There are no recipes in this book yet." +#~ msgstr "Šajā grāmatā vēl nav receptes." + +#~ msgid "Waiting Time" +#~ msgstr "Gaidīšanas laiks" + +#~ msgid "Select Keywords" +#~ msgstr "Atlasīt atslēgvārdus" + +#~ msgid "Nutrition" +#~ msgstr "Uzturs" + +#~ msgid "Delete Step" +#~ msgstr "Dzēst soli" + +#~ msgid "Calories" +#~ msgstr "Kalorijas" + +#~ msgid "Carbohydrates" +#~ msgstr "Ogļhidrāti" + +#~ msgid "Fats" +#~ msgstr "Tauki" + +#~ msgid "Proteins" +#~ msgstr "Olbaltumvielas" + +#~ msgid "Step" +#~ msgstr "Solis" + +#~ msgid "Show as header" +#~ msgstr "Rādīt kā galveni" + +#~ msgid "Hide as header" +#~ msgstr "Slēpt kā galveni" + +#~ msgid "Move Up" +#~ msgstr "Pārvietot uz augšu" + +#~ msgid "Move Down" +#~ msgstr "Pārvietot uz leju" + +#~ msgid "Step Name" +#~ msgstr "Soļa nosaukums" + +#~ msgid "Step Type" +#~ msgstr "Soļa tips" + +#~ msgid "Step time in Minutes" +#~ msgstr "Soļa laiks minūtēs" + +#, fuzzy +#~| msgid "Select one" +#~ msgid "Select File" +#~ msgstr "Izvēlies vienu" + +#, fuzzy +#~| msgid "Delete Recipe" +#~ msgid "Select Recipe" +#~ msgstr "Dzēst recepti" + +#~ msgid "Delete Ingredient" +#~ msgstr "Dzēst sastāvdaļu" + +#~ msgid "Make Header" +#~ msgstr "Izveidot galveni" + +#~ msgid "Make Ingredient" +#~ msgstr "Pagatavot sastāvdaļu" + +#~ msgid "Disable Amount" +#~ msgstr "Atspējot summu" + +#~ msgid "Enable Amount" +#~ msgstr "Iespējot summu" + +#~ msgid "Save & View" +#~ msgstr "Saglabāt un skatīt" + +#~ msgid "Add Step" +#~ msgstr "Pievienot soli" + +#~ msgid "Add Nutrition" +#~ msgstr "Pievienot uzturu" + +#~ msgid "Remove Nutrition" +#~ msgstr "Noņemt uzturu" + +#~ msgid "View Recipe" +#~ msgstr "Skatīt recepti" + +#~ msgid "Delete Recipe" +#~ msgstr "Dzēst recepti" + #~ msgid "" #~ "A username is not required, if left blank the new user can choose one." #~ msgstr "" diff --git a/cookbook/locale/nl/LC_MESSAGES/django.mo b/cookbook/locale/nl/LC_MESSAGES/django.mo index 284ded70..175ca41f 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 ab4b1606..ec5fbfb0 100644 --- a/cookbook/locale/nl/LC_MESSAGES/django.po +++ b/cookbook/locale/nl/LC_MESSAGES/django.po @@ -12,8 +12,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-08-17 08:44+0200\n" -"PO-Revision-Date: 2021-08-24 18:28+0000\n" +"POT-Creation-Date: 2022-01-18 14:52+0100\n" +"PO-Revision-Date: 2022-02-09 01:31+0000\n" "Last-Translator: Jesse \n" "Language-Team: Dutch \n" @@ -22,17 +22,68 @@ 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.7.2\n" +"X-Generator: Weblate 4.10.1\n" -#: .\cookbook\filters.py:23 .\cookbook\templates\base.html:98 -#: .\cookbook\templates\forms\edit_internal_recipe.html:269 -#: .\cookbook\templates\forms\ingredients.html:34 -#: .\cookbook\templates\space.html:43 .\cookbook\templates\stats.html:28 -#: .\cookbook\templates\url_import.html:270 .\cookbook\views\lists.py:67 +#: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 +#: .\cookbook\templates\space.html:50 .\cookbook\templates\stats.html:28 +#: .\cookbook\templates\url_import.html:277 msgid "Ingredients" msgstr "Ingrediënten" -#: .\cookbook\forms.py:49 +#: .\cookbook\forms.py:56 +msgid "Default unit" +msgstr "Standaard eenheid" + +#: .\cookbook\forms.py:57 +msgid "Use fractions" +msgstr "Gebruik fracties" + +#: .\cookbook\forms.py:58 +msgid "Use KJ" +msgstr "Gebruik KJ" + +#: .\cookbook\forms.py:59 +msgid "Theme" +msgstr "Thema" + +#: .\cookbook\forms.py:60 +msgid "Navbar color" +msgstr "Navbar kleur" + +#: .\cookbook\forms.py:61 +msgid "Sticky navbar" +msgstr "Plak navbar" + +#: .\cookbook\forms.py:62 +msgid "Default page" +msgstr "Standaard pagina" + +#: .\cookbook\forms.py:63 +msgid "Show recent recipes" +msgstr "Toon recente recepten" + +#: .\cookbook\forms.py:64 +msgid "Search style" +msgstr "Zoekstijl" + +#: .\cookbook\forms.py:65 +msgid "Plan sharing" +msgstr "Plan delen" + +#: .\cookbook\forms.py:66 +msgid "Ingredient decimal places" +msgstr "Ingrediënt decimalen" + +#: .\cookbook\forms.py:67 +msgid "Shopping list auto sync period" +msgstr "Boodschappenlijst auto sync periode" + +#: .\cookbook\forms.py:68 .\cookbook\templates\recipe_view.html:21 +#: .\cookbook\templates\space.html:77 .\cookbook\templates\stats.html:47 +msgid "Comments" +msgstr "Opmerkingen" + +#: .\cookbook\forms.py:72 msgid "" "Color of the top navigation bar. Not all colors work with all themes, just " "try them out!" @@ -40,13 +91,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:51 +#: .\cookbook\forms.py:74 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:53 +#: .\cookbook\forms.py:76 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" @@ -54,27 +105,33 @@ msgstr "" "Mogelijk maken van breuken bij ingrediënt aantallen (het automatisch " "converteren van decimalen naar breuken)" -#: .\cookbook\forms.py:56 -msgid "" -"Users with whom newly created meal plan/shopping list entries should be " -"shared by default." -msgstr "" -"Gebruikers waarmee nieuwe maaltijdplannen/boodschappenlijstjes standaard " -"gedeeld moeten worden." +#: .\cookbook\forms.py:78 +msgid "Display nutritional energy amounts in joules instead of calories" +msgstr "Geef energiewaardes weer in joules in plaats van calorieën" -#: .\cookbook\forms.py:58 +#: .\cookbook\forms.py:79 +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:80 +msgid "Users with whom to share shopping lists." +msgstr "Gebruikers waarmee boodschappenlijsten gedeeld moeten worden." + +#: .\cookbook\forms.py:82 msgid "Show recently viewed recipes on search page." msgstr "Geef recent bekeken recepten op de zoekpagina weer." -#: .\cookbook\forms.py:59 +#: .\cookbook\forms.py:83 msgid "Number of decimals to round ingredients." msgstr "Aantal decimalen om ingrediënten op af te ronden." -#: .\cookbook\forms.py:60 +#: .\cookbook\forms.py:84 msgid "If you want to be able to create and see comments underneath recipes." -msgstr "Als je opmerkingen bij recepten wil kunnen maken en zien." +msgstr "Als je opmerkingen onder recepten wil kunnen maken en zien." -#: .\cookbook\forms.py:62 +#: .\cookbook\forms.py:86 .\cookbook\forms.py:493 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. " @@ -87,11 +144,19 @@ msgstr "" "gelijktijdig boodschappen doen maar verbruikt mogelijk extra mobiele data. " "Wordt gereset bij opslaan wanneer de limiet niet bereikt is." -#: .\cookbook\forms.py:65 +#: .\cookbook\forms.py:89 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:81 +#: .\cookbook\forms.py:90 .\cookbook\forms.py:496 +msgid "Automatically add meal plan ingredients to shopping list." +msgstr "Zet maaltijdplan ingrediënten automatisch op boodschappenlijst." + +#: .\cookbook\forms.py:91 +msgid "Exclude ingredients that are on hand." +msgstr "Sluit ingrediënten die op voorraad zijn uit." + +#: .\cookbook\forms.py:108 msgid "" "Both fields are optional. If none are given the username will be displayed " "instead" @@ -99,42 +164,39 @@ msgstr "" "Beide velden zijn optioneel. Indien niks is opgegeven wordt de " "gebruikersnaam weergegeven" -#: .\cookbook\forms.py:102 .\cookbook\forms.py:331 -#: .\cookbook\templates\forms\edit_internal_recipe.html:49 -#: .\cookbook\templates\url_import.html:154 +#: .\cookbook\forms.py:129 .\cookbook\forms.py:298 +#: .\cookbook\templates\url_import.html:161 msgid "Name" msgstr "Naam" -#: .\cookbook\forms.py:103 .\cookbook\forms.py:332 -#: .\cookbook\templates\base.html:108 .\cookbook\templates\base.html:169 -#: .\cookbook\templates\forms\edit_internal_recipe.html:85 -#: .\cookbook\templates\space.html:39 .\cookbook\templates\stats.html:24 -#: .\cookbook\templates\url_import.html:188 -#: .\cookbook\templates\url_import.html:573 +#: .\cookbook\forms.py:130 .\cookbook\forms.py:299 +#: .\cookbook\templates\space.html:44 .\cookbook\templates\stats.html:24 +#: .\cookbook\templates\url_import.html:195 +#: .\cookbook\templates\url_import.html:585 .\cookbook\views\lists.py:97 msgid "Keywords" msgstr "Etiketten" -#: .\cookbook\forms.py:104 +#: .\cookbook\forms.py:131 msgid "Preparation time in minutes" msgstr "Voorbereidingstijd in minuten" -#: .\cookbook\forms.py:105 +#: .\cookbook\forms.py:132 msgid "Waiting time (cooking/baking) in minutes" msgstr "Wacht tijd in minuten (koken en bakken)" -#: .\cookbook\forms.py:106 .\cookbook\forms.py:333 +#: .\cookbook\forms.py:133 .\cookbook\forms.py:267 .\cookbook\forms.py:300 msgid "Path" msgstr "Pad" -#: .\cookbook\forms.py:107 +#: .\cookbook\forms.py:134 msgid "Storage UID" msgstr "Opslag UID" -#: .\cookbook\forms.py:133 +#: .\cookbook\forms.py:164 msgid "Default" msgstr "Standaard waarde" -#: .\cookbook\forms.py:144 .\cookbook\templates\url_import.html:90 +#: .\cookbook\forms.py:175 .\cookbook\templates\url_import.html:97 msgid "" "To prevent duplicates recipes with the same name as existing ones are " "ignored. Check this box to import everything." @@ -142,51 +204,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:164 -msgid "New Unit" -msgstr "Nieuwe eenheid" - -#: .\cookbook\forms.py:165 -msgid "New unit that other gets replaced by." -msgstr "Nieuwe eenheid waarmee de andere wordt vervangen." - -#: .\cookbook\forms.py:170 -msgid "Old Unit" -msgstr "Oude eenheid" - -#: .\cookbook\forms.py:171 -msgid "Unit that should be replaced." -msgstr "Eenheid die vervangen dient te worden." - -#: .\cookbook\forms.py:187 -msgid "New Food" -msgstr "Nieuw Ingredïent" - -#: .\cookbook\forms.py:188 -msgid "New food that other gets replaced by." -msgstr "Nieuw Ingredïent dat Oud Ingrediënt vervangt." - -#: .\cookbook\forms.py:193 -msgid "Old Food" -msgstr "Oud Ingrediënt" - -#: .\cookbook\forms.py:194 -msgid "Food that should be replaced." -msgstr "Te vervangen Ingrediënt." - -#: .\cookbook\forms.py:212 +#: .\cookbook\forms.py:197 msgid "Add your comment: " msgstr "Voeg een opmerking toe: " -#: .\cookbook\forms.py:253 +#: .\cookbook\forms.py:212 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:260 +#: .\cookbook\forms.py:219 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:269 +#: .\cookbook\forms.py:228 msgid "" "Leave empty for dropbox and enter only base url for nextcloud (/remote." "php/webdav/ is added automatically)" @@ -194,26 +224,33 @@ msgstr "" "Laat leeg voor dropbox en vul enkel de base url voor nextcloud in. (/" "remote.php/webdav/ wordt automatisch toegevoegd.)" -#: .\cookbook\forms.py:307 +#: .\cookbook\forms.py:266 .\cookbook\views\edit.py:166 +msgid "Storage" +msgstr "Opslag" + +#: .\cookbook\forms.py:268 +msgid "Active" +msgstr "Actief" + +#: .\cookbook\forms.py:274 msgid "Search String" msgstr "Zoekopdracht" -#: .\cookbook\forms.py:334 +#: .\cookbook\forms.py:301 msgid "File ID" msgstr "Bestands ID" -#: .\cookbook\forms.py:370 +#: .\cookbook\forms.py:323 msgid "You must provide at least a recipe or a title." msgstr "Je moet minimaal één recept of titel te specificeren." -#: .\cookbook\forms.py:383 +#: .\cookbook\forms.py:336 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:384 -#: .\cookbook\templates\forms\edit_internal_recipe.html:427 +#: .\cookbook\forms.py:337 msgid "" "You can use markdown to format this field. See the docs here" @@ -221,30 +258,234 @@ msgstr "" "Je kunt markdown gebruiken om dit veld te op te maken. Bekijk de documentatie hier" -#: .\cookbook\forms.py:409 +#: .\cookbook\forms.py:363 msgid "Maximum number of users for this space reached." msgstr "Maximum aantal gebruikers voor deze ruimte bereikt." -#: .\cookbook\forms.py:415 +#: .\cookbook\forms.py:369 msgid "Email address already taken!" msgstr "E-mailadres reeds in gebruik!" -#: .\cookbook\forms.py:423 +#: .\cookbook\forms.py:377 msgid "" -"An email address is not required but if present the invite link will be send " +"An email address is not required but if present the invite link will be sent " "to the user." msgstr "" "Een e-mailadres is niet vereist, maar indien aanwezig zal de " "uitnodigingslink naar de gebruiker worden gestuurd." -#: .\cookbook\forms.py:438 +#: .\cookbook\forms.py:392 msgid "Name already taken." msgstr "Naam reeds in gebruik." -#: .\cookbook\forms.py:449 +#: .\cookbook\forms.py:403 msgid "Accept Terms and Privacy" msgstr "Accepteer voorwaarden" +#: .\cookbook\forms.py:435 +msgid "" +"Determines how fuzzy a search is if it uses trigram similarity matching (e." +"g. low values mean more typos are ignored)." +msgstr "" +"Bepaalt hoe 'fuzzy' een zoekopdracht is als het trigram vergelijken gebruikt " +"(lage waarden betekenen bijvoorbeeld dat meer typefouten genegeerd worden)." + +#: .\cookbook\forms.py:445 +msgid "" +"Select type method of search. Click here for " +"full desciption of choices." +msgstr "" +"Selecteer zoekmethode. Klik hier voor een " +"beschrijving van de keuzes." + +#: .\cookbook\forms.py:446 +msgid "" +"Use fuzzy matching on units, keywords and ingredients when editing and " +"importing recipes." +msgstr "" +"Gebruik 'fuzzy' koppelen bij eenheden, etiketten en ingrediënten bij " +"bewerken en importeren van recepten." + +#: .\cookbook\forms.py:448 +msgid "" +"Fields to search ignoring accents. Selecting this option can improve or " +"degrade search quality depending on language" +msgstr "" +"Velden doorzoeken waarbij accenten genegeerd worden. Het selecteren van " +"deze optie kan de zoekkwaliteit afhankelijk van de taal, zowel verbeteren " +"als verslechteren" + +#: .\cookbook\forms.py:450 +msgid "" +"Fields to search for partial matches. (e.g. searching for 'Pie' will return " +"'pie' and 'piece' and 'soapie')" +msgstr "" +"Velden doorzoeken op gedeelde overeenkomsten. (zoeken op 'Appel' vindt " +"'appel', 'aardappel' en 'appelsap')" + +#: .\cookbook\forms.py:452 +msgid "" +"Fields to search for beginning of word matches. (e.g. searching for 'sa' " +"will return 'salad' and 'sandwich')" +msgstr "" +"Velden doorzoeken op overeenkomsten aan het begin van het woord. (zoeken op " +"'sa' vindt 'salade' en 'sandwich')" + +#: .\cookbook\forms.py:454 +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 "" +"Velden 'fuzzy' doorzoeken. (zoeken op 'recetp' vindt ook 'recept') Noot: " +"deze optie conflicteert met de zoekmethoden 'web' en 'raw'." + +#: .\cookbook\forms.py:456 +msgid "" +"Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " +"only function with fulltext fields." +msgstr "" +"Velden doorzoeken op volledige tekst. Noot: Web, Zin en Raw zoekmethoden " +"werken alleen met volledige tekstvelden." + +#: .\cookbook\forms.py:460 +msgid "Search Method" +msgstr "Zoekmethode" + +#: .\cookbook\forms.py:461 +msgid "Fuzzy Lookups" +msgstr "'Fuzzy' zoekopdrachten" + +#: .\cookbook\forms.py:462 +msgid "Ignore Accent" +msgstr "Negeer accent" + +#: .\cookbook\forms.py:463 +msgid "Partial Match" +msgstr "Gedeeltelijke overeenkomst" + +#: .\cookbook\forms.py:464 +msgid "Starts Wtih" +msgstr "Begint met" + +#: .\cookbook\forms.py:465 +msgid "Fuzzy Search" +msgstr "'Fuzzy' zoeken" + +#: .\cookbook\forms.py:466 +msgid "Full Text" +msgstr "Volledige tekst" + +#: .\cookbook\forms.py:491 +msgid "" +"Users will see all items you add to your shopping list. They must add you " +"to see items on their list." +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:497 +msgid "" +"When adding a meal plan to the shopping list (manually or automatically), " +"include all related recipes." +msgstr "" +"Als een maaltijdplan aan de boodschappenlijst toegevoegd wordt (handmatig of " +"automatisch), neem dan alle recepten op." + +#: .\cookbook\forms.py:498 +msgid "" +"When adding a meal plan to the shopping list (manually or automatically), " +"exclude ingredients that are on hand." +msgstr "" +"Als een maaltijdplan aan de boodschappenlijst toegevoegd wordt (handmatig of " +"automatisch), sluit ingrediënten die op voorraad zijn dan uit." + +#: .\cookbook\forms.py:499 +msgid "Default number of hours to delay a shopping list entry." +msgstr "Standaard aantal uren om een boodschappenlijst item te vertragen." + +#: .\cookbook\forms.py:500 +msgid "Filter shopping list to only include supermarket categories." +msgstr "Filter boodschappenlijst om alleen supermarktcategorieën te bevatten." + +#: .\cookbook\forms.py:501 +msgid "Days of recent shopping list entries to display." +msgstr "Dagen van recente boodschappenlijst items weer te geven." + +#: .\cookbook\forms.py:502 +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:503 +msgid "Delimiter to use for CSV exports." +msgstr "Scheidingsteken te gebruiken voor CSV exports." + +#: .\cookbook\forms.py:504 +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:508 +msgid "Share Shopping List" +msgstr "Deel boodschappenlijst" + +#: .\cookbook\forms.py:509 +msgid "Autosync" +msgstr "Autosync" + +#: .\cookbook\forms.py:510 +msgid "Auto Add Meal Plan" +msgstr "Voeg maaltijdplan automatisch toe" + +#: .\cookbook\forms.py:511 +msgid "Exclude On Hand" +msgstr "Sluit op voorraad uit" + +#: .\cookbook\forms.py:512 +msgid "Include Related" +msgstr "Neem gerelateerde op" + +#: .\cookbook\forms.py:513 +msgid "Default Delay Hours" +msgstr "Standaard vertraging in uren" + +#: .\cookbook\forms.py:514 +msgid "Filter to Supermarket" +msgstr "Filter op supermarkt" + +#: .\cookbook\forms.py:515 +msgid "Recent Days" +msgstr "Afgelopen dagen" + +#: .\cookbook\forms.py:516 +msgid "CSV Delimiter" +msgstr "CSV scheidingsteken" + +#: .\cookbook\forms.py:517 .\cookbook\templates\shopping_list.html:322 +msgid "List Prefix" +msgstr "Lijst voorvoegsel" + +#: .\cookbook\forms.py:518 +msgid "Auto On Hand" +msgstr "Auto op voorraad" + +#: .\cookbook\forms.py:528 +msgid "Reset Food Inheritance" +msgstr "Herstel Ingrediënt overname" + +#: .\cookbook\forms.py:529 +msgid "Reset all food to inherit the fields configured." +msgstr "Herstel alle ingrediënten om de geconfigureerde velden over te nemen." + +#: .\cookbook\forms.py:541 +msgid "Fields on food that should be inherited by default." +msgstr "Velden van ingrediënten die standaard overgenomen moeten worden." + +#: .\cookbook\forms.py:542 +msgid "Show recipe counts on search filters" +msgstr "Toon recepten teller bij zoekfilters" + #: .\cookbook\helper\AllAuthCustomAdapter.py:36 msgid "" "In order to prevent spam, the requested email was not send. Please wait a " @@ -253,56 +494,55 @@ 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:138 -#: .\cookbook\helper\permission_helper.py:161 .\cookbook\views\views.py:151 +#: .\cookbook\helper\permission_helper.py:136 +#: .\cookbook\helper\permission_helper.py:159 .\cookbook\views\views.py:148 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:142 -#: .\cookbook\helper\permission_helper.py:148 -#: .\cookbook\helper\permission_helper.py:173 -#: .\cookbook\helper\permission_helper.py:218 -#: .\cookbook\helper\permission_helper.py:232 -#: .\cookbook\helper\permission_helper.py:243 -#: .\cookbook\helper\permission_helper.py:254 .\cookbook\views\data.py:40 -#: .\cookbook\views\views.py:162 .\cookbook\views\views.py:169 -#: .\cookbook\views\views.py:259 +#: .\cookbook\helper\permission_helper.py:140 +#: .\cookbook\helper\permission_helper.py:146 +#: .\cookbook\helper\permission_helper.py:171 +#: .\cookbook\helper\permission_helper.py:219 +#: .\cookbook\helper\permission_helper.py:233 +#: .\cookbook\helper\permission_helper.py:244 +#: .\cookbook\helper\permission_helper.py:255 .\cookbook\views\data.py:47 +#: .\cookbook\views\views.py:159 .\cookbook\views\views.py:166 +#: .\cookbook\views\views.py:232 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:166 -#: .\cookbook\helper\permission_helper.py:189 -#: .\cookbook\helper\permission_helper.py:204 +#: .\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 "" "Interactie met dit object is niet mogelijk omdat je niet de eigenaar bent!" -#: .\cookbook\helper\template_helper.py:60 -#: .\cookbook\helper\template_helper.py:62 +#: .\cookbook\helper\recipe_search.py:473 +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:54 +msgid "You must supply a recipe or mealplan" +msgstr "Je moet een recept of maaltijdplan aanleveren" + +#: .\cookbook\helper\shopping_helper.py:58 +msgid "You must supply a created_by" +msgstr "Je moet een created_by aanleveren" + +#: .\cookbook\helper\template_helper.py:61 +#: .\cookbook\helper\template_helper.py:63 msgid "Could not parse template code." msgstr "Sjablooncode kon niet verwerkt worden." -#: .\cookbook\integration\integration.py:104 -#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 -#: .\cookbook\templates\import_response.html:7 -#: .\cookbook\templates\test.html:14 .\cookbook\templates\test.html:20 -#: .\cookbook\templates\url_import.html:27 -#: .\cookbook\templates\url_import.html:101 -#: .\cookbook\templates\url_import.html:123 -#: .\cookbook\templates\url_import.html:317 -#: .\cookbook\templates\url_import.html:604 .\cookbook\views\delete.py:60 -#: .\cookbook\views\edit.py:199 -msgid "Import" -msgstr "Importeer" - -#: .\cookbook\integration\integration.py:185 +#: .\cookbook\integration\integration.py:200 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:188 +#: .\cookbook\integration\integration.py:203 msgid "" "An unexpected error occurred during the import. Please make sure you have " "uploaded a valid file." @@ -310,11 +550,11 @@ msgstr "" "Er is een onverwachte fout opgetreden tijdens het importeren. Controleer of " "u een geldig bestand hebt geüpload." -#: .\cookbook\integration\integration.py:192 +#: .\cookbook\integration\integration.py:208 msgid "The following recipes were ignored because they already existed:" msgstr "De volgende recepten zijn genegeerd omdat ze al bestonden:" -#: .\cookbook\integration\integration.py:196 +#: .\cookbook\integration\integration.py:212 #, python-format msgid "Imported %s recipes." msgstr "%s recepten geïmporteerd." @@ -327,37 +567,53 @@ msgstr "Notities" msgid "Nutritional Information" msgstr "Voedingswaarde" -#: .\cookbook\integration\paprika.py:53 +#: .\cookbook\integration\paprika.py:53 .\cookbook\templates\url_import.html:42 msgid "Source" msgstr "Bron" -#: .\cookbook\integration\safron.py:23 -#: .\cookbook\templates\forms\edit_internal_recipe.html:79 -#: .\cookbook\templates\include\log_cooking.html:16 -#: .\cookbook\templates\url_import.html:224 -#: .\cookbook\templates\url_import.html:455 +#: .\cookbook\integration\saffron.py:23 +#: .\cookbook\templates\include\log_cooking.html:18 +#: .\cookbook\templates\url_import.html:231 +#: .\cookbook\templates\url_import.html:462 msgid "Servings" msgstr "Porties" -#: .\cookbook\integration\safron.py:25 +#: .\cookbook\integration\saffron.py:25 msgid "Waiting time" msgstr "Wachttijd" -#: .\cookbook\integration\safron.py:27 -#: .\cookbook\templates\forms\edit_internal_recipe.html:73 +#: .\cookbook\integration\saffron.py:27 msgid "Preparation Time" msgstr "Bereidingstijd" -#: .\cookbook\integration\safron.py:29 .\cookbook\templates\base.html:78 +#: .\cookbook\integration\saffron.py:29 .\cookbook\templates\base.html:78 #: .\cookbook\templates\forms\ingredients.html:7 #: .\cookbook\templates\index.html:7 msgid "Cookbook" msgstr "Kookboek" -#: .\cookbook\integration\safron.py:31 +#: .\cookbook\integration\saffron.py:31 msgid "Section" msgstr "Sectie" +#: .\cookbook\management\commands\rebuildindex.py:14 +msgid "Rebuilds full text search index on Recipe" +msgstr "Herbouwt de volledige tekst zoekindex van Recept" + +#: .\cookbook\management\commands\rebuildindex.py:18 +msgid "Only Postgress databases use full text search, no index to rebuild" +msgstr "" +"Alleen Postgress databases gebruiken volledige tekst zoekmethoden, geen " +"index aanwezig om te herbouwen" + +#: .\cookbook\management\commands\rebuildindex.py:29 +msgid "Recipe index rebuild complete." +msgstr "Recept index herbouw afgerond." + +#: .\cookbook\management\commands\rebuildindex.py:31 +msgid "Recipe index rebuild failed." +msgstr "Recept index herbouw mislukt." + #: .\cookbook\migrations\0047_auto_20200602_1133.py:14 msgid "Breakfast" msgstr "Ontbijt" @@ -374,7 +630,7 @@ msgstr "Avondeten" msgid "Other" msgstr "Overige" -#: .\cookbook\models.py:72 +#: .\cookbook\models.py:246 msgid "" "Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " "upload." @@ -382,84 +638,139 @@ msgstr "" "Maximale bestandsopslag voor ruimte in MB. 0 voor onbeperkt, -1 om uploaden " "van bestanden uit te schakelen." -#: .\cookbook\models.py:123 .\cookbook\templates\search.html:7 -#: .\cookbook\templates\shopping_list.html:52 +#: .\cookbook\models.py:300 .\cookbook\templates\search.html:7 +#: .\cookbook\templates\shopping_list.html:53 msgid "Search" msgstr "Zoeken" -#: .\cookbook\models.py:124 .\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 +#: .\cookbook\models.py:301 .\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 "Maaltijdplan" -#: .\cookbook\models.py:125 .\cookbook\templates\base.html:89 +#: .\cookbook\models.py:302 .\cookbook\templates\base.html:90 msgid "Books" msgstr "Boeken" -#: .\cookbook\models.py:133 +#: .\cookbook\models.py:310 msgid "Small" msgstr "Klein" -#: .\cookbook\models.py:133 +#: .\cookbook\models.py:310 msgid "Large" msgstr "Groot" -#: .\cookbook\models.py:133 .\cookbook\templates\generic\new_template.html:6 +#: .\cookbook\models.py:310 .\cookbook\templates\generic\new_template.html:6 #: .\cookbook\templates\generic\new_template.html:14 -#: .\cookbook\templates\meal_plan.html:323 msgid "New" msgstr "Nieuw" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:202 +#: .\cookbook\models.py:512 +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:586 .\cookbook\templates\url_import.html:44 msgid "Text" msgstr "Tekst" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:203 +#: .\cookbook\models.py:586 msgid "Time" msgstr "Tijd" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:204 -#: .\cookbook\templates\forms\edit_internal_recipe.html:219 +#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:46 msgid "File" msgstr "Bestand" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:205 -#: .\cookbook\templates\forms\edit_internal_recipe.html:241 +#: .\cookbook\models.py:586 #: .\cookbook\templates\include\recipe_open_modal.html:7 -#: .\cookbook\templates\meal_plan.html:247 .\cookbook\views\delete.py:28 -#: .\cookbook\views\edit.py:273 .\cookbook\views\new.py:52 +#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260 +#: .\cookbook\views\new.py:53 msgid "Recipe" -msgstr "recept" +msgstr "Recept" -#: .\cookbook\serializer.py:109 +#: .\cookbook\models.py:1041 .\cookbook\templates\search_info.html:28 +msgid "Simple" +msgstr "Simpel" + +#: .\cookbook\models.py:1042 .\cookbook\templates\search_info.html:33 +msgid "Phrase" +msgstr "Zin" + +#: .\cookbook\models.py:1043 .\cookbook\templates\search_info.html:38 +msgid "Web" +msgstr "Web" + +#: .\cookbook\models.py:1044 .\cookbook\templates\search_info.html:47 +msgid "Raw" +msgstr "Rauw" + +#: .\cookbook\models.py:1082 +msgid "Food Alias" +msgstr "Ingrediënt alias" + +#: .\cookbook\models.py:1082 +msgid "Unit Alias" +msgstr "Eenheid alias" + +#: .\cookbook\models.py:1082 +msgid "Keyword Alias" +msgstr "Etiket alias" + +#: .\cookbook\serializer.py:175 +msgid "A user is required" +msgstr "Een gebruiker is verplicht" + +#: .\cookbook\serializer.py:195 msgid "File uploads are not enabled for this Space." msgstr "Bestandsuploads zijn niet ingeschakeld voor deze Ruimte." -#: .\cookbook\serializer.py:117 +#: .\cookbook\serializer.py:206 msgid "You have reached your file upload limit." msgstr "U heeft de uploadlimiet bereikt." -#: .\cookbook\tables.py:35 .\cookbook\templates\books.html:36 -#: .\cookbook\templates\generic\edit_template.html:6 +#: .\cookbook\serializer.py:962 +msgid "Existing shopping list to update" +msgstr "Bestaande boodschappenlijst is bijgewerkt" + +#: .\cookbook\serializer.py:964 +msgid "" +"List of ingredient IDs from the recipe to add, if not provided all " +"ingredients will be added." +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:965 +msgid "" +"Providing a list_recipe ID and servings of 0 will delete that shopping list." +msgstr "" + +#: .\cookbook\serializer.py:973 +msgid "Amount of food to add to the shopping list" +msgstr "" + +#: .\cookbook\serializer.py:974 +msgid "ID of unit to use for the shopping list" +msgstr "" + +#: .\cookbook\serializer.py:975 +msgid "When set to true will delete all food from active shopping lists." +msgstr "" + +#: .\cookbook\tables.py:35 .\cookbook\templates\generic\edit_template.html:6 #: .\cookbook\templates\generic\edit_template.html:14 -#: .\cookbook\templates\meal_plan.html:281 #: .\cookbook\templates\recipes_table.html:82 -#: .\cookbook\templates\shopping_list.html:33 -#: .\cookbook\templates\space.html:90 +#: .\cookbook\templates\shopping_list.html:37 +#: .\cookbook\templates\space.html:109 msgid "Edit" msgstr "Bewerken" -#: .\cookbook\tables.py:124 .\cookbook\tables.py:147 -#: .\cookbook\templates\books.html:38 -#: .\cookbook\templates\generic\delete_template.html:5 -#: .\cookbook\templates\generic\delete_template.html:13 -#: .\cookbook\templates\generic\edit_template.html:27 -#: .\cookbook\templates\meal_plan.html:277 +#: .\cookbook\tables.py:115 .\cookbook\tables.py:138 +#: .\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" @@ -488,7 +799,7 @@ 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:154 .\cookbook\templates\settings.html:6 +#: .\cookbook\templates\base.html:257 .\cookbook\templates\settings.html:6 #: .\cookbook\templates\settings.html:17 #: .\cookbook\templates\socialaccount\connections.html:10 msgid "Settings" @@ -523,6 +834,7 @@ msgid "Re-send Verification" msgstr "Verificatie opnieuw verzenden" #: .\cookbook\templates\account\email.html:50 +#: .\cookbook\templates\generic\delete_template.html:56 #: .\cookbook\templates\socialaccount\connections.html:44 msgid "Remove" msgstr "Verwijder" @@ -570,7 +882,7 @@ msgstr "" " ." #: .\cookbook\templates\account\email_confirm.html:22 -#: .\cookbook\templates\generic\delete_template.html:21 +#: .\cookbook\templates\generic\delete_template.html:71 msgid "Confirm" msgstr "Bevestigen" @@ -584,7 +896,7 @@ 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:189 +#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:289 msgid "Login" msgstr "Inloggen" @@ -595,27 +907,27 @@ msgstr "Inloggen" msgid "Sign In" msgstr "Log in" -#: .\cookbook\templates\account\login.html:32 +#: .\cookbook\templates\account\login.html:34 #: .\cookbook\templates\socialaccount\signup.html:8 #: .\cookbook\templates\socialaccount\signup.html:57 msgid "Sign Up" msgstr "Registreer" -#: .\cookbook\templates\account\login.html:36 -#: .\cookbook\templates\account\login.html:37 +#: .\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:37 +#: .\cookbook\templates\account\login.html:40 msgid "Lost your password?" msgstr "Wachtwoord vergeten?" -#: .\cookbook\templates\account\login.html:48 +#: .\cookbook\templates\account\login.html:52 msgid "Social Login" msgstr "Socials login" -#: .\cookbook\templates\account\login.html:49 +#: .\cookbook\templates\account\login.html:53 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." @@ -632,12 +944,16 @@ msgstr "Weet je zeker dat je uit wil loggen?" #: .\cookbook\templates\account\password_change.html:6 #: .\cookbook\templates\account\password_change.html:16 #: .\cookbook\templates\account\password_change.html:21 +#: .\cookbook\templates\account\password_reset_from_key.html:7 +#: .\cookbook\templates\account\password_reset_from_key.html:13 +#: .\cookbook\templates\account\password_reset_from_key_done.html:7 +#: .\cookbook\templates\account\password_reset_from_key_done.html:13 msgid "Change Password" msgstr "Wijzig wachtwoord" #: .\cookbook\templates\account\password_change.html:12 #: .\cookbook\templates\account\password_set.html:12 -#: .\cookbook\templates\settings.html:52 +#: .\cookbook\templates\settings.html:76 msgid "Password" msgstr "Wachtwoord" @@ -672,6 +988,32 @@ msgstr "" "Er is een e-mail verstuurd. Neem contact op als je deze niet binnen een paar " "minuten ontvangen hebt." +#: .\cookbook\templates\account\password_reset_from_key.html:13 +msgid "Bad Token" +msgstr "Bad token" + +#: .\cookbook\templates\account\password_reset_from_key.html:25 +#, python-format +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used.\n" +" Please request a new " +"password reset." +msgstr "" +"De link voor het opnieuw instellen van het wachtwoord was ongeldig, mogelijk " +"omdat hij al gebruikt is.\n" +" Vraag een nieuwe link " +"voor een wachtwoord reset aan." + +#: .\cookbook\templates\account\password_reset_from_key.html:33 +msgid "change password" +msgstr "Wijzig wachtwoord" + +#: .\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 "Je wachtwoord is nu gewijzigd." + #: .\cookbook\templates\account\password_set.html:6 #: .\cookbook\templates\account\password_set.html:16 #: .\cookbook\templates\account\password_set.html:21 @@ -723,98 +1065,110 @@ 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:179 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:279 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "API documentatie" -#: .\cookbook\templates\base.html:85 -msgid "Utensils" -msgstr "Kookgerei" - -#: .\cookbook\templates\base.html:95 +#: .\cookbook\templates\base.html:86 msgid "Shopping" msgstr "Winkelen" -#: .\cookbook\templates\base.html:101 -#: .\cookbook\templates\shopping_list.html:230 +#: .\cookbook\templates\base.html:113 +msgid "Keyword" +msgstr "Etiketten" + +#: .\cookbook\templates\base.html:125 .\cookbook\views\lists.py:114 +msgid "Foods" +msgstr "Ingrediënten" + +#: .\cookbook\templates\base.html:137 +#: .\cookbook\templates\forms\ingredients.html:24 +#: .\cookbook\templates\space.html:47 .\cookbook\templates\stats.html:26 +#: .\cookbook\views\lists.py:131 +msgid "Units" +msgstr "Eenheden" + +#: .\cookbook\templates\base.html:151 +#: .\cookbook\templates\shopping_list.html:208 #: .\cookbook\templates\supermarket.html:7 msgid "Supermarket" msgstr "Supermarkt" -#: .\cookbook\templates\base.html:112 .\cookbook\views\delete.py:84 -#: .\cookbook\views\edit.py:102 .\cookbook\views\lists.py:26 -#: .\cookbook\views\new.py:78 -msgid "Keyword" -msgstr "Etiket" +#: .\cookbook\templates\base.html:163 +msgid "Supermarket Category" +msgstr "Supermarktcategorie" -#: .\cookbook\templates\base.html:114 +#: .\cookbook\templates\base.html:175 .\cookbook\views\lists.py:180 +msgid "Automations" +msgstr "Automatiseringen" + +#: .\cookbook\templates\base.html:189 .\cookbook\views\lists.py:200 +msgid "Files" +msgstr "Bestanden" + +#: .\cookbook\templates\base.html:201 msgid "Batch Edit" msgstr "Batchbewerking" -#: .\cookbook\templates\base.html:119 -msgid "Storage Data" -msgstr "Dataopslag" - -#: .\cookbook\templates\base.html:123 -msgid "Storage Backends" -msgstr "Opslag Backends" - -#: .\cookbook\templates\base.html:125 -msgid "Configure Sync" -msgstr "Synchronisatie configureren" - -#: .\cookbook\templates\base.html:127 -msgid "Discovered Recipes" -msgstr "Ontdekte recepten" - -#: .\cookbook\templates\base.html:129 -msgid "Discovery Log" -msgstr "Ontdekkingslogboek" - -#: .\cookbook\templates\base.html:131 .\cookbook\templates\stats.html:10 -msgid "Statistics" -msgstr "Statistieken" - -#: .\cookbook\templates\base.html:133 -msgid "Units & Ingredients" -msgstr "Eenheden & Ingrediënten" - -#: .\cookbook\templates\base.html:135 .\cookbook\templates\index.html:47 -msgid "Import Recipe" -msgstr "Recept importeren" - -#: .\cookbook\templates\base.html:156 .\cookbook\templates\history.html:6 +#: .\cookbook\templates\base.html:213 .\cookbook\templates\history.html:6 #: .\cookbook\templates\history.html:14 msgid "History" msgstr "Geschiedenis" -#: .\cookbook\templates\base.html:159 .\cookbook\templates\space.html:7 -#: .\cookbook\templates\space.html:19 +#: .\cookbook\templates\base.html:228 .\cookbook\templates\export.html:14 +#: .\cookbook\templates\export.html:20 +#: .\cookbook\templates\shopping_list.html:310 +#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 +msgid "Export" +msgstr "Exporteren" + +#: .\cookbook\templates\base.html:244 .\cookbook\templates\index.html:47 +msgid "Import Recipe" +msgstr "Recept importeren" + +#: .\cookbook\templates\base.html:246 +#: .\cookbook\templates\shopping_list.html:165 +#: .\cookbook\templates\shopping_list.html:188 +msgid "Create" +msgstr "Aanmaken" + +#: .\cookbook\templates\base.html:259 +#: .\cookbook\templates\generic\list_template.html:14 +#: .\cookbook\templates\space.html:69 .\cookbook\templates\stats.html:43 +msgid "External Recipes" +msgstr "Externe recepten" + +#: .\cookbook\templates\base.html:262 .\cookbook\templates\space.html:8 +#: .\cookbook\templates\space.html:20 .\cookbook\templates\space.html:150 msgid "Space Settings" msgstr "Ruimte Instellingen" -#: .\cookbook\templates\base.html:163 .\cookbook\templates\system.html:13 +#: .\cookbook\templates\base.html:267 .\cookbook\templates\system.html:13 msgid "System" msgstr "Systeem" -#: .\cookbook\templates\base.html:165 .\cookbook\templates\base.html:171 +#: .\cookbook\templates\base.html:269 msgid "Admin" msgstr "Beheer" -#: .\cookbook\templates\base.html:175 +#: .\cookbook\templates\base.html:273 msgid "Markdown Guide" msgstr "Markdown gids" -#: .\cookbook\templates\base.html:177 +#: .\cookbook\templates\base.html:275 msgid "GitHub" msgstr "GitHub" -#: .\cookbook\templates\base.html:181 +#: .\cookbook\templates\base.html:277 +msgid "Translate Tandoor" +msgstr "Vertaal Tandoor" + +#: .\cookbook\templates\base.html:281 msgid "API Browser" msgstr "API Browser" -#: .\cookbook\templates\base.html:184 +#: .\cookbook\templates\base.html:284 msgid "Log out" msgstr "Uitloggen" @@ -832,7 +1186,7 @@ msgstr "" "Voeg de gespecificeerde etiketten toe aan alle recepten die een woord " "bevatten" -#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:85 +#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:82 msgid "Sync" msgstr "Synchroniseren" @@ -852,10 +1206,36 @@ msgstr "" msgid "The path must be in the following format" msgstr "Het pad dient het volgende format te hebben" -#: .\cookbook\templates\batch\monitor.html:27 +#: .\cookbook\templates\batch\monitor.html:20 +#: .\cookbook\templates\forms\edit_import_recipe.html:14 +#: .\cookbook\templates\generic\edit_template.html:23 +#: .\cookbook\templates\generic\new_template.html:23 +#: .\cookbook\templates\include\log_cooking.html:30 +#: .\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\shopping_list.html:311 +#: .\cookbook\templates\space.html:155 +msgid "Save" +msgstr "Opslaan" + +#: .\cookbook\templates\batch\monitor.html:21 +msgid "Manage External Storage" +msgstr "Beheer externe opslag" + +#: .\cookbook\templates\batch\monitor.html:28 msgid "Sync Now!" msgstr "Synchroniseer nu!" +#: .\cookbook\templates\batch\monitor.html:29 +msgid "Show Recipes" +msgstr "Toon Recepten" + +#: .\cookbook\templates\batch\monitor.html:30 +msgid "Show Log" +msgstr "Toon Log" + #: .\cookbook\templates\batch\waiting.html:4 #: .\cookbook\templates\batch\waiting.html:10 msgid "Importing Recipes" @@ -869,257 +1249,23 @@ msgstr "" "Dit kan een aantal minuten duren, afhankelijk van het aantal documenten wat " "op het moment gesynchroniseerd worden. Een ogenblik geduld alstublieft." -#: .\cookbook\templates\books.html:5 .\cookbook\templates\books.html:11 +#: .\cookbook\templates\books.html:7 msgid "Recipe Books" msgstr "Kookboeken" -#: .\cookbook\templates\books.html:15 -msgid "New Book" -msgstr "Nieuw boek" - -#: .\cookbook\templates\books.html:27 .\cookbook\templates\recipe_view.html:26 -msgid "by" -msgstr "door" - -#: .\cookbook\templates\books.html:34 -msgid "Toggle Recipes" -msgstr "Recepten in/uitschakelen" - -#: .\cookbook\templates\books.html:54 -#: .\cookbook\templates\meal_plan_entry.html:48 -#: .\cookbook\templates\recipes_table.html:64 -msgid "Last cooked" -msgstr "Laatst bereid" - -#: .\cookbook\templates\books.html:71 -msgid "There are no recipes in this book yet." -msgstr "In dit boek bestaan nog geen recepten." - #: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6 msgid "Export Recipes" msgstr "Recepten exporteren" -#: .\cookbook\templates\export.html:14 .\cookbook\templates\export.html:20 -#: .\cookbook\templates\shopping_list.html:351 -#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 -msgid "Export" -msgstr "Exporteren" - -#: .\cookbook\templates\files.html:7 -msgid "Files" -msgstr "Bestanden" - #: .\cookbook\templates\forms\edit_import_recipe.html:5 #: .\cookbook\templates\forms\edit_import_recipe.html:9 msgid "Import new Recipe" msgstr "Nieuw recept importeren" -#: .\cookbook\templates\forms\edit_import_recipe.html:14 -#: .\cookbook\templates\forms\edit_internal_recipe.html:439 -#: .\cookbook\templates\forms\edit_internal_recipe.html:471 -#: .\cookbook\templates\generic\edit_template.html:23 -#: .\cookbook\templates\generic\new_template.html:23 -#: .\cookbook\templates\include\log_cooking.html:28 -#: .\cookbook\templates\meal_plan.html:325 -#: .\cookbook\templates\settings.html:46 .\cookbook\templates\settings.html:87 -#: .\cookbook\templates\settings.html:105 -#: .\cookbook\templates\shopping_list.html:353 -msgid "Save" -msgstr "Opslaan" - #: .\cookbook\templates\forms\edit_internal_recipe.html:7 -#: .\cookbook\templates\forms\edit_internal_recipe.html:34 msgid "Edit Recipe" msgstr "Recept bewerken" -#: .\cookbook\templates\forms\edit_internal_recipe.html:56 -#: .\cookbook\templates\url_import.html:171 -msgid "Description" -msgstr "Beschrijving" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:76 -msgid "Waiting Time" -msgstr "Wachttijd" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:82 -msgid "Servings Text" -msgstr "Porties tekst" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:93 -msgid "Select Keywords" -msgstr "Selecteer etiketten" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:94 -#: .\cookbook\templates\url_import.html:583 -msgid "Add Keyword" -msgstr "Voeg Etiket toe" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:112 -msgid "Nutrition" -msgstr "Voedingswaarde" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:116 -#: .\cookbook\templates\forms\edit_internal_recipe.html:166 -msgid "Delete Step" -msgstr "Verwijder stap" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:120 -msgid "Calories" -msgstr "Calorieën" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:123 -msgid "Carbohydrates" -msgstr "Koolhydraten" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:126 -msgid "Fats" -msgstr "Vetten" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:128 -msgid "Proteins" -msgstr "Eiwitten" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:150 -#: .\cookbook\templates\forms\edit_internal_recipe.html:504 -msgid "Step" -msgstr "Stap" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:171 -msgid "Show as header" -msgstr "Laat als kop zien" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:177 -msgid "Hide as header" -msgstr "Verbergen als kop" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:182 -msgid "Move Up" -msgstr "Verplaats omhoog" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:187 -msgid "Move Down" -msgstr "Verplaats omlaag" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:196 -msgid "Step Name" -msgstr "Stap naam" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:200 -msgid "Step Type" -msgstr "Stap type" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:213 -msgid "Step time in Minutes" -msgstr "Tijdsduur stap in minuten" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:229 -msgid "Select File" -msgstr "Selecteer bestand" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:230 -#: .\cookbook\templates\forms\edit_internal_recipe.html:252 -#: .\cookbook\templates\forms\edit_internal_recipe.html:313 -#: .\cookbook\templates\forms\edit_internal_recipe.html:337 -#: .\cookbook\templates\shopping_list.html:189 -#: .\cookbook\templates\shopping_list.html:211 -#: .\cookbook\templates\shopping_list.html:241 -#: .\cookbook\templates\shopping_list.html:265 -#: .\cookbook\templates\url_import.html:495 -#: .\cookbook\templates\url_import.html:527 -msgid "Select" -msgstr "Selecteer" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:251 -msgid "Select Recipe" -msgstr "Selecteer recept" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:311 -#: .\cookbook\templates\shopping_list.html:187 -msgid "Select Unit" -msgstr "Selecteer eenheid" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:312 -#: .\cookbook\templates\forms\edit_internal_recipe.html:336 -#: .\cookbook\templates\shopping_list.html:188 -#: .\cookbook\templates\shopping_list.html:210 -msgid "Create" -msgstr "Maak" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:335 -#: .\cookbook\templates\shopping_list.html:209 -msgid "Select Food" -msgstr "Selecteer ingrediënt" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:352 -#: .\cookbook\templates\meal_plan.html:256 -#: .\cookbook\templates\url_import.html:542 -msgid "Note" -msgstr "Notitie" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:369 -msgid "Delete Ingredient" -msgstr "Verwijder ingrediënt" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:375 -msgid "Make Header" -msgstr "Stel in als kop" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:381 -msgid "Make Ingredient" -msgstr "Maak ingrediënt" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:387 -msgid "Disable Amount" -msgstr "Hoeveelheid uitschakelen" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:393 -msgid "Enable Amount" -msgstr "Hoeveelheid inschakelen" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:398 -msgid "Copy Template Reference" -msgstr "Kopieer sjabloon referentie" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:424 -#: .\cookbook\templates\url_import.html:297 -#: .\cookbook\templates\url_import.html:567 -msgid "Instructions" -msgstr "Instructies" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:437 -#: .\cookbook\templates\forms\edit_internal_recipe.html:468 -msgid "Save & View" -msgstr "Opslaan & bekijken" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:441 -#: .\cookbook\templates\forms\edit_internal_recipe.html:474 -msgid "Add Step" -msgstr "Voeg stap toe" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:444 -#: .\cookbook\templates\forms\edit_internal_recipe.html:478 -msgid "Add Nutrition" -msgstr "Voedingswaarde toevoegen" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:446 -#: .\cookbook\templates\forms\edit_internal_recipe.html:480 -msgid "Remove Nutrition" -msgstr "Voedingswaarde verwijderen" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:448 -#: .\cookbook\templates\forms\edit_internal_recipe.html:483 -msgid "View Recipe" -msgstr "Bekijk recept" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:450 -#: .\cookbook\templates\forms\edit_internal_recipe.html:485 -msgid "Delete Recipe" -msgstr "Verwijder recept" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:491 -msgid "Steps" -msgstr "Stappen" - #: .\cookbook\templates\forms\ingredients.html:15 msgid "Edit Ingredients" msgstr "Ingrediënten bewerken" @@ -1136,17 +1282,12 @@ msgid "" msgstr "" "\n" " Het volgende formulier kan worden gebruikt wanneer per ongeluk twee " -"(of meer) eenheden of ingrediënten zijn gemaakt die eigenlijk hetzelfde " -"zijn.\n" -" Het voegt de twee eenheden of ingrediënten samen en past alle bijbehorende " -"recepten aan.\n" +"(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:24 -#: .\cookbook\templates\space.html:41 .\cookbook\templates\stats.html:26 -msgid "Units" -msgstr "Eenheden" - #: .\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?" @@ -1160,29 +1301,46 @@ 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?" -#: .\cookbook\templates\generic\delete_template.html:18 +#: .\cookbook\templates\generic\delete_template.html:21 #, python-format msgid "Are you sure you want to delete the %(title)s: %(object)s " msgstr "Weet je zeker dat je %(title)s: %(object)s wil verwijderen " -#: .\cookbook\templates\generic\edit_template.html:30 -msgid "View" -msgstr "Bekijken" +#: .\cookbook\templates\generic\delete_template.html:26 +msgid "Protected" +msgstr "Beschermd" -#: .\cookbook\templates\generic\edit_template.html:34 +#: .\cookbook\templates\generic\delete_template.html:41 +msgid "Cascade" +msgstr "Cascade" + +#: .\cookbook\templates\generic\delete_template.html:72 +msgid "Cancel" +msgstr "Annuleer" + +#: .\cookbook\templates\generic\edit_template.html:32 +msgid "View" +msgstr "Bekijk" + +#: .\cookbook\templates\generic\edit_template.html:36 msgid "Delete original file" msgstr "Origineel bestand verwijderen" #: .\cookbook\templates\generic\list_template.html:6 -#: .\cookbook\templates\generic\list_template.html:12 +#: .\cookbook\templates\generic\list_template.html:22 msgid "List" -msgstr "Lijst" +msgstr " " -#: .\cookbook\templates\generic\list_template.html:25 +#: .\cookbook\templates\generic\list_template.html:33 +#: .\cookbook\templates\shopping_list.html:33 +msgid "Try the new shopping list" +msgstr "Probeer de nieuwe boodschappenlijst" + +#: .\cookbook\templates\generic\list_template.html:45 msgid "Filter" msgstr "Filtreren" -#: .\cookbook\templates\generic\list_template.html:30 +#: .\cookbook\templates\generic\list_template.html:50 msgid "Import all" msgstr "Alles importeren" @@ -1208,23 +1366,32 @@ msgstr "Kook logboek" msgid "Import Recipes" msgstr "Recepten importeren" -#: .\cookbook\templates\include\log_cooking.html:7 +#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 +#: .\cookbook\templates\import_response.html:7 +#: .\cookbook\templates\test.html:14 .\cookbook\templates\test.html:20 +#: .\cookbook\templates\url_import.html:29 +#: .\cookbook\templates\url_import.html:108 +#: .\cookbook\templates\url_import.html:130 +#: .\cookbook\templates\url_import.html:324 +#: .\cookbook\templates\url_import.html:618 .\cookbook\views\delete.py:89 +#: .\cookbook\views\edit.py:200 +msgid "Import" +msgstr "Importeer" + +#: .\cookbook\templates\include\log_cooking.html:9 msgid "Log Recipe Cooking" msgstr "logboek recept koken" -#: .\cookbook\templates\include\log_cooking.html:13 +#: .\cookbook\templates\include\log_cooking.html:15 msgid "All fields are optional and can be left empty." msgstr "Alle velden zijn optioneel en mogen leeg gelaten worden." -#: .\cookbook\templates\include\log_cooking.html:19 +#: .\cookbook\templates\include\log_cooking.html:21 msgid "Rating" msgstr "Beoordeling" -#: .\cookbook\templates\include\log_cooking.html:27 +#: .\cookbook\templates\include\log_cooking.html:29 #: .\cookbook\templates\include\recipe_open_modal.html:18 -#: .\cookbook\templates\meal_plan.html:283 -#: .\cookbook\templates\meal_plan.html:327 -#: .\cookbook\templates\meal_plan.html:366 msgid "Close" msgstr "Sluiten" @@ -1249,11 +1416,11 @@ msgid "" " " msgstr "" "\n" -" Het wachtwoord en token veld worden als plain text in " -"de database opgeslagen.\n" -" Dit is nodig omdat deze benodigd zijn voor de API requests, Echter verhoogt " -"dit ook het risico van diefstal.
\n" -" Om mogelijke schade te beperken kun je gebruik maken van account met " +" Het wachtwoord en token veld worden als plain text " +"opgeslagen in de database.\n" +" Dit is nodig omdat deze benodigd zijn voor de API requests, Dit verhoogt " +"echter ook het risico van diefstal.
\n" +" Om mogelijke schade te beperken kun je gebruik maken van accounts met " "gelimiteerde toegang.\n" " " @@ -1277,8 +1444,8 @@ msgstr "Zoekopdracht opnieuw instellen" msgid "Last viewed" msgstr "Laatst bekeken" -#: .\cookbook\templates\index.html:87 .\cookbook\templates\meal_plan.html:178 -#: .\cookbook\templates\space.html:35 .\cookbook\templates\stats.html:22 +#: .\cookbook\templates\index.html:87 .\cookbook\templates\space.html:37 +#: .\cookbook\templates\stats.html:22 msgid "Recipes" msgstr "Recepten" @@ -1309,13 +1476,14 @@ msgstr "" "\n" " Markdown is een lichtgewicht opmaak taal die gebruikt kan worden om " "tekst eenvoudig op te maken.\n" -" Deze site gebruikt de Python Markdown bibliotheek\n" -" om je tekst in mooi uitziende HTML om te zetten. De volledige documentatie " -"kan \n" -" hiergevonden worden.\n" -" Onvolledige, maar waarschijnlijk voldoende, informatie staat hieronder.\n" +" Deze site gebruikt de Python Markdown bibliotheek\n" +" om je tekst in mooi uitziende HTML om te zetten. De volledige " +"documentatie kan \n" +" hiergevonden worden.\n" +" Onvolledige, maar waarschijnlijk voldoende, informatie staat " +"hieronder.\n" " " #: .\cookbook\templates\markdown_info.html:25 @@ -1324,7 +1492,7 @@ msgstr "Koppen" #: .\cookbook\templates\markdown_info.html:54 msgid "Formatting" -msgstr "Formattering" +msgstr "Opmaak" #: .\cookbook\templates\markdown_info.html:56 #: .\cookbook\templates\markdown_info.html:72 @@ -1407,7 +1575,7 @@ msgstr "" #: .\cookbook\templates\markdown_info.html:132 #: .\cookbook\templates\markdown_info.html:145 msgid "This will become an image" -msgstr "Dit wordt een plaatje" +msgstr "Dit wordt een afbeelding" #: .\cookbook\templates\markdown_info.html:152 msgid "Tables" @@ -1441,173 +1609,23 @@ msgstr "Kop" msgid "Cell" msgstr "Cel" -#: .\cookbook\templates\meal_plan.html:101 -msgid "New Entry" -msgstr "Nieuw item" +#: .\cookbook\templates\meal_plan_entry.html:6 +msgid "Meal Plan View" +msgstr "Maaltijdenplan bekijken" -#: .\cookbook\templates\meal_plan.html:113 -#: .\cookbook\templates\shopping_list.html:56 -msgid "Search Recipe" -msgstr "Zoek recept" - -#: .\cookbook\templates\meal_plan.html:139 -msgid "Title" -msgstr "Titel" - -#: .\cookbook\templates\meal_plan.html:141 -msgid "Note (optional)" -msgstr "Notitie (optioneel)" - -#: .\cookbook\templates\meal_plan.html:143 -msgid "" -"You can use markdown to format this field. See the docs here" -msgstr "" -"Je kan markdown gebruiken om dit veld op te maken. Zie de documentatie" - -#: .\cookbook\templates\meal_plan.html:147 -#: .\cookbook\templates\meal_plan.html:251 -msgid "Serving Count" -msgstr "Portie teller" - -#: .\cookbook\templates\meal_plan.html:153 -msgid "Create only note" -msgstr "Maak alleen een notitie" - -#: .\cookbook\templates\meal_plan.html:168 -#: .\cookbook\templates\shopping_list.html:7 -#: .\cookbook\templates\shopping_list.html:29 -#: .\cookbook\templates\shopping_list.html:714 -msgid "Shopping List" -msgstr "Boodschappenlijstje" - -#: .\cookbook\templates\meal_plan.html:172 -msgid "Shopping list currently empty" -msgstr "Boodschappenlijst is momenteel leeg" - -#: .\cookbook\templates\meal_plan.html:175 -msgid "Open Shopping List" -msgstr "Open boodschappenlijstje" - -#: .\cookbook\templates\meal_plan.html:189 -msgid "Plan" -msgstr "Plan" - -#: .\cookbook\templates\meal_plan.html:196 -msgid "Number of Days" -msgstr "Aantal dagen" - -#: .\cookbook\templates\meal_plan.html:206 -msgid "Weekday offset" -msgstr "Weekdag aanpassing" - -#: .\cookbook\templates\meal_plan.html:209 -msgid "" -"Number of days starting from the first day of the week to offset the default " -"view." -msgstr "" -"Aantal dagen startende met de eerste dag van de week om het standaard " -"overzicht aan te passen." - -#: .\cookbook\templates\meal_plan.html:217 -#: .\cookbook\templates\meal_plan.html:294 -msgid "Edit plan types" -msgstr "Bewerk plan soorten" - -#: .\cookbook\templates\meal_plan.html:219 -msgid "Show help" -msgstr "Toon help" - -#: .\cookbook\templates\meal_plan.html:220 -msgid "Week iCal export" -msgstr "Week iCal export" - -#: .\cookbook\templates\meal_plan.html:264 #: .\cookbook\templates\meal_plan_entry.html:18 msgid "Created by" msgstr "Gemaakt door" -#: .\cookbook\templates\meal_plan.html:270 #: .\cookbook\templates\meal_plan_entry.html:20 -#: .\cookbook\templates\shopping_list.html:254 +#: .\cookbook\templates\shopping_list.html:232 msgid "Shared with" msgstr "Gedeeld met" -#: .\cookbook\templates\meal_plan.html:280 -msgid "Add to Shopping" -msgstr "Voeg toe aan Boodschappen" - -#: .\cookbook\templates\meal_plan.html:323 -msgid "New meal type" -msgstr "Nieuwe maaltijdsoort" - -#: .\cookbook\templates\meal_plan.html:338 -msgid "Meal Plan Help" -msgstr "Maaltijdplanner hulp" - -#: .\cookbook\templates\meal_plan.html:344 -msgid "" -"\n" -"

The meal plan module allows planning of meals " -"both with recipes and notes.

\n" -"

Simply select a recipe from the list of " -"recently viewed recipes or search the one you\n" -" want and drag it to the desired plan " -"position. You can also add a note and a title and\n" -" then drag the recipe to create a plan entry " -"with a custom title and note. Creating only\n" -" Notes is possible by dragging the create " -"note box into the plan.

\n" -"

Click on a recipe in order to open the " -"detailed view. There you can also add it to the\n" -" shopping list. You can also add all recipes " -"of a day to the shopping list by\n" -" clicking the shopping cart at the top of the " -"table.

\n" -"

Since a common use case is to plan meals " -"together you can define\n" -" users you want to share your plan with in " -"the settings.\n" -"

\n" -"

You can also edit the types of meals you want " -"to plan. If you share your plan with\n" -" someone with\n" -" different meals, their meal types will " -"appear in your list as well. To prevent\n" -" duplicates (e.g. Other and Misc.)\n" -" name your meal types the same as the users " -"you share your meals with and they will be\n" -" merged.

\n" -" " -msgstr "" -"\n" -"

De maaltijdplan module maakt plannen van " -"maaltijden met recepten en notities mogelijk.

\n" -"

Selecteer een recept van de lijst recent bekeken recepten of zoek naar\n" -" het gewenste recept en sleep het naar de juiste positie in het " -"maaltijdplan. Je kan ook eerst een notitie en titel toevoegen en dan het " -"recept naar de juiste positie slepen om een unieke maaltijdplan inschrijving " -"te maken.\n" -" Alleen notities aanmaken is mogelijk door het Maak notitie vlak in het " -"maaltijdplan te slepen.

\n" -"

Klik op een recept om de gedetailleerde weergave te openen. Daar kan je " -"het ook toevoegen aan je boodschappenlijst.\n" -" Je kan ook alle recepten van een dag aan je boodschappenlijst toevoegen " -"door op het winkelwagentje boven aan de tabel te klikken.

\n" -"

Omdat maaltijden samen gepland kunnen worden kan je in de instellingen " -"kiezen met welke gebruikers je het maaltijd plan wil delen.

\n" -"

Je kan ook het type maaltijd dat je wil plannen bewerken. Als je een " -"maaltijdplan deelt met iemand met andere maaltijden, dan zullen hun " -"maaltijdtypes ook in jouw lijst verschijnen. Geef, om dubbelingen (zoals " -"Overig en Anders) te voorkomen, je maaltijdtypes daarom dezelfde naam als de " -"gebruikers waarmee je maaltijdplannen deelt. In dat geval worden de " -"maaltijden samengevoegd.

\n" -" " - -#: .\cookbook\templates\meal_plan_entry.html:6 -msgid "Meal Plan View" -msgstr "Maaltijdenplan bekijken" +#: .\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." @@ -1654,7 +1672,7 @@ msgid "" "Recipes, foods, shopping lists and more are organized in spaces of one or " "more people." msgstr "" -"Recepten, ingrediënten, boodschappenlijstjes en meer zijn georganiseerd in " +"Recepten, ingrediënten, boodschappenlijsten en meer zijn georganiseerd in " "ruimtes van één of meer personen." #: .\cookbook\templates\no_space_info.html:18 @@ -1710,29 +1728,28 @@ msgstr "" "De recepten hieronder zijn beschikbaar om offline te bekijken omdat je ze " "recent bekeken hebt. Houd er rekening mee dat de data mogelijk verouderd is." -#: .\cookbook\templates\recipe_view.html:21 .\cookbook\templates\space.html:62 -#: .\cookbook\templates\stats.html:47 -msgid "Comments" -msgstr "Opmerkingen" +#: .\cookbook\templates\recipe_view.html:26 +msgid "by" +msgstr "door" -#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:118 -#: .\cookbook\views\edit.py:179 +#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:147 +#: .\cookbook\views\edit.py:180 msgid "Comment" msgstr "Opmerking" #: .\cookbook\templates\recipes_table.html:19 #: .\cookbook\templates\recipes_table.html:23 -#: .\cookbook\templates\url_import.html:440 +#: .\cookbook\templates\url_import.html:447 msgid "Recipe Image" msgstr "Recept afbeelding" #: .\cookbook\templates\recipes_table.html:51 -#: .\cookbook\templates\url_import.html:445 +#: .\cookbook\templates\url_import.html:452 msgid "Preparation time ca." msgstr "Geschatte voorbereidingstijd" #: .\cookbook\templates\recipes_table.html:57 -#: .\cookbook\templates\url_import.html:450 +#: .\cookbook\templates\url_import.html:457 msgid "Waiting time ca." msgstr "Geschatte wachttijd" @@ -1748,48 +1765,314 @@ msgstr "Bereiding loggen" msgid "Recipe Home" msgstr "Recept thuis" -#: .\cookbook\templates\settings.html:25 +#: .\cookbook\templates\search_info.html:5 +#: .\cookbook\templates\search_info.html:9 +#: .\cookbook\templates\settings.html:172 +msgid "Search Settings" +msgstr "Zoekinstellingen" + +#: .\cookbook\templates\search_info.html:10 +msgid "" +"\n" +" Creating the best search experience is complicated and weighs " +"heavily on your personal configuration. \n" +" Changing any of the search settings can have significant impact on " +"the speed and quality of the results.\n" +" Search Methods, Trigrams and Full Text Search configurations are " +"only available if you are using Postgres for your database.\n" +" " +msgstr "" +"\n" +" Het maken van de beste zoekervaring is gecompliceerd en sterk " +"afhankelijk van je persoonlijke configuratie. \n" +" Het aanpassen van de zoekinstellingen kan een significante impact op " +"de snelheid en kwaliteit van de resultaten hebben.\n" +" Zoekmethoden Trigram en Volledige tekst zoeken zijn alleen " +"beschikbaar wanneer je Postgress als database gebruikt.\n" +" " + +#: .\cookbook\templates\search_info.html:19 +msgid "Search Methods" +msgstr "Zoekmethoden" + +#: .\cookbook\templates\search_info.html:23 +msgid "" +" \n" +" Full text searches attempt to normalize the words provided to " +"match common variants. For example: 'forked', 'forking', 'forks' will all " +"normalize to 'fork'.\n" +" There are several methods available, described below, that will " +"control how the search behavior should react when multiple words are " +"searched.\n" +" Full technical details on how these operate can be viewed on Postgresql's website.\n" +" " +msgstr "" +" \n" +" Volledige tekst zoeken probeert de woorden te normaliseren om " +"ook varianten te vinden. Bijvoorbeeld: 'appel' en 'appels' worden beiden " +"genormaliseerd naar 'appel'.\n" +" Er zijn verschillende zoekmethoden beschikbaar, hier beneden " +"beschreven, die het zoekgedrag bepalen wanneer er naar meerdere woorden " +"gezocht wordt.\n" +" Volledige technische details kunnen bekene worden op Postgresql's website.\n" +" " + +#: .\cookbook\templates\search_info.html:29 +msgid "" +" \n" +" Simple searches ignore punctuation and common words such as " +"'the', 'a', 'and'. And will treat seperate words as required.\n" +" Searching for 'apple or flour' will return any recipe that " +"includes both 'apple' and 'flour' anywhere in the fields that have been " +"selected for a full text search.\n" +" " +msgstr "" +" \n" +" Simpel zoeken negeert interpunctie en veelgebruikte worden zoals " +"'de', 'het', 'een' of 'en'. Het behandelt de losse woorden zoals gevraagd\n" +" Zoeken naar 'appel' of bloem vindt elk recept dat zowel 'appel' " +"als 'bloem' ergens in de velden die geselecteerd zijn voor een zoekopdracht " +"bevat.\n" +" " + +#: .\cookbook\templates\search_info.html:34 +msgid "" +" \n" +" Phrase searches ignore punctuation, but will search for all of " +"the words in the exact order provided.\n" +" Searching for 'apple or flour' will only return a recipe that " +"includes the exact phrase 'apple or flour' in any of the fields that have " +"been selected for a full text search.\n" +" " +msgstr "" +" \n" +" Zin zoeken negeert interpunctie en zoekt naar alle woorden in de " +"volgorde waarin ze opgegeven zijn.\n" +" Zoeken naar 'appel of bloem' vindt alleen recepten waarbij de " +"exacte zin 'appel of bloem' in een van de velden die geselecteerd zijn voor " +"een zoekopdracht.\n" +" " + +#: .\cookbook\templates\search_info.html:39 +msgid "" +" \n" +" Web searches simulate functionality found on many web search " +"sites supporting special syntax.\n" +" Placing quotes around several words will convert those words " +"into a phrase.\n" +" 'or' is recongized as searching for the word (or phrase) " +"immediately before 'or' OR the word (or phrase) directly after.\n" +" '-' is recognized as searching for recipes that do not include " +"the word (or phrase) that comes immediately after. \n" +" For example searching for 'apple pie' or cherry -butter will " +"return any recipe that includes the phrase 'apple pie' or the word " +"'cherry' \n" +" in any field included in the full text search but exclude any " +"recipe that has the word 'butter' in any field included.\n" +" " +msgstr "" +" \n" +" Web zoeken simuleert functionaliteit zoals gevonden op veel " +"websites, met ondersteuning voor speciale tekens\n" +" Het plaatsen van aanhalingstekens om woorden zorgt ervoor dat ze " +"als zin behandeld worden.\n" +" 'or' kan worden gebruikt om te zoeken naar het woord (of de zin) " +"direct voor of na de 'or'.\n" +" '-' kan worden gebruikt om te zoeken naar recepten waarin het " +"woord (of zin) direct na de '-' niet voorkomt.\n" +" Bijvoorbeeld: zoeken naar \"'stamppot boerenkool' or kersen -" +"vlaai\" vindt recepten die de zin 'stamppot boerenkool' of het woord kersen " +"maar laat geen recepten zien waarbij het woord 'vlaai' in één van de " +"geselecteerde zoekvelden staat.\n" +" " + +#: .\cookbook\templates\search_info.html:48 +msgid "" +" \n" +" Raw search is similar to Web except will take puncuation " +"operators such as '|', '&' and '()'\n" +" " +msgstr "" +" \n" +" Raw zoeken is vergelijkbaar met Web met als toevoeging dat het " +"tekens zoals '|', '&' en '()' accepteert\n" +" " + +#: .\cookbook\templates\search_info.html:59 +msgid "" +" \n" +" Another approach to searching that also requires Postgresql is " +"fuzzy search or trigram similarity. A trigram is a group of three " +"consecutive characters.\n" +" For example searching for 'apple' will create x trigrams 'app', " +"'ppl', 'ple' and will create a score of how closely words match the " +"generated trigrams.\n" +" One benefit of searching trigams is that a search for 'sandwich' " +"will find mispelled words such as 'sandwhich' that would be missed by other " +"methods.\n" +" " +msgstr "" +" \n" +" Een andere benadering voor zoeken die ook Postgresql vereist is " +"'Fuzzy' of Trigram zoeken. Een Trigram is een groep van drie opvolgende " +"karakters.\n" +" Bijvoorbeeld: zoeken op 'appel' maakt 3 trigrams op 'app', 'ppe' " +"en 'pel' en maakt een score van hoe dicht de woorden overeenkomen met de " +"gegenereerde trigrams.\n" +" Eén voordeel van het zoeken met trigrams is dat een zoekopdracht " +"ook verkeerd gespelde woorden, die met andere zoekmethoden gemist worden, " +"vindt.\n" +" " + +#: .\cookbook\templates\search_info.html:69 +msgid "Search Fields" +msgstr "Zoekvelden" + +#: .\cookbook\templates\search_info.html:73 +msgid "" +" \n" +" Unaccent is a special case in that it enables searching a field " +"'unaccented' for each search style attempting to ignore accented values. \n" +" For example when you enable unaccent for 'Name' any search " +"(starts with, contains, trigram) will attempt the search ignoring accented " +"characters.\n" +" \n" +" For the other options, you can enable search on any or all " +"fields and they will be combined together with an assumed 'OR'.\n" +" For example enabling 'Name' for Starts With, 'Name' and " +"'Description' for Partial Match and 'Ingredients' and 'Keywords' for Full " +"Search\n" +" and searching for 'apple' will generate a search that will " +"return recipes that have:\n" +" - A recipe name that starts with 'apple'\n" +" - OR a recipe name that contains 'apple'\n" +" - OR a recipe description that contains 'apple'\n" +" - OR a recipe that will have a full text search match ('apple' " +"or 'apples') in ingredients\n" +" - OR a recipe that will have a full text search match in " +"Keywords\n" +"\n" +" Combining too many fields in too many types of search can have a " +"negative impact on performance, create duplicate results or return " +"unexpected results.\n" +" For example, enabling fuzzy search or partial matches will " +"interfere with web search methods. \n" +" Searching for 'apple -pie' with fuzzy search and full text " +"search will return the recipe Apple Pie. Though it is not included in the " +"full text results, it does match the trigram results.\n" +" " +msgstr "" +" \n" +" Ongeaccentueerd is een optie waarbij letters met accenten met de " +"gekozen zoekmethode genegeerd worden. \n" +" Wanneer je bijvoorbeeld ongeaccentueerd voor 'Naam' activeert " +"wordt bij elke zoekmethode geaccentueerde tekens genegeerd.\n" +" Voor de andere opties kan je zoeken op elk of alle velden " +"waarbij ze dan worden gecombineerd met een aangenomen 'OR'.\n" +" Bijvoorbeeld activatie van 'Naam' voor Begint met, 'Naam' en " +"'Beschrijving' voor Gedeeltelijke overeenkomst en 'Ingrediënten' en " +"'Etiketten' voor Volledig zoeken vindt de volgende recepten:\n" +" - Een receptnaam die begint met 'appel'\n" +" - OF een receptnaam die 'appel' bevat\n" +" - OF een receptbeschrijving die 'appel' bevat\n" +" - OF een recept met een volledige tekst overeenkomst ('appel' of " +"'appels') in Ingredienten\n" +" - OF een recept met een volledige tekst overeenkomst in " +"Etiketten\n" +"\n" +" Te veel velden combineren in te veel verschillende zoekmethoden " +"kan een negatieve impact op de prestaties hebben, dubbele resultaten creëren " +"of tot onverwachte resultaten leiden.\n" +" Het activeren van 'Fuzzy' zoeken of gedeeltelijke overeenkomsten " +"belemmert 'web' zoekmethoden. \n" +" Zoeken naar 'appel - taart' met 'Fuzzy' zoeken en volledige " +"tekst zoeken vindt het recept Appeltaart. Ondanks dat het niet in de " +"volledige tekst zoeken resultaten staat, komt het overeen met de " +"trigramresultaten.\n" +" " + +#: .\cookbook\templates\search_info.html:95 +msgid "Search Index" +msgstr "Zoekindex" + +#: .\cookbook\templates\search_info.html:99 +msgid "" +" \n" +" Trigram search and Full Text Search both rely on database " +"indexes to perform effectively. \n" +" You can rebuild the indexes on all fields in the Admin page for " +"Recipes and selecting all recipes and running 'rebuild index for selected " +"recipes'\n" +" You can also rebuild indexes at the command line by executing " +"the management command 'python manage.py rebuildindex'\n" +" " +msgstr "" +" \n" +" Trigram zoeken en Volledige tekst zoeken gebruiken beiden " +"database indices om effectief te kunnen zoeken. \n" +" Je kan de indices herbouwen op alle velden in de " +"Administratiepagina voor Recepten en vervolgens alle recepten te selecteren " +"en 'herbouw index voor geselecteerde recepten' te activeren.\n" +" Je kan ook indices herbouwen op de command line met het " +"managementcommando 'python manage.py rebuildindex'\n" +" " + +#: .\cookbook\templates\settings.html:28 msgid "Account" msgstr "Account" -#: .\cookbook\templates\settings.html:29 +#: .\cookbook\templates\settings.html:35 msgid "Preferences" msgstr "Voorkeuren" -#: .\cookbook\templates\settings.html:33 +#: .\cookbook\templates\settings.html:42 msgid "API-Settings" msgstr "API-instellingen" -#: .\cookbook\templates\settings.html:41 +#: .\cookbook\templates\settings.html:49 +msgid "Search-Settings" +msgstr "Zoek instellingen" + +#: .\cookbook\templates\settings.html:56 +#, fuzzy +#| msgid "Search-Settings" +msgid "Shopping-Settings" +msgstr "Zoek instellingen" + +#: .\cookbook\templates\settings.html:65 msgid "Name Settings" msgstr "Naam instellingen" -#: .\cookbook\templates\settings.html:49 +#: .\cookbook\templates\settings.html:73 msgid "Account Settings" msgstr "Account instellingen" -#: .\cookbook\templates\settings.html:51 +#: .\cookbook\templates\settings.html:75 msgid "Emails" msgstr "E-mails" -#: .\cookbook\templates\settings.html:54 +#: .\cookbook\templates\settings.html:78 #: .\cookbook\templates\socialaccount\connections.html:11 msgid "Social" msgstr "Socials" -#: .\cookbook\templates\settings.html:66 +#: .\cookbook\templates\settings.html:91 msgid "Language" msgstr "Taal" -#: .\cookbook\templates\settings.html:96 +#: .\cookbook\templates\settings.html:121 msgid "Style" msgstr "Stijl" -#: .\cookbook\templates\settings.html:116 +#: .\cookbook\templates\settings.html:142 msgid "API Token" msgstr "API Token" -#: .\cookbook\templates\settings.html:117 +#: .\cookbook\templates\settings.html:143 msgid "" "You can use both basic authentication and token based authentication to " "access the REST API." @@ -1797,7 +2080,7 @@ 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:134 +#: .\cookbook\templates\settings.html:160 msgid "" "Use the token as an Authorization header prefixed by the word token as shown " "in the following examples:" @@ -1805,10 +2088,80 @@ msgstr "" "Gebruik de token als een 'Authorization header'voorafgegaan door het woord " "token zoals in de volgende voorbeelden:" -#: .\cookbook\templates\settings.html:136 +#: .\cookbook\templates\settings.html:162 msgid "or" msgstr "of" +#: .\cookbook\templates\settings.html:173 +msgid "" +"There are many options to configure the search depending on your personal " +"preferences." +msgstr "" +"Er zijn vele mogelijkheden om het zoeken te configureren die afhangen van je " +"persoonlijke voorkeur." + +#: .\cookbook\templates\settings.html:174 +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 "" +"Normaal gesproken is het niet nodig ze te configureren en kan je " +"gebruikmaken van het standaard profiel of de volgende vooraf ingestelde " +"profielen." + +#: .\cookbook\templates\settings.html:175 +msgid "" +"If you do want to configure the search you can read about the different " +"options here." +msgstr "" +"Als je het zoeken wil configureren kan je hier " +"over de verschillende opties lezen." + +#: .\cookbook\templates\settings.html:180 +msgid "Fuzzy" +msgstr "Fuzzy" + +#: .\cookbook\templates\settings.html:181 +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 "" +"Vind wat je nodig hebt, zelfs als je zoekopdracht of het recept typefouten " +"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 +msgid "This is the default behavior" +msgstr "Dit is het standaard gedrag" + +#: .\cookbook\templates\settings.html:183 +#: .\cookbook\templates\settings.html:191 +msgid "Apply" +msgstr "Pas toe" + +#: .\cookbook\templates\settings.html:188 +msgid "Precise" +msgstr "Nauwkeurig" + +#: .\cookbook\templates\settings.html:189 +msgid "" +"Allows fine control over search results but might not return results if too " +"many spelling mistakes are made." +msgstr "" +"Staat fijnmazige controle over zoekresultaten toe, maar toont mogelijk geen " +"resultaten als er te veel spelfouten gemaakt zijn." + +#: .\cookbook\templates\settings.html:190 +msgid "Perfect for large Databases" +msgstr "Perfect voor grote databases" + +#: .\cookbook\templates\settings.html:207 +#, fuzzy +#| msgid "Shopping List" +msgid "Shopping Settings" +msgstr "Boodschappenlijst" + #: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5 msgid "Cookbook Setup" msgstr "Kookboek Setup" @@ -1827,50 +2180,73 @@ msgstr "" msgid "Create Superuser account" msgstr "Maak Superuser acount" -#: .\cookbook\templates\shopping_list.html:79 -msgid "Shopping Recipes" -msgstr "Boodschappen recepten" +#: .\cookbook\templates\shopping_list.html:8 +#: .\cookbook\templates\shopping_list.html:29 +#: .\cookbook\templates\shopping_list.html:663 +msgid "Shopping List" +msgstr "Boodschappenlijst" -#: .\cookbook\templates\shopping_list.html:83 +#: .\cookbook\templates\shopping_list.html:55 +msgid "Search Recipe" +msgstr "Zoek recept" + +#: .\cookbook\templates\shopping_list.html:72 +msgid "Shopping Recipes" +msgstr "Recepten op boodschappenlijst" + +#: .\cookbook\templates\shopping_list.html:74 msgid "No recipes selected" msgstr "Geen recepten geselecteerd" -#: .\cookbook\templates\shopping_list.html:150 +#: .\cookbook\templates\shopping_list.html:131 msgid "Entry Mode" msgstr "Invoermodus" -#: .\cookbook\templates\shopping_list.html:158 +#: .\cookbook\templates\shopping_list.html:139 msgid "Add Entry" -msgstr "Zet op lijst" +msgstr "Voeg toe aan boodschappenlijst" -#: .\cookbook\templates\shopping_list.html:174 +#: .\cookbook\templates\shopping_list.html:152 msgid "Amount" msgstr "Hoeveelheid" -#: .\cookbook\templates\shopping_list.html:240 +#: .\cookbook\templates\shopping_list.html:164 +msgid "Select Unit" +msgstr "Selecteer eenheid" + +#: .\cookbook\templates\shopping_list.html:166 +#: .\cookbook\templates\shopping_list.html:189 +#: .\cookbook\templates\shopping_list.html:219 +#: .\cookbook\templates\shopping_list.html:243 +#: .\cookbook\templates\url_import.html:505 +#: .\cookbook\templates\url_import.html:537 +msgid "Select" +msgstr "Selecteer" + +#: .\cookbook\templates\shopping_list.html:187 +msgid "Select Food" +msgstr "Selecteer ingrediënt" + +#: .\cookbook\templates\shopping_list.html:218 msgid "Select Supermarket" msgstr "Selecteer supermarkt" -#: .\cookbook\templates\shopping_list.html:264 +#: .\cookbook\templates\shopping_list.html:242 msgid "Select User" msgstr "Selecteer gebruiker" -#: .\cookbook\templates\shopping_list.html:283 +#: .\cookbook\templates\shopping_list.html:258 msgid "Finished" msgstr "Afgerond" -#: .\cookbook\templates\shopping_list.html:296 +#: .\cookbook\templates\shopping_list.html:267 msgid "You are offline, shopping list might not syncronize." -msgstr "Je bent offline, boodschappenlijst synchroniseert mogelijk niet." +msgstr "Je bent offline, de boodschappenlijst synchroniseert mogelijk niet." -#: .\cookbook\templates\shopping_list.html:361 +#: .\cookbook\templates\shopping_list.html:318 msgid "Copy/Export" msgstr "Kopieër/exporteer" -#: .\cookbook\templates\shopping_list.html:365 -msgid "List Prefix" -msgstr "Lijst voorvoegsel" - #: .\cookbook\templates\socialaccount\connections.html:4 #: .\cookbook\templates\socialaccount\connections.html:15 msgid "Account Connections" @@ -1926,84 +2302,80 @@ msgstr "" msgid "Sign in using" msgstr "Log in met" -#: .\cookbook\templates\space.html:23 +#: .\cookbook\templates\space.html:25 msgid "Space:" msgstr "Ruimte:" -#: .\cookbook\templates\space.html:24 +#: .\cookbook\templates\space.html:26 msgid "Manage Subscription" msgstr "Beheer abonnementen" -#: .\cookbook\templates\space.html:32 .\cookbook\templates\stats.html:19 +#: .\cookbook\templates\space.html:34 .\cookbook\templates\stats.html:19 msgid "Number of objects" msgstr "Aantal objecten" -#: .\cookbook\templates\space.html:45 .\cookbook\templates\stats.html:30 +#: .\cookbook\templates\space.html:54 .\cookbook\templates\stats.html:30 msgid "Recipe Imports" msgstr "Geïmporteerde recepten" -#: .\cookbook\templates\space.html:53 .\cookbook\templates\stats.html:38 +#: .\cookbook\templates\space.html:62 .\cookbook\templates\stats.html:38 msgid "Objects stats" msgstr "Object statistieken" -#: .\cookbook\templates\space.html:56 .\cookbook\templates\stats.html:41 +#: .\cookbook\templates\space.html:65 .\cookbook\templates\stats.html:41 msgid "Recipes without Keywords" msgstr "Recepten zonder etiketten" -#: .\cookbook\templates\space.html:58 .\cookbook\templates\stats.html:43 -msgid "External Recipes" -msgstr "Externe recepten" - -#: .\cookbook\templates\space.html:60 .\cookbook\templates\stats.html:45 +#: .\cookbook\templates\space.html:73 .\cookbook\templates\stats.html:45 msgid "Internal Recipes" msgstr "Interne recepten" -#: .\cookbook\templates\space.html:73 +#: .\cookbook\templates\space.html:89 msgid "Members" msgstr "Leden" -#: .\cookbook\templates\space.html:77 +#: .\cookbook\templates\space.html:95 msgid "Invite User" msgstr "Nodig gebruiker uit" -#: .\cookbook\templates\space.html:88 +#: .\cookbook\templates\space.html:107 msgid "User" msgstr "Gebruiker" -#: .\cookbook\templates\space.html:89 +#: .\cookbook\templates\space.html:108 msgid "Groups" msgstr "Groepen" -#: .\cookbook\templates\space.html:105 +#: .\cookbook\templates\space.html:119 msgid "admin" msgstr "Beheerder" -#: .\cookbook\templates\space.html:106 +#: .\cookbook\templates\space.html:120 msgid "user" msgstr "gebruiker" -#: .\cookbook\templates\space.html:107 +#: .\cookbook\templates\space.html:121 msgid "guest" msgstr "gast" -#: .\cookbook\templates\space.html:108 +#: .\cookbook\templates\space.html:122 msgid "remove" msgstr "verwijder" -#: .\cookbook\templates\space.html:112 +#: .\cookbook\templates\space.html:126 msgid "Update" msgstr "Update" -#: .\cookbook\templates\space.html:116 +#: .\cookbook\templates\space.html:130 msgid "You cannot edit yourself." msgstr "Je kan jezelf niet bewerken." -#: .\cookbook\templates\space.html:123 +#: .\cookbook\templates\space.html:136 msgid "There are no members in your space yet!" msgstr "Er zitten nog geen leden in jouw ruimte!" -#: .\cookbook\templates\space.html:130 .\cookbook\templates\system.html:21 -#: .\cookbook\views\lists.py:115 +#: .\cookbook\templates\space.html:143 .\cookbook\templates\system.html:21 +#: .\cookbook\views\lists.py:85 msgid "Invite Links" msgstr "Uitnodigingslink" @@ -2011,6 +2383,10 @@ msgstr "Uitnodigingslink" msgid "Stats" msgstr "Statistieken" +#: .\cookbook\templates\stats.html:10 +msgid "Statistics" +msgstr "Statistieken" + #: .\cookbook\templates\system.html:22 msgid "Show Links" msgstr "Toon links" @@ -2139,94 +2515,111 @@ msgstr "" " alleen werken met Postgres databases.\n" " " -#: .\cookbook\templates\url_import.html:6 +#: .\cookbook\templates\url_import.html:8 msgid "URL Import" msgstr "Importeer URL" -#: .\cookbook\templates\url_import.html:31 +#: .\cookbook\templates\url_import.html:33 msgid "Drag me to your bookmarks to import recipes from anywhere" msgstr "" "Sleep mij naar je bladwijzers om overal recepten vandaan te kunnen importeren" -#: .\cookbook\templates\url_import.html:32 +#: .\cookbook\templates\url_import.html:34 msgid "Bookmark Me!" msgstr "Sla mij op als bladwijzer!" -#: .\cookbook\templates\url_import.html:61 +#: .\cookbook\templates\url_import.html:38 +msgid "URL" +msgstr "URL" + +#: .\cookbook\templates\url_import.html:40 +msgid "App" +msgstr "App" + +#: .\cookbook\templates\url_import.html:64 msgid "Enter website URL" msgstr "Vul website URL in" -#: .\cookbook\templates\url_import.html:97 +#: .\cookbook\templates\url_import.html:104 msgid "Select recipe files to import or drop them here..." msgstr "" "Selecteer receptbestanden om te importeren of sleep ze hier naar toe..." -#: .\cookbook\templates\url_import.html:118 +#: .\cookbook\templates\url_import.html:125 msgid "Paste json or html source here to load recipe." msgstr "Plak json of html bron om recept te laden." -#: .\cookbook\templates\url_import.html:146 +#: .\cookbook\templates\url_import.html:153 msgid "Preview Recipe Data" msgstr "Bekijk recept gegevens" -#: .\cookbook\templates\url_import.html:147 +#: .\cookbook\templates\url_import.html:154 msgid "Drag recipe attributes from the right into the appropriate box below." msgstr "" "Sleep eigenschappen van het recept van rechts naar het juiste vlak beneden." -#: .\cookbook\templates\url_import.html:156 -#: .\cookbook\templates\url_import.html:173 -#: .\cookbook\templates\url_import.html:190 -#: .\cookbook\templates\url_import.html:209 -#: .\cookbook\templates\url_import.html:227 -#: .\cookbook\templates\url_import.html:242 -#: .\cookbook\templates\url_import.html:257 -#: .\cookbook\templates\url_import.html:273 -#: .\cookbook\templates\url_import.html:300 -#: .\cookbook\templates\url_import.html:351 +#: .\cookbook\templates\url_import.html:163 +#: .\cookbook\templates\url_import.html:180 +#: .\cookbook\templates\url_import.html:197 +#: .\cookbook\templates\url_import.html:216 +#: .\cookbook\templates\url_import.html:234 +#: .\cookbook\templates\url_import.html:249 +#: .\cookbook\templates\url_import.html:264 +#: .\cookbook\templates\url_import.html:280 +#: .\cookbook\templates\url_import.html:307 +#: .\cookbook\templates\url_import.html:358 msgid "Clear Contents" msgstr "Wis inhoud" -#: .\cookbook\templates\url_import.html:158 +#: .\cookbook\templates\url_import.html:165 msgid "Text dragged here will be appended to the name." msgstr "Hierheen gesleepte tekst wordt aan de naam toegevoegd." -#: .\cookbook\templates\url_import.html:175 +#: .\cookbook\templates\url_import.html:178 +msgid "Description" +msgstr "Beschrijving" + +#: .\cookbook\templates\url_import.html:182 msgid "Text dragged here will be appended to the description." msgstr "Hierheen gesleepte tekst wordt aan de beschrijving toegevoegd." -#: .\cookbook\templates\url_import.html:192 +#: .\cookbook\templates\url_import.html:199 msgid "Keywords dragged here will be appended to current list" msgstr "Hierheen gesleepte Etiketten worden aan de huidige lijst toegevoegd" -#: .\cookbook\templates\url_import.html:207 +#: .\cookbook\templates\url_import.html:214 msgid "Image" msgstr "Afbeelding" -#: .\cookbook\templates\url_import.html:239 +#: .\cookbook\templates\url_import.html:246 msgid "Prep Time" msgstr "Voorbereidingstijd" -#: .\cookbook\templates\url_import.html:254 +#: .\cookbook\templates\url_import.html:261 msgid "Cook Time" msgstr "Kooktijd" -#: .\cookbook\templates\url_import.html:275 +#: .\cookbook\templates\url_import.html:282 msgid "Ingredients dragged here will be appended to current list." msgstr "" "Hierheen gesleepte Ingrediënten worden aan de huidige lijst toegevoegd." -#: .\cookbook\templates\url_import.html:302 +#: .\cookbook\templates\url_import.html:304 +#: .\cookbook\templates\url_import.html:579 +msgid "Instructions" +msgstr "Instructies" + +#: .\cookbook\templates\url_import.html:309 msgid "" "Recipe instructions dragged here will be appended to current instructions." msgstr "" "Hierheen gesleepte Recept instructies worden aan de huidige lijst toegevoegd." -#: .\cookbook\templates\url_import.html:325 +#: .\cookbook\templates\url_import.html:332 msgid "Discovered Attributes" msgstr "Ontdekte Eigenschappen" -#: .\cookbook\templates\url_import.html:327 +#: .\cookbook\templates\url_import.html:334 msgid "" "Drag recipe attributes from below into the appropriate box on the left. " "Click any node to display its full properties." @@ -2234,53 +2627,61 @@ msgstr "" "Sleep recept eigenschappen van beneden naar de juiste doos aan de " "linkerzijde. Klik er op om alle eigenschappen te zien." -#: .\cookbook\templates\url_import.html:344 +#: .\cookbook\templates\url_import.html:351 msgid "Show Blank Field" msgstr "Toon Leeg Veld" -#: .\cookbook\templates\url_import.html:349 +#: .\cookbook\templates\url_import.html:356 msgid "Blank Field" msgstr "Leeg Veld" -#: .\cookbook\templates\url_import.html:353 +#: .\cookbook\templates\url_import.html:360 msgid "Items dragged to Blank Field will be appended." msgstr "Naar Leeg Veld gesleepte items worden toegevoegd." -#: .\cookbook\templates\url_import.html:400 +#: .\cookbook\templates\url_import.html:407 msgid "Delete Text" msgstr "Verwijder tekst" -#: .\cookbook\templates\url_import.html:413 +#: .\cookbook\templates\url_import.html:420 msgid "Delete image" msgstr "Verwijder afbeelding" -#: .\cookbook\templates\url_import.html:429 +#: .\cookbook\templates\url_import.html:436 msgid "Recipe Name" msgstr "Naam Recept" -#: .\cookbook\templates\url_import.html:433 +#: .\cookbook\templates\url_import.html:440 msgid "Recipe Description" msgstr "Beschrijving recept" -#: .\cookbook\templates\url_import.html:494 -#: .\cookbook\templates\url_import.html:526 -#: .\cookbook\templates\url_import.html:582 +#: .\cookbook\templates\url_import.html:504 +#: .\cookbook\templates\url_import.html:536 +#: .\cookbook\templates\url_import.html:596 msgid "Select one" msgstr "Selecteer één" -#: .\cookbook\templates\url_import.html:596 +#: .\cookbook\templates\url_import.html:554 +msgid "Note" +msgstr "Notitie" + +#: .\cookbook\templates\url_import.html:597 +msgid "Add Keyword" +msgstr "Voeg Etiket toe" + +#: .\cookbook\templates\url_import.html:610 msgid "All Keywords" msgstr "Alle etiketten" -#: .\cookbook\templates\url_import.html:599 +#: .\cookbook\templates\url_import.html:613 msgid "Import all keywords, not only the ones already existing." msgstr "Importeer alle etiketten, niet alleen de bestaande." -#: .\cookbook\templates\url_import.html:626 +#: .\cookbook\templates\url_import.html:640 msgid "Information" msgstr "Informatie" -#: .\cookbook\templates\url_import.html:628 +#: .\cookbook\templates\url_import.html:642 msgid "" " Only websites containing ld+json or microdata information can currently\n" " be imported. Most big recipe pages " @@ -2298,49 +2699,193 @@ msgstr "" "vrij om een voorbeeld te posten in \n" " de GitHub issues." -#: .\cookbook\templates\url_import.html:636 +#: .\cookbook\templates\url_import.html:650 msgid "Google ld+json Info" msgstr "Google Id+json Info" -#: .\cookbook\templates\url_import.html:639 +#: .\cookbook\templates\url_import.html:653 msgid "GitHub Issues" msgstr "GitHub issues" -#: .\cookbook\templates\url_import.html:641 +#: .\cookbook\templates\url_import.html:655 msgid "Recipe Markup Specification" msgstr "Recept opmaak specificatie" -#: .\cookbook\views\api.py:79 +#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:170 msgid "Parameter updated_at incorrectly formatted" msgstr "Parameter updatet_at is onjuist geformateerd" -#: .\cookbook\views\api.py:580 .\cookbook\views\views.py:303 -msgid "This feature is not available in the demo version!" -msgstr "Deze optie is niet beschikbaar in de demo versie!" +#: .\cookbook\views\api.py:190 .\cookbook\views\api.py:291 +#, python-brace-format +msgid "No {self.basename} with id {pk} exists" +msgstr "Er bestaat geen {self.basename} met id {pk}" -#: .\cookbook\views\api.py:603 +#: .\cookbook\views\api.py:194 +msgid "Cannot merge with the same object!" +msgstr "Kan niet met hetzelfde object samenvoegen!" + +#: .\cookbook\views\api.py:201 +#, python-brace-format +msgid "No {self.basename} with id {target} exists" +msgstr "Er bestaat geen {self.basename} met id {target}" + +#: .\cookbook\views\api.py:206 +msgid "Cannot merge with child object!" +msgstr "Kan niet met kindobject samenvoegen!" + +#: .\cookbook\views\api.py:239 +#, 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:244 +#, 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:300 +#, 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:303 .\cookbook\views\api.py:321 +msgid "An error occurred attempting to move " +msgstr "Er is een error opgetreden bij het verplaatsen " + +#: .\cookbook\views\api.py:306 +msgid "Cannot move an object to itself!" +msgstr "Kan object niet verplaatsen naar zichzelf!" + +#: .\cookbook\views\api.py:312 +#, python-brace-format +msgid "No {self.basename} with id {parent} exists" +msgstr "Er bestaat geen {self.basename} met id {parent}" + +#: .\cookbook\views\api.py:318 +#, 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:470 +#, python-brace-format +msgid "{obj.name} was removed from the shopping list." +msgstr "" + +#: .\cookbook\views\api.py:475 .\cookbook\views\api.py:726 +#, python-brace-format +msgid "{obj.name} was added to the shopping list." +msgstr "" + +#: .\cookbook\views\api.py:587 +msgid "ID of recipe a step is part of. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:588 +msgid "Query string matched (fuzzy) against object name." +msgstr "" + +#: .\cookbook\views\api.py:631 +msgid "" +"Query string matched (fuzzy) against recipe name. In the future also " +"fulltext search." +msgstr "" + +#: .\cookbook\views\api.py:632 +msgid "ID of keyword a recipe should have. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:633 +msgid "ID of food a recipe should have. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:634 +msgid "ID of unit a recipe should have." +msgstr "" + +#: .\cookbook\views\api.py:635 +msgid "Rating a recipe should have. [0 - 5]" +msgstr "" + +#: .\cookbook\views\api.py:636 +msgid "ID of book a recipe should be in. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:637 +msgid "" +"If recipe should have all (AND=false) or any (OR=true) of the " +"provided keywords." +msgstr "" + +#: .\cookbook\views\api.py:638 +msgid "" +"If recipe should have all (AND=false) or any (OR=true) of the " +"provided foods." +msgstr "" + +#: .\cookbook\views\api.py:639 +msgid "" +"If recipe should be in all (AND=false) or any (OR=true) of the " +"provided books." +msgstr "" + +#: .\cookbook\views\api.py:640 +msgid "If only internal recipes should be returned. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:641 +msgid "Returns the results in randomized order. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:642 +msgid "Returns new results first in search results. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:768 +msgid "" +"Returns the shopping list entry with a primary key of id. Multiple values " +"allowed." +msgstr "" + +#: .\cookbook\views\api.py:771 +msgid "" +"Filter shopping list entries on checked. [true, false, both, recent]
- recent includes unchecked items and recently completed items." +msgstr "" + +#: .\cookbook\views\api.py:773 +msgid "Returns the shopping list entries sorted by supermarket category order." +msgstr "" + +#: .\cookbook\views\api.py:922 .\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 "Deze optie is nog niet beschikbaar in de gehoste versie van Tandoor!" + +#: .\cookbook\views\api.py:944 msgid "Sync successful!" msgstr "Synchronisatie succesvol!" -#: .\cookbook\views\api.py:608 +#: .\cookbook\views\api.py:949 msgid "Error synchronizing with Storage" msgstr "Er is een fout opgetreden bij het synchroniseren met Opslag" -#: .\cookbook\views\api.py:686 +#: .\cookbook\views\api.py:1028 msgid "Nothing to do." msgstr "Niks te doen." -#: .\cookbook\views\api.py:701 +#: .\cookbook\views\api.py:1043 msgid "The requested site provided malformed data and cannot be read." msgstr "" "De opgevraagde site heeft misvormde data verstrekt en kan niet gelezen " "worden." -#: .\cookbook\views\api.py:708 +#: .\cookbook\views\api.py:1050 msgid "The requested page could not be found." msgstr "De opgevraagde pagina kon niet gevonden worden." -#: .\cookbook\views\api.py:717 +#: .\cookbook\views\api.py:1068 msgid "" "The requested site does not provide any recognized data format to import the " "recipe from." @@ -2348,172 +2893,177 @@ msgstr "" "De opgevraagde site biedt geen bekend gegevensformaat aan om het recept van " "te importeren." -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:1082 +msgid "Connection Refused." +msgstr "" + +#: .\cookbook\views\api.py:1091 msgid "No useable data could be found." msgstr "Er is geen bruikbare data gevonden." -#: .\cookbook\views\api.py:747 +#: .\cookbook\views\api.py:1107 msgid "I couldn't find anything to do." msgstr "Ik kon niks vinden om te doen." -#: .\cookbook\views\data.py:31 .\cookbook\views\data.py:122 -#: .\cookbook\views\edit.py:50 .\cookbook\views\import_export.py:67 -#: .\cookbook\views\new.py:32 +#: .\cookbook\views\data.py:34 .\cookbook\views\data.py:129 +#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:80 +#: .\cookbook\views\new.py:33 msgid "You have reached the maximum number of recipes for your space." msgstr "Je hebt het maximaal aantal recepten voor jouw ruimte bereikt." -#: .\cookbook\views\data.py:35 .\cookbook\views\data.py:126 -#: .\cookbook\views\edit.py:54 .\cookbook\views\import_export.py:71 -#: .\cookbook\views\new.py:36 +#: .\cookbook\views\data.py:38 .\cookbook\views\data.py:133 +#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:84 +#: .\cookbook\views\new.py:37 msgid "You have more users than allowed in your space." msgstr "Je hebt meer gebruikers dan toegestaan in jouw ruimte." -#: .\cookbook\views\data.py:104 +#: .\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] "Batch bewerking voldaan. %(count)d het recept is ge-update." msgstr[1] "Batch bewerking voldaan. %(count)d Recepten zijn geupdatet." -#: .\cookbook\views\delete.py:72 +#: .\cookbook\views\delete.py:101 msgid "Monitor" msgstr "Bewaker" -#: .\cookbook\views\delete.py:96 .\cookbook\views\lists.py:102 -#: .\cookbook\views\new.py:98 +#: .\cookbook\views\delete.py:125 .\cookbook\views\lists.py:71 +#: .\cookbook\views\new.py:101 msgid "Storage Backend" msgstr "Opslag backend" -#: .\cookbook\views\delete.py:106 +#: .\cookbook\views\delete.py:135 msgid "" "Could not delete this storage backend as it is used in at least one monitor." msgstr "" "Dit Opslag backend kon niet verwijderd worden omdat het gebruikt wordt in " "tenminste een Bewaker." -#: .\cookbook\views\delete.py:129 .\cookbook\views\edit.py:213 -#: .\cookbook\views\new.py:156 +#: .\cookbook\views\delete.py:158 msgid "Recipe Book" msgstr "Kookboek" -#: .\cookbook\views\delete.py:141 +#: .\cookbook\views\delete.py:170 msgid "Bookmarks" msgstr "Bladwijzers" -#: .\cookbook\views\delete.py:163 .\cookbook\views\new.py:252 +#: .\cookbook\views\delete.py:192 .\cookbook\views\new.py:238 msgid "Invite Link" msgstr "Uitnodigingslink" -#: .\cookbook\views\edit.py:119 -msgid "Food" -msgstr "Ingrediënt" - -#: .\cookbook\views\edit.py:128 +#: .\cookbook\views\edit.py:125 msgid "You cannot edit this storage!" msgstr "Je kan deze opslag niet bewerken!" -#: .\cookbook\views\edit.py:148 +#: .\cookbook\views\edit.py:149 msgid "Storage saved!" msgstr "Opslag opgeslagen!" -#: .\cookbook\views\edit.py:154 +#: .\cookbook\views\edit.py:155 msgid "There was an error updating this storage backend!" msgstr "Er is een fout opgetreden bij het updaten van deze opslag backend!" -#: .\cookbook\views\edit.py:165 -msgid "Storage" -msgstr "Opslag" - -#: .\cookbook\views\edit.py:261 +#: .\cookbook\views\edit.py:248 msgid "Changes saved!" msgstr "Wijzigingen opgeslagen!" -#: .\cookbook\views\edit.py:265 +#: .\cookbook\views\edit.py:252 msgid "Error saving changes!" msgstr "Fout bij het opslaan van de wijzigingen!" -#: .\cookbook\views\edit.py:299 -msgid "Units merged!" -msgstr "Eenheden samengevoegd!" - -#: .\cookbook\views\edit.py:301 .\cookbook\views\edit.py:317 -msgid "Cannot merge with the same object!" -msgstr "Kan niet met hetzelfde object samenvoegen!" - -#: .\cookbook\views\edit.py:315 -msgid "Foods merged!" -msgstr "Ingrediënten samengevoegd!" - -#: .\cookbook\views\import_export.py:93 +#: .\cookbook\views\import_export.py:106 msgid "Importing is not implemented for this provider" msgstr "Importeren is voor deze provider niet geïmplementeerd" -#: .\cookbook\views\import_export.py:115 +#: .\cookbook\views\import_export.py:127 +msgid "" +"The PDF Exporter is not enabled on this instance as it is still in an " +"experimental state." +msgstr "" + +#: .\cookbook\views\import_export.py:132 msgid "Exporting is not implemented for this provider" msgstr "Exporteren is voor deze provider niet geïmplementeerd" -#: .\cookbook\views\lists.py:40 +#: .\cookbook\views\lists.py:25 msgid "Import Log" msgstr "Import logboek" -#: .\cookbook\views\lists.py:53 +#: .\cookbook\views\lists.py:38 msgid "Discovery" msgstr "Ontdekken" -#: .\cookbook\views\lists.py:85 +#: .\cookbook\views\lists.py:54 msgid "Shopping Lists" msgstr "Boodschappenlijst" -#: .\cookbook\views\new.py:123 +#: .\cookbook\views\lists.py:148 +msgid "Supermarkets" +msgstr "Supermarkten" + +#: .\cookbook\views\lists.py:164 +msgid "Shopping Categories" +msgstr "Boodschappencategorieën" + +#: .\cookbook\views\lists.py:217 +msgid "Steps" +msgstr "Stappen" + +#: .\cookbook\views\lists.py:232 +msgid "New Shopping List" +msgstr "Nieuwe boodschappenlijst" + +#: .\cookbook\views\new.py:126 msgid "Imported new recipe!" msgstr "Nieuw recept geïmporteerd!" -#: .\cookbook\views\new.py:126 +#: .\cookbook\views\new.py:129 msgid "There was an error importing this recipe!" msgstr "Er is een fout opgetreden bij het importeren van dit recept!" -#: .\cookbook\views\new.py:226 +#: .\cookbook\views\new.py:212 msgid "Hello" msgstr "Hallo" -#: .\cookbook\views\new.py:226 +#: .\cookbook\views\new.py:212 msgid "You have been invited by " msgstr "Je bent uitgenodigd door " -#: .\cookbook\views\new.py:227 +#: .\cookbook\views\new.py:213 msgid " to join their Tandoor Recipes space " msgstr " om zijn/haar Tandoor Recepten ruimte " -#: .\cookbook\views\new.py:228 +#: .\cookbook\views\new.py:214 msgid "Click the following link to activate your account: " msgstr "Klik om de volgende link om je account te activeren: " -#: .\cookbook\views\new.py:229 +#: .\cookbook\views\new.py:215 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\views\new.py:230 +#: .\cookbook\views\new.py:216 msgid "The invitation is valid until " msgstr "De uitnodiging is geldig tot " -#: .\cookbook\views\new.py:231 +#: .\cookbook\views\new.py:217 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\views\new.py:234 +#: .\cookbook\views\new.py:220 msgid "Tandoor Recipes Invite" msgstr "Tandoor Recepten uitnodiging" -#: .\cookbook\views\new.py:241 +#: .\cookbook\views\new.py:227 msgid "Invite link successfully send to user." msgstr "Uitnodigingslink succesvol verstuurd naar gebruiker." -#: .\cookbook\views\new.py:244 +#: .\cookbook\views\new.py:230 msgid "" "You have send to many emails, please share the link manually or wait a few " "hours." @@ -2521,12 +3071,12 @@ msgstr "" "Je hebt te veel e-mails verstuurd, deel de link handmatig of wacht enkele " "uren." -#: .\cookbook\views\new.py:246 +#: .\cookbook\views\new.py:232 msgid "Email to user could not be send, please share link manually." msgstr "" "E-mail aan gebruiker kon niet verzonden worden, deel de link handmatig." -#: .\cookbook\views\views.py:129 +#: .\cookbook\views\views.py:126 msgid "" "You have successfully created your own recipe space. Start by adding some " "recipes or invite other people to join you." @@ -2534,15 +3084,35 @@ 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:177 +#: .\cookbook\views\views.py:174 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:188 +#: .\cookbook\views\views.py:185 msgid "Comment saved!" msgstr "Opmerking opgeslagen!" -#: .\cookbook\views\views.py:395 +#: .\cookbook\views\views.py:276 +msgid "This feature is not available in the demo version!" +msgstr "Deze optie is niet beschikbaar in de demo versie!" + +#: .\cookbook\views\views.py:335 +msgid "You must select at least one field to search!" +msgstr "Je moet tenminste één veld om te doorzoeken selecteren!" + +#: .\cookbook\views\views.py:340 +msgid "" +"To use this search method you must select at least one full text search " +"field!" +msgstr "" +"Om deze zoekmethode te gebruiken moet je tenminste één volledig tekstveld " +"selecteren!" + +#: .\cookbook\views\views.py:344 +msgid "Fuzzy search is not compatible with this search method!" +msgstr "'Fuzzy' zoeken is niet te gebruiken met deze zoekmethode!" + +#: .\cookbook\views\views.py:470 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 " @@ -2553,31 +3123,31 @@ msgstr "" "documentatie raad moeten plegen voor een methode om je wachtwoord te " "resetten." -#: .\cookbook\views\views.py:402 +#: .\cookbook\views\views.py:477 msgid "Passwords dont match!" msgstr "Wachtwoorden komen niet overeen!" -#: .\cookbook\views\views.py:418 +#: .\cookbook\views\views.py:493 msgid "User has been created, please login!" msgstr "Gebruiker is gecreëerd, Log in alstublieft!" -#: .\cookbook\views\views.py:434 +#: .\cookbook\views\views.py:509 msgid "Malformed Invite Link supplied!" msgstr "Onjuiste uitnodigingslink opgegeven!" -#: .\cookbook\views\views.py:441 +#: .\cookbook\views\views.py:516 msgid "You are already member of a space and therefore cannot join this one." msgstr "Je bent al lid van een ruimte en kan daardoor niet toetreden tot deze." -#: .\cookbook\views\views.py:452 +#: .\cookbook\views\views.py:527 msgid "Successfully joined space." msgstr "Succesvol toegetreden tot ruimte." -#: .\cookbook\views\views.py:458 +#: .\cookbook\views\views.py:533 msgid "Invite Link not valid or already used!" msgstr "De uitnodigingslink is niet valide of al gebruikt!" -#: .\cookbook\views\views.py:522 +#: .\cookbook\views\views.py:614 msgid "" "Reporting share links is not enabled for this instance. Please notify the " "page administrator to report problems." @@ -2585,7 +3155,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:528 +#: .\cookbook\views\views.py:620 msgid "" "Recipe sharing link has been disabled! For additional information please " "contact the page administrator." @@ -2593,15 +3163,282 @@ msgstr "" "Links voor het delen van recepten zijn gedeactiveerd. Neem contact op met de " "paginabeheerder voor aanvullende informatie." +#, python-brace-format +#~ msgid "No {self.basename} with id {child} exists" +#~ msgstr "Er bestaat geen {self.basename} met id {child}" + +#~ msgid "New Unit" +#~ msgstr "Nieuwe eenheid" + +#~ msgid "New unit that other gets replaced by." +#~ msgstr "Nieuwe eenheid waarmee de andere wordt vervangen." + +#~ msgid "Old Unit" +#~ msgstr "Oude eenheid" + +#~ msgid "Unit that should be replaced." +#~ msgstr "Eenheid die vervangen dient te worden." + +#~ msgid "New Food" +#~ msgstr "Nieuw Ingredïent" + +#~ msgid "New food that other gets replaced by." +#~ msgstr "Nieuw Ingredïent dat Oud Ingrediënt vervangt." + +#~ msgid "Old Food" +#~ msgstr "Oud Ingrediënt" + +#~ msgid "New Entry" +#~ msgstr "Nieuw item" + +#~ msgid "Title" +#~ msgstr "Titel" + +#~ msgid "Note (optional)" +#~ msgstr "Notitie (optioneel)" + +#~ msgid "" +#~ "You can use markdown to format this field. See the docs here" +#~ msgstr "" +#~ "Je kan markdown gebruiken om dit veld op te maken. Zie de documentatie" + +#~ msgid "Serving Count" +#~ msgstr "Portie teller" + +#~ msgid "Create only note" +#~ msgstr "Maak alleen een notitie" + +#~ msgid "Plan" +#~ msgstr "Plan" + +#~ msgid "Number of Days" +#~ msgstr "Aantal dagen" + +#~ msgid "Weekday offset" +#~ msgstr "Weekdag aanpassing" + +#~ msgid "" +#~ "Number of days starting from the first day of the week to offset the " +#~ "default view." +#~ msgstr "" +#~ "Aantal dagen startende met de eerste dag van de week om het standaard " +#~ "overzicht aan te passen." + +#~ msgid "Edit plan types" +#~ msgstr "Bewerk maaltijdplan types" + +#~ msgid "Show help" +#~ msgstr "Help" + +#~ msgid "Week iCal export" +#~ msgstr "Exporteer week als iCal" + +#~ msgid "Add to Shopping" +#~ msgstr "Voeg toe aan boodschappenlijst" + +#~ msgid "New meal type" +#~ msgstr "Nieuwe maaltijdsoort" + +#~ msgid "Meal Plan Help" +#~ msgstr "Maaltijdplanner hulp" + +#~ msgid "" +#~ "\n" +#~ "

The meal plan module allows planning of " +#~ "meals both with recipes and notes.

\n" +#~ "

Simply select a recipe from the list of " +#~ "recently viewed recipes or search the one you\n" +#~ " want and drag it to the desired plan " +#~ "position. You can also add a note and a title and\n" +#~ " then drag the recipe to create a plan " +#~ "entry with a custom title and note. Creating only\n" +#~ " Notes is possible by dragging the create " +#~ "note box into the plan.

\n" +#~ "

Click on a recipe in order to open the " +#~ "detailed view. There you can also add it to the\n" +#~ " shopping list. You can also add all " +#~ "recipes of a day to the shopping list by\n" +#~ " clicking the shopping cart at the top of " +#~ "the table.

\n" +#~ "

Since a common use case is to plan meals " +#~ "together you can define\n" +#~ " users you want to share your plan with in " +#~ "the settings.\n" +#~ "

\n" +#~ "

You can also edit the types of meals you " +#~ "want to plan. If you share your plan with\n" +#~ " someone with\n" +#~ " different meals, their meal types will " +#~ "appear in your list as well. To prevent\n" +#~ " duplicates (e.g. Other and Misc.)\n" +#~ " name your meal types the same as the " +#~ "users you share your meals with and they will be\n" +#~ " merged.

\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ "

De maaltijdplan module maakt plannen van " +#~ "maaltijden met recepten en notities mogelijk.

\n" +#~ "

Selecteer een recept van de lijst recent bekeken recepten of zoek " +#~ "naar\n" +#~ " het gewenste recept en sleep het naar de juiste positie in het " +#~ "maaltijdplan. Je kan ook eerst een notitie en titel toevoegen en dan het " +#~ "recept naar de juiste positie slepen om een unieke maaltijdplan " +#~ "inschrijving te maken.\n" +#~ " Alleen notities aanmaken is mogelijk door het Maak notitie vlak in het " +#~ "maaltijdplan te slepen.

\n" +#~ "

Klik op een recept om de gedetailleerde weergave te openen. Daar kan " +#~ "je het ook toevoegen aan je boodschappenlijst.\n" +#~ " Je kan ook alle recepten van een dag aan je boodschappenlijst toevoegen " +#~ "door op het winkelwagentje boven aan de tabel te klikken.

\n" +#~ "

Omdat maaltijden samen gepland kunnen worden kan je in de " +#~ "instellingen kiezen met welke gebruikers je het maaltijd plan wil delen.\n" +#~ "

Je kan ook het type maaltijd dat je wil plannen bewerken. Als je een " +#~ "maaltijdplan deelt met iemand met andere maaltijden, dan zullen hun " +#~ "maaltijdtypes ook in jouw lijst verschijnen. Geef, om dubbelingen (zoals " +#~ "Overig en Anders) te voorkomen, je maaltijdtypes daarom dezelfde naam als " +#~ "de gebruikers waarmee je maaltijdplannen deelt. In dat geval worden de " +#~ "maaltijden samengevoegd.

\n" +#~ " " + +#~ msgid "Units merged!" +#~ msgstr "Eenheden samengevoegd!" + +#~ msgid "Foods merged!" +#~ msgstr "Ingrediënten samengevoegd!" + +#~ msgid "Utensils" +#~ msgstr "Kookgerei" + +#~ msgid "Storage Data" +#~ msgstr "Dataopslag" + +#~ msgid "Storage Backends" +#~ msgstr "Opslag Backends" + +#~ msgid "Configure Sync" +#~ msgstr "Synchronisatie configureren" + +#~ msgid "Discovered Recipes" +#~ msgstr "Ontdekte recepten" + +#~ msgid "Discovery Log" +#~ msgstr "Ontdekkingslogboek" + +#~ msgid "Units & Ingredients" +#~ msgstr "Eenheden & Ingrediënten" + +#~ msgid "New Book" +#~ msgstr "Nieuw boek" + +#~ msgid "Toggle Recipes" +#~ msgstr "Recepten in/uitschakelen" + +#~ msgid "There are no recipes in this book yet." +#~ msgstr "In dit boek bestaan nog geen recepten." + +#~ msgid "Waiting Time" +#~ msgstr "Wachttijd" + +#~ msgid "Servings Text" +#~ msgstr "Porties tekst" + +#~ msgid "Select Keywords" +#~ msgstr "Selecteer etiketten" + +#~ msgid "Nutrition" +#~ msgstr "Voedingswaarde" + +#~ msgid "Delete Step" +#~ msgstr "Verwijder stap" + +#~ msgid "Calories" +#~ msgstr "Calorieën" + +#~ msgid "Carbohydrates" +#~ msgstr "Koolhydraten" + +#~ msgid "Fats" +#~ msgstr "Vetten" + +#~ msgid "Proteins" +#~ msgstr "Eiwitten" + +#~ msgid "Step" +#~ msgstr "Stap" + +#~ msgid "Show as header" +#~ msgstr "Laat als kop zien" + +#~ msgid "Hide as header" +#~ msgstr "Verbergen als kop" + +#~ msgid "Move Up" +#~ msgstr "Verplaats omhoog" + +#~ msgid "Move Down" +#~ msgstr "Verplaats omlaag" + +#~ msgid "Step Name" +#~ msgstr "Stap naam" + +#~ msgid "Step Type" +#~ msgstr "Stap type" + +#~ msgid "Step time in Minutes" +#~ msgstr "Tijdsduur stap in minuten" + +#~ msgid "Select File" +#~ msgstr "Selecteer bestand" + +#~ msgid "Select Recipe" +#~ msgstr "Selecteer recept" + +#~ msgid "Delete Ingredient" +#~ msgstr "Verwijder ingrediënt" + +#~ msgid "Make Header" +#~ msgstr "Stel in als kop" + +#~ msgid "Make Ingredient" +#~ msgstr "Maak ingrediënt" + +#~ msgid "Disable Amount" +#~ msgstr "Hoeveelheid uitschakelen" + +#~ msgid "Enable Amount" +#~ msgstr "Hoeveelheid inschakelen" + +#~ msgid "Copy Template Reference" +#~ msgstr "Kopieer sjabloon referentie" + +#~ msgid "Save & View" +#~ msgstr "Opslaan & bekijken" + +#~ msgid "Add Step" +#~ msgstr "Voeg stap toe" + +#~ msgid "Add Nutrition" +#~ msgstr "Voedingswaarde toevoegen" + +#~ msgid "Remove Nutrition" +#~ msgstr "Voedingswaarde verwijderen" + +#~ msgid "View Recipe" +#~ msgstr "Bekijk recept" + +#~ msgid "Delete Recipe" +#~ msgstr "Verwijder recept" + #~ msgid "Password Settings" #~ msgstr "Wachtwoord instellingen" #~ msgid "Email Settings" #~ msgstr "E-mail instellingen" -#~ msgid "Manage Email Settings" -#~ msgstr "Beheer e-mail instellingen" - #~ msgid "Manage Social Accounts" #~ msgstr "Beheer sociale media accounts" diff --git a/cookbook/locale/pl/LC_MESSAGES/django.mo b/cookbook/locale/pl/LC_MESSAGES/django.mo index 316de277..a9e19da9 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/pl/LC_MESSAGES/django.po b/cookbook/locale/pl/LC_MESSAGES/django.po index afd2c168..cda13d34 100644 --- a/cookbook/locale/pl/LC_MESSAGES/django.po +++ b/cookbook/locale/pl/LC_MESSAGES/django.po @@ -6,20 +6,23 @@ # Translators: # retmas , 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: retmas , 2021\n" -"Language-Team: Polish (https://www.transifex.com/django-recipes/teams/110507/pl/)\n" +"PO-Revision-Date: 2021-11-06 14:06+0000\n" +"Last-Translator: retmas gh \n" +"Language-Team: Polish \n" +"Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: pl\n" -"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n" +"%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n" +"%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" +"X-Generator: Weblate 4.8\n" #: .\cookbook\filters.py:22 .\cookbook\templates\base.html:87 #: .\cookbook\templates\forms\edit_internal_recipe.html:219 @@ -175,7 +178,7 @@ msgstr "Posiłek który zostanie zamieniony." #: .\cookbook\forms.py:198 msgid "Add your comment: " -msgstr "Dodaj komentarz:" +msgstr "Dodaj komentarz: " #: .\cookbook\forms.py:229 msgid "Leave empty for dropbox and enter app password for nextcloud." @@ -322,7 +325,7 @@ msgstr "Szukaj" #: .\cookbook\templates\meal_plan.html:5 .\cookbook\views\delete.py:165 #: .\cookbook\views\edit.py:216 .\cookbook\views\new.py:189 msgid "Meal-Plan" -msgstr "Plan posiłku" +msgstr "Plan posiłków" #: .\cookbook\models.py:79 .\cookbook\templates\base.html:78 msgid "Books" @@ -382,7 +385,7 @@ msgstr "Zabierz mnie na stronę główną" #: .\cookbook\templates\404.html:35 msgid "Report a Bug" -msgstr "Raprtuj błąd" +msgstr "Raportuj błąd" #: .\cookbook\templates\account\login.html:7 #: .\cookbook\templates\base.html:166 @@ -949,6 +952,15 @@ msgid "" " To limit the possible damage tokens or accounts with limited access can be used.\n" " " msgstr "" +"\n" +" Pola Hasło oraz Token są zapisane jawnym tekstem " +"wewnątrz bazy danych.\n" +" To jest konieczne ponieważ są one potrzebne do tworzenia wywołań " +"API, ale zwiększa to również ryzyko,\n" +" że ktoś je wykradnie.
\n" +" W celu ograniczenia możliwych szkód należy używać kont i tokenów z " +"ograniczonym dostępem.\n" +" " #: .\cookbook\templates\index.html:29 msgid "Search recipe ..." @@ -956,37 +968,37 @@ msgstr "Wyszukaj przepis ..." #: .\cookbook\templates\index.html:44 msgid "New Recipe" -msgstr "" +msgstr "Nowy przepis" #: .\cookbook\templates\index.html:47 msgid "Website Import" -msgstr "" +msgstr "Import z WWW" #: .\cookbook\templates\index.html:53 msgid "Advanced Search" -msgstr "" +msgstr "Zaawansowane wyszukiwanie" #: .\cookbook\templates\index.html:57 msgid "Reset Search" -msgstr "" +msgstr "Wyzeruj wyszukiwanie" #: .\cookbook\templates\index.html:85 msgid "Last viewed" -msgstr "" +msgstr "Ostatnio przeglądane" #: .\cookbook\templates\index.html:87 .\cookbook\templates\meal_plan.html:178 #: .\cookbook\templates\stats.html:22 msgid "Recipes" -msgstr "" +msgstr "Przepisy" #: .\cookbook\templates\index.html:94 msgid "Log in to view recipes" -msgstr "" +msgstr "Zaloguj się w celu przeglądania przepisów" #: .\cookbook\templates\markdown_info.html:5 #: .\cookbook\templates\markdown_info.html:13 msgid "Markdown Info" -msgstr "" +msgstr "Informacje o języku Markdown" #: .\cookbook\templates\markdown_info.html:14 msgid "" @@ -998,54 +1010,71 @@ msgid "" " An incomplete but most likely sufficient documentation can be found below.\n" " " msgstr "" +"\n" +" Markdown jest prostym językiem znaczników przeznaczonym do łatwego " +"formatowania teksu.\n" +" Ta strona używa biblioteki Python Markdown w celu \n" +" konwertowania Twojego tekstu w ładnie wyglądający HTML. Pełna " +"dokumentacja markdown znajduje się\n" +" tutaj.\n" +" Niekompletna, ale w większości przypadków wystarczająca dokumentacja " +"znajduje się poniżej.\n" +" " #: .\cookbook\templates\markdown_info.html:25 msgid "Headers" -msgstr "" +msgstr "Nagłówki" #: .\cookbook\templates\markdown_info.html:54 msgid "Formatting" -msgstr "" +msgstr "Formatowanie" #: .\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 "" +"Podział linii jest realizowany poprzez dodanie dwóch spacji na końcu linii" #: .\cookbook\templates\markdown_info.html:57 #: .\cookbook\templates\markdown_info.html:73 msgid "or by leaving a blank line inbetween." msgstr "" +"lub poprzez pozostawienie pustej linii pomiędzy tekstem, który ma zostać " +"podzielony." #: .\cookbook\templates\markdown_info.html:59 #: .\cookbook\templates\markdown_info.html:74 msgid "This text is bold" -msgstr "" +msgstr "Ten tekst jest pogrubiony" #: .\cookbook\templates\markdown_info.html:60 #: .\cookbook\templates\markdown_info.html:75 msgid "This text is italic" -msgstr "" +msgstr "Ten tekst jest napisany kursywą" #: .\cookbook\templates\markdown_info.html:61 #: .\cookbook\templates\markdown_info.html:77 msgid "Blockquotes are also possible" -msgstr "" +msgstr "Cytaty blokowe również są możliwe" #: .\cookbook\templates\markdown_info.html:84 msgid "Lists" -msgstr "" +msgstr "Listy" #: .\cookbook\templates\markdown_info.html:85 msgid "" "Lists can ordered or unorderd. It is important to leave a blank line " "before the list!" msgstr "" +"Listy mogą być uporządkowane lub nieuporządkowane. Ważne jest, żeby " +"pozostawić pustą linię przed listą!" #: .\cookbook\templates\markdown_info.html:87 #: .\cookbook\templates\markdown_info.html:108 msgid "Ordered List" -msgstr "" +msgstr "Lista uporządkowana" #: .\cookbook\templates\markdown_info.html:89 #: .\cookbook\templates\markdown_info.html:90 @@ -1054,12 +1083,12 @@ msgstr "" #: .\cookbook\templates\markdown_info.html:111 #: .\cookbook\templates\markdown_info.html:112 msgid "unordered list item" -msgstr "" +msgstr "element listy nieuporządkowanej" #: .\cookbook\templates\markdown_info.html:93 #: .\cookbook\templates\markdown_info.html:114 msgid "Unordered List" -msgstr "" +msgstr "Lista nieuporządkowana" #: .\cookbook\templates\markdown_info.html:95 #: .\cookbook\templates\markdown_info.html:96 @@ -1068,26 +1097,29 @@ msgstr "" #: .\cookbook\templates\markdown_info.html:117 #: .\cookbook\templates\markdown_info.html:118 msgid "ordered list item" -msgstr "" +msgstr "element listy uporządkowanej" #: .\cookbook\templates\markdown_info.html:125 msgid "Images & Links" -msgstr "" +msgstr "Obrazki oraz Linki" #: .\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 "" +"Linki mogą być formatowane przy użyciu Markdown. Ta aplikacja pozwala " +"również na wklejanie linków bezpośrednio do pól Markdown bez żadnego " +"formatowania." #: .\cookbook\templates\markdown_info.html:132 #: .\cookbook\templates\markdown_info.html:145 msgid "This will become an image" -msgstr "" +msgstr "To stanie się obrazkiem" #: .\cookbook\templates\markdown_info.html:152 msgid "Tables" -msgstr "" +msgstr "Tabele" #: .\cookbook\templates\markdown_info.html:153 msgid "" @@ -1095,40 +1127,43 @@ msgid "" " editor like this one." msgstr "" +"Tabele w Markdown trudno stworzyć z ręki. Zalecane jest użycie edytora " +"tablic takiego jak ten." #: .\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 "Tablica" #: .\cookbook\templates\markdown_info.html:155 #: .\cookbook\templates\markdown_info.html:172 msgid "Header" -msgstr "" +msgstr "Nagłówek" #: .\cookbook\templates\markdown_info.html:157 #: .\cookbook\templates\markdown_info.html:178 msgid "Cell" -msgstr "" +msgstr "Komórka" #: .\cookbook\templates\meal_plan.html:101 msgid "New Entry" -msgstr "" +msgstr "Nowy wpis" #: .\cookbook\templates\meal_plan.html:113 #: .\cookbook\templates\shopping_list.html:52 msgid "Search Recipe" -msgstr "" +msgstr "Szukaj przepisu" #: .\cookbook\templates\meal_plan.html:139 msgid "Title" -msgstr "" +msgstr "Tytuł" #: .\cookbook\templates\meal_plan.html:141 msgid "Note (optional)" -msgstr "" +msgstr "Notatka (opcjonalna)" #: .\cookbook\templates\meal_plan.html:143 msgid "" @@ -1136,84 +1171,87 @@ msgid "" "href=\"/docs/markdown/\" target=\"_blank\" rel=\"noopener noreferrer\">docs " "here" msgstr "" +"Możesz użyć Markdown do sformatowania tego pola. Sprawdź tę dokumentację" #: .\cookbook\templates\meal_plan.html:147 #: .\cookbook\templates\meal_plan.html:251 msgid "Serving Count" -msgstr "" +msgstr "Liczba porcji" #: .\cookbook\templates\meal_plan.html:153 msgid "Create only note" -msgstr "" +msgstr "Stwórz tylko natatkę" #: .\cookbook\templates\meal_plan.html:168 #: .\cookbook\templates\shopping_list.html:7 #: .\cookbook\templates\shopping_list.html:29 #: .\cookbook\templates\shopping_list.html:693 msgid "Shopping List" -msgstr "" +msgstr "Lista zakupów" #: .\cookbook\templates\meal_plan.html:172 msgid "Shopping list currently empty" -msgstr "" +msgstr "Lista zakupów obecnie jest pusta" #: .\cookbook\templates\meal_plan.html:175 msgid "Open Shopping List" -msgstr "" +msgstr "Otwórz Listę zakupów" #: .\cookbook\templates\meal_plan.html:189 msgid "Plan" -msgstr "" +msgstr "Planowanie" #: .\cookbook\templates\meal_plan.html:196 msgid "Number of Days" -msgstr "" +msgstr "Liczba dni" #: .\cookbook\templates\meal_plan.html:206 msgid "Weekday offset" -msgstr "" +msgstr "Przesunięcie dni tygodnia" #: .\cookbook\templates\meal_plan.html:209 msgid "" "Number of days starting from the first day of the week to offset the default" " view." msgstr "" +"Liczba dni począwszy od pierwszego dnia tygodnia aby ustawić domyślny widok." #: .\cookbook\templates\meal_plan.html:217 #: .\cookbook\templates\meal_plan.html:294 msgid "Edit plan types" -msgstr "" +msgstr "Edytuj typy planów" #: .\cookbook\templates\meal_plan.html:219 msgid "Show help" -msgstr "" +msgstr "Wyświetl pomoc" #: .\cookbook\templates\meal_plan.html:220 msgid "Week iCal export" -msgstr "" +msgstr "Eksport planu tygodniowego do pliku iCal" #: .\cookbook\templates\meal_plan.html:264 #: .\cookbook\templates\meal_plan_entry.html:18 msgid "Created by" -msgstr "" +msgstr "Stworzone przez" #: .\cookbook\templates\meal_plan.html:270 #: .\cookbook\templates\meal_plan_entry.html:20 #: .\cookbook\templates\shopping_list.html:248 msgid "Shared with" -msgstr "" +msgstr "Współdzielone z" #: .\cookbook\templates\meal_plan.html:280 msgid "Add to Shopping" -msgstr "" +msgstr "Dodaj do zakupów" #: .\cookbook\templates\meal_plan.html:323 msgid "New meal type" -msgstr "" +msgstr "Nowy typ posiłku" #: .\cookbook\templates\meal_plan.html:338 msgid "Meal Plan Help" -msgstr "" +msgstr "Pomoc dla Planu posiłków" #: .\cookbook\templates\meal_plan.html:344 msgid "" @@ -1237,257 +1275,302 @@ msgid "" " merged.

\n" " " msgstr "" +"\n" +"

Moduł planowania posiłków pozwala na " +"planowanie zarówno przy wykorzystaniu przepisów jak i notatek.

\n" +"

Po prostu wybierz przepis z listy ostatnio " +"oglądanych przepisów lub wyszukaj ten\n" +" który chcesz i przeciągnij go do wybranej " +"pozycji na planie. Możesz również dodać tytuł i notatkę\n" +" i wtedy przeciągnąć przepis w celu " +"stworzenia pozycji na planie z własnym tytułem i notatką. Tworzenie tylko\n" +" Notatek jest możliwe poprzez przeciągnięcie " +"bloku Stwórz tylko notatkę na plan.

\n" +"

Kliknij na przepisie w celu otworzenia " +"podglądu szczegółów. Stąd możesz dodać go do\n" +" listy zakupów. Możesz również dodać " +"wszystkie przepisy z dnia do listy zakupów poprzez\n" +" kliknięcie wózka sklepowego na górze " +"tabeli.

\n" +"

Ze względu na to że powszechne jest wspólne " +"planowanie posiłków, możesz wskazać\n" +" użytkowników z którymi chcesz współdzielić " +"swój plan w ustawieniach.\n" +"

\n" +"

Możesz również edytować typy posiłków, które " +"chcesz planować. Jeżeli współdzielisz swój plan\n" +" z kimś z innymi posiłkami,\n" +" ich typy posiłków również pojawią się na " +"twojej liście. Aby zapobiec\n" +" duplikowaniu (np. Inne i Różne)\n" +" nazywaj swoje typy posiłków tak samo jak " +"użytkownicy z którymi współdzielisz posiłki a wtedy zostaną\n" +" połączone.

\n" +" " #: .\cookbook\templates\meal_plan_entry.html:6 msgid "Meal Plan View" -msgstr "" +msgstr "Podgląd Planu posiłków" #: .\cookbook\templates\meal_plan_entry.html:50 msgid "Never cooked before." -msgstr "" +msgstr "Nigdy dotąd nie ugotowane." #: .\cookbook\templates\meal_plan_entry.html:76 msgid "Other meals on this day" -msgstr "" +msgstr "Inne posiłki tego dnia" #: .\cookbook\templates\no_groups_info.html:5 #: .\cookbook\templates\offline.html:6 msgid "Offline" -msgstr "" +msgstr "Nie podłączone" #: .\cookbook\templates\no_groups_info.html:12 msgid "No Permissions" -msgstr "" +msgstr "Brak uprawnień" #: .\cookbook\templates\no_groups_info.html:15 msgid "" "You do not have any groups and therefor cannot use this application. Please " "contact your administrator." msgstr "" +"Nie masz żadnych grup i dlatego nie możesz korzystać z tej aplikacji. " +"Skontaktuj się z administratorem." #: .\cookbook\templates\offline.html:19 msgid "You are currently offline!" -msgstr "" +msgstr "Jesteś obecnie 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 "" +"Przepisy wymienione poniżej są dostępne do przeglądania w trybie offline, " +"ponieważ ostatnio je oglądałeś. Pamiętaj, że dane mogą być nieaktualne." #: .\cookbook\templates\recipe_view.html:21 .\cookbook\templates\stats.html:47 msgid "Comments" -msgstr "" +msgstr "Uwagi" #: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:118 #: .\cookbook\views\edit.py:162 msgid "Comment" -msgstr "" +msgstr "Komentarz" #: .\cookbook\templates\recipes_table.html:19 #: .\cookbook\templates\recipes_table.html:23 #: .\cookbook\templates\url_import.html:50 msgid "Recipe Image" -msgstr "" +msgstr "Obraz dla przepisu" #: .\cookbook\templates\recipes_table.html:46 #: .\cookbook\templates\url_import.html:55 msgid "Preparation time ca." -msgstr "" +msgstr "Czas przygotowania około" #: .\cookbook\templates\recipes_table.html:52 #: .\cookbook\templates\url_import.html:60 msgid "Waiting time ca." -msgstr "" +msgstr "Czas oczekiwania około" #: .\cookbook\templates\recipes_table.html:55 msgid "External" -msgstr "" +msgstr "Zewnętrzny" #: .\cookbook\templates\recipes_table.html:81 msgid "Log Cooking" -msgstr "" +msgstr "Dziennik gotowania" #: .\cookbook\templates\rest_framework\api.html:5 msgid "Recipe Home" -msgstr "" +msgstr "Strona główna Przepisów" #: .\cookbook\templates\settings.html:22 msgid "Account" -msgstr "" +msgstr "Konto" #: .\cookbook\templates\settings.html:38 msgid "Link social account" -msgstr "" +msgstr "Połącz konto społecznościowe" #: .\cookbook\templates\settings.html:42 msgid "Language" -msgstr "" +msgstr "Język" #: .\cookbook\templates\settings.html:67 msgid "Style" -msgstr "" +msgstr "Styl" #: .\cookbook\templates\settings.html:79 msgid "API Token" -msgstr "" +msgstr "Token dla API" #: .\cookbook\templates\settings.html:80 msgid "" "You can use both basic authentication and token based authentication to " "access the REST API." msgstr "" +"Aby uzyskać dostęp do interfejsu REST API, można użyć zarówno " +"uwierzytelniania podstawowego, jak i uwierzytelniania opartego na tokenach." #: .\cookbook\templates\settings.html:92 msgid "" "Use the token as an Authorization header prefixed by the word token as shown" " in the following examples:" msgstr "" +"Użyj tokena jako nagłówka autoryzacji poprzedzonego słowem token, jak " +"pokazano w następujących przykładach:" #: .\cookbook\templates\settings.html:94 msgid "or" -msgstr "" +msgstr "lub" #: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5 msgid "Cookbook Setup" -msgstr "" +msgstr "Konfiguracja Książki kucharskiej" #: .\cookbook\templates\setup.html:14 msgid "Setup" -msgstr "" +msgstr "Konfiguracja" #: .\cookbook\templates\setup.html:15 msgid "" "To start using this application you must first create a superuser account." msgstr "" +"Aby rozpocząć korzystanie z tej aplikacji, musisz najpierw utworzyć konto " +"super użytkownika." #: .\cookbook\templates\setup.html:20 msgid "Create Superuser account" -msgstr "" +msgstr "Utwórz konto super użytkownika" #: .\cookbook\templates\shopping_list.html:75 msgid "Shopping Recipes" -msgstr "" +msgstr "Zakupy do Przepisów" #: .\cookbook\templates\shopping_list.html:79 msgid "No recipes selected" -msgstr "" +msgstr "Nie wybrano przepisów" #: .\cookbook\templates\shopping_list.html:145 msgid "Entry Mode" -msgstr "" +msgstr "Tryb wprowadzania" #: .\cookbook\templates\shopping_list.html:153 msgid "Add Entry" -msgstr "" +msgstr "Dodaj pozycję" #: .\cookbook\templates\shopping_list.html:168 msgid "Amount" -msgstr "" +msgstr "Ilość" #: .\cookbook\templates\shopping_list.html:224 msgid "Supermarket" -msgstr "" +msgstr "Sklep" #: .\cookbook\templates\shopping_list.html:234 msgid "Select Supermarket" -msgstr "" +msgstr "Wybierz sklep" #: .\cookbook\templates\shopping_list.html:258 msgid "Select User" -msgstr "" +msgstr "Wybierz użytkownika" #: .\cookbook\templates\shopping_list.html:277 msgid "Finished" -msgstr "" +msgstr "Skończone" #: .\cookbook\templates\shopping_list.html:290 msgid "You are offline, shopping list might not syncronize." -msgstr "" +msgstr "Jesteś offline, lista zakupów może się nie zsynchronizować." #: .\cookbook\templates\shopping_list.html:353 msgid "Copy/Export" -msgstr "" +msgstr "Kopiuj/Eksportuj" #: .\cookbook\templates\shopping_list.html:357 msgid "List Prefix" -msgstr "" +msgstr "Prefiks listy" #: .\cookbook\templates\shopping_list.html:696 msgid "There was an error creating a resource!" -msgstr "" +msgstr "Wystąpił błąd podczas tworzenia zasobu!" #: .\cookbook\templates\socialaccount\connections.html:4 #: .\cookbook\templates\socialaccount\connections.html:7 msgid "Account Connections" -msgstr "" +msgstr "Połączenie kont" #: .\cookbook\templates\socialaccount\connections.html:10 msgid "" "You can sign in to your account using any of the following third party\n" " accounts:" msgstr "" +"Możesz zalogować się na swoje konto za pomocą dowolnego z następujących " +"kont\n" +" zewnętrznych:" #: .\cookbook\templates\socialaccount\connections.html:36 msgid "Remove" -msgstr "" +msgstr "Usuń" #: .\cookbook\templates\socialaccount\connections.html:44 msgid "" "You currently have no social network accounts connected to this account." -msgstr "" +msgstr "Obecnie nie masz kont sieci społecznościowych połączonych z tym kontem." #: .\cookbook\templates\socialaccount\connections.html:47 msgid "Add a 3rd Party Account" -msgstr "" +msgstr "Dodaj konto firmy zewnętrznej" #: .\cookbook\templates\stats.html:4 msgid "Stats" -msgstr "" +msgstr "Statystyki" #: .\cookbook\templates\stats.html:19 msgid "Number of objects" -msgstr "" +msgstr "Liczba obiektów" #: .\cookbook\templates\stats.html:30 msgid "Recipe Imports" -msgstr "" +msgstr "Import przepisów" #: .\cookbook\templates\stats.html:38 msgid "Objects stats" -msgstr "" +msgstr "Statystyki obiektów" #: .\cookbook\templates\stats.html:41 msgid "Recipes without Keywords" -msgstr "" +msgstr "Przepisy bez słów kluczowych" #: .\cookbook\templates\stats.html:43 msgid "External Recipes" -msgstr "" +msgstr "Przepisy zewnętrzne" #: .\cookbook\templates\stats.html:45 msgid "Internal Recipes" -msgstr "" +msgstr "Przepisy zapisane lokalnie" #: .\cookbook\templates\system.html:21 .\cookbook\views\lists.py:128 msgid "Invite Links" -msgstr "" +msgstr "Linki z zaproszeniami" #: .\cookbook\templates\system.html:22 msgid "Show Links" -msgstr "" +msgstr "Wyświetl linki" #: .\cookbook\templates\system.html:27 msgid "Backup & Restore" -msgstr "" +msgstr "Kopie zapasowe" #: .\cookbook\templates\system.html:28 msgid "Download Backup" -msgstr "" +msgstr "Pobierz kopię zapasową" #: .\cookbook\templates\system.html:49 msgid "System Information" -msgstr "" +msgstr "Informacje o systemie" #: .\cookbook\templates\system.html:51 msgid "" @@ -1497,20 +1580,27 @@ msgid "" " Changelogs can be found here.\n" " " msgstr "" +"\n" +" Django Recipes to darmowa aplikacja typu open source. Można ją " +"znaleźć na\n" +" GitHub.\n" +" Dziennik zmian można znaleźć tutaj.\n" +" " #: .\cookbook\templates\system.html:65 msgid "Media Serving" -msgstr "" +msgstr "Obsługa multimediów" #: .\cookbook\templates\system.html:66 .\cookbook\templates\system.html:81 #: .\cookbook\templates\system.html:97 msgid "Warning" -msgstr "" +msgstr "Uwaga" #: .\cookbook\templates\system.html:66 .\cookbook\templates\system.html:81 #: .\cookbook\templates\system.html:97 .\cookbook\templates\system.html:112 msgid "Ok" -msgstr "" +msgstr "Ok" #: .\cookbook\templates\system.html:68 msgid "" @@ -1520,15 +1610,22 @@ msgid "" " your installation.\n" " " msgstr "" +"Udostępnianie plików multimedialnych bezpośrednio przy użyciu gunicorn/" +"python nie jest rekomendowane!\n" +" Postępuj zgodnie z opisanymi \n" +" tutaj krokami w celu\n" +" uaktualnienia swojej instalacji.\n" +" " #: .\cookbook\templates\system.html:74 .\cookbook\templates\system.html:90 #: .\cookbook\templates\system.html:105 .\cookbook\templates\system.html:119 msgid "Everything is fine!" -msgstr "" +msgstr "Wszystko w porządku!" #: .\cookbook\templates\system.html:79 msgid "Secret Key" -msgstr "" +msgstr "Sekretny klucz" #: .\cookbook\templates\system.html:83 msgid "" @@ -1539,10 +1636,19 @@ msgid "" " SECRET_KEY int the .env configuration file.\n" " " msgstr "" +"\n" +" Nie posiadasz skonfigurowanego SECRET_KEY w swoim " +"pliku .env. Django domyślnie\n" +" korzysta ze standardowego klucza\n" +" dostarczonego z instalacją, który jest publicznie znany i " +"niezabezpieczony! Proszę ustawić\n" +" SECRET_KEY w pliku konfiguracyjnym ." +"env.\n" +" " #: .\cookbook\templates\system.html:95 msgid "Debug Mode" -msgstr "" +msgstr "Tryb debugowania" #: .\cookbook\templates\system.html:99 msgid "" @@ -1552,14 +1658,20 @@ msgid "" " DEBUG=0 int the .env configuration file.\n" " " msgstr "" +"\n" +" Ta aplikacja nadal działa w trybie debugowania. " +"Najprawdopodobniej nie jest to potrzebne. Wyłącz tryb debugowania,\n" +" ustawiając\n" +" DEBUG=0 w pliku konfiguracyjnym .env.\n" +" " #: .\cookbook\templates\system.html:110 msgid "Database" -msgstr "" +msgstr "Baza danych" #: .\cookbook\templates\system.html:112 msgid "Info" -msgstr "" +msgstr "Informacje" #: .\cookbook\templates\system.html:114 msgid "" @@ -1568,36 +1680,41 @@ msgid "" " features only work with postgres databases.\n" " " msgstr "" +"\n" +" Ta aplikacja nie pracuje z bazą danych Postgres. To jest " +"możliwe, ale nie zalecane, ponieważ\n" +" niektóre funkcje działają tylko z bazami danych Postgres.\n" +" " #: .\cookbook\templates\url_import.html:5 msgid "URL Import" -msgstr "" +msgstr "Importuj z URL" #: .\cookbook\templates\url_import.html:23 msgid "Enter website URL" -msgstr "" +msgstr "Wpisz adres URL witryny" #: .\cookbook\templates\url_import.html:44 msgid "Recipe Name" -msgstr "" +msgstr "Nazwa przepisu" #: .\cookbook\templates\url_import.html:104 #: .\cookbook\templates\url_import.html:136 #: .\cookbook\templates\url_import.html:192 msgid "Select one" -msgstr "" +msgstr "Wybierz jeden" #: .\cookbook\templates\url_import.html:203 msgid "All Keywords" -msgstr "" +msgstr "Wszystkie słowa kluczowe" #: .\cookbook\templates\url_import.html:206 msgid "Import all keywords, not only the ones already existing." -msgstr "" +msgstr "Importuj wszystkie słowa kluczowe, nie tylko te już istniejące." #: .\cookbook\templates\url_import.html:233 msgid "Information" -msgstr "" +msgstr "Informacja" #: .\cookbook\templates\url_import.html:235 msgid "" @@ -1607,103 +1724,113 @@ msgid "" " it probably has some kind of structured data feel free to post an example in the\n" " github issues." msgstr "" +" Obecnie można importować tylko witryny internetowe zawierające informacje o " +"ld+json lub mikrodanych.\n" +" Obsługuje to większość dużych stron z " +"przepisami. Jeśli Twoja witryna nie może zostać zaimportowana,\n" +" ale uważasz,\n" +" że prawdopodobnie zawiera jakieś " +"uporządkowane dane, możesz zamieścić przykład\n" +" na github." #: .\cookbook\templates\url_import.html:243 msgid "Google ld+json Info" -msgstr "" +msgstr "Informacje o Google ld+json" #: .\cookbook\templates\url_import.html:246 msgid "GitHub Issues" -msgstr "" +msgstr "Problemy na GitHub" #: .\cookbook\templates\url_import.html:248 msgid "Recipe Markup Specification" -msgstr "" +msgstr "Specyfikacja znaczników przepisów" #: .\cookbook\views\api.py:104 msgid "Parameter filter_list incorrectly formatted" -msgstr "" +msgstr "Nieprawidłowo sformatowany parametr filter_list" #: .\cookbook\views\api.py:117 msgid "Preference for given user already exists" -msgstr "" +msgstr "Preferencja dla danego użytkownika już istnieje" #: .\cookbook\views\api.py:416 .\cookbook\views\views.py:265 msgid "This feature is not available in the demo version!" -msgstr "" +msgstr "Ta funkcja nie jest dostępna w wersji demo!" #: .\cookbook\views\api.py:439 msgid "Sync successful!" -msgstr "" +msgstr "Synchronizacja powiodła się!" #: .\cookbook\views\api.py:444 msgid "Error synchronizing with Storage" -msgstr "" +msgstr "Błąd synchronizacji z magazynem" #: .\cookbook\views\api.py:510 msgid "The requested page could not be found." -msgstr "" +msgstr "Żądana strona nie została znaleziona." #: .\cookbook\views\api.py:519 msgid "" "The requested page refused to provide any information (Status Code 403)." -msgstr "" +msgstr "Żądana strona odmówiła podania jakichkolwiek informacji (Kod 403)." #: .\cookbook\views\data.py:101 #, 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[3] "" +msgstr[0] "Edycja zbiorcza zakończona. Zaktualizowano %(count)d przepis." +msgstr[1] "Edycja zbiorcza zakończona. Zaktualizowano %(count)d przepisy." +msgstr[2] "Edycja zbiorcza zakończona. Zaktualizowano %(count)d przepisów." +msgstr[3] "Edycja zbiorcza zakończona. Zaktualizowano przepisy: %(count)d." #: .\cookbook\views\delete.py:72 msgid "Monitor" -msgstr "" +msgstr "Monitor" #: .\cookbook\views\delete.py:96 .\cookbook\views\lists.py:109 #: .\cookbook\views\new.py:83 msgid "Storage Backend" -msgstr "" +msgstr "Obsługa Magazynów" #: .\cookbook\views\delete.py:106 msgid "" "Could not delete this storage backend as it is used in at least one monitor." msgstr "" +"Nie można usunąć tego typu Magazynu, ponieważ jest on używany w co najmniej " +"jednym monitorze." #: .\cookbook\views\delete.py:129 .\cookbook\views\edit.py:196 #: .\cookbook\views\new.py:144 msgid "Recipe Book" -msgstr "" +msgstr "Książka z przepisami" #: .\cookbook\views\delete.py:154 msgid "Bookmarks" -msgstr "" +msgstr "Zakładki" #: .\cookbook\views\delete.py:176 .\cookbook\views\new.py:214 msgid "Invite Link" -msgstr "" +msgstr "Link z zaproszeniem" #: .\cookbook\views\edit.py:100 msgid "Food" -msgstr "" +msgstr "Jedzenie" #: .\cookbook\views\edit.py:110 msgid "You cannot edit this storage!" -msgstr "" +msgstr "Nie możesz edytować tego Magazynu!" #: .\cookbook\views\edit.py:131 msgid "Storage saved!" -msgstr "" +msgstr "Magazyn zapisany!" #: .\cookbook\views\edit.py:137 msgid "There was an error updating this storage backend!" -msgstr "" +msgstr "Podczas aktualizowania tego Magazynu wystąpił błąd!" #: .\cookbook\views\edit.py:148 msgid "Storage" -msgstr "" +msgstr "Magazyn" #: .\cookbook\views\edit.py:245 msgid "Changes saved!" @@ -1727,11 +1854,11 @@ msgstr "Posiłki scalone!" #: .\cookbook\views\import_export.py:42 msgid "Importing is not implemented for this provider" -msgstr "Importowanie dla tego usługodawcy nie zostało zaimplementowane." +msgstr "Importowanie dla tego usługodawcy nie zostało zaimplementowane" #: .\cookbook\views\import_export.py:58 msgid "Exporting is not implemented for this provider" -msgstr "Eksportowanie dla tego usługodawcy nie zostało zaimplementowane." +msgstr "Eksportowanie dla tego usługodawcy nie zostało zaimplementowane" #: .\cookbook\views\lists.py:42 msgid "Import Log" diff --git a/cookbook/locale/pt/LC_MESSAGES/django.mo b/cookbook/locale/pt/LC_MESSAGES/django.mo index 7f6b9401..fb128ac6 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 e2e889e7..ce17747b 100644 --- a/cookbook/locale/pt/LC_MESSAGES/django.po +++ b/cookbook/locale/pt/LC_MESSAGES/django.po @@ -7,172 +7,218 @@ # Henrique Diogo Silva , 2020 # João Cunha , 2020 # -#, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-08-17 08:44+0200\n" -"PO-Revision-Date: 2020-06-02 19:28+0000\n" -"Last-Translator: João Cunha , 2020\n" -"Language-Team: Portuguese (https://www.transifex.com/django-recipes/" -"teams/110507/pt/)\n" +"POT-Creation-Date: 2022-01-18 14:52+0100\n" +"PO-Revision-Date: 2021-11-12 20:06+0000\n" +"Last-Translator: Henrique Silva \n" +"Language-Team: Portuguese \n" "Language: pt\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.8\n" -#: .\cookbook\filters.py:23 .\cookbook\templates\base.html:98 -#: .\cookbook\templates\forms\edit_internal_recipe.html:269 -#: .\cookbook\templates\forms\ingredients.html:34 -#: .\cookbook\templates\space.html:43 .\cookbook\templates\stats.html:28 -#: .\cookbook\templates\url_import.html:270 .\cookbook\views\lists.py:67 +#: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 +#: .\cookbook\templates\space.html:50 .\cookbook\templates\stats.html:28 +#: .\cookbook\templates\url_import.html:277 msgid "Ingredients" msgstr "Ingredientes" -#: .\cookbook\forms.py:49 +#: .\cookbook\forms.py:56 +msgid "Default unit" +msgstr "Unidade predefinida" + +#: .\cookbook\forms.py:57 +msgid "Use fractions" +msgstr "Usar frações" + +#: .\cookbook\forms.py:58 +msgid "Use KJ" +msgstr "Usar KJ" + +#: .\cookbook\forms.py:59 +msgid "Theme" +msgstr "Tema" + +#: .\cookbook\forms.py:60 +msgid "Navbar color" +msgstr "Cor de barra de navegação" + +#: .\cookbook\forms.py:61 +msgid "Sticky navbar" +msgstr "Prender barra de navegação" + +#: .\cookbook\forms.py:62 +msgid "Default page" +msgstr "Página predefinida" + +#: .\cookbook\forms.py:63 +msgid "Show recent recipes" +msgstr "Mostrar receitas recentes" + +#: .\cookbook\forms.py:64 +msgid "Search style" +msgstr "Estilo de pesquisa" + +#: .\cookbook\forms.py:65 +msgid "Plan sharing" +msgstr "Partilha de planos" + +#: .\cookbook\forms.py:66 +msgid "Ingredient decimal places" +msgstr "Casas decimais de ingredientes" + +#: .\cookbook\forms.py:67 +msgid "Shopping list auto sync period" +msgstr "Período de sincronização automática" + +#: .\cookbook\forms.py:68 .\cookbook\templates\recipe_view.html:21 +#: .\cookbook\templates\space.html:77 .\cookbook\templates\stats.html:47 +msgid "Comments" +msgstr "Comentários" + +#: .\cookbook\forms.py:72 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." -#: .\cookbook\forms.py:51 +#: .\cookbook\forms.py:74 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:53 +#: .\cookbook\forms.py:76 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" msgstr "" +"Utilizar frações para apresentar quantidades de ingredientes decimais " +"(converter quantidades decimais para frações automáticamente)" -#: .\cookbook\forms.py:56 -msgid "" -"Users with whom newly created meal plan/shopping list entries should be " -"shared by default." +#: .\cookbook\forms.py:78 +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:79 +#, fuzzy +#| msgid "" +#| "Users with whom newly created meal plan/shopping list entries should be " +#| "shared by default." +msgid "Users with whom newly created meal plans should be shared by default." +msgstr "" +"Utilizadores com os quais novos planos de refeições/listas de compras devem " +"ser partilhados por defeito." + +#: .\cookbook\forms.py:80 +msgid "Users with whom to share shopping lists." msgstr "" -#: .\cookbook\forms.py:58 +#: .\cookbook\forms.py:82 msgid "Show recently viewed recipes on search page." msgstr "Mostrar receitas recentes na página de pesquisa." -#: .\cookbook\forms.py:59 +#: .\cookbook\forms.py:83 msgid "Number of decimals to round ingredients." msgstr "Número de casas decimais para arredondamentos." -#: .\cookbook\forms.py:60 +#: .\cookbook\forms.py:84 msgid "If you want to be able to create and see comments underneath recipes." -msgstr "" +msgstr "Ativar a funcionalidade comentar receitas." -#: .\cookbook\forms.py:62 +#: .\cookbook\forms.py:86 .\cookbook\forms.py:493 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. " "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 "" +"Definir esta opção como 0 desativará a sincronização automática. Ao " +"visualizar uma lista de compras, a lista é atualizada a cada período aqui " +"definido para sincronizar as alterações que outro utilizador possa ter " +"feito. Útil ao fazer compras com vários utilizadores, mas pode aumentar o " +"uso de dados móveis." -#: .\cookbook\forms.py:65 +#: .\cookbook\forms.py:89 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:90 .\cookbook\forms.py:496 +msgid "Automatically add meal plan ingredients to shopping list." msgstr "" -#: .\cookbook\forms.py:81 +#: .\cookbook\forms.py:91 +msgid "Exclude ingredients that are on hand." +msgstr "" + +#: .\cookbook\forms.py:108 msgid "" "Both fields are optional. If none are given the username will be displayed " "instead" msgstr "" "Ambos os campos são opcionais. Se nenhum for preenchido o nome de utilizador " -"será apresentado." +"será apresentado" -#: .\cookbook\forms.py:102 .\cookbook\forms.py:331 -#: .\cookbook\templates\forms\edit_internal_recipe.html:49 -#: .\cookbook\templates\url_import.html:154 +#: .\cookbook\forms.py:129 .\cookbook\forms.py:298 +#: .\cookbook\templates\url_import.html:161 msgid "Name" msgstr "Nome" -#: .\cookbook\forms.py:103 .\cookbook\forms.py:332 -#: .\cookbook\templates\base.html:108 .\cookbook\templates\base.html:169 -#: .\cookbook\templates\forms\edit_internal_recipe.html:85 -#: .\cookbook\templates\space.html:39 .\cookbook\templates\stats.html:24 -#: .\cookbook\templates\url_import.html:188 -#: .\cookbook\templates\url_import.html:573 +#: .\cookbook\forms.py:130 .\cookbook\forms.py:299 +#: .\cookbook\templates\space.html:44 .\cookbook\templates\stats.html:24 +#: .\cookbook\templates\url_import.html:195 +#: .\cookbook\templates\url_import.html:585 .\cookbook\views\lists.py:97 msgid "Keywords" msgstr "Palavras-chave" -#: .\cookbook\forms.py:104 +#: .\cookbook\forms.py:131 msgid "Preparation time in minutes" msgstr "Tempo de preparação em minutos" -#: .\cookbook\forms.py:105 +#: .\cookbook\forms.py:132 msgid "Waiting time (cooking/baking) in minutes" msgstr "Tempo de espera (cozedura) em minutos" -#: .\cookbook\forms.py:106 .\cookbook\forms.py:333 +#: .\cookbook\forms.py:133 .\cookbook\forms.py:267 .\cookbook\forms.py:300 msgid "Path" msgstr "Caminho" -#: .\cookbook\forms.py:107 +#: .\cookbook\forms.py:134 msgid "Storage UID" msgstr "UID de armazenamento" -#: .\cookbook\forms.py:133 +#: .\cookbook\forms.py:164 msgid "Default" -msgstr "" +msgstr "Predefinição" -#: .\cookbook\forms.py:144 .\cookbook\templates\url_import.html:90 +#: .\cookbook\forms.py:175 .\cookbook\templates\url_import.html:97 msgid "" "To prevent duplicates recipes with the same name as existing ones are " "ignored. Check this box to import everything." 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:164 -msgid "New Unit" -msgstr "Nova Unidade" - -#: .\cookbook\forms.py:165 -msgid "New unit that other gets replaced by." -msgstr "Nova unidade substituta." - -#: .\cookbook\forms.py:170 -msgid "Old Unit" -msgstr "Unidade Anterior" - -#: .\cookbook\forms.py:171 -msgid "Unit that should be replaced." -msgstr "Unidade a ser alterada." - -#: .\cookbook\forms.py:187 -msgid "New Food" -msgstr "Novo Prato" - -#: .\cookbook\forms.py:188 -msgid "New food that other gets replaced by." -msgstr "Novo prato a ser alterado." - -#: .\cookbook\forms.py:193 -msgid "Old Food" -msgstr "Prato Anterior" - -#: .\cookbook\forms.py:194 -msgid "Food that should be replaced." -msgstr "Prato a ser alterado." - -#: .\cookbook\forms.py:212 +#: .\cookbook\forms.py:197 msgid "Add your comment: " msgstr "Adicionar comentário:" -#: .\cookbook\forms.py:253 +#: .\cookbook\forms.py:212 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:260 +#: .\cookbook\forms.py:219 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:269 +#: .\cookbook\forms.py:228 msgid "" "Leave empty for dropbox and enter only base url for nextcloud (/remote." "php/webdav/ is added automatically)" @@ -180,26 +226,33 @@ msgstr "" "Deixar vazio para Dropbox e inserir apenas url base para Nextcloud (/" "remote.php/webdav/é adicionado automaticamente). " -#: .\cookbook\forms.py:307 +#: .\cookbook\forms.py:266 .\cookbook\views\edit.py:166 +msgid "Storage" +msgstr "Armazenamento" + +#: .\cookbook\forms.py:268 +msgid "Active" +msgstr "Ativo" + +#: .\cookbook\forms.py:274 msgid "Search String" msgstr "Procurar" -#: .\cookbook\forms.py:334 +#: .\cookbook\forms.py:301 msgid "File ID" msgstr "ID the ficheiro" -#: .\cookbook\forms.py:370 +#: .\cookbook\forms.py:323 msgid "You must provide at least a recipe or a title." msgstr "É necessário inserir uma receita ou um título." -#: .\cookbook\forms.py:383 +#: .\cookbook\forms.py:336 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:384 -#: .\cookbook\templates\forms\edit_internal_recipe.html:427 +#: .\cookbook\forms.py:337 msgid "" "You can use markdown to format this field. See the docs here" @@ -207,92 +260,294 @@ msgstr "" "É possível utilizar markdown para editar este campo. Documentação disponível aqui" -#: .\cookbook\forms.py:409 +#: .\cookbook\forms.py:363 msgid "Maximum number of users for this space reached." -msgstr "" +msgstr "Número máximo de utilizadores alcançado." -#: .\cookbook\forms.py:415 +#: .\cookbook\forms.py:369 msgid "Email address already taken!" -msgstr "" +msgstr "Endereço email já utilizado!" -#: .\cookbook\forms.py:423 +#: .\cookbook\forms.py:377 msgid "" -"An email address is not required but if present the invite link will be send " +"An email address is not required but if present the invite link will be sent " "to the user." msgstr "" +"Um endereço de email não é obrigatório mas se fornecido será enviada uma " +"mensagem ao utilizador." -#: .\cookbook\forms.py:438 +#: .\cookbook\forms.py:392 msgid "Name already taken." +msgstr "Nome já existente." + +#: .\cookbook\forms.py:403 +msgid "Accept Terms and Privacy" +msgstr "Aceitar Termos e Condições" + +#: .\cookbook\forms.py:435 +msgid "" +"Determines how fuzzy a search is if it uses trigram similarity matching (e." +"g. low values mean more typos are ignored)." +msgstr "" +"Determina o quão difusa uma pesquisa é se esta utilizar uma correspondência " +"de semelhança de trigrama (valores mais baixos significam que mais erros são " +"ignorados)." + +#: .\cookbook\forms.py:445 +msgid "" +"Select type method of search. Click here for " +"full desciption of choices." +msgstr "" +"Selecionar o método de pesquisa. Uma descrição completa das opções pode ser " +"encontrada aqui." + +#: .\cookbook\forms.py:446 +msgid "" +"Use fuzzy matching on units, keywords and ingredients when editing and " +"importing recipes." +msgstr "" +"Utilizar correspondência difusa em unidades, palavras-chave e ingredientes " +"ao editar e importar receitas." + +#: .\cookbook\forms.py:448 +msgid "" +"Fields to search ignoring accents. Selecting this option can improve or " +"degrade search quality depending on language" +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:450 +msgid "" +"Fields to search for partial matches. (e.g. searching for 'Pie' will return " +"'pie' and 'piece' and 'soapie')" msgstr "" -#: .\cookbook\forms.py:449 -msgid "Accept Terms and Privacy" +#: .\cookbook\forms.py:452 +msgid "" +"Fields to search for beginning of word matches. (e.g. searching for 'sa' " +"will return 'salad' and 'sandwich')" msgstr "" +#: .\cookbook\forms.py:454 +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:456 +msgid "" +"Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " +"only function with fulltext fields." +msgstr "" + +#: .\cookbook\forms.py:460 +#, fuzzy +#| msgid "Search" +msgid "Search Method" +msgstr "Procurar" + +#: .\cookbook\forms.py:461 +msgid "Fuzzy Lookups" +msgstr "" + +#: .\cookbook\forms.py:462 +msgid "Ignore Accent" +msgstr "" + +#: .\cookbook\forms.py:463 +msgid "Partial Match" +msgstr "" + +#: .\cookbook\forms.py:464 +msgid "Starts Wtih" +msgstr "" + +#: .\cookbook\forms.py:465 +#, fuzzy +#| msgid "Search" +msgid "Fuzzy Search" +msgstr "Procurar" + +#: .\cookbook\forms.py:466 +#, fuzzy +#| msgid "Text" +msgid "Full Text" +msgstr "Texto" + +#: .\cookbook\forms.py:491 +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:497 +msgid "" +"When adding a meal plan to the shopping list (manually or automatically), " +"include all related recipes." +msgstr "" + +#: .\cookbook\forms.py:498 +msgid "" +"When adding a meal plan to the shopping list (manually or automatically), " +"exclude ingredients that are on hand." +msgstr "" + +#: .\cookbook\forms.py:499 +msgid "Default number of hours to delay a shopping list entry." +msgstr "" + +#: .\cookbook\forms.py:500 +msgid "Filter shopping list to only include supermarket categories." +msgstr "" + +#: .\cookbook\forms.py:501 +msgid "Days of recent shopping list entries to display." +msgstr "" + +#: .\cookbook\forms.py:502 +msgid "Mark food 'On Hand' when checked off shopping list." +msgstr "" + +#: .\cookbook\forms.py:503 +msgid "Delimiter to use for CSV exports." +msgstr "" + +#: .\cookbook\forms.py:504 +msgid "Prefix to add when copying list to the clipboard." +msgstr "" + +#: .\cookbook\forms.py:508 +#, fuzzy +#| msgid "Shopping" +msgid "Share Shopping List" +msgstr "Compras" + +#: .\cookbook\forms.py:509 +msgid "Autosync" +msgstr "" + +#: .\cookbook\forms.py:510 +msgid "Auto Add Meal Plan" +msgstr "" + +#: .\cookbook\forms.py:511 +msgid "Exclude On Hand" +msgstr "" + +#: .\cookbook\forms.py:512 +msgid "Include Related" +msgstr "" + +#: .\cookbook\forms.py:513 +msgid "Default Delay Hours" +msgstr "" + +#: .\cookbook\forms.py:514 +msgid "Filter to Supermarket" +msgstr "" + +#: .\cookbook\forms.py:515 +msgid "Recent Days" +msgstr "" + +#: .\cookbook\forms.py:516 +msgid "CSV Delimiter" +msgstr "" + +#: .\cookbook\forms.py:517 .\cookbook\templates\shopping_list.html:322 +msgid "List Prefix" +msgstr "" + +#: .\cookbook\forms.py:518 +msgid "Auto On Hand" +msgstr "" + +#: .\cookbook\forms.py:528 +msgid "Reset Food Inheritance" +msgstr "" + +#: .\cookbook\forms.py:529 +msgid "Reset all food to inherit the fields configured." +msgstr "" + +#: .\cookbook\forms.py:541 +#, 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:542 +#, fuzzy +#| msgid "Show recently viewed recipes on search page." +msgid "Show recipe counts on search filters" +msgstr "Mostrar receitas recentes na página de pesquisa." + #: .\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 "" -#: .\cookbook\helper\permission_helper.py:138 -#: .\cookbook\helper\permission_helper.py:161 .\cookbook\views\views.py:151 +#: .\cookbook\helper\permission_helper.py:136 +#: .\cookbook\helper\permission_helper.py:159 .\cookbook\views\views.py:148 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:142 -#: .\cookbook\helper\permission_helper.py:148 -#: .\cookbook\helper\permission_helper.py:173 -#: .\cookbook\helper\permission_helper.py:218 -#: .\cookbook\helper\permission_helper.py:232 -#: .\cookbook\helper\permission_helper.py:243 -#: .\cookbook\helper\permission_helper.py:254 .\cookbook\views\data.py:40 -#: .\cookbook\views\views.py:162 .\cookbook\views\views.py:169 -#: .\cookbook\views\views.py:259 +#: .\cookbook\helper\permission_helper.py:140 +#: .\cookbook\helper\permission_helper.py:146 +#: .\cookbook\helper\permission_helper.py:171 +#: .\cookbook\helper\permission_helper.py:219 +#: .\cookbook\helper\permission_helper.py:233 +#: .\cookbook\helper\permission_helper.py:244 +#: .\cookbook\helper\permission_helper.py:255 .\cookbook\views\data.py:47 +#: .\cookbook\views\views.py:159 .\cookbook\views\views.py:166 +#: .\cookbook\views\views.py:232 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:166 -#: .\cookbook\helper\permission_helper.py:189 -#: .\cookbook\helper\permission_helper.py:204 +#: .\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 "" -#: .\cookbook\helper\template_helper.py:60 -#: .\cookbook\helper\template_helper.py:62 +#: .\cookbook\helper\recipe_search.py:473 +msgid "One of queryset or hash_key must be provided" +msgstr "" + +#: .\cookbook\helper\shopping_helper.py:54 +#, fuzzy +#| msgid "You must provide at least a recipe or a title." +msgid "You must supply a recipe or mealplan" +msgstr "É necessário inserir uma receita ou um título." + +#: .\cookbook\helper\shopping_helper.py:58 +msgid "You must supply a created_by" +msgstr "" + +#: .\cookbook\helper\template_helper.py:61 +#: .\cookbook\helper\template_helper.py:63 msgid "Could not parse template code." msgstr "" -#: .\cookbook\integration\integration.py:104 -#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 -#: .\cookbook\templates\import_response.html:7 -#: .\cookbook\templates\test.html:14 .\cookbook\templates\test.html:20 -#: .\cookbook\templates\url_import.html:27 -#: .\cookbook\templates\url_import.html:101 -#: .\cookbook\templates\url_import.html:123 -#: .\cookbook\templates\url_import.html:317 -#: .\cookbook\templates\url_import.html:604 .\cookbook\views\delete.py:60 -#: .\cookbook\views\edit.py:199 -msgid "Import" -msgstr "Importar" - -#: .\cookbook\integration\integration.py:185 +#: .\cookbook\integration\integration.py:200 msgid "" "Importer expected a .zip file. Did you choose the correct importer type for " "your data ?" msgstr "" -#: .\cookbook\integration\integration.py:188 +#: .\cookbook\integration\integration.py:203 msgid "" "An unexpected error occurred during the import. Please make sure you have " "uploaded a valid file." msgstr "" -#: .\cookbook\integration\integration.py:192 +#: .\cookbook\integration\integration.py:208 msgid "The following recipes were ignored because they already existed:" msgstr "" -#: .\cookbook\integration\integration.py:196 +#: .\cookbook\integration\integration.py:212 #, fuzzy, python-format #| msgid "Import Recipes" msgid "Imported %s recipes." @@ -308,37 +563,51 @@ msgstr "Nota" msgid "Nutritional Information" msgstr "" -#: .\cookbook\integration\paprika.py:53 +#: .\cookbook\integration\paprika.py:53 .\cookbook\templates\url_import.html:42 msgid "Source" msgstr "" -#: .\cookbook\integration\safron.py:23 -#: .\cookbook\templates\forms\edit_internal_recipe.html:79 -#: .\cookbook\templates\include\log_cooking.html:16 -#: .\cookbook\templates\url_import.html:224 -#: .\cookbook\templates\url_import.html:455 +#: .\cookbook\integration\saffron.py:23 +#: .\cookbook\templates\include\log_cooking.html:18 +#: .\cookbook\templates\url_import.html:231 +#: .\cookbook\templates\url_import.html:462 msgid "Servings" msgstr "Porções" -#: .\cookbook\integration\safron.py:25 +#: .\cookbook\integration\saffron.py:25 msgid "Waiting time" msgstr "" -#: .\cookbook\integration\safron.py:27 -#: .\cookbook\templates\forms\edit_internal_recipe.html:73 +#: .\cookbook\integration\saffron.py:27 msgid "Preparation Time" msgstr "" -#: .\cookbook\integration\safron.py:29 .\cookbook\templates\base.html:78 +#: .\cookbook\integration\saffron.py:29 .\cookbook\templates\base.html:78 #: .\cookbook\templates\forms\ingredients.html:7 #: .\cookbook\templates\index.html:7 msgid "Cookbook" msgstr "Livro de refeições" -#: .\cookbook\integration\safron.py:31 +#: .\cookbook\integration\saffron.py:31 msgid "Section" msgstr "" +#: .\cookbook\management\commands\rebuildindex.py:14 +msgid "Rebuilds full text search index on Recipe" +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:18 +msgid "Only Postgress databases use full text search, no index to rebuild" +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:29 +msgid "Recipe index rebuild complete." +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:31 +msgid "Recipe index rebuild failed." +msgstr "" + #: .\cookbook\migrations\0047_auto_20200602_1133.py:14 msgid "Breakfast" msgstr "Pequeno-almoço" @@ -355,92 +624,151 @@ msgstr "Jantar" msgid "Other" msgstr "Outro" -#: .\cookbook\models.py:72 +#: .\cookbook\models.py:246 msgid "" "Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " "upload." msgstr "" -#: .\cookbook\models.py:123 .\cookbook\templates\search.html:7 -#: .\cookbook\templates\shopping_list.html:52 +#: .\cookbook\models.py:300 .\cookbook\templates\search.html:7 +#: .\cookbook\templates\shopping_list.html:53 msgid "Search" msgstr "Procurar" -#: .\cookbook\models.py:124 .\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 +#: .\cookbook\models.py:301 .\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 "Plano de refeição" -#: .\cookbook\models.py:125 .\cookbook\templates\base.html:89 +#: .\cookbook\models.py:302 .\cookbook\templates\base.html:90 msgid "Books" msgstr "Livros" -#: .\cookbook\models.py:133 +#: .\cookbook\models.py:310 msgid "Small" msgstr "Pequeno" -#: .\cookbook\models.py:133 +#: .\cookbook\models.py:310 msgid "Large" msgstr "Grande" -#: .\cookbook\models.py:133 .\cookbook\templates\generic\new_template.html:6 +#: .\cookbook\models.py:310 .\cookbook\templates\generic\new_template.html:6 #: .\cookbook\templates\generic\new_template.html:14 -#: .\cookbook\templates\meal_plan.html:323 msgid "New" msgstr "Novo" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:202 +#: .\cookbook\models.py:512 +msgid " is part of a recipe step and cannot be deleted" +msgstr "" + +#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:44 msgid "Text" msgstr "Texto" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:203 +#: .\cookbook\models.py:586 msgid "Time" msgstr "Tempo" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:204 -#: .\cookbook\templates\forms\edit_internal_recipe.html:219 +#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:46 #, fuzzy #| msgid "File ID" msgid "File" msgstr "ID the ficheiro" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:205 -#: .\cookbook\templates\forms\edit_internal_recipe.html:241 +#: .\cookbook\models.py:586 #: .\cookbook\templates\include\recipe_open_modal.html:7 -#: .\cookbook\templates\meal_plan.html:247 .\cookbook\views\delete.py:28 -#: .\cookbook\views\edit.py:273 .\cookbook\views\new.py:52 +#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260 +#: .\cookbook\views\new.py:53 msgid "Recipe" msgstr "Receita" -#: .\cookbook\serializer.py:109 +#: .\cookbook\models.py:1041 .\cookbook\templates\search_info.html:28 +msgid "Simple" +msgstr "" + +#: .\cookbook\models.py:1042 .\cookbook\templates\search_info.html:33 +msgid "Phrase" +msgstr "" + +#: .\cookbook\models.py:1043 .\cookbook\templates\search_info.html:38 +msgid "Web" +msgstr "" + +#: .\cookbook\models.py:1044 .\cookbook\templates\search_info.html:47 +msgid "Raw" +msgstr "" + +#: .\cookbook\models.py:1082 +#, fuzzy +#| msgid "New Food" +msgid "Food Alias" +msgstr "Novo Prato" + +#: .\cookbook\models.py:1082 +#, fuzzy +#| msgid "Units" +msgid "Unit Alias" +msgstr "Unidades" + +#: .\cookbook\models.py:1082 +#, fuzzy +#| msgid "Keywords" +msgid "Keyword Alias" +msgstr "Palavras-chave" + +#: .\cookbook\serializer.py:175 +msgid "A user is required" +msgstr "" + +#: .\cookbook\serializer.py:195 msgid "File uploads are not enabled for this Space." msgstr "" -#: .\cookbook\serializer.py:117 +#: .\cookbook\serializer.py:206 msgid "You have reached your file upload limit." msgstr "" -#: .\cookbook\tables.py:35 .\cookbook\templates\books.html:36 -#: .\cookbook\templates\generic\edit_template.html:6 +#: .\cookbook\serializer.py:962 +msgid "Existing shopping list to update" +msgstr "" + +#: .\cookbook\serializer.py:964 +msgid "" +"List of ingredient IDs from the recipe to add, if not provided all " +"ingredients will be added." +msgstr "" + +#: .\cookbook\serializer.py:965 +msgid "" +"Providing a list_recipe ID and servings of 0 will delete that shopping list." +msgstr "" + +#: .\cookbook\serializer.py:973 +msgid "Amount of food to add to the shopping list" +msgstr "" + +#: .\cookbook\serializer.py:974 +msgid "ID of unit to use for the shopping list" +msgstr "" + +#: .\cookbook\serializer.py:975 +msgid "When set to true will delete all food from active shopping lists." +msgstr "" + +#: .\cookbook\tables.py:35 .\cookbook\templates\generic\edit_template.html:6 #: .\cookbook\templates\generic\edit_template.html:14 -#: .\cookbook\templates\meal_plan.html:281 #: .\cookbook\templates\recipes_table.html:82 -#: .\cookbook\templates\shopping_list.html:33 -#: .\cookbook\templates\space.html:90 +#: .\cookbook\templates\shopping_list.html:37 +#: .\cookbook\templates\space.html:109 msgid "Edit" msgstr "Editar" -#: .\cookbook\tables.py:124 .\cookbook\tables.py:147 -#: .\cookbook\templates\books.html:38 -#: .\cookbook\templates\generic\delete_template.html:5 -#: .\cookbook\templates\generic\delete_template.html:13 -#: .\cookbook\templates\generic\edit_template.html:27 -#: .\cookbook\templates\meal_plan.html:277 +#: .\cookbook\tables.py:115 .\cookbook\tables.py:138 +#: .\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" @@ -469,7 +797,7 @@ 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:154 .\cookbook\templates\settings.html:6 +#: .\cookbook\templates\base.html:257 .\cookbook\templates\settings.html:6 #: .\cookbook\templates\settings.html:17 #: .\cookbook\templates\socialaccount\connections.html:10 msgid "Settings" @@ -506,6 +834,7 @@ msgid "Re-send Verification" msgstr "" #: .\cookbook\templates\account\email.html:50 +#: .\cookbook\templates\generic\delete_template.html:56 #: .\cookbook\templates\socialaccount\connections.html:44 msgid "Remove" msgstr "" @@ -547,7 +876,7 @@ msgid "" msgstr "" #: .\cookbook\templates\account\email_confirm.html:22 -#: .\cookbook\templates\generic\delete_template.html:21 +#: .\cookbook\templates\generic\delete_template.html:71 msgid "Confirm" msgstr "Confirme" @@ -559,7 +888,7 @@ msgid "" "request." msgstr "" -#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:189 +#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:289 msgid "Login" msgstr "Iniciar sessão" @@ -570,27 +899,27 @@ msgstr "Iniciar sessão" msgid "Sign In" msgstr "" -#: .\cookbook\templates\account\login.html:32 +#: .\cookbook\templates\account\login.html:34 #: .\cookbook\templates\socialaccount\signup.html:8 #: .\cookbook\templates\socialaccount\signup.html:57 msgid "Sign Up" msgstr "" -#: .\cookbook\templates\account\login.html:36 -#: .\cookbook\templates\account\login.html:37 +#: .\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:37 +#: .\cookbook\templates\account\login.html:40 msgid "Lost your password?" msgstr "" -#: .\cookbook\templates\account\login.html:48 +#: .\cookbook\templates\account\login.html:52 msgid "Social Login" msgstr "" -#: .\cookbook\templates\account\login.html:49 +#: .\cookbook\templates\account\login.html:53 msgid "You can use any of the following providers to sign in." msgstr "" @@ -607,12 +936,16 @@ msgstr "" #: .\cookbook\templates\account\password_change.html:6 #: .\cookbook\templates\account\password_change.html:16 #: .\cookbook\templates\account\password_change.html:21 +#: .\cookbook\templates\account\password_reset_from_key.html:7 +#: .\cookbook\templates\account\password_reset_from_key.html:13 +#: .\cookbook\templates\account\password_reset_from_key_done.html:7 +#: .\cookbook\templates\account\password_reset_from_key_done.html:13 msgid "Change Password" msgstr "" #: .\cookbook\templates\account\password_change.html:12 #: .\cookbook\templates\account\password_set.html:12 -#: .\cookbook\templates\settings.html:52 +#: .\cookbook\templates\settings.html:76 #, fuzzy #| msgid "Settings" msgid "Password" @@ -645,6 +978,30 @@ msgid "" "within a few minutes." msgstr "" +#: .\cookbook\templates\account\password_reset_from_key.html:13 +msgid "Bad Token" +msgstr "" + +#: .\cookbook\templates\account\password_reset_from_key.html:25 +#, python-format +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used.\n" +" Please request a new " +"password reset." +msgstr "" + +#: .\cookbook\templates\account\password_reset_from_key.html:33 +#, fuzzy +#| msgid "Settings" +msgid "change password" +msgstr "Definições" + +#: .\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 "" + #: .\cookbook\templates\account\password_set.html:6 #: .\cookbook\templates\account\password_set.html:16 #: .\cookbook\templates\account\password_set.html:21 @@ -696,100 +1053,118 @@ msgstr "" msgid "We are sorry, but the sign up is currently closed." msgstr "" -#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:179 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:279 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "Documentação API" -#: .\cookbook\templates\base.html:85 -msgid "Utensils" -msgstr "Utensílios" - -#: .\cookbook\templates\base.html:95 +#: .\cookbook\templates\base.html:86 msgid "Shopping" msgstr "Compras" -#: .\cookbook\templates\base.html:101 -#: .\cookbook\templates\shopping_list.html:230 +#: .\cookbook\templates\base.html:113 +msgid "Keyword" +msgstr "Palavra-chave" + +#: .\cookbook\templates\base.html:125 .\cookbook\views\lists.py:114 +#, fuzzy +#| msgid "New Food" +msgid "Foods" +msgstr "Novo Prato" + +#: .\cookbook\templates\base.html:137 +#: .\cookbook\templates\forms\ingredients.html:24 +#: .\cookbook\templates\space.html:47 .\cookbook\templates\stats.html:26 +#: .\cookbook\views\lists.py:131 +msgid "Units" +msgstr "Unidades" + +#: .\cookbook\templates\base.html:151 +#: .\cookbook\templates\shopping_list.html:208 #: .\cookbook\templates\supermarket.html:7 msgid "Supermarket" msgstr "" -#: .\cookbook\templates\base.html:112 .\cookbook\views\delete.py:84 -#: .\cookbook\views\edit.py:102 .\cookbook\views\lists.py:26 -#: .\cookbook\views\new.py:78 -msgid "Keyword" -msgstr "Palavra-chave" +#: .\cookbook\templates\base.html:163 +#, fuzzy +#| msgid "Batch edit Category" +msgid "Supermarket Category" +msgstr "Editar Categorias em massa" -#: .\cookbook\templates\base.html:114 +#: .\cookbook\templates\base.html:175 .\cookbook\views\lists.py:180 +msgid "Automations" +msgstr "" + +#: .\cookbook\templates\base.html:189 .\cookbook\views\lists.py:200 +#, fuzzy +#| msgid "File ID" +msgid "Files" +msgstr "ID the ficheiro" + +#: .\cookbook\templates\base.html:201 msgid "Batch Edit" msgstr "Editor em massa" -#: .\cookbook\templates\base.html:119 -msgid "Storage Data" -msgstr "Dados de armazenamento" - -#: .\cookbook\templates\base.html:123 -msgid "Storage Backends" -msgstr "" - -#: .\cookbook\templates\base.html:125 -msgid "Configure Sync" -msgstr "Configurar sincronização" - -#: .\cookbook\templates\base.html:127 -msgid "Discovered Recipes" -msgstr "Descobrir Receitas" - -#: .\cookbook\templates\base.html:129 -msgid "Discovery Log" -msgstr "" - -#: .\cookbook\templates\base.html:131 .\cookbook\templates\stats.html:10 -msgid "Statistics" -msgstr "Estatísticas" - -#: .\cookbook\templates\base.html:133 -msgid "Units & Ingredients" -msgstr "Unidades e Ingredientes" - -#: .\cookbook\templates\base.html:135 .\cookbook\templates\index.html:47 -msgid "Import Recipe" -msgstr "Importar Receita" - -#: .\cookbook\templates\base.html:156 .\cookbook\templates\history.html:6 +#: .\cookbook\templates\base.html:213 .\cookbook\templates\history.html:6 #: .\cookbook\templates\history.html:14 msgid "History" msgstr "Histórico" -#: .\cookbook\templates\base.html:159 .\cookbook\templates\space.html:7 -#: .\cookbook\templates\space.html:19 +#: .\cookbook\templates\base.html:228 .\cookbook\templates\export.html:14 +#: .\cookbook\templates\export.html:20 +#: .\cookbook\templates\shopping_list.html:310 +#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 +msgid "Export" +msgstr "Exportar" + +#: .\cookbook\templates\base.html:244 .\cookbook\templates\index.html:47 +msgid "Import Recipe" +msgstr "Importar Receita" + +#: .\cookbook\templates\base.html:246 +#: .\cookbook\templates\shopping_list.html:165 +#: .\cookbook\templates\shopping_list.html:188 +msgid "Create" +msgstr "Criar" + +#: .\cookbook\templates\base.html:259 +#: .\cookbook\templates\generic\list_template.html:14 +#: .\cookbook\templates\space.html:69 .\cookbook\templates\stats.html:43 +msgid "External Recipes" +msgstr "" + +#: .\cookbook\templates\base.html:262 .\cookbook\templates\space.html:8 +#: .\cookbook\templates\space.html:20 .\cookbook\templates\space.html:150 #, fuzzy #| msgid "Settings" msgid "Space Settings" msgstr "Definições" -#: .\cookbook\templates\base.html:163 .\cookbook\templates\system.html:13 +#: .\cookbook\templates\base.html:267 .\cookbook\templates\system.html:13 msgid "System" msgstr "Sistema" -#: .\cookbook\templates\base.html:165 .\cookbook\templates\base.html:171 +#: .\cookbook\templates\base.html:269 msgid "Admin" msgstr "Administração" -#: .\cookbook\templates\base.html:175 +#: .\cookbook\templates\base.html:273 msgid "Markdown Guide" msgstr "" -#: .\cookbook\templates\base.html:177 +#: .\cookbook\templates\base.html:275 msgid "GitHub" msgstr "GitHub" -#: .\cookbook\templates\base.html:181 +#: .\cookbook\templates\base.html:277 +msgid "Translate Tandoor" +msgstr "" + +#: .\cookbook\templates\base.html:281 msgid "API Browser" msgstr "Navegador de API" -#: .\cookbook\templates\base.html:184 +#: .\cookbook\templates\base.html:284 msgid "Log out" msgstr "" @@ -805,7 +1180,7 @@ msgstr "Editar Receitas em massa" msgid "Add the specified keywords to all recipes containing a word" msgstr "Adicionar palavras-chave a todas as receitas que contenham uma palavra" -#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:85 +#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:82 msgid "Sync" msgstr "Sincronizar" @@ -823,10 +1198,40 @@ msgstr "" msgid "The path must be in the following format" msgstr "O caminho deve estar no seguinte formato" -#: .\cookbook\templates\batch\monitor.html:27 +#: .\cookbook\templates\batch\monitor.html:20 +#: .\cookbook\templates\forms\edit_import_recipe.html:14 +#: .\cookbook\templates\generic\edit_template.html:23 +#: .\cookbook\templates\generic\new_template.html:23 +#: .\cookbook\templates\include\log_cooking.html:30 +#: .\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\shopping_list.html:311 +#: .\cookbook\templates\space.html:155 +msgid "Save" +msgstr "Gravar" + +#: .\cookbook\templates\batch\monitor.html:21 +msgid "Manage External Storage" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:28 msgid "Sync Now!" msgstr "Sincronizar" +#: .\cookbook\templates\batch\monitor.html:29 +#, fuzzy +#| msgid "Recipes" +msgid "Show Recipes" +msgstr "Receitas" + +#: .\cookbook\templates\batch\monitor.html:30 +#, fuzzy +#| msgid "View Log" +msgid "Show Log" +msgstr "Ver Registro" + #: .\cookbook\templates\batch\waiting.html:4 #: .\cookbook\templates\batch\waiting.html:10 msgid "Importing Recipes" @@ -840,265 +1245,23 @@ msgstr "" "Este processo pode demorar alguns minutos, dependendo do número de receitas " "a ser importadas." -#: .\cookbook\templates\books.html:5 .\cookbook\templates\books.html:11 +#: .\cookbook\templates\books.html:7 msgid "Recipe Books" msgstr "Livros de Receitas" -#: .\cookbook\templates\books.html:15 -msgid "New Book" -msgstr "Novo Livro" - -#: .\cookbook\templates\books.html:27 .\cookbook\templates\recipe_view.html:26 -msgid "by" -msgstr "por" - -#: .\cookbook\templates\books.html:34 -msgid "Toggle Recipes" -msgstr "" - -#: .\cookbook\templates\books.html:54 -#: .\cookbook\templates\meal_plan_entry.html:48 -#: .\cookbook\templates\recipes_table.html:64 -msgid "Last cooked" -msgstr "Última cozinhada" - -#: .\cookbook\templates\books.html:71 -msgid "There are no recipes in this book yet." -msgstr "Ainda não há receitas neste livro." - #: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6 msgid "Export Recipes" msgstr "Exportar Receitas" -#: .\cookbook\templates\export.html:14 .\cookbook\templates\export.html:20 -#: .\cookbook\templates\shopping_list.html:351 -#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 -msgid "Export" -msgstr "Exportar" - -#: .\cookbook\templates\files.html:7 -#, fuzzy -#| msgid "File ID" -msgid "Files" -msgstr "ID the ficheiro" - #: .\cookbook\templates\forms\edit_import_recipe.html:5 #: .\cookbook\templates\forms\edit_import_recipe.html:9 msgid "Import new Recipe" msgstr "Importar nova Receita" -#: .\cookbook\templates\forms\edit_import_recipe.html:14 -#: .\cookbook\templates\forms\edit_internal_recipe.html:439 -#: .\cookbook\templates\forms\edit_internal_recipe.html:471 -#: .\cookbook\templates\generic\edit_template.html:23 -#: .\cookbook\templates\generic\new_template.html:23 -#: .\cookbook\templates\include\log_cooking.html:28 -#: .\cookbook\templates\meal_plan.html:325 -#: .\cookbook\templates\settings.html:46 .\cookbook\templates\settings.html:87 -#: .\cookbook\templates\settings.html:105 -#: .\cookbook\templates\shopping_list.html:353 -msgid "Save" -msgstr "Gravar" - #: .\cookbook\templates\forms\edit_internal_recipe.html:7 -#: .\cookbook\templates\forms\edit_internal_recipe.html:34 msgid "Edit Recipe" msgstr "Editar Receita" -#: .\cookbook\templates\forms\edit_internal_recipe.html:56 -#: .\cookbook\templates\url_import.html:171 -msgid "Description" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:76 -msgid "Waiting Time" -msgstr "Tempo de Espera" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:82 -msgid "Servings Text" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:93 -msgid "Select Keywords" -msgstr "Escolher Palavras-chave" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:94 -#: .\cookbook\templates\url_import.html:583 -#, fuzzy -#| msgid "Keyword" -msgid "Add Keyword" -msgstr "Palavra-chave" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:112 -msgid "Nutrition" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:116 -#: .\cookbook\templates\forms\edit_internal_recipe.html:166 -msgid "Delete Step" -msgstr "Apagar Passo" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:120 -msgid "Calories" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:123 -msgid "Carbohydrates" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:126 -msgid "Fats" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:128 -msgid "Proteins" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:150 -#: .\cookbook\templates\forms\edit_internal_recipe.html:504 -msgid "Step" -msgstr "Passo" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:171 -msgid "Show as header" -msgstr "Mostrar como cabeçalho" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:177 -msgid "Hide as header" -msgstr "Esconder como cabeçalho" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:182 -msgid "Move Up" -msgstr "Mover para cima" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:187 -msgid "Move Down" -msgstr "Mover para baixo" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:196 -msgid "Step Name" -msgstr "Nome do passo" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:200 -msgid "Step Type" -msgstr "Tipo de passo" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:213 -msgid "Step time in Minutes" -msgstr "Tempo de passo em minutos" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:229 -#, fuzzy -#| msgid "Select Unit" -msgid "Select File" -msgstr "Selecionar Unidade" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:230 -#: .\cookbook\templates\forms\edit_internal_recipe.html:252 -#: .\cookbook\templates\forms\edit_internal_recipe.html:313 -#: .\cookbook\templates\forms\edit_internal_recipe.html:337 -#: .\cookbook\templates\shopping_list.html:189 -#: .\cookbook\templates\shopping_list.html:211 -#: .\cookbook\templates\shopping_list.html:241 -#: .\cookbook\templates\shopping_list.html:265 -#: .\cookbook\templates\url_import.html:495 -#: .\cookbook\templates\url_import.html:527 -msgid "Select" -msgstr "Selecionar" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:251 -#, fuzzy -#| msgid "Delete Recipe" -msgid "Select Recipe" -msgstr "Apagar Receita" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:311 -#: .\cookbook\templates\shopping_list.html:187 -msgid "Select Unit" -msgstr "Selecionar Unidade" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:312 -#: .\cookbook\templates\forms\edit_internal_recipe.html:336 -#: .\cookbook\templates\shopping_list.html:188 -#: .\cookbook\templates\shopping_list.html:210 -msgid "Create" -msgstr "Criar" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:335 -#: .\cookbook\templates\shopping_list.html:209 -msgid "Select Food" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:352 -#: .\cookbook\templates\meal_plan.html:256 -#: .\cookbook\templates\url_import.html:542 -msgid "Note" -msgstr "Nota" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:369 -msgid "Delete Ingredient" -msgstr "Apagar Ingrediente" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:375 -msgid "Make Header" -msgstr "Adicionar Cabeçalho" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:381 -msgid "Make Ingredient" -msgstr "Adicionar Ingrediente" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:387 -msgid "Disable Amount" -msgstr "Desativar Quantidade" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:393 -msgid "Enable Amount" -msgstr "Ativar Quantidade" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:398 -msgid "Copy Template Reference" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:424 -#: .\cookbook\templates\url_import.html:297 -#: .\cookbook\templates\url_import.html:567 -msgid "Instructions" -msgstr "Instruções" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:437 -#: .\cookbook\templates\forms\edit_internal_recipe.html:468 -msgid "Save & View" -msgstr "Gravar e Ver" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:441 -#: .\cookbook\templates\forms\edit_internal_recipe.html:474 -msgid "Add Step" -msgstr "Adicionar Passo" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:444 -#: .\cookbook\templates\forms\edit_internal_recipe.html:478 -msgid "Add Nutrition" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:446 -#: .\cookbook\templates\forms\edit_internal_recipe.html:480 -msgid "Remove Nutrition" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:448 -#: .\cookbook\templates\forms\edit_internal_recipe.html:483 -msgid "View Recipe" -msgstr "Ver Receita" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:450 -#: .\cookbook\templates\forms\edit_internal_recipe.html:485 -msgid "Delete Recipe" -msgstr "Apagar Receita" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:491 -msgid "Steps" -msgstr "Passos" - #: .\cookbook\templates\forms\ingredients.html:15 msgid "Edit Ingredients" msgstr "Editar ingredientes" @@ -1119,11 +1282,6 @@ msgstr "" "Junta duas unidades ou ingredientes e atualiza todas as receitas que as " "estejam a usar. " -#: .\cookbook\templates\forms\ingredients.html:24 -#: .\cookbook\templates\space.html:41 .\cookbook\templates\stats.html:26 -msgid "Units" -msgstr "Unidades" - #: .\cookbook\templates\forms\ingredients.html:26 msgid "Are you sure that you want to merge these two units?" msgstr "" @@ -1137,29 +1295,46 @@ msgstr "Juntar" msgid "Are you sure that you want to merge these two ingredients?" msgstr "" -#: .\cookbook\templates\generic\delete_template.html:18 +#: .\cookbook\templates\generic\delete_template.html:21 #, python-format msgid "Are you sure you want to delete the %(title)s: %(object)s " msgstr "Tem a certeza que quer apagar %(title)s: %(object)s" -#: .\cookbook\templates\generic\edit_template.html:30 +#: .\cookbook\templates\generic\delete_template.html:26 +msgid "Protected" +msgstr "" + +#: .\cookbook\templates\generic\delete_template.html:41 +msgid "Cascade" +msgstr "" + +#: .\cookbook\templates\generic\delete_template.html:72 +msgid "Cancel" +msgstr "" + +#: .\cookbook\templates\generic\edit_template.html:32 msgid "View" msgstr "Ver" -#: .\cookbook\templates\generic\edit_template.html:34 +#: .\cookbook\templates\generic\edit_template.html:36 msgid "Delete original file" msgstr "Apagar ficheiro original" #: .\cookbook\templates\generic\list_template.html:6 -#: .\cookbook\templates\generic\list_template.html:12 +#: .\cookbook\templates\generic\list_template.html:22 msgid "List" msgstr "Listar " -#: .\cookbook\templates\generic\list_template.html:25 +#: .\cookbook\templates\generic\list_template.html:33 +#: .\cookbook\templates\shopping_list.html:33 +msgid "Try the new shopping list" +msgstr "" + +#: .\cookbook\templates\generic\list_template.html:45 msgid "Filter" msgstr "Filtrar" -#: .\cookbook\templates\generic\list_template.html:30 +#: .\cookbook\templates\generic\list_template.html:50 msgid "Import all" msgstr "Importar tudo" @@ -1185,23 +1360,32 @@ msgstr "Registro Cook" msgid "Import Recipes" msgstr "Importar Receitas" -#: .\cookbook\templates\include\log_cooking.html:7 +#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 +#: .\cookbook\templates\import_response.html:7 +#: .\cookbook\templates\test.html:14 .\cookbook\templates\test.html:20 +#: .\cookbook\templates\url_import.html:29 +#: .\cookbook\templates\url_import.html:108 +#: .\cookbook\templates\url_import.html:130 +#: .\cookbook\templates\url_import.html:324 +#: .\cookbook\templates\url_import.html:618 .\cookbook\views\delete.py:89 +#: .\cookbook\views\edit.py:200 +msgid "Import" +msgstr "Importar" + +#: .\cookbook\templates\include\log_cooking.html:9 msgid "Log Recipe Cooking" msgstr "Registro Receita Cooking" -#: .\cookbook\templates\include\log_cooking.html:13 +#: .\cookbook\templates\include\log_cooking.html:15 msgid "All fields are optional and can be left empty." msgstr "Todos os campos são opcionais e podem ser deixados vazios. " -#: .\cookbook\templates\include\log_cooking.html:19 +#: .\cookbook\templates\include\log_cooking.html:21 msgid "Rating" msgstr "Classificação " -#: .\cookbook\templates\include\log_cooking.html:27 +#: .\cookbook\templates\include\log_cooking.html:29 #: .\cookbook\templates\include\recipe_open_modal.html:18 -#: .\cookbook\templates\meal_plan.html:283 -#: .\cookbook\templates\meal_plan.html:327 -#: .\cookbook\templates\meal_plan.html:366 msgid "Close" msgstr "Fechar" @@ -1254,8 +1438,8 @@ msgstr "Redefinir Procura" msgid "Last viewed" msgstr "Ultimo visto" -#: .\cookbook\templates\index.html:87 .\cookbook\templates\meal_plan.html:178 -#: .\cookbook\templates\space.html:35 .\cookbook\templates\stats.html:22 +#: .\cookbook\templates\index.html:87 .\cookbook\templates\space.html:37 +#: .\cookbook\templates\stats.html:22 msgid "Recipes" msgstr "Receitas" @@ -1402,148 +1586,23 @@ msgstr "Cabeçalho" msgid "Cell" msgstr "Célula " -#: .\cookbook\templates\meal_plan.html:101 -msgid "New Entry" -msgstr "Nova Entrada" - -#: .\cookbook\templates\meal_plan.html:113 -#: .\cookbook\templates\shopping_list.html:56 -msgid "Search Recipe" -msgstr "Procure Receita" - -#: .\cookbook\templates\meal_plan.html:139 -msgid "Title" -msgstr "Título" - -#: .\cookbook\templates\meal_plan.html:141 -msgid "Note (optional)" -msgstr "Nota (opcional)" - -#: .\cookbook\templates\meal_plan.html:143 -msgid "" -"You can use markdown to format this field. See the docs here" -msgstr "" -"Pode usar markdown para formatar este campo. Veja a documentação aqui " - -#: .\cookbook\templates\meal_plan.html:147 -#: .\cookbook\templates\meal_plan.html:251 -msgid "Serving Count" +#: .\cookbook\templates\meal_plan_entry.html:6 +msgid "Meal Plan View" msgstr "" -#: .\cookbook\templates\meal_plan.html:153 -msgid "Create only note" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:168 -#: .\cookbook\templates\shopping_list.html:7 -#: .\cookbook\templates\shopping_list.html:29 -#: .\cookbook\templates\shopping_list.html:714 -msgid "Shopping List" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:172 -msgid "Shopping list currently empty" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:175 -msgid "Open Shopping List" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:189 -msgid "Plan" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:196 -msgid "Number of Days" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:206 -msgid "Weekday offset" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:209 -msgid "" -"Number of days starting from the first day of the week to offset the default " -"view." -msgstr "" - -#: .\cookbook\templates\meal_plan.html:217 -#: .\cookbook\templates\meal_plan.html:294 -msgid "Edit plan types" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:219 -msgid "Show help" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:220 -msgid "Week iCal export" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:264 #: .\cookbook\templates\meal_plan_entry.html:18 msgid "Created by" msgstr "" -#: .\cookbook\templates\meal_plan.html:270 #: .\cookbook\templates\meal_plan_entry.html:20 -#: .\cookbook\templates\shopping_list.html:254 +#: .\cookbook\templates\shopping_list.html:232 msgid "Shared with" msgstr "" -#: .\cookbook\templates\meal_plan.html:280 -msgid "Add to Shopping" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:323 -msgid "New meal type" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:338 -msgid "Meal Plan Help" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:344 -msgid "" -"\n" -"

The meal plan module allows planning of meals " -"both with recipes and notes.

\n" -"

Simply select a recipe from the list of " -"recently viewed recipes or search the one you\n" -" want and drag it to the desired plan " -"position. You can also add a note and a title and\n" -" then drag the recipe to create a plan entry " -"with a custom title and note. Creating only\n" -" Notes is possible by dragging the create " -"note box into the plan.

\n" -"

Click on a recipe in order to open the " -"detailed view. There you can also add it to the\n" -" shopping list. You can also add all recipes " -"of a day to the shopping list by\n" -" clicking the shopping cart at the top of the " -"table.

\n" -"

Since a common use case is to plan meals " -"together you can define\n" -" users you want to share your plan with in " -"the settings.\n" -"

\n" -"

You can also edit the types of meals you want " -"to plan. If you share your plan with\n" -" someone with\n" -" different meals, their meal types will " -"appear in your list as well. To prevent\n" -" duplicates (e.g. Other and Misc.)\n" -" name your meal types the same as the users " -"you share your meals with and they will be\n" -" merged.

\n" -" " -msgstr "" - -#: .\cookbook\templates\meal_plan_entry.html:6 -msgid "Meal Plan View" -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." @@ -1642,29 +1701,28 @@ msgid "" "recently viewed them. Keep in mind that data might be outdated." msgstr "" -#: .\cookbook\templates\recipe_view.html:21 .\cookbook\templates\space.html:62 -#: .\cookbook\templates\stats.html:47 -msgid "Comments" -msgstr "" +#: .\cookbook\templates\recipe_view.html:26 +msgid "by" +msgstr "por" -#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:118 -#: .\cookbook\views\edit.py:179 +#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:147 +#: .\cookbook\views\edit.py:180 msgid "Comment" msgstr "" #: .\cookbook\templates\recipes_table.html:19 #: .\cookbook\templates\recipes_table.html:23 -#: .\cookbook\templates\url_import.html:440 +#: .\cookbook\templates\url_import.html:447 msgid "Recipe Image" msgstr "" #: .\cookbook\templates\recipes_table.html:51 -#: .\cookbook\templates\url_import.html:445 +#: .\cookbook\templates\url_import.html:452 msgid "Preparation time ca." msgstr "" #: .\cookbook\templates\recipes_table.html:57 -#: .\cookbook\templates\url_import.html:450 +#: .\cookbook\templates\url_import.html:457 msgid "Waiting time ca." msgstr "" @@ -1680,71 +1738,306 @@ msgstr "" msgid "Recipe Home" msgstr "" -#: .\cookbook\templates\settings.html:25 +#: .\cookbook\templates\search_info.html:5 +#: .\cookbook\templates\search_info.html:9 +#: .\cookbook\templates\settings.html:172 +#, fuzzy +#| msgid "Search String" +msgid "Search Settings" +msgstr "Procurar" + +#: .\cookbook\templates\search_info.html:10 +msgid "" +"\n" +" Creating the best search experience is complicated and weighs " +"heavily on your personal configuration. \n" +" Changing any of the search settings can have significant impact on " +"the speed and quality of the results.\n" +" Search Methods, Trigrams and Full Text Search configurations are " +"only available if you are using Postgres for your database.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:19 +#, fuzzy +#| msgid "Search" +msgid "Search Methods" +msgstr "Procurar" + +#: .\cookbook\templates\search_info.html:23 +msgid "" +" \n" +" Full text searches attempt to normalize the words provided to " +"match common variants. For example: 'forked', 'forking', 'forks' will all " +"normalize to 'fork'.\n" +" There are several methods available, described below, that will " +"control how the search behavior should react when multiple words are " +"searched.\n" +" Full technical details on how these operate can be viewed on Postgresql's website.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:29 +msgid "" +" \n" +" Simple searches ignore punctuation and common words such as " +"'the', 'a', 'and'. And will treat seperate words as required.\n" +" Searching for 'apple or flour' will return any recipe that " +"includes both 'apple' and 'flour' anywhere in the fields that have been " +"selected for a full text search.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:34 +msgid "" +" \n" +" Phrase searches ignore punctuation, but will search for all of " +"the words in the exact order provided.\n" +" Searching for 'apple or flour' will only return a recipe that " +"includes the exact phrase 'apple or flour' in any of the fields that have " +"been selected for a full text search.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:39 +msgid "" +" \n" +" Web searches simulate functionality found on many web search " +"sites supporting special syntax.\n" +" Placing quotes around several words will convert those words " +"into a phrase.\n" +" 'or' is recongized as searching for the word (or phrase) " +"immediately before 'or' OR the word (or phrase) directly after.\n" +" '-' is recognized as searching for recipes that do not include " +"the word (or phrase) that comes immediately after. \n" +" For example searching for 'apple pie' or cherry -butter will " +"return any recipe that includes the phrase 'apple pie' or the word " +"'cherry' \n" +" in any field included in the full text search but exclude any " +"recipe that has the word 'butter' in any field included.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:48 +msgid "" +" \n" +" Raw search is similar to Web except will take puncuation " +"operators such as '|', '&' and '()'\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:59 +msgid "" +" \n" +" Another approach to searching that also requires Postgresql is " +"fuzzy search or trigram similarity. A trigram is a group of three " +"consecutive characters.\n" +" For example searching for 'apple' will create x trigrams 'app', " +"'ppl', 'ple' and will create a score of how closely words match the " +"generated trigrams.\n" +" One benefit of searching trigams is that a search for 'sandwich' " +"will find mispelled words such as 'sandwhich' that would be missed by other " +"methods.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:69 +#, fuzzy +#| msgid "Search Recipe" +msgid "Search Fields" +msgstr "Procure Receita" + +#: .\cookbook\templates\search_info.html:73 +msgid "" +" \n" +" Unaccent is a special case in that it enables searching a field " +"'unaccented' for each search style attempting to ignore accented values. \n" +" For example when you enable unaccent for 'Name' any search " +"(starts with, contains, trigram) will attempt the search ignoring accented " +"characters.\n" +" \n" +" For the other options, you can enable search on any or all " +"fields and they will be combined together with an assumed 'OR'.\n" +" For example enabling 'Name' for Starts With, 'Name' and " +"'Description' for Partial Match and 'Ingredients' and 'Keywords' for Full " +"Search\n" +" and searching for 'apple' will generate a search that will " +"return recipes that have:\n" +" - A recipe name that starts with 'apple'\n" +" - OR a recipe name that contains 'apple'\n" +" - OR a recipe description that contains 'apple'\n" +" - OR a recipe that will have a full text search match ('apple' " +"or 'apples') in ingredients\n" +" - OR a recipe that will have a full text search match in " +"Keywords\n" +"\n" +" Combining too many fields in too many types of search can have a " +"negative impact on performance, create duplicate results or return " +"unexpected results.\n" +" For example, enabling fuzzy search or partial matches will " +"interfere with web search methods. \n" +" Searching for 'apple -pie' with fuzzy search and full text " +"search will return the recipe Apple Pie. Though it is not included in the " +"full text results, it does match the trigram results.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:95 +#, fuzzy +#| msgid "Search" +msgid "Search Index" +msgstr "Procurar" + +#: .\cookbook\templates\search_info.html:99 +msgid "" +" \n" +" Trigram search and Full Text Search both rely on database " +"indexes to perform effectively. \n" +" You can rebuild the indexes on all fields in the Admin page for " +"Recipes and selecting all recipes and running 'rebuild index for selected " +"recipes'\n" +" You can also rebuild indexes at the command line by executing " +"the management command 'python manage.py rebuildindex'\n" +" " +msgstr "" + +#: .\cookbook\templates\settings.html:28 msgid "Account" msgstr "" -#: .\cookbook\templates\settings.html:29 +#: .\cookbook\templates\settings.html:35 msgid "Preferences" msgstr "" -#: .\cookbook\templates\settings.html:33 +#: .\cookbook\templates\settings.html:42 #, fuzzy #| msgid "Settings" msgid "API-Settings" msgstr "Definições" -#: .\cookbook\templates\settings.html:41 +#: .\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:49 +#: .\cookbook\templates\settings.html:73 #, fuzzy #| msgid "Settings" msgid "Account Settings" msgstr "Definições" -#: .\cookbook\templates\settings.html:51 +#: .\cookbook\templates\settings.html:75 #, fuzzy #| msgid "Settings" msgid "Emails" msgstr "Definições" -#: .\cookbook\templates\settings.html:54 +#: .\cookbook\templates\settings.html:78 #: .\cookbook\templates\socialaccount\connections.html:11 msgid "Social" msgstr "" -#: .\cookbook\templates\settings.html:66 +#: .\cookbook\templates\settings.html:91 msgid "Language" msgstr "" -#: .\cookbook\templates\settings.html:96 +#: .\cookbook\templates\settings.html:121 msgid "Style" msgstr "" -#: .\cookbook\templates\settings.html:116 +#: .\cookbook\templates\settings.html:142 msgid "API Token" msgstr "" -#: .\cookbook\templates\settings.html:117 +#: .\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:134 +#: .\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:136 +#: .\cookbook\templates\settings.html:162 msgid "or" msgstr "" +#: .\cookbook\templates\settings.html:173 +msgid "" +"There are many options to configure the search depending on your personal " +"preferences." +msgstr "" + +#: .\cookbook\templates\settings.html:174 +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 +msgid "" +"If you do want to configure the search you can read about the different " +"options here." +msgstr "" + +#: .\cookbook\templates\settings.html:180 +msgid "Fuzzy" +msgstr "" + +#: .\cookbook\templates\settings.html:181 +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 +msgid "This is the default behavior" +msgstr "" + +#: .\cookbook\templates\settings.html:183 +#: .\cookbook\templates\settings.html:191 +msgid "Apply" +msgstr "" + +#: .\cookbook\templates\settings.html:188 +msgid "Precise" +msgstr "" + +#: .\cookbook\templates\settings.html:189 +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 +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 "" @@ -1762,50 +2055,73 @@ msgstr "" msgid "Create Superuser account" msgstr "" -#: .\cookbook\templates\shopping_list.html:79 +#: .\cookbook\templates\shopping_list.html:8 +#: .\cookbook\templates\shopping_list.html:29 +#: .\cookbook\templates\shopping_list.html:663 +msgid "Shopping List" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:55 +msgid "Search Recipe" +msgstr "Procure Receita" + +#: .\cookbook\templates\shopping_list.html:72 msgid "Shopping Recipes" msgstr "" -#: .\cookbook\templates\shopping_list.html:83 +#: .\cookbook\templates\shopping_list.html:74 msgid "No recipes selected" msgstr "" -#: .\cookbook\templates\shopping_list.html:150 +#: .\cookbook\templates\shopping_list.html:131 msgid "Entry Mode" msgstr "" -#: .\cookbook\templates\shopping_list.html:158 +#: .\cookbook\templates\shopping_list.html:139 msgid "Add Entry" msgstr "" -#: .\cookbook\templates\shopping_list.html:174 +#: .\cookbook\templates\shopping_list.html:152 msgid "Amount" msgstr "" -#: .\cookbook\templates\shopping_list.html:240 +#: .\cookbook\templates\shopping_list.html:164 +msgid "Select Unit" +msgstr "Selecionar Unidade" + +#: .\cookbook\templates\shopping_list.html:166 +#: .\cookbook\templates\shopping_list.html:189 +#: .\cookbook\templates\shopping_list.html:219 +#: .\cookbook\templates\shopping_list.html:243 +#: .\cookbook\templates\url_import.html:505 +#: .\cookbook\templates\url_import.html:537 +msgid "Select" +msgstr "Selecionar" + +#: .\cookbook\templates\shopping_list.html:187 +msgid "Select Food" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:218 msgid "Select Supermarket" msgstr "" -#: .\cookbook\templates\shopping_list.html:264 +#: .\cookbook\templates\shopping_list.html:242 msgid "Select User" msgstr "" -#: .\cookbook\templates\shopping_list.html:283 +#: .\cookbook\templates\shopping_list.html:258 msgid "Finished" msgstr "" -#: .\cookbook\templates\shopping_list.html:296 +#: .\cookbook\templates\shopping_list.html:267 msgid "You are offline, shopping list might not syncronize." msgstr "" -#: .\cookbook\templates\shopping_list.html:361 +#: .\cookbook\templates\shopping_list.html:318 msgid "Copy/Export" msgstr "" -#: .\cookbook\templates\shopping_list.html:365 -msgid "List Prefix" -msgstr "" - #: .\cookbook\templates\socialaccount\connections.html:4 #: .\cookbook\templates\socialaccount\connections.html:15 msgid "Account Connections" @@ -1855,88 +2171,84 @@ msgstr "" msgid "Sign in using" msgstr "" -#: .\cookbook\templates\space.html:23 +#: .\cookbook\templates\space.html:25 msgid "Space:" msgstr "" -#: .\cookbook\templates\space.html:24 +#: .\cookbook\templates\space.html:26 msgid "Manage Subscription" msgstr "" -#: .\cookbook\templates\space.html:32 .\cookbook\templates\stats.html:19 +#: .\cookbook\templates\space.html:34 .\cookbook\templates\stats.html:19 msgid "Number of objects" msgstr "" -#: .\cookbook\templates\space.html:45 .\cookbook\templates\stats.html:30 +#: .\cookbook\templates\space.html:54 .\cookbook\templates\stats.html:30 msgid "Recipe Imports" msgstr "" -#: .\cookbook\templates\space.html:53 .\cookbook\templates\stats.html:38 +#: .\cookbook\templates\space.html:62 .\cookbook\templates\stats.html:38 msgid "Objects stats" msgstr "" -#: .\cookbook\templates\space.html:56 .\cookbook\templates\stats.html:41 +#: .\cookbook\templates\space.html:65 .\cookbook\templates\stats.html:41 msgid "Recipes without Keywords" msgstr "" -#: .\cookbook\templates\space.html:58 .\cookbook\templates\stats.html:43 -msgid "External Recipes" -msgstr "" - -#: .\cookbook\templates\space.html:60 .\cookbook\templates\stats.html:45 +#: .\cookbook\templates\space.html:73 .\cookbook\templates\stats.html:45 msgid "Internal Recipes" msgstr "" -#: .\cookbook\templates\space.html:73 +#: .\cookbook\templates\space.html:89 msgid "Members" msgstr "" -#: .\cookbook\templates\space.html:77 +#: .\cookbook\templates\space.html:95 msgid "Invite User" msgstr "" -#: .\cookbook\templates\space.html:88 +#: .\cookbook\templates\space.html:107 msgid "User" msgstr "" -#: .\cookbook\templates\space.html:89 +#: .\cookbook\templates\space.html:108 msgid "Groups" msgstr "" -#: .\cookbook\templates\space.html:105 +#: .\cookbook\templates\space.html:119 #, fuzzy #| msgid "Admin" msgid "admin" msgstr "Administração" -#: .\cookbook\templates\space.html:106 +#: .\cookbook\templates\space.html:120 msgid "user" msgstr "" -#: .\cookbook\templates\space.html:107 +#: .\cookbook\templates\space.html:121 msgid "guest" msgstr "" -#: .\cookbook\templates\space.html:108 +#: .\cookbook\templates\space.html:122 msgid "remove" msgstr "" -#: .\cookbook\templates\space.html:112 +#: .\cookbook\templates\space.html:126 msgid "Update" msgstr "" -#: .\cookbook\templates\space.html:116 +#: .\cookbook\templates\space.html:130 msgid "You cannot edit yourself." msgstr "" -#: .\cookbook\templates\space.html:123 +#: .\cookbook\templates\space.html:136 #, fuzzy #| msgid "There are no recipes in this book yet." msgid "There are no members in your space yet!" msgstr "Ainda não há receitas neste livro." -#: .\cookbook\templates\space.html:130 .\cookbook\templates\system.html:21 -#: .\cookbook\views\lists.py:115 +#: .\cookbook\templates\space.html:143 .\cookbook\templates\system.html:21 +#: .\cookbook\views\lists.py:85 msgid "Invite Links" msgstr "" @@ -1944,6 +2256,10 @@ msgstr "" msgid "Stats" msgstr "" +#: .\cookbook\templates\stats.html:10 +msgid "Statistics" +msgstr "Estatísticas" + #: .\cookbook\templates\system.html:22 msgid "Show Links" msgstr "" @@ -2041,155 +2357,182 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\url_import.html:6 +#: .\cookbook\templates\url_import.html:8 msgid "URL Import" msgstr "" -#: .\cookbook\templates\url_import.html:31 +#: .\cookbook\templates\url_import.html:33 msgid "Drag me to your bookmarks to import recipes from anywhere" msgstr "" -#: .\cookbook\templates\url_import.html:32 +#: .\cookbook\templates\url_import.html:34 msgid "Bookmark Me!" msgstr "" -#: .\cookbook\templates\url_import.html:61 +#: .\cookbook\templates\url_import.html:38 +msgid "URL" +msgstr "" + +#: .\cookbook\templates\url_import.html:40 +msgid "App" +msgstr "" + +#: .\cookbook\templates\url_import.html:64 msgid "Enter website URL" msgstr "" -#: .\cookbook\templates\url_import.html:97 +#: .\cookbook\templates\url_import.html:104 msgid "Select recipe files to import or drop them here..." msgstr "" -#: .\cookbook\templates\url_import.html:118 +#: .\cookbook\templates\url_import.html:125 msgid "Paste json or html source here to load recipe." msgstr "" -#: .\cookbook\templates\url_import.html:146 +#: .\cookbook\templates\url_import.html:153 #, fuzzy #| msgid "View Recipe" msgid "Preview Recipe Data" msgstr "Ver Receita" -#: .\cookbook\templates\url_import.html:147 +#: .\cookbook\templates\url_import.html:154 msgid "Drag recipe attributes from the right into the appropriate box below." msgstr "" -#: .\cookbook\templates\url_import.html:156 -#: .\cookbook\templates\url_import.html:173 -#: .\cookbook\templates\url_import.html:190 -#: .\cookbook\templates\url_import.html:209 -#: .\cookbook\templates\url_import.html:227 -#: .\cookbook\templates\url_import.html:242 -#: .\cookbook\templates\url_import.html:257 -#: .\cookbook\templates\url_import.html:273 -#: .\cookbook\templates\url_import.html:300 -#: .\cookbook\templates\url_import.html:351 +#: .\cookbook\templates\url_import.html:163 +#: .\cookbook\templates\url_import.html:180 +#: .\cookbook\templates\url_import.html:197 +#: .\cookbook\templates\url_import.html:216 +#: .\cookbook\templates\url_import.html:234 +#: .\cookbook\templates\url_import.html:249 +#: .\cookbook\templates\url_import.html:264 +#: .\cookbook\templates\url_import.html:280 +#: .\cookbook\templates\url_import.html:307 +#: .\cookbook\templates\url_import.html:358 msgid "Clear Contents" msgstr "" -#: .\cookbook\templates\url_import.html:158 +#: .\cookbook\templates\url_import.html:165 msgid "Text dragged here will be appended to the name." msgstr "" -#: .\cookbook\templates\url_import.html:175 +#: .\cookbook\templates\url_import.html:178 +msgid "Description" +msgstr "" + +#: .\cookbook\templates\url_import.html:182 msgid "Text dragged here will be appended to the description." msgstr "" -#: .\cookbook\templates\url_import.html:192 +#: .\cookbook\templates\url_import.html:199 msgid "Keywords dragged here will be appended to current list" msgstr "" -#: .\cookbook\templates\url_import.html:207 +#: .\cookbook\templates\url_import.html:214 msgid "Image" msgstr "" -#: .\cookbook\templates\url_import.html:239 +#: .\cookbook\templates\url_import.html:246 #, fuzzy #| msgid "Time" msgid "Prep Time" msgstr "Tempo" -#: .\cookbook\templates\url_import.html:254 +#: .\cookbook\templates\url_import.html:261 #, fuzzy #| msgid "Time" msgid "Cook Time" msgstr "Tempo" -#: .\cookbook\templates\url_import.html:275 +#: .\cookbook\templates\url_import.html:282 msgid "Ingredients dragged here will be appended to current list." msgstr "" -#: .\cookbook\templates\url_import.html:302 +#: .\cookbook\templates\url_import.html:304 +#: .\cookbook\templates\url_import.html:579 +msgid "Instructions" +msgstr "Instruções" + +#: .\cookbook\templates\url_import.html:309 msgid "" "Recipe instructions dragged here will be appended to current instructions." msgstr "" -#: .\cookbook\templates\url_import.html:325 +#: .\cookbook\templates\url_import.html:332 #, fuzzy #| msgid "Discovered Recipes" msgid "Discovered Attributes" msgstr "Descobrir Receitas" -#: .\cookbook\templates\url_import.html:327 +#: .\cookbook\templates\url_import.html:334 msgid "" "Drag recipe attributes from below into the appropriate box on the left. " "Click any node to display its full properties." msgstr "" -#: .\cookbook\templates\url_import.html:344 +#: .\cookbook\templates\url_import.html:351 #, fuzzy #| msgid "Show as header" msgid "Show Blank Field" msgstr "Mostrar como cabeçalho" -#: .\cookbook\templates\url_import.html:349 +#: .\cookbook\templates\url_import.html:356 msgid "Blank Field" msgstr "" -#: .\cookbook\templates\url_import.html:353 +#: .\cookbook\templates\url_import.html:360 msgid "Items dragged to Blank Field will be appended." msgstr "" -#: .\cookbook\templates\url_import.html:400 +#: .\cookbook\templates\url_import.html:407 #, fuzzy #| msgid "Delete Step" msgid "Delete Text" msgstr "Apagar Passo" -#: .\cookbook\templates\url_import.html:413 +#: .\cookbook\templates\url_import.html:420 #, fuzzy #| msgid "Delete Recipe" msgid "Delete image" msgstr "Apagar Receita" -#: .\cookbook\templates\url_import.html:429 +#: .\cookbook\templates\url_import.html:436 msgid "Recipe Name" msgstr "" -#: .\cookbook\templates\url_import.html:433 +#: .\cookbook\templates\url_import.html:440 msgid "Recipe Description" msgstr "" -#: .\cookbook\templates\url_import.html:494 -#: .\cookbook\templates\url_import.html:526 -#: .\cookbook\templates\url_import.html:582 +#: .\cookbook\templates\url_import.html:504 +#: .\cookbook\templates\url_import.html:536 +#: .\cookbook\templates\url_import.html:596 msgid "Select one" msgstr "" -#: .\cookbook\templates\url_import.html:596 +#: .\cookbook\templates\url_import.html:554 +msgid "Note" +msgstr "Nota" + +#: .\cookbook\templates\url_import.html:597 +#, fuzzy +#| msgid "Keyword" +msgid "Add Keyword" +msgstr "Palavra-chave" + +#: .\cookbook\templates\url_import.html:610 msgid "All Keywords" msgstr "" -#: .\cookbook\templates\url_import.html:599 +#: .\cookbook\templates\url_import.html:613 msgid "Import all keywords, not only the ones already existing." msgstr "" -#: .\cookbook\templates\url_import.html:626 +#: .\cookbook\templates\url_import.html:640 msgid "Information" msgstr "" -#: .\cookbook\templates\url_import.html:628 +#: .\cookbook\templates\url_import.html:642 msgid "" " Only websites containing ld+json or microdata information can currently\n" " be imported. Most big recipe pages " @@ -2200,281 +2543,577 @@ msgid "" " github issues." msgstr "" -#: .\cookbook\templates\url_import.html:636 +#: .\cookbook\templates\url_import.html:650 msgid "Google ld+json Info" msgstr "" -#: .\cookbook\templates\url_import.html:639 +#: .\cookbook\templates\url_import.html:653 msgid "GitHub Issues" msgstr "" -#: .\cookbook\templates\url_import.html:641 +#: .\cookbook\templates\url_import.html:655 msgid "Recipe Markup Specification" msgstr "" -#: .\cookbook\views\api.py:79 +#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:170 msgid "Parameter updated_at incorrectly formatted" msgstr "" -#: .\cookbook\views\api.py:580 .\cookbook\views\views.py:303 -msgid "This feature is not available in the demo version!" +#: .\cookbook\views\api.py:190 .\cookbook\views\api.py:291 +#, python-brace-format +msgid "No {self.basename} with id {pk} exists" msgstr "" -#: .\cookbook\views\api.py:603 +#: .\cookbook\views\api.py:194 +msgid "Cannot merge with the same object!" +msgstr "" + +#: .\cookbook\views\api.py:201 +#, python-brace-format +msgid "No {self.basename} with id {target} exists" +msgstr "" + +#: .\cookbook\views\api.py:206 +msgid "Cannot merge with child object!" +msgstr "" + +#: .\cookbook\views\api.py:239 +#, python-brace-format +msgid "{source.name} was merged successfully with {target.name}" +msgstr "" + +#: .\cookbook\views\api.py:244 +#, python-brace-format +msgid "An error occurred attempting to merge {source.name} with {target.name}" +msgstr "" + +#: .\cookbook\views\api.py:300 +#, python-brace-format +msgid "{child.name} was moved successfully to the root." +msgstr "" + +#: .\cookbook\views\api.py:303 .\cookbook\views\api.py:321 +msgid "An error occurred attempting to move " +msgstr "" + +#: .\cookbook\views\api.py:306 +msgid "Cannot move an object to itself!" +msgstr "" + +#: .\cookbook\views\api.py:312 +#, python-brace-format +msgid "No {self.basename} with id {parent} exists" +msgstr "" + +#: .\cookbook\views\api.py:318 +#, python-brace-format +msgid "{child.name} was moved successfully to parent {parent.name}" +msgstr "" + +#: .\cookbook\views\api.py:470 +#, python-brace-format +msgid "{obj.name} was removed from the shopping list." +msgstr "" + +#: .\cookbook\views\api.py:475 .\cookbook\views\api.py:726 +#, python-brace-format +msgid "{obj.name} was added to the shopping list." +msgstr "" + +#: .\cookbook\views\api.py:587 +msgid "ID of recipe a step is part of. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:588 +msgid "Query string matched (fuzzy) against object name." +msgstr "" + +#: .\cookbook\views\api.py:631 +msgid "" +"Query string matched (fuzzy) against recipe name. In the future also " +"fulltext search." +msgstr "" + +#: .\cookbook\views\api.py:632 +msgid "ID of keyword a recipe should have. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:633 +msgid "ID of food a recipe should have. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:634 +msgid "ID of unit a recipe should have." +msgstr "" + +#: .\cookbook\views\api.py:635 +msgid "Rating a recipe should have. [0 - 5]" +msgstr "" + +#: .\cookbook\views\api.py:636 +msgid "ID of book a recipe should be in. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:637 +msgid "" +"If recipe should have all (AND=false) or any (OR=true) of the " +"provided keywords." +msgstr "" + +#: .\cookbook\views\api.py:638 +msgid "" +"If recipe should have all (AND=false) or any (OR=true) of the " +"provided foods." +msgstr "" + +#: .\cookbook\views\api.py:639 +msgid "" +"If recipe should be in all (AND=false) or any (OR=true) of the " +"provided books." +msgstr "" + +#: .\cookbook\views\api.py:640 +msgid "If only internal recipes should be returned. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:641 +msgid "Returns the results in randomized order. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:642 +msgid "Returns new results first in search results. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:768 +msgid "" +"Returns the shopping list entry with a primary key of id. Multiple values " +"allowed." +msgstr "" + +#: .\cookbook\views\api.py:771 +msgid "" +"Filter shopping list entries on checked. [true, false, both, recent]
- recent includes unchecked items and recently completed items." +msgstr "" + +#: .\cookbook\views\api.py:773 +msgid "Returns the shopping list entries sorted by supermarket category order." +msgstr "" + +#: .\cookbook\views\api.py:922 .\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 "" + +#: .\cookbook\views\api.py:944 msgid "Sync successful!" msgstr "" -#: .\cookbook\views\api.py:608 +#: .\cookbook\views\api.py:949 msgid "Error synchronizing with Storage" msgstr "" -#: .\cookbook\views\api.py:686 +#: .\cookbook\views\api.py:1028 msgid "Nothing to do." msgstr "" -#: .\cookbook\views\api.py:701 +#: .\cookbook\views\api.py:1043 msgid "The requested site provided malformed data and cannot be read." msgstr "" -#: .\cookbook\views\api.py:708 +#: .\cookbook\views\api.py:1050 msgid "The requested page could not be found." msgstr "" -#: .\cookbook\views\api.py:717 +#: .\cookbook\views\api.py:1068 msgid "" "The requested site does not provide any recognized data format to import the " "recipe from." msgstr "Esta página não contém uma receita que eu consiga entender." -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:1082 +msgid "Connection Refused." +msgstr "" + +#: .\cookbook\views\api.py:1091 msgid "No useable data could be found." msgstr "" -#: .\cookbook\views\api.py:747 +#: .\cookbook\views\api.py:1107 msgid "I couldn't find anything to do." msgstr "" -#: .\cookbook\views\data.py:31 .\cookbook\views\data.py:122 -#: .\cookbook\views\edit.py:50 .\cookbook\views\import_export.py:67 -#: .\cookbook\views\new.py:32 +#: .\cookbook\views\data.py:34 .\cookbook\views\data.py:129 +#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:80 +#: .\cookbook\views\new.py:33 msgid "You have reached the maximum number of recipes for your space." msgstr "" -#: .\cookbook\views\data.py:35 .\cookbook\views\data.py:126 -#: .\cookbook\views\edit.py:54 .\cookbook\views\import_export.py:71 -#: .\cookbook\views\new.py:36 +#: .\cookbook\views\data.py:38 .\cookbook\views\data.py:133 +#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:84 +#: .\cookbook\views\new.py:37 msgid "You have more users than allowed in your space." msgstr "" -#: .\cookbook\views\data.py:104 +#: .\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] "" -#: .\cookbook\views\delete.py:72 +#: .\cookbook\views\delete.py:101 msgid "Monitor" msgstr "" -#: .\cookbook\views\delete.py:96 .\cookbook\views\lists.py:102 -#: .\cookbook\views\new.py:98 +#: .\cookbook\views\delete.py:125 .\cookbook\views\lists.py:71 +#: .\cookbook\views\new.py:101 msgid "Storage Backend" msgstr "" -#: .\cookbook\views\delete.py:106 +#: .\cookbook\views\delete.py:135 msgid "" "Could not delete this storage backend as it is used in at least one monitor." msgstr "" -#: .\cookbook\views\delete.py:129 .\cookbook\views\edit.py:213 -#: .\cookbook\views\new.py:156 +#: .\cookbook\views\delete.py:158 msgid "Recipe Book" msgstr "" -#: .\cookbook\views\delete.py:141 +#: .\cookbook\views\delete.py:170 msgid "Bookmarks" msgstr "" -#: .\cookbook\views\delete.py:163 .\cookbook\views\new.py:252 +#: .\cookbook\views\delete.py:192 .\cookbook\views\new.py:238 msgid "Invite Link" msgstr "" -#: .\cookbook\views\edit.py:119 -msgid "Food" -msgstr "" - -#: .\cookbook\views\edit.py:128 +#: .\cookbook\views\edit.py:125 msgid "You cannot edit this storage!" msgstr "" -#: .\cookbook\views\edit.py:148 +#: .\cookbook\views\edit.py:149 msgid "Storage saved!" msgstr "" -#: .\cookbook\views\edit.py:154 +#: .\cookbook\views\edit.py:155 msgid "There was an error updating this storage backend!" msgstr "" -#: .\cookbook\views\edit.py:165 -msgid "Storage" -msgstr "" - -#: .\cookbook\views\edit.py:261 +#: .\cookbook\views\edit.py:248 msgid "Changes saved!" msgstr "" -#: .\cookbook\views\edit.py:265 +#: .\cookbook\views\edit.py:252 msgid "Error saving changes!" msgstr "" -#: .\cookbook\views\edit.py:299 -msgid "Units merged!" -msgstr "" - -#: .\cookbook\views\edit.py:301 .\cookbook\views\edit.py:317 -msgid "Cannot merge with the same object!" -msgstr "" - -#: .\cookbook\views\edit.py:315 -msgid "Foods merged!" -msgstr "" - -#: .\cookbook\views\import_export.py:93 +#: .\cookbook\views\import_export.py:106 msgid "Importing is not implemented for this provider" msgstr "" -#: .\cookbook\views\import_export.py:115 +#: .\cookbook\views\import_export.py:127 +msgid "" +"The PDF Exporter is not enabled on this instance as it is still in an " +"experimental state." +msgstr "" + +#: .\cookbook\views\import_export.py:132 msgid "Exporting is not implemented for this provider" msgstr "" -#: .\cookbook\views\lists.py:40 +#: .\cookbook\views\lists.py:25 msgid "Import Log" msgstr "" -#: .\cookbook\views\lists.py:53 +#: .\cookbook\views\lists.py:38 msgid "Discovery" msgstr "" -#: .\cookbook\views\lists.py:85 +#: .\cookbook\views\lists.py:54 msgid "Shopping Lists" msgstr "" -#: .\cookbook\views\new.py:123 +#: .\cookbook\views\lists.py:148 +msgid "Supermarkets" +msgstr "" + +#: .\cookbook\views\lists.py:164 +msgid "Shopping Categories" +msgstr "" + +#: .\cookbook\views\lists.py:217 +msgid "Steps" +msgstr "Passos" + +#: .\cookbook\views\lists.py:232 +#, fuzzy +#| msgid "Shopping" +msgid "New Shopping List" +msgstr "Compras" + +#: .\cookbook\views\new.py:126 msgid "Imported new recipe!" msgstr "" -#: .\cookbook\views\new.py:126 +#: .\cookbook\views\new.py:129 msgid "There was an error importing this recipe!" msgstr "" -#: .\cookbook\views\new.py:226 +#: .\cookbook\views\new.py:212 msgid "Hello" msgstr "" -#: .\cookbook\views\new.py:226 +#: .\cookbook\views\new.py:212 msgid "You have been invited by " msgstr "" -#: .\cookbook\views\new.py:227 +#: .\cookbook\views\new.py:213 msgid " to join their Tandoor Recipes space " msgstr "" -#: .\cookbook\views\new.py:228 +#: .\cookbook\views\new.py:214 msgid "Click the following link to activate your account: " msgstr "" -#: .\cookbook\views\new.py:229 +#: .\cookbook\views\new.py:215 msgid "" "If the link does not work use the following code to manually join the space: " msgstr "" -#: .\cookbook\views\new.py:230 +#: .\cookbook\views\new.py:216 msgid "The invitation is valid until " msgstr "" -#: .\cookbook\views\new.py:231 +#: .\cookbook\views\new.py:217 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " msgstr "" -#: .\cookbook\views\new.py:234 +#: .\cookbook\views\new.py:220 msgid "Tandoor Recipes Invite" msgstr "" -#: .\cookbook\views\new.py:241 +#: .\cookbook\views\new.py:227 msgid "Invite link successfully send to user." msgstr "" -#: .\cookbook\views\new.py:244 +#: .\cookbook\views\new.py:230 msgid "" "You have send to many emails, please share the link manually or wait a few " "hours." msgstr "" -#: .\cookbook\views\new.py:246 +#: .\cookbook\views\new.py:232 msgid "Email to user could not be send, please share link manually." msgstr "" -#: .\cookbook\views\views.py:129 +#: .\cookbook\views\views.py:126 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:177 +#: .\cookbook\views\views.py:174 msgid "You do not have the required permissions to perform this action!" msgstr "" -#: .\cookbook\views\views.py:188 +#: .\cookbook\views\views.py:185 msgid "Comment saved!" msgstr "" -#: .\cookbook\views\views.py:395 +#: .\cookbook\views\views.py:276 +msgid "This feature is not available in the demo version!" +msgstr "" + +#: .\cookbook\views\views.py:335 +msgid "You must select at least one field to search!" +msgstr "" + +#: .\cookbook\views\views.py:340 +msgid "" +"To use this search method you must select at least one full text search " +"field!" +msgstr "" + +#: .\cookbook\views\views.py:344 +msgid "Fuzzy search is not compatible with this search method!" +msgstr "" + +#: .\cookbook\views\views.py:470 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:402 +#: .\cookbook\views\views.py:477 msgid "Passwords dont match!" msgstr "" -#: .\cookbook\views\views.py:418 +#: .\cookbook\views\views.py:493 msgid "User has been created, please login!" msgstr "" -#: .\cookbook\views\views.py:434 +#: .\cookbook\views\views.py:509 msgid "Malformed Invite Link supplied!" msgstr "" -#: .\cookbook\views\views.py:441 +#: .\cookbook\views\views.py:516 #, fuzzy #| msgid "You are not logged in and therefore cannot view this page!" msgid "You are already member of a space and therefore cannot join this one." msgstr "Autenticação necessária para aceder a esta página!" -#: .\cookbook\views\views.py:452 +#: .\cookbook\views\views.py:527 msgid "Successfully joined space." msgstr "" -#: .\cookbook\views\views.py:458 +#: .\cookbook\views\views.py:533 msgid "Invite Link not valid or already used!" msgstr "" -#: .\cookbook\views\views.py:522 +#: .\cookbook\views\views.py:614 msgid "" "Reporting share links is not enabled for this instance. Please notify the " "page administrator to report problems." msgstr "" -#: .\cookbook\views\views.py:528 +#: .\cookbook\views\views.py:620 msgid "" "Recipe sharing link has been disabled! For additional information please " "contact the page administrator." msgstr "" +#~ msgid "New Unit" +#~ msgstr "Nova Unidade" + +#~ msgid "New unit that other gets replaced by." +#~ msgstr "Nova unidade substituta." + +#~ msgid "Old Unit" +#~ msgstr "Unidade Anterior" + +#~ msgid "Unit that should be replaced." +#~ msgstr "Unidade a ser alterada." + +#~ msgid "New Food" +#~ msgstr "Novo Prato" + +#~ msgid "New food that other gets replaced by." +#~ msgstr "Novo prato a ser alterado." + +#~ msgid "Old Food" +#~ msgstr "Prato Anterior" + +#~ msgid "New Entry" +#~ msgstr "Nova Entrada" + +#~ msgid "Title" +#~ msgstr "Título" + +#~ msgid "Note (optional)" +#~ msgstr "Nota (opcional)" + +#~ msgid "" +#~ "You can use markdown to format this field. See the docs here" +#~ msgstr "" +#~ "Pode usar markdown para formatar este campo. Veja a documentação " +#~ "aqui " + +#~ msgid "Utensils" +#~ msgstr "Utensílios" + +#~ msgid "Storage Data" +#~ msgstr "Dados de armazenamento" + +#~ msgid "Configure Sync" +#~ msgstr "Configurar sincronização" + +#~ msgid "Discovered Recipes" +#~ msgstr "Descobrir Receitas" + +#~ msgid "Units & Ingredients" +#~ msgstr "Unidades e Ingredientes" + +#~ msgid "New Book" +#~ msgstr "Novo Livro" + +#~ msgid "There are no recipes in this book yet." +#~ msgstr "Ainda não há receitas neste livro." + +#~ msgid "Waiting Time" +#~ msgstr "Tempo de Espera" + +#~ msgid "Select Keywords" +#~ msgstr "Escolher Palavras-chave" + +#~ msgid "Delete Step" +#~ msgstr "Apagar Passo" + +#~ msgid "Step" +#~ msgstr "Passo" + +#~ msgid "Show as header" +#~ msgstr "Mostrar como cabeçalho" + +#~ msgid "Hide as header" +#~ msgstr "Esconder como cabeçalho" + +#~ msgid "Move Up" +#~ msgstr "Mover para cima" + +#~ msgid "Move Down" +#~ msgstr "Mover para baixo" + +#~ msgid "Step Name" +#~ msgstr "Nome do passo" + +#~ msgid "Step Type" +#~ msgstr "Tipo de passo" + +#~ msgid "Step time in Minutes" +#~ msgstr "Tempo de passo em minutos" + +#, fuzzy +#~| msgid "Select Unit" +#~ msgid "Select File" +#~ msgstr "Selecionar Unidade" + +#, fuzzy +#~| msgid "Delete Recipe" +#~ msgid "Select Recipe" +#~ msgstr "Apagar Receita" + +#~ msgid "Delete Ingredient" +#~ msgstr "Apagar Ingrediente" + +#~ msgid "Make Header" +#~ msgstr "Adicionar Cabeçalho" + +#~ msgid "Make Ingredient" +#~ msgstr "Adicionar Ingrediente" + +#~ msgid "Disable Amount" +#~ msgstr "Desativar Quantidade" + +#~ msgid "Enable Amount" +#~ msgstr "Ativar Quantidade" + +#~ msgid "Save & View" +#~ msgstr "Gravar e Ver" + +#~ msgid "Add Step" +#~ msgstr "Adicionar Passo" + +#~ msgid "View Recipe" +#~ msgstr "Ver Receita" + +#~ msgid "Delete Recipe" +#~ msgstr "Apagar Receita" + #~ msgid "" #~ "A username is not required, if left blank the new user can choose one." #~ msgstr "" diff --git a/cookbook/locale/rn/LC_MESSAGES/django.po b/cookbook/locale/rn/LC_MESSAGES/django.po index 4aa893a4..b301bc61 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: 2021-08-17 08:44+0200\n" +"POT-Creation-Date: 2022-01-18 14:52+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,49 +18,106 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: .\cookbook\filters.py:23 .\cookbook\templates\base.html:98 -#: .\cookbook\templates\forms\edit_internal_recipe.html:269 -#: .\cookbook\templates\forms\ingredients.html:34 -#: .\cookbook\templates\space.html:43 .\cookbook\templates\stats.html:28 -#: .\cookbook\templates\url_import.html:270 .\cookbook\views\lists.py:67 +#: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 +#: .\cookbook\templates\space.html:50 .\cookbook\templates\stats.html:28 +#: .\cookbook\templates\url_import.html:277 msgid "Ingredients" msgstr "" -#: .\cookbook\forms.py:49 +#: .\cookbook\forms.py:56 +msgid "Default unit" +msgstr "" + +#: .\cookbook\forms.py:57 +msgid "Use fractions" +msgstr "" + +#: .\cookbook\forms.py:58 +msgid "Use KJ" +msgstr "" + +#: .\cookbook\forms.py:59 +msgid "Theme" +msgstr "" + +#: .\cookbook\forms.py:60 +msgid "Navbar color" +msgstr "" + +#: .\cookbook\forms.py:61 +msgid "Sticky navbar" +msgstr "" + +#: .\cookbook\forms.py:62 +msgid "Default page" +msgstr "" + +#: .\cookbook\forms.py:63 +msgid "Show recent recipes" +msgstr "" + +#: .\cookbook\forms.py:64 +msgid "Search style" +msgstr "" + +#: .\cookbook\forms.py:65 +msgid "Plan sharing" +msgstr "" + +#: .\cookbook\forms.py:66 +msgid "Ingredient decimal places" +msgstr "" + +#: .\cookbook\forms.py:67 +msgid "Shopping list auto sync period" +msgstr "" + +#: .\cookbook\forms.py:68 .\cookbook\templates\recipe_view.html:21 +#: .\cookbook\templates\space.html:77 .\cookbook\templates\stats.html:47 +msgid "Comments" +msgstr "" + +#: .\cookbook\forms.py:72 msgid "" "Color of the top navigation bar. Not all colors work with all themes, just " "try them out!" msgstr "" -#: .\cookbook\forms.py:51 +#: .\cookbook\forms.py:74 msgid "Default Unit to be used when inserting a new ingredient into a recipe." msgstr "" -#: .\cookbook\forms.py:53 +#: .\cookbook\forms.py:76 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" msgstr "" -#: .\cookbook\forms.py:56 -msgid "" -"Users with whom newly created meal plan/shopping list entries should be " -"shared by default." +#: .\cookbook\forms.py:78 +msgid "Display nutritional energy amounts in joules instead of calories" msgstr "" -#: .\cookbook\forms.py:58 +#: .\cookbook\forms.py:79 +msgid "Users with whom newly created meal plans should be shared by default." +msgstr "" + +#: .\cookbook\forms.py:80 +msgid "Users with whom to share shopping lists." +msgstr "" + +#: .\cookbook\forms.py:82 msgid "Show recently viewed recipes on search page." msgstr "" -#: .\cookbook\forms.py:59 +#: .\cookbook\forms.py:83 msgid "Number of decimals to round ingredients." msgstr "" -#: .\cookbook\forms.py:60 +#: .\cookbook\forms.py:84 msgid "If you want to be able to create and see comments underneath recipes." msgstr "" -#: .\cookbook\forms.py:62 +#: .\cookbook\forms.py:86 .\cookbook\forms.py:493 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. " @@ -68,216 +125,373 @@ msgid "" "mobile data. If lower than instance limit it is reset when saving." msgstr "" -#: .\cookbook\forms.py:65 +#: .\cookbook\forms.py:89 msgid "Makes the navbar stick to the top of the page." msgstr "" -#: .\cookbook\forms.py:81 +#: .\cookbook\forms.py:90 .\cookbook\forms.py:496 +msgid "Automatically add meal plan ingredients to shopping list." +msgstr "" + +#: .\cookbook\forms.py:91 +msgid "Exclude ingredients that are on hand." +msgstr "" + +#: .\cookbook\forms.py:108 msgid "" "Both fields are optional. If none are given the username will be displayed " "instead" msgstr "" -#: .\cookbook\forms.py:102 .\cookbook\forms.py:331 -#: .\cookbook\templates\forms\edit_internal_recipe.html:49 -#: .\cookbook\templates\url_import.html:154 +#: .\cookbook\forms.py:129 .\cookbook\forms.py:298 +#: .\cookbook\templates\url_import.html:161 msgid "Name" msgstr "" -#: .\cookbook\forms.py:103 .\cookbook\forms.py:332 -#: .\cookbook\templates\base.html:108 .\cookbook\templates\base.html:169 -#: .\cookbook\templates\forms\edit_internal_recipe.html:85 -#: .\cookbook\templates\space.html:39 .\cookbook\templates\stats.html:24 -#: .\cookbook\templates\url_import.html:188 -#: .\cookbook\templates\url_import.html:573 +#: .\cookbook\forms.py:130 .\cookbook\forms.py:299 +#: .\cookbook\templates\space.html:44 .\cookbook\templates\stats.html:24 +#: .\cookbook\templates\url_import.html:195 +#: .\cookbook\templates\url_import.html:585 .\cookbook\views\lists.py:97 msgid "Keywords" msgstr "" -#: .\cookbook\forms.py:104 +#: .\cookbook\forms.py:131 msgid "Preparation time in minutes" msgstr "" -#: .\cookbook\forms.py:105 +#: .\cookbook\forms.py:132 msgid "Waiting time (cooking/baking) in minutes" msgstr "" -#: .\cookbook\forms.py:106 .\cookbook\forms.py:333 +#: .\cookbook\forms.py:133 .\cookbook\forms.py:267 .\cookbook\forms.py:300 msgid "Path" msgstr "" -#: .\cookbook\forms.py:107 +#: .\cookbook\forms.py:134 msgid "Storage UID" msgstr "" -#: .\cookbook\forms.py:133 +#: .\cookbook\forms.py:164 msgid "Default" msgstr "" -#: .\cookbook\forms.py:144 .\cookbook\templates\url_import.html:90 +#: .\cookbook\forms.py:175 .\cookbook\templates\url_import.html:97 msgid "" "To prevent duplicates recipes with the same name as existing ones are " "ignored. Check this box to import everything." msgstr "" -#: .\cookbook\forms.py:164 -msgid "New Unit" -msgstr "" - -#: .\cookbook\forms.py:165 -msgid "New unit that other gets replaced by." -msgstr "" - -#: .\cookbook\forms.py:170 -msgid "Old Unit" -msgstr "" - -#: .\cookbook\forms.py:171 -msgid "Unit that should be replaced." -msgstr "" - -#: .\cookbook\forms.py:187 -msgid "New Food" -msgstr "" - -#: .\cookbook\forms.py:188 -msgid "New food that other gets replaced by." -msgstr "" - -#: .\cookbook\forms.py:193 -msgid "Old Food" -msgstr "" - -#: .\cookbook\forms.py:194 -msgid "Food that should be replaced." -msgstr "" - -#: .\cookbook\forms.py:212 +#: .\cookbook\forms.py:197 msgid "Add your comment: " msgstr "" -#: .\cookbook\forms.py:253 +#: .\cookbook\forms.py:212 msgid "Leave empty for dropbox and enter app password for nextcloud." msgstr "" -#: .\cookbook\forms.py:260 +#: .\cookbook\forms.py:219 msgid "Leave empty for nextcloud and enter api token for dropbox." msgstr "" -#: .\cookbook\forms.py:269 +#: .\cookbook\forms.py:228 msgid "" "Leave empty for dropbox and enter only base url for nextcloud (/remote." "php/webdav/ is added automatically)" msgstr "" -#: .\cookbook\forms.py:307 +#: .\cookbook\forms.py:266 .\cookbook\views\edit.py:166 +msgid "Storage" +msgstr "" + +#: .\cookbook\forms.py:268 +msgid "Active" +msgstr "" + +#: .\cookbook\forms.py:274 msgid "Search String" msgstr "" -#: .\cookbook\forms.py:334 +#: .\cookbook\forms.py:301 msgid "File ID" msgstr "" -#: .\cookbook\forms.py:370 +#: .\cookbook\forms.py:323 msgid "You must provide at least a recipe or a title." msgstr "" -#: .\cookbook\forms.py:383 +#: .\cookbook\forms.py:336 msgid "You can list default users to share recipes with in the settings." msgstr "" -#: .\cookbook\forms.py:384 -#: .\cookbook\templates\forms\edit_internal_recipe.html:427 +#: .\cookbook\forms.py:337 msgid "" "You can use markdown to format this field. See the docs here" msgstr "" -#: .\cookbook\forms.py:409 +#: .\cookbook\forms.py:363 msgid "Maximum number of users for this space reached." msgstr "" -#: .\cookbook\forms.py:415 +#: .\cookbook\forms.py:369 msgid "Email address already taken!" msgstr "" -#: .\cookbook\forms.py:423 +#: .\cookbook\forms.py:377 msgid "" -"An email address is not required but if present the invite link will be send " +"An email address is not required but if present the invite link will be sent " "to the user." msgstr "" -#: .\cookbook\forms.py:438 +#: .\cookbook\forms.py:392 msgid "Name already taken." msgstr "" -#: .\cookbook\forms.py:449 +#: .\cookbook\forms.py:403 msgid "Accept Terms and Privacy" msgstr "" +#: .\cookbook\forms.py:435 +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:445 +msgid "" +"Select type method of search. Click here for " +"full desciption of choices." +msgstr "" + +#: .\cookbook\forms.py:446 +msgid "" +"Use fuzzy matching on units, keywords and ingredients when editing and " +"importing recipes." +msgstr "" + +#: .\cookbook\forms.py:448 +msgid "" +"Fields to search ignoring accents. Selecting this option can improve or " +"degrade search quality depending on language" +msgstr "" + +#: .\cookbook\forms.py:450 +msgid "" +"Fields to search for partial matches. (e.g. searching for 'Pie' will return " +"'pie' and 'piece' and 'soapie')" +msgstr "" + +#: .\cookbook\forms.py:452 +msgid "" +"Fields to search for beginning of word matches. (e.g. searching for 'sa' " +"will return 'salad' and 'sandwich')" +msgstr "" + +#: .\cookbook\forms.py:454 +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:456 +msgid "" +"Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " +"only function with fulltext fields." +msgstr "" + +#: .\cookbook\forms.py:460 +msgid "Search Method" +msgstr "" + +#: .\cookbook\forms.py:461 +msgid "Fuzzy Lookups" +msgstr "" + +#: .\cookbook\forms.py:462 +msgid "Ignore Accent" +msgstr "" + +#: .\cookbook\forms.py:463 +msgid "Partial Match" +msgstr "" + +#: .\cookbook\forms.py:464 +msgid "Starts Wtih" +msgstr "" + +#: .\cookbook\forms.py:465 +msgid "Fuzzy Search" +msgstr "" + +#: .\cookbook\forms.py:466 +msgid "Full Text" +msgstr "" + +#: .\cookbook\forms.py:491 +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:497 +msgid "" +"When adding a meal plan to the shopping list (manually or automatically), " +"include all related recipes." +msgstr "" + +#: .\cookbook\forms.py:498 +msgid "" +"When adding a meal plan to the shopping list (manually or automatically), " +"exclude ingredients that are on hand." +msgstr "" + +#: .\cookbook\forms.py:499 +msgid "Default number of hours to delay a shopping list entry." +msgstr "" + +#: .\cookbook\forms.py:500 +msgid "Filter shopping list to only include supermarket categories." +msgstr "" + +#: .\cookbook\forms.py:501 +msgid "Days of recent shopping list entries to display." +msgstr "" + +#: .\cookbook\forms.py:502 +msgid "Mark food 'On Hand' when checked off shopping list." +msgstr "" + +#: .\cookbook\forms.py:503 +msgid "Delimiter to use for CSV exports." +msgstr "" + +#: .\cookbook\forms.py:504 +msgid "Prefix to add when copying list to the clipboard." +msgstr "" + +#: .\cookbook\forms.py:508 +msgid "Share Shopping List" +msgstr "" + +#: .\cookbook\forms.py:509 +msgid "Autosync" +msgstr "" + +#: .\cookbook\forms.py:510 +msgid "Auto Add Meal Plan" +msgstr "" + +#: .\cookbook\forms.py:511 +msgid "Exclude On Hand" +msgstr "" + +#: .\cookbook\forms.py:512 +msgid "Include Related" +msgstr "" + +#: .\cookbook\forms.py:513 +msgid "Default Delay Hours" +msgstr "" + +#: .\cookbook\forms.py:514 +msgid "Filter to Supermarket" +msgstr "" + +#: .\cookbook\forms.py:515 +msgid "Recent Days" +msgstr "" + +#: .\cookbook\forms.py:516 +msgid "CSV Delimiter" +msgstr "" + +#: .\cookbook\forms.py:517 .\cookbook\templates\shopping_list.html:322 +msgid "List Prefix" +msgstr "" + +#: .\cookbook\forms.py:518 +msgid "Auto On Hand" +msgstr "" + +#: .\cookbook\forms.py:528 +msgid "Reset Food Inheritance" +msgstr "" + +#: .\cookbook\forms.py:529 +msgid "Reset all food to inherit the fields configured." +msgstr "" + +#: .\cookbook\forms.py:541 +msgid "Fields on food that should be inherited by default." +msgstr "" + +#: .\cookbook\forms.py:542 +msgid "Show recipe counts on search filters" +msgstr "" + #: .\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 "" -#: .\cookbook\helper\permission_helper.py:138 -#: .\cookbook\helper\permission_helper.py:161 .\cookbook\views\views.py:151 +#: .\cookbook\helper\permission_helper.py:136 +#: .\cookbook\helper\permission_helper.py:159 .\cookbook\views\views.py:148 msgid "You are not logged in and therefore cannot view this page!" msgstr "" -#: .\cookbook\helper\permission_helper.py:142 -#: .\cookbook\helper\permission_helper.py:148 -#: .\cookbook\helper\permission_helper.py:173 -#: .\cookbook\helper\permission_helper.py:218 -#: .\cookbook\helper\permission_helper.py:232 -#: .\cookbook\helper\permission_helper.py:243 -#: .\cookbook\helper\permission_helper.py:254 .\cookbook\views\data.py:40 -#: .\cookbook\views\views.py:162 .\cookbook\views\views.py:169 -#: .\cookbook\views\views.py:259 +#: .\cookbook\helper\permission_helper.py:140 +#: .\cookbook\helper\permission_helper.py:146 +#: .\cookbook\helper\permission_helper.py:171 +#: .\cookbook\helper\permission_helper.py:219 +#: .\cookbook\helper\permission_helper.py:233 +#: .\cookbook\helper\permission_helper.py:244 +#: .\cookbook\helper\permission_helper.py:255 .\cookbook\views\data.py:47 +#: .\cookbook\views\views.py:159 .\cookbook\views\views.py:166 +#: .\cookbook\views\views.py:232 msgid "You do not have the required permissions to view this page!" msgstr "" -#: .\cookbook\helper\permission_helper.py:166 -#: .\cookbook\helper\permission_helper.py:189 -#: .\cookbook\helper\permission_helper.py:204 +#: .\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 "" -#: .\cookbook\helper\template_helper.py:60 -#: .\cookbook\helper\template_helper.py:62 +#: .\cookbook\helper\recipe_search.py:473 +msgid "One of queryset or hash_key must be provided" +msgstr "" + +#: .\cookbook\helper\shopping_helper.py:54 +msgid "You must supply a recipe or mealplan" +msgstr "" + +#: .\cookbook\helper\shopping_helper.py:58 +msgid "You must supply a created_by" +msgstr "" + +#: .\cookbook\helper\template_helper.py:61 +#: .\cookbook\helper\template_helper.py:63 msgid "Could not parse template code." msgstr "" -#: .\cookbook\integration\integration.py:104 -#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 -#: .\cookbook\templates\import_response.html:7 -#: .\cookbook\templates\test.html:14 .\cookbook\templates\test.html:20 -#: .\cookbook\templates\url_import.html:27 -#: .\cookbook\templates\url_import.html:101 -#: .\cookbook\templates\url_import.html:123 -#: .\cookbook\templates\url_import.html:317 -#: .\cookbook\templates\url_import.html:604 .\cookbook\views\delete.py:60 -#: .\cookbook\views\edit.py:199 -msgid "Import" -msgstr "" - -#: .\cookbook\integration\integration.py:185 +#: .\cookbook\integration\integration.py:200 msgid "" "Importer expected a .zip file. Did you choose the correct importer type for " "your data ?" msgstr "" -#: .\cookbook\integration\integration.py:188 +#: .\cookbook\integration\integration.py:203 msgid "" "An unexpected error occurred during the import. Please make sure you have " "uploaded a valid file." msgstr "" -#: .\cookbook\integration\integration.py:192 +#: .\cookbook\integration\integration.py:208 msgid "The following recipes were ignored because they already existed:" msgstr "" -#: .\cookbook\integration\integration.py:196 +#: .\cookbook\integration\integration.py:212 #, python-format msgid "Imported %s recipes." msgstr "" @@ -290,37 +504,51 @@ msgstr "" msgid "Nutritional Information" msgstr "" -#: .\cookbook\integration\paprika.py:53 +#: .\cookbook\integration\paprika.py:53 .\cookbook\templates\url_import.html:42 msgid "Source" msgstr "" -#: .\cookbook\integration\safron.py:23 -#: .\cookbook\templates\forms\edit_internal_recipe.html:79 -#: .\cookbook\templates\include\log_cooking.html:16 -#: .\cookbook\templates\url_import.html:224 -#: .\cookbook\templates\url_import.html:455 +#: .\cookbook\integration\saffron.py:23 +#: .\cookbook\templates\include\log_cooking.html:18 +#: .\cookbook\templates\url_import.html:231 +#: .\cookbook\templates\url_import.html:462 msgid "Servings" msgstr "" -#: .\cookbook\integration\safron.py:25 +#: .\cookbook\integration\saffron.py:25 msgid "Waiting time" msgstr "" -#: .\cookbook\integration\safron.py:27 -#: .\cookbook\templates\forms\edit_internal_recipe.html:73 +#: .\cookbook\integration\saffron.py:27 msgid "Preparation Time" msgstr "" -#: .\cookbook\integration\safron.py:29 .\cookbook\templates\base.html:78 +#: .\cookbook\integration\saffron.py:29 .\cookbook\templates\base.html:78 #: .\cookbook\templates\forms\ingredients.html:7 #: .\cookbook\templates\index.html:7 msgid "Cookbook" msgstr "" -#: .\cookbook\integration\safron.py:31 +#: .\cookbook\integration\saffron.py:31 msgid "Section" msgstr "" +#: .\cookbook\management\commands\rebuildindex.py:14 +msgid "Rebuilds full text search index on Recipe" +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:18 +msgid "Only Postgress databases use full text search, no index to rebuild" +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:29 +msgid "Recipe index rebuild complete." +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:31 +msgid "Recipe index rebuild failed." +msgstr "" + #: .\cookbook\migrations\0047_auto_20200602_1133.py:14 msgid "Breakfast" msgstr "" @@ -337,90 +565,143 @@ msgstr "" msgid "Other" msgstr "" -#: .\cookbook\models.py:72 +#: .\cookbook\models.py:246 msgid "" "Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " "upload." msgstr "" -#: .\cookbook\models.py:123 .\cookbook\templates\search.html:7 -#: .\cookbook\templates\shopping_list.html:52 +#: .\cookbook\models.py:300 .\cookbook\templates\search.html:7 +#: .\cookbook\templates\shopping_list.html:53 msgid "Search" msgstr "" -#: .\cookbook\models.py:124 .\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 +#: .\cookbook\models.py:301 .\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 "" -#: .\cookbook\models.py:125 .\cookbook\templates\base.html:89 +#: .\cookbook\models.py:302 .\cookbook\templates\base.html:90 msgid "Books" msgstr "" -#: .\cookbook\models.py:133 +#: .\cookbook\models.py:310 msgid "Small" msgstr "" -#: .\cookbook\models.py:133 +#: .\cookbook\models.py:310 msgid "Large" msgstr "" -#: .\cookbook\models.py:133 .\cookbook\templates\generic\new_template.html:6 +#: .\cookbook\models.py:310 .\cookbook\templates\generic\new_template.html:6 #: .\cookbook\templates\generic\new_template.html:14 -#: .\cookbook\templates\meal_plan.html:323 msgid "New" msgstr "" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:202 +#: .\cookbook\models.py:512 +msgid " is part of a recipe step and cannot be deleted" +msgstr "" + +#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:44 msgid "Text" msgstr "" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:203 +#: .\cookbook\models.py:586 msgid "Time" msgstr "" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:204 -#: .\cookbook\templates\forms\edit_internal_recipe.html:219 +#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:46 msgid "File" msgstr "" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:205 -#: .\cookbook\templates\forms\edit_internal_recipe.html:241 +#: .\cookbook\models.py:586 #: .\cookbook\templates\include\recipe_open_modal.html:7 -#: .\cookbook\templates\meal_plan.html:247 .\cookbook\views\delete.py:28 -#: .\cookbook\views\edit.py:273 .\cookbook\views\new.py:52 +#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260 +#: .\cookbook\views\new.py:53 msgid "Recipe" msgstr "" -#: .\cookbook\serializer.py:109 +#: .\cookbook\models.py:1041 .\cookbook\templates\search_info.html:28 +msgid "Simple" +msgstr "" + +#: .\cookbook\models.py:1042 .\cookbook\templates\search_info.html:33 +msgid "Phrase" +msgstr "" + +#: .\cookbook\models.py:1043 .\cookbook\templates\search_info.html:38 +msgid "Web" +msgstr "" + +#: .\cookbook\models.py:1044 .\cookbook\templates\search_info.html:47 +msgid "Raw" +msgstr "" + +#: .\cookbook\models.py:1082 +msgid "Food Alias" +msgstr "" + +#: .\cookbook\models.py:1082 +msgid "Unit Alias" +msgstr "" + +#: .\cookbook\models.py:1082 +msgid "Keyword Alias" +msgstr "" + +#: .\cookbook\serializer.py:175 +msgid "A user is required" +msgstr "" + +#: .\cookbook\serializer.py:195 msgid "File uploads are not enabled for this Space." msgstr "" -#: .\cookbook\serializer.py:117 +#: .\cookbook\serializer.py:206 msgid "You have reached your file upload limit." msgstr "" -#: .\cookbook\tables.py:35 .\cookbook\templates\books.html:36 -#: .\cookbook\templates\generic\edit_template.html:6 +#: .\cookbook\serializer.py:962 +msgid "Existing shopping list to update" +msgstr "" + +#: .\cookbook\serializer.py:964 +msgid "" +"List of ingredient IDs from the recipe to add, if not provided all " +"ingredients will be added." +msgstr "" + +#: .\cookbook\serializer.py:965 +msgid "" +"Providing a list_recipe ID and servings of 0 will delete that shopping list." +msgstr "" + +#: .\cookbook\serializer.py:973 +msgid "Amount of food to add to the shopping list" +msgstr "" + +#: .\cookbook\serializer.py:974 +msgid "ID of unit to use for the shopping list" +msgstr "" + +#: .\cookbook\serializer.py:975 +msgid "When set to true will delete all food from active shopping lists." +msgstr "" + +#: .\cookbook\tables.py:35 .\cookbook\templates\generic\edit_template.html:6 #: .\cookbook\templates\generic\edit_template.html:14 -#: .\cookbook\templates\meal_plan.html:281 #: .\cookbook\templates\recipes_table.html:82 -#: .\cookbook\templates\shopping_list.html:33 -#: .\cookbook\templates\space.html:90 +#: .\cookbook\templates\shopping_list.html:37 +#: .\cookbook\templates\space.html:109 msgid "Edit" msgstr "" -#: .\cookbook\tables.py:124 .\cookbook\tables.py:147 -#: .\cookbook\templates\books.html:38 -#: .\cookbook\templates\generic\delete_template.html:5 -#: .\cookbook\templates\generic\delete_template.html:13 -#: .\cookbook\templates\generic\edit_template.html:27 -#: .\cookbook\templates\meal_plan.html:277 +#: .\cookbook\tables.py:115 .\cookbook\tables.py:138 +#: .\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 "" @@ -449,7 +730,7 @@ 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:154 .\cookbook\templates\settings.html:6 +#: .\cookbook\templates\base.html:257 .\cookbook\templates\settings.html:6 #: .\cookbook\templates\settings.html:17 #: .\cookbook\templates\socialaccount\connections.html:10 msgid "Settings" @@ -484,6 +765,7 @@ msgid "Re-send Verification" msgstr "" #: .\cookbook\templates\account\email.html:50 +#: .\cookbook\templates\generic\delete_template.html:56 #: .\cookbook\templates\socialaccount\connections.html:44 msgid "Remove" msgstr "" @@ -525,7 +807,7 @@ msgid "" msgstr "" #: .\cookbook\templates\account\email_confirm.html:22 -#: .\cookbook\templates\generic\delete_template.html:21 +#: .\cookbook\templates\generic\delete_template.html:71 msgid "Confirm" msgstr "" @@ -537,7 +819,7 @@ msgid "" "request." msgstr "" -#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:189 +#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:289 msgid "Login" msgstr "" @@ -548,27 +830,27 @@ msgstr "" msgid "Sign In" msgstr "" -#: .\cookbook\templates\account\login.html:32 +#: .\cookbook\templates\account\login.html:34 #: .\cookbook\templates\socialaccount\signup.html:8 #: .\cookbook\templates\socialaccount\signup.html:57 msgid "Sign Up" msgstr "" -#: .\cookbook\templates\account\login.html:36 -#: .\cookbook\templates\account\login.html:37 +#: .\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:37 +#: .\cookbook\templates\account\login.html:40 msgid "Lost your password?" msgstr "" -#: .\cookbook\templates\account\login.html:48 +#: .\cookbook\templates\account\login.html:52 msgid "Social Login" msgstr "" -#: .\cookbook\templates\account\login.html:49 +#: .\cookbook\templates\account\login.html:53 msgid "You can use any of the following providers to sign in." msgstr "" @@ -585,12 +867,16 @@ msgstr "" #: .\cookbook\templates\account\password_change.html:6 #: .\cookbook\templates\account\password_change.html:16 #: .\cookbook\templates\account\password_change.html:21 +#: .\cookbook\templates\account\password_reset_from_key.html:7 +#: .\cookbook\templates\account\password_reset_from_key.html:13 +#: .\cookbook\templates\account\password_reset_from_key_done.html:7 +#: .\cookbook\templates\account\password_reset_from_key_done.html:13 msgid "Change Password" msgstr "" #: .\cookbook\templates\account\password_change.html:12 #: .\cookbook\templates\account\password_set.html:12 -#: .\cookbook\templates\settings.html:52 +#: .\cookbook\templates\settings.html:76 msgid "Password" msgstr "" @@ -621,6 +907,28 @@ msgid "" "within a few minutes." msgstr "" +#: .\cookbook\templates\account\password_reset_from_key.html:13 +msgid "Bad Token" +msgstr "" + +#: .\cookbook\templates\account\password_reset_from_key.html:25 +#, python-format +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used.\n" +" Please request a new " +"password reset." +msgstr "" + +#: .\cookbook\templates\account\password_reset_from_key.html:33 +msgid "change password" +msgstr "" + +#: .\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 "" + #: .\cookbook\templates\account\password_set.html:6 #: .\cookbook\templates\account\password_set.html:16 #: .\cookbook\templates\account\password_set.html:21 @@ -672,98 +980,110 @@ msgstr "" msgid "We are sorry, but the sign up is currently closed." msgstr "" -#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:179 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:279 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "" -#: .\cookbook\templates\base.html:85 -msgid "Utensils" -msgstr "" - -#: .\cookbook\templates\base.html:95 +#: .\cookbook\templates\base.html:86 msgid "Shopping" msgstr "" -#: .\cookbook\templates\base.html:101 -#: .\cookbook\templates\shopping_list.html:230 +#: .\cookbook\templates\base.html:113 +msgid "Keyword" +msgstr "" + +#: .\cookbook\templates\base.html:125 .\cookbook\views\lists.py:114 +msgid "Foods" +msgstr "" + +#: .\cookbook\templates\base.html:137 +#: .\cookbook\templates\forms\ingredients.html:24 +#: .\cookbook\templates\space.html:47 .\cookbook\templates\stats.html:26 +#: .\cookbook\views\lists.py:131 +msgid "Units" +msgstr "" + +#: .\cookbook\templates\base.html:151 +#: .\cookbook\templates\shopping_list.html:208 #: .\cookbook\templates\supermarket.html:7 msgid "Supermarket" msgstr "" -#: .\cookbook\templates\base.html:112 .\cookbook\views\delete.py:84 -#: .\cookbook\views\edit.py:102 .\cookbook\views\lists.py:26 -#: .\cookbook\views\new.py:78 -msgid "Keyword" +#: .\cookbook\templates\base.html:163 +msgid "Supermarket Category" msgstr "" -#: .\cookbook\templates\base.html:114 +#: .\cookbook\templates\base.html:175 .\cookbook\views\lists.py:180 +msgid "Automations" +msgstr "" + +#: .\cookbook\templates\base.html:189 .\cookbook\views\lists.py:200 +msgid "Files" +msgstr "" + +#: .\cookbook\templates\base.html:201 msgid "Batch Edit" msgstr "" -#: .\cookbook\templates\base.html:119 -msgid "Storage Data" -msgstr "" - -#: .\cookbook\templates\base.html:123 -msgid "Storage Backends" -msgstr "" - -#: .\cookbook\templates\base.html:125 -msgid "Configure Sync" -msgstr "" - -#: .\cookbook\templates\base.html:127 -msgid "Discovered Recipes" -msgstr "" - -#: .\cookbook\templates\base.html:129 -msgid "Discovery Log" -msgstr "" - -#: .\cookbook\templates\base.html:131 .\cookbook\templates\stats.html:10 -msgid "Statistics" -msgstr "" - -#: .\cookbook\templates\base.html:133 -msgid "Units & Ingredients" -msgstr "" - -#: .\cookbook\templates\base.html:135 .\cookbook\templates\index.html:47 -msgid "Import Recipe" -msgstr "" - -#: .\cookbook\templates\base.html:156 .\cookbook\templates\history.html:6 +#: .\cookbook\templates\base.html:213 .\cookbook\templates\history.html:6 #: .\cookbook\templates\history.html:14 msgid "History" msgstr "" -#: .\cookbook\templates\base.html:159 .\cookbook\templates\space.html:7 -#: .\cookbook\templates\space.html:19 +#: .\cookbook\templates\base.html:228 .\cookbook\templates\export.html:14 +#: .\cookbook\templates\export.html:20 +#: .\cookbook\templates\shopping_list.html:310 +#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 +msgid "Export" +msgstr "" + +#: .\cookbook\templates\base.html:244 .\cookbook\templates\index.html:47 +msgid "Import Recipe" +msgstr "" + +#: .\cookbook\templates\base.html:246 +#: .\cookbook\templates\shopping_list.html:165 +#: .\cookbook\templates\shopping_list.html:188 +msgid "Create" +msgstr "" + +#: .\cookbook\templates\base.html:259 +#: .\cookbook\templates\generic\list_template.html:14 +#: .\cookbook\templates\space.html:69 .\cookbook\templates\stats.html:43 +msgid "External Recipes" +msgstr "" + +#: .\cookbook\templates\base.html:262 .\cookbook\templates\space.html:8 +#: .\cookbook\templates\space.html:20 .\cookbook\templates\space.html:150 msgid "Space Settings" msgstr "" -#: .\cookbook\templates\base.html:163 .\cookbook\templates\system.html:13 +#: .\cookbook\templates\base.html:267 .\cookbook\templates\system.html:13 msgid "System" msgstr "" -#: .\cookbook\templates\base.html:165 .\cookbook\templates\base.html:171 +#: .\cookbook\templates\base.html:269 msgid "Admin" msgstr "" -#: .\cookbook\templates\base.html:175 +#: .\cookbook\templates\base.html:273 msgid "Markdown Guide" msgstr "" -#: .\cookbook\templates\base.html:177 +#: .\cookbook\templates\base.html:275 msgid "GitHub" msgstr "" -#: .\cookbook\templates\base.html:181 +#: .\cookbook\templates\base.html:277 +msgid "Translate Tandoor" +msgstr "" + +#: .\cookbook\templates\base.html:281 msgid "API Browser" msgstr "" -#: .\cookbook\templates\base.html:184 +#: .\cookbook\templates\base.html:284 msgid "Log out" msgstr "" @@ -779,7 +1099,7 @@ msgstr "" msgid "Add the specified keywords to all recipes containing a word" msgstr "" -#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:85 +#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:82 msgid "Sync" msgstr "" @@ -797,10 +1117,36 @@ msgstr "" msgid "The path must be in the following format" msgstr "" -#: .\cookbook\templates\batch\monitor.html:27 +#: .\cookbook\templates\batch\monitor.html:20 +#: .\cookbook\templates\forms\edit_import_recipe.html:14 +#: .\cookbook\templates\generic\edit_template.html:23 +#: .\cookbook\templates\generic\new_template.html:23 +#: .\cookbook\templates\include\log_cooking.html:30 +#: .\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\shopping_list.html:311 +#: .\cookbook\templates\space.html:155 +msgid "Save" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:21 +msgid "Manage External Storage" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:28 msgid "Sync Now!" msgstr "" +#: .\cookbook\templates\batch\monitor.html:29 +msgid "Show Recipes" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:30 +msgid "Show Log" +msgstr "" + #: .\cookbook\templates\batch\waiting.html:4 #: .\cookbook\templates\batch\waiting.html:10 msgid "Importing Recipes" @@ -812,257 +1158,23 @@ msgid "" "please wait." msgstr "" -#: .\cookbook\templates\books.html:5 .\cookbook\templates\books.html:11 +#: .\cookbook\templates\books.html:7 msgid "Recipe Books" msgstr "" -#: .\cookbook\templates\books.html:15 -msgid "New Book" -msgstr "" - -#: .\cookbook\templates\books.html:27 .\cookbook\templates\recipe_view.html:26 -msgid "by" -msgstr "" - -#: .\cookbook\templates\books.html:34 -msgid "Toggle Recipes" -msgstr "" - -#: .\cookbook\templates\books.html:54 -#: .\cookbook\templates\meal_plan_entry.html:48 -#: .\cookbook\templates\recipes_table.html:64 -msgid "Last cooked" -msgstr "" - -#: .\cookbook\templates\books.html:71 -msgid "There are no recipes in this book yet." -msgstr "" - #: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6 msgid "Export Recipes" msgstr "" -#: .\cookbook\templates\export.html:14 .\cookbook\templates\export.html:20 -#: .\cookbook\templates\shopping_list.html:351 -#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 -msgid "Export" -msgstr "" - -#: .\cookbook\templates\files.html:7 -msgid "Files" -msgstr "" - #: .\cookbook\templates\forms\edit_import_recipe.html:5 #: .\cookbook\templates\forms\edit_import_recipe.html:9 msgid "Import new Recipe" msgstr "" -#: .\cookbook\templates\forms\edit_import_recipe.html:14 -#: .\cookbook\templates\forms\edit_internal_recipe.html:439 -#: .\cookbook\templates\forms\edit_internal_recipe.html:471 -#: .\cookbook\templates\generic\edit_template.html:23 -#: .\cookbook\templates\generic\new_template.html:23 -#: .\cookbook\templates\include\log_cooking.html:28 -#: .\cookbook\templates\meal_plan.html:325 -#: .\cookbook\templates\settings.html:46 .\cookbook\templates\settings.html:87 -#: .\cookbook\templates\settings.html:105 -#: .\cookbook\templates\shopping_list.html:353 -msgid "Save" -msgstr "" - #: .\cookbook\templates\forms\edit_internal_recipe.html:7 -#: .\cookbook\templates\forms\edit_internal_recipe.html:34 msgid "Edit Recipe" msgstr "" -#: .\cookbook\templates\forms\edit_internal_recipe.html:56 -#: .\cookbook\templates\url_import.html:171 -msgid "Description" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:76 -msgid "Waiting Time" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:82 -msgid "Servings Text" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:93 -msgid "Select Keywords" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:94 -#: .\cookbook\templates\url_import.html:583 -msgid "Add Keyword" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:112 -msgid "Nutrition" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:116 -#: .\cookbook\templates\forms\edit_internal_recipe.html:166 -msgid "Delete Step" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:120 -msgid "Calories" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:123 -msgid "Carbohydrates" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:126 -msgid "Fats" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:128 -msgid "Proteins" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:150 -#: .\cookbook\templates\forms\edit_internal_recipe.html:504 -msgid "Step" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:171 -msgid "Show as header" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:177 -msgid "Hide as header" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:182 -msgid "Move Up" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:187 -msgid "Move Down" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:196 -msgid "Step Name" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:200 -msgid "Step Type" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:213 -msgid "Step time in Minutes" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:229 -msgid "Select File" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:230 -#: .\cookbook\templates\forms\edit_internal_recipe.html:252 -#: .\cookbook\templates\forms\edit_internal_recipe.html:313 -#: .\cookbook\templates\forms\edit_internal_recipe.html:337 -#: .\cookbook\templates\shopping_list.html:189 -#: .\cookbook\templates\shopping_list.html:211 -#: .\cookbook\templates\shopping_list.html:241 -#: .\cookbook\templates\shopping_list.html:265 -#: .\cookbook\templates\url_import.html:495 -#: .\cookbook\templates\url_import.html:527 -msgid "Select" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:251 -msgid "Select Recipe" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:311 -#: .\cookbook\templates\shopping_list.html:187 -msgid "Select Unit" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:312 -#: .\cookbook\templates\forms\edit_internal_recipe.html:336 -#: .\cookbook\templates\shopping_list.html:188 -#: .\cookbook\templates\shopping_list.html:210 -msgid "Create" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:335 -#: .\cookbook\templates\shopping_list.html:209 -msgid "Select Food" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:352 -#: .\cookbook\templates\meal_plan.html:256 -#: .\cookbook\templates\url_import.html:542 -msgid "Note" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:369 -msgid "Delete Ingredient" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:375 -msgid "Make Header" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:381 -msgid "Make Ingredient" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:387 -msgid "Disable Amount" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:393 -msgid "Enable Amount" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:398 -msgid "Copy Template Reference" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:424 -#: .\cookbook\templates\url_import.html:297 -#: .\cookbook\templates\url_import.html:567 -msgid "Instructions" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:437 -#: .\cookbook\templates\forms\edit_internal_recipe.html:468 -msgid "Save & View" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:441 -#: .\cookbook\templates\forms\edit_internal_recipe.html:474 -msgid "Add Step" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:444 -#: .\cookbook\templates\forms\edit_internal_recipe.html:478 -msgid "Add Nutrition" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:446 -#: .\cookbook\templates\forms\edit_internal_recipe.html:480 -msgid "Remove Nutrition" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:448 -#: .\cookbook\templates\forms\edit_internal_recipe.html:483 -msgid "View Recipe" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:450 -#: .\cookbook\templates\forms\edit_internal_recipe.html:485 -msgid "Delete Recipe" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:491 -msgid "Steps" -msgstr "" - #: .\cookbook\templates\forms\ingredients.html:15 msgid "Edit Ingredients" msgstr "" @@ -1078,11 +1190,6 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\forms\ingredients.html:24 -#: .\cookbook\templates\space.html:41 .\cookbook\templates\stats.html:26 -msgid "Units" -msgstr "" - #: .\cookbook\templates\forms\ingredients.html:26 msgid "Are you sure that you want to merge these two units?" msgstr "" @@ -1096,29 +1203,46 @@ msgstr "" msgid "Are you sure that you want to merge these two ingredients?" msgstr "" -#: .\cookbook\templates\generic\delete_template.html:18 +#: .\cookbook\templates\generic\delete_template.html:21 #, python-format msgid "Are you sure you want to delete the %(title)s: %(object)s " msgstr "" -#: .\cookbook\templates\generic\edit_template.html:30 +#: .\cookbook\templates\generic\delete_template.html:26 +msgid "Protected" +msgstr "" + +#: .\cookbook\templates\generic\delete_template.html:41 +msgid "Cascade" +msgstr "" + +#: .\cookbook\templates\generic\delete_template.html:72 +msgid "Cancel" +msgstr "" + +#: .\cookbook\templates\generic\edit_template.html:32 msgid "View" msgstr "" -#: .\cookbook\templates\generic\edit_template.html:34 +#: .\cookbook\templates\generic\edit_template.html:36 msgid "Delete original file" msgstr "" #: .\cookbook\templates\generic\list_template.html:6 -#: .\cookbook\templates\generic\list_template.html:12 +#: .\cookbook\templates\generic\list_template.html:22 msgid "List" msgstr "" -#: .\cookbook\templates\generic\list_template.html:25 +#: .\cookbook\templates\generic\list_template.html:33 +#: .\cookbook\templates\shopping_list.html:33 +msgid "Try the new shopping list" +msgstr "" + +#: .\cookbook\templates\generic\list_template.html:45 msgid "Filter" msgstr "" -#: .\cookbook\templates\generic\list_template.html:30 +#: .\cookbook\templates\generic\list_template.html:50 msgid "Import all" msgstr "" @@ -1144,23 +1268,32 @@ msgstr "" msgid "Import Recipes" msgstr "" -#: .\cookbook\templates\include\log_cooking.html:7 +#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 +#: .\cookbook\templates\import_response.html:7 +#: .\cookbook\templates\test.html:14 .\cookbook\templates\test.html:20 +#: .\cookbook\templates\url_import.html:29 +#: .\cookbook\templates\url_import.html:108 +#: .\cookbook\templates\url_import.html:130 +#: .\cookbook\templates\url_import.html:324 +#: .\cookbook\templates\url_import.html:618 .\cookbook\views\delete.py:89 +#: .\cookbook\views\edit.py:200 +msgid "Import" +msgstr "" + +#: .\cookbook\templates\include\log_cooking.html:9 msgid "Log Recipe Cooking" msgstr "" -#: .\cookbook\templates\include\log_cooking.html:13 +#: .\cookbook\templates\include\log_cooking.html:15 msgid "All fields are optional and can be left empty." msgstr "" -#: .\cookbook\templates\include\log_cooking.html:19 +#: .\cookbook\templates\include\log_cooking.html:21 msgid "Rating" msgstr "" -#: .\cookbook\templates\include\log_cooking.html:27 +#: .\cookbook\templates\include\log_cooking.html:29 #: .\cookbook\templates\include\recipe_open_modal.html:18 -#: .\cookbook\templates\meal_plan.html:283 -#: .\cookbook\templates\meal_plan.html:327 -#: .\cookbook\templates\meal_plan.html:366 msgid "Close" msgstr "" @@ -1205,8 +1338,8 @@ msgstr "" msgid "Last viewed" msgstr "" -#: .\cookbook\templates\index.html:87 .\cookbook\templates\meal_plan.html:178 -#: .\cookbook\templates\space.html:35 .\cookbook\templates\stats.html:22 +#: .\cookbook\templates\index.html:87 .\cookbook\templates\space.html:37 +#: .\cookbook\templates\stats.html:22 msgid "Recipes" msgstr "" @@ -1349,145 +1482,22 @@ msgstr "" msgid "Cell" msgstr "" -#: .\cookbook\templates\meal_plan.html:101 -msgid "New Entry" +#: .\cookbook\templates\meal_plan_entry.html:6 +msgid "Meal Plan View" msgstr "" -#: .\cookbook\templates\meal_plan.html:113 -#: .\cookbook\templates\shopping_list.html:56 -msgid "Search Recipe" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:139 -msgid "Title" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:141 -msgid "Note (optional)" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:143 -msgid "" -"You can use markdown to format this field. See the docs here" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:147 -#: .\cookbook\templates\meal_plan.html:251 -msgid "Serving Count" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:153 -msgid "Create only note" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:168 -#: .\cookbook\templates\shopping_list.html:7 -#: .\cookbook\templates\shopping_list.html:29 -#: .\cookbook\templates\shopping_list.html:714 -msgid "Shopping List" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:172 -msgid "Shopping list currently empty" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:175 -msgid "Open Shopping List" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:189 -msgid "Plan" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:196 -msgid "Number of Days" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:206 -msgid "Weekday offset" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:209 -msgid "" -"Number of days starting from the first day of the week to offset the default " -"view." -msgstr "" - -#: .\cookbook\templates\meal_plan.html:217 -#: .\cookbook\templates\meal_plan.html:294 -msgid "Edit plan types" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:219 -msgid "Show help" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:220 -msgid "Week iCal export" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:264 #: .\cookbook\templates\meal_plan_entry.html:18 msgid "Created by" msgstr "" -#: .\cookbook\templates\meal_plan.html:270 #: .\cookbook\templates\meal_plan_entry.html:20 -#: .\cookbook\templates\shopping_list.html:254 +#: .\cookbook\templates\shopping_list.html:232 msgid "Shared with" msgstr "" -#: .\cookbook\templates\meal_plan.html:280 -msgid "Add to Shopping" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:323 -msgid "New meal type" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:338 -msgid "Meal Plan Help" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:344 -msgid "" -"\n" -"

The meal plan module allows planning of meals " -"both with recipes and notes.

\n" -"

Simply select a recipe from the list of " -"recently viewed recipes or search the one you\n" -" want and drag it to the desired plan " -"position. You can also add a note and a title and\n" -" then drag the recipe to create a plan entry " -"with a custom title and note. Creating only\n" -" Notes is possible by dragging the create " -"note box into the plan.

\n" -"

Click on a recipe in order to open the " -"detailed view. There you can also add it to the\n" -" shopping list. You can also add all recipes " -"of a day to the shopping list by\n" -" clicking the shopping cart at the top of the " -"table.

\n" -"

Since a common use case is to plan meals " -"together you can define\n" -" users you want to share your plan with in " -"the settings.\n" -"

\n" -"

You can also edit the types of meals you want " -"to plan. If you share your plan with\n" -" someone with\n" -" different meals, their meal types will " -"appear in your list as well. To prevent\n" -" duplicates (e.g. Other and Misc.)\n" -" name your meal types the same as the users " -"you share your meals with and they will be\n" -" merged.

\n" -" " -msgstr "" - -#: .\cookbook\templates\meal_plan_entry.html:6 -msgid "Meal Plan View" +#: .\cookbook\templates\meal_plan_entry.html:48 +#: .\cookbook\templates\recipes_table.html:64 +msgid "Last cooked" msgstr "" #: .\cookbook\templates\meal_plan_entry.html:50 @@ -1581,29 +1591,28 @@ msgid "" "recently viewed them. Keep in mind that data might be outdated." msgstr "" -#: .\cookbook\templates\recipe_view.html:21 .\cookbook\templates\space.html:62 -#: .\cookbook\templates\stats.html:47 -msgid "Comments" +#: .\cookbook\templates\recipe_view.html:26 +msgid "by" msgstr "" -#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:118 -#: .\cookbook\views\edit.py:179 +#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:147 +#: .\cookbook\views\edit.py:180 msgid "Comment" msgstr "" #: .\cookbook\templates\recipes_table.html:19 #: .\cookbook\templates\recipes_table.html:23 -#: .\cookbook\templates\url_import.html:440 +#: .\cookbook\templates\url_import.html:447 msgid "Recipe Image" msgstr "" #: .\cookbook\templates\recipes_table.html:51 -#: .\cookbook\templates\url_import.html:445 +#: .\cookbook\templates\url_import.html:452 msgid "Preparation time ca." msgstr "" #: .\cookbook\templates\recipes_table.html:57 -#: .\cookbook\templates\url_import.html:450 +#: .\cookbook\templates\url_import.html:457 msgid "Waiting time ca." msgstr "" @@ -1619,63 +1628,284 @@ msgstr "" msgid "Recipe Home" msgstr "" -#: .\cookbook\templates\settings.html:25 +#: .\cookbook\templates\search_info.html:5 +#: .\cookbook\templates\search_info.html:9 +#: .\cookbook\templates\settings.html:172 +msgid "Search Settings" +msgstr "" + +#: .\cookbook\templates\search_info.html:10 +msgid "" +"\n" +" Creating the best search experience is complicated and weighs " +"heavily on your personal configuration. \n" +" Changing any of the search settings can have significant impact on " +"the speed and quality of the results.\n" +" Search Methods, Trigrams and Full Text Search configurations are " +"only available if you are using Postgres for your database.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:19 +msgid "Search Methods" +msgstr "" + +#: .\cookbook\templates\search_info.html:23 +msgid "" +" \n" +" Full text searches attempt to normalize the words provided to " +"match common variants. For example: 'forked', 'forking', 'forks' will all " +"normalize to 'fork'.\n" +" There are several methods available, described below, that will " +"control how the search behavior should react when multiple words are " +"searched.\n" +" Full technical details on how these operate can be viewed on Postgresql's website.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:29 +msgid "" +" \n" +" Simple searches ignore punctuation and common words such as " +"'the', 'a', 'and'. And will treat seperate words as required.\n" +" Searching for 'apple or flour' will return any recipe that " +"includes both 'apple' and 'flour' anywhere in the fields that have been " +"selected for a full text search.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:34 +msgid "" +" \n" +" Phrase searches ignore punctuation, but will search for all of " +"the words in the exact order provided.\n" +" Searching for 'apple or flour' will only return a recipe that " +"includes the exact phrase 'apple or flour' in any of the fields that have " +"been selected for a full text search.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:39 +msgid "" +" \n" +" Web searches simulate functionality found on many web search " +"sites supporting special syntax.\n" +" Placing quotes around several words will convert those words " +"into a phrase.\n" +" 'or' is recongized as searching for the word (or phrase) " +"immediately before 'or' OR the word (or phrase) directly after.\n" +" '-' is recognized as searching for recipes that do not include " +"the word (or phrase) that comes immediately after. \n" +" For example searching for 'apple pie' or cherry -butter will " +"return any recipe that includes the phrase 'apple pie' or the word " +"'cherry' \n" +" in any field included in the full text search but exclude any " +"recipe that has the word 'butter' in any field included.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:48 +msgid "" +" \n" +" Raw search is similar to Web except will take puncuation " +"operators such as '|', '&' and '()'\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:59 +msgid "" +" \n" +" Another approach to searching that also requires Postgresql is " +"fuzzy search or trigram similarity. A trigram is a group of three " +"consecutive characters.\n" +" For example searching for 'apple' will create x trigrams 'app', " +"'ppl', 'ple' and will create a score of how closely words match the " +"generated trigrams.\n" +" One benefit of searching trigams is that a search for 'sandwich' " +"will find mispelled words such as 'sandwhich' that would be missed by other " +"methods.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:69 +msgid "Search Fields" +msgstr "" + +#: .\cookbook\templates\search_info.html:73 +msgid "" +" \n" +" Unaccent is a special case in that it enables searching a field " +"'unaccented' for each search style attempting to ignore accented values. \n" +" For example when you enable unaccent for 'Name' any search " +"(starts with, contains, trigram) will attempt the search ignoring accented " +"characters.\n" +" \n" +" For the other options, you can enable search on any or all " +"fields and they will be combined together with an assumed 'OR'.\n" +" For example enabling 'Name' for Starts With, 'Name' and " +"'Description' for Partial Match and 'Ingredients' and 'Keywords' for Full " +"Search\n" +" and searching for 'apple' will generate a search that will " +"return recipes that have:\n" +" - A recipe name that starts with 'apple'\n" +" - OR a recipe name that contains 'apple'\n" +" - OR a recipe description that contains 'apple'\n" +" - OR a recipe that will have a full text search match ('apple' " +"or 'apples') in ingredients\n" +" - OR a recipe that will have a full text search match in " +"Keywords\n" +"\n" +" Combining too many fields in too many types of search can have a " +"negative impact on performance, create duplicate results or return " +"unexpected results.\n" +" For example, enabling fuzzy search or partial matches will " +"interfere with web search methods. \n" +" Searching for 'apple -pie' with fuzzy search and full text " +"search will return the recipe Apple Pie. Though it is not included in the " +"full text results, it does match the trigram results.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:95 +msgid "Search Index" +msgstr "" + +#: .\cookbook\templates\search_info.html:99 +msgid "" +" \n" +" Trigram search and Full Text Search both rely on database " +"indexes to perform effectively. \n" +" You can rebuild the indexes on all fields in the Admin page for " +"Recipes and selecting all recipes and running 'rebuild index for selected " +"recipes'\n" +" You can also rebuild indexes at the command line by executing " +"the management command 'python manage.py rebuildindex'\n" +" " +msgstr "" + +#: .\cookbook\templates\settings.html:28 msgid "Account" msgstr "" -#: .\cookbook\templates\settings.html:29 +#: .\cookbook\templates\settings.html:35 msgid "Preferences" msgstr "" -#: .\cookbook\templates\settings.html:33 +#: .\cookbook\templates\settings.html:42 msgid "API-Settings" msgstr "" -#: .\cookbook\templates\settings.html:41 +#: .\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:49 +#: .\cookbook\templates\settings.html:73 msgid "Account Settings" msgstr "" -#: .\cookbook\templates\settings.html:51 +#: .\cookbook\templates\settings.html:75 msgid "Emails" msgstr "" -#: .\cookbook\templates\settings.html:54 +#: .\cookbook\templates\settings.html:78 #: .\cookbook\templates\socialaccount\connections.html:11 msgid "Social" msgstr "" -#: .\cookbook\templates\settings.html:66 +#: .\cookbook\templates\settings.html:91 msgid "Language" msgstr "" -#: .\cookbook\templates\settings.html:96 +#: .\cookbook\templates\settings.html:121 msgid "Style" msgstr "" -#: .\cookbook\templates\settings.html:116 +#: .\cookbook\templates\settings.html:142 msgid "API Token" msgstr "" -#: .\cookbook\templates\settings.html:117 +#: .\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:134 +#: .\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:136 +#: .\cookbook\templates\settings.html:162 msgid "or" msgstr "" +#: .\cookbook\templates\settings.html:173 +msgid "" +"There are many options to configure the search depending on your personal " +"preferences." +msgstr "" + +#: .\cookbook\templates\settings.html:174 +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 +msgid "" +"If you do want to configure the search you can read about the different " +"options here." +msgstr "" + +#: .\cookbook\templates\settings.html:180 +msgid "Fuzzy" +msgstr "" + +#: .\cookbook\templates\settings.html:181 +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 +msgid "This is the default behavior" +msgstr "" + +#: .\cookbook\templates\settings.html:183 +#: .\cookbook\templates\settings.html:191 +msgid "Apply" +msgstr "" + +#: .\cookbook\templates\settings.html:188 +msgid "Precise" +msgstr "" + +#: .\cookbook\templates\settings.html:189 +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 +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 "" @@ -1693,50 +1923,73 @@ msgstr "" msgid "Create Superuser account" msgstr "" -#: .\cookbook\templates\shopping_list.html:79 +#: .\cookbook\templates\shopping_list.html:8 +#: .\cookbook\templates\shopping_list.html:29 +#: .\cookbook\templates\shopping_list.html:663 +msgid "Shopping List" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:55 +msgid "Search Recipe" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:72 msgid "Shopping Recipes" msgstr "" -#: .\cookbook\templates\shopping_list.html:83 +#: .\cookbook\templates\shopping_list.html:74 msgid "No recipes selected" msgstr "" -#: .\cookbook\templates\shopping_list.html:150 +#: .\cookbook\templates\shopping_list.html:131 msgid "Entry Mode" msgstr "" -#: .\cookbook\templates\shopping_list.html:158 +#: .\cookbook\templates\shopping_list.html:139 msgid "Add Entry" msgstr "" -#: .\cookbook\templates\shopping_list.html:174 +#: .\cookbook\templates\shopping_list.html:152 msgid "Amount" msgstr "" -#: .\cookbook\templates\shopping_list.html:240 +#: .\cookbook\templates\shopping_list.html:164 +msgid "Select Unit" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:166 +#: .\cookbook\templates\shopping_list.html:189 +#: .\cookbook\templates\shopping_list.html:219 +#: .\cookbook\templates\shopping_list.html:243 +#: .\cookbook\templates\url_import.html:505 +#: .\cookbook\templates\url_import.html:537 +msgid "Select" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:187 +msgid "Select Food" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:218 msgid "Select Supermarket" msgstr "" -#: .\cookbook\templates\shopping_list.html:264 +#: .\cookbook\templates\shopping_list.html:242 msgid "Select User" msgstr "" -#: .\cookbook\templates\shopping_list.html:283 +#: .\cookbook\templates\shopping_list.html:258 msgid "Finished" msgstr "" -#: .\cookbook\templates\shopping_list.html:296 +#: .\cookbook\templates\shopping_list.html:267 msgid "You are offline, shopping list might not syncronize." msgstr "" -#: .\cookbook\templates\shopping_list.html:361 +#: .\cookbook\templates\shopping_list.html:318 msgid "Copy/Export" msgstr "" -#: .\cookbook\templates\shopping_list.html:365 -msgid "List Prefix" -msgstr "" - #: .\cookbook\templates\socialaccount\connections.html:4 #: .\cookbook\templates\socialaccount\connections.html:15 msgid "Account Connections" @@ -1786,84 +2039,80 @@ msgstr "" msgid "Sign in using" msgstr "" -#: .\cookbook\templates\space.html:23 +#: .\cookbook\templates\space.html:25 msgid "Space:" msgstr "" -#: .\cookbook\templates\space.html:24 +#: .\cookbook\templates\space.html:26 msgid "Manage Subscription" msgstr "" -#: .\cookbook\templates\space.html:32 .\cookbook\templates\stats.html:19 +#: .\cookbook\templates\space.html:34 .\cookbook\templates\stats.html:19 msgid "Number of objects" msgstr "" -#: .\cookbook\templates\space.html:45 .\cookbook\templates\stats.html:30 +#: .\cookbook\templates\space.html:54 .\cookbook\templates\stats.html:30 msgid "Recipe Imports" msgstr "" -#: .\cookbook\templates\space.html:53 .\cookbook\templates\stats.html:38 +#: .\cookbook\templates\space.html:62 .\cookbook\templates\stats.html:38 msgid "Objects stats" msgstr "" -#: .\cookbook\templates\space.html:56 .\cookbook\templates\stats.html:41 +#: .\cookbook\templates\space.html:65 .\cookbook\templates\stats.html:41 msgid "Recipes without Keywords" msgstr "" -#: .\cookbook\templates\space.html:58 .\cookbook\templates\stats.html:43 -msgid "External Recipes" -msgstr "" - -#: .\cookbook\templates\space.html:60 .\cookbook\templates\stats.html:45 +#: .\cookbook\templates\space.html:73 .\cookbook\templates\stats.html:45 msgid "Internal Recipes" msgstr "" -#: .\cookbook\templates\space.html:73 +#: .\cookbook\templates\space.html:89 msgid "Members" msgstr "" -#: .\cookbook\templates\space.html:77 +#: .\cookbook\templates\space.html:95 msgid "Invite User" msgstr "" -#: .\cookbook\templates\space.html:88 +#: .\cookbook\templates\space.html:107 msgid "User" msgstr "" -#: .\cookbook\templates\space.html:89 +#: .\cookbook\templates\space.html:108 msgid "Groups" msgstr "" -#: .\cookbook\templates\space.html:105 +#: .\cookbook\templates\space.html:119 msgid "admin" msgstr "" -#: .\cookbook\templates\space.html:106 +#: .\cookbook\templates\space.html:120 msgid "user" msgstr "" -#: .\cookbook\templates\space.html:107 +#: .\cookbook\templates\space.html:121 msgid "guest" msgstr "" -#: .\cookbook\templates\space.html:108 +#: .\cookbook\templates\space.html:122 msgid "remove" msgstr "" -#: .\cookbook\templates\space.html:112 +#: .\cookbook\templates\space.html:126 msgid "Update" msgstr "" -#: .\cookbook\templates\space.html:116 +#: .\cookbook\templates\space.html:130 msgid "You cannot edit yourself." msgstr "" -#: .\cookbook\templates\space.html:123 +#: .\cookbook\templates\space.html:136 msgid "There are no members in your space yet!" msgstr "" -#: .\cookbook\templates\space.html:130 .\cookbook\templates\system.html:21 -#: .\cookbook\views\lists.py:115 +#: .\cookbook\templates\space.html:143 .\cookbook\templates\system.html:21 +#: .\cookbook\views\lists.py:85 msgid "Invite Links" msgstr "" @@ -1871,6 +2120,10 @@ msgstr "" msgid "Stats" msgstr "" +#: .\cookbook\templates\stats.html:10 +msgid "Statistics" +msgstr "" + #: .\cookbook\templates\system.html:22 msgid "Show Links" msgstr "" @@ -1968,141 +2221,166 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\url_import.html:6 +#: .\cookbook\templates\url_import.html:8 msgid "URL Import" msgstr "" -#: .\cookbook\templates\url_import.html:31 +#: .\cookbook\templates\url_import.html:33 msgid "Drag me to your bookmarks to import recipes from anywhere" msgstr "" -#: .\cookbook\templates\url_import.html:32 +#: .\cookbook\templates\url_import.html:34 msgid "Bookmark Me!" msgstr "" -#: .\cookbook\templates\url_import.html:61 +#: .\cookbook\templates\url_import.html:38 +msgid "URL" +msgstr "" + +#: .\cookbook\templates\url_import.html:40 +msgid "App" +msgstr "" + +#: .\cookbook\templates\url_import.html:64 msgid "Enter website URL" msgstr "" -#: .\cookbook\templates\url_import.html:97 +#: .\cookbook\templates\url_import.html:104 msgid "Select recipe files to import or drop them here..." msgstr "" -#: .\cookbook\templates\url_import.html:118 +#: .\cookbook\templates\url_import.html:125 msgid "Paste json or html source here to load recipe." msgstr "" -#: .\cookbook\templates\url_import.html:146 +#: .\cookbook\templates\url_import.html:153 msgid "Preview Recipe Data" msgstr "" -#: .\cookbook\templates\url_import.html:147 +#: .\cookbook\templates\url_import.html:154 msgid "Drag recipe attributes from the right into the appropriate box below." msgstr "" -#: .\cookbook\templates\url_import.html:156 -#: .\cookbook\templates\url_import.html:173 -#: .\cookbook\templates\url_import.html:190 -#: .\cookbook\templates\url_import.html:209 -#: .\cookbook\templates\url_import.html:227 -#: .\cookbook\templates\url_import.html:242 -#: .\cookbook\templates\url_import.html:257 -#: .\cookbook\templates\url_import.html:273 -#: .\cookbook\templates\url_import.html:300 -#: .\cookbook\templates\url_import.html:351 +#: .\cookbook\templates\url_import.html:163 +#: .\cookbook\templates\url_import.html:180 +#: .\cookbook\templates\url_import.html:197 +#: .\cookbook\templates\url_import.html:216 +#: .\cookbook\templates\url_import.html:234 +#: .\cookbook\templates\url_import.html:249 +#: .\cookbook\templates\url_import.html:264 +#: .\cookbook\templates\url_import.html:280 +#: .\cookbook\templates\url_import.html:307 +#: .\cookbook\templates\url_import.html:358 msgid "Clear Contents" msgstr "" -#: .\cookbook\templates\url_import.html:158 +#: .\cookbook\templates\url_import.html:165 msgid "Text dragged here will be appended to the name." msgstr "" -#: .\cookbook\templates\url_import.html:175 +#: .\cookbook\templates\url_import.html:178 +msgid "Description" +msgstr "" + +#: .\cookbook\templates\url_import.html:182 msgid "Text dragged here will be appended to the description." msgstr "" -#: .\cookbook\templates\url_import.html:192 +#: .\cookbook\templates\url_import.html:199 msgid "Keywords dragged here will be appended to current list" msgstr "" -#: .\cookbook\templates\url_import.html:207 +#: .\cookbook\templates\url_import.html:214 msgid "Image" msgstr "" -#: .\cookbook\templates\url_import.html:239 +#: .\cookbook\templates\url_import.html:246 msgid "Prep Time" msgstr "" -#: .\cookbook\templates\url_import.html:254 +#: .\cookbook\templates\url_import.html:261 msgid "Cook Time" msgstr "" -#: .\cookbook\templates\url_import.html:275 +#: .\cookbook\templates\url_import.html:282 msgid "Ingredients dragged here will be appended to current list." msgstr "" -#: .\cookbook\templates\url_import.html:302 +#: .\cookbook\templates\url_import.html:304 +#: .\cookbook\templates\url_import.html:579 +msgid "Instructions" +msgstr "" + +#: .\cookbook\templates\url_import.html:309 msgid "" "Recipe instructions dragged here will be appended to current instructions." msgstr "" -#: .\cookbook\templates\url_import.html:325 +#: .\cookbook\templates\url_import.html:332 msgid "Discovered Attributes" msgstr "" -#: .\cookbook\templates\url_import.html:327 +#: .\cookbook\templates\url_import.html:334 msgid "" "Drag recipe attributes from below into the appropriate box on the left. " "Click any node to display its full properties." msgstr "" -#: .\cookbook\templates\url_import.html:344 +#: .\cookbook\templates\url_import.html:351 msgid "Show Blank Field" msgstr "" -#: .\cookbook\templates\url_import.html:349 +#: .\cookbook\templates\url_import.html:356 msgid "Blank Field" msgstr "" -#: .\cookbook\templates\url_import.html:353 +#: .\cookbook\templates\url_import.html:360 msgid "Items dragged to Blank Field will be appended." msgstr "" -#: .\cookbook\templates\url_import.html:400 +#: .\cookbook\templates\url_import.html:407 msgid "Delete Text" msgstr "" -#: .\cookbook\templates\url_import.html:413 +#: .\cookbook\templates\url_import.html:420 msgid "Delete image" msgstr "" -#: .\cookbook\templates\url_import.html:429 +#: .\cookbook\templates\url_import.html:436 msgid "Recipe Name" msgstr "" -#: .\cookbook\templates\url_import.html:433 +#: .\cookbook\templates\url_import.html:440 msgid "Recipe Description" msgstr "" -#: .\cookbook\templates\url_import.html:494 -#: .\cookbook\templates\url_import.html:526 -#: .\cookbook\templates\url_import.html:582 +#: .\cookbook\templates\url_import.html:504 +#: .\cookbook\templates\url_import.html:536 +#: .\cookbook\templates\url_import.html:596 msgid "Select one" msgstr "" -#: .\cookbook\templates\url_import.html:596 +#: .\cookbook\templates\url_import.html:554 +msgid "Note" +msgstr "" + +#: .\cookbook\templates\url_import.html:597 +msgid "Add Keyword" +msgstr "" + +#: .\cookbook\templates\url_import.html:610 msgid "All Keywords" msgstr "" -#: .\cookbook\templates\url_import.html:599 +#: .\cookbook\templates\url_import.html:613 msgid "Import all keywords, not only the ones already existing." msgstr "" -#: .\cookbook\templates\url_import.html:626 +#: .\cookbook\templates\url_import.html:640 msgid "Information" msgstr "" -#: .\cookbook\templates\url_import.html:628 +#: .\cookbook\templates\url_import.html:642 msgid "" " Only websites containing ld+json or microdata information can currently\n" " be imported. Most big recipe pages " @@ -2113,274 +2391,439 @@ msgid "" " github issues." msgstr "" -#: .\cookbook\templates\url_import.html:636 +#: .\cookbook\templates\url_import.html:650 msgid "Google ld+json Info" msgstr "" -#: .\cookbook\templates\url_import.html:639 +#: .\cookbook\templates\url_import.html:653 msgid "GitHub Issues" msgstr "" -#: .\cookbook\templates\url_import.html:641 +#: .\cookbook\templates\url_import.html:655 msgid "Recipe Markup Specification" msgstr "" -#: .\cookbook\views\api.py:79 +#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:170 msgid "Parameter updated_at incorrectly formatted" msgstr "" -#: .\cookbook\views\api.py:580 .\cookbook\views\views.py:303 -msgid "This feature is not available in the demo version!" +#: .\cookbook\views\api.py:190 .\cookbook\views\api.py:291 +#, python-brace-format +msgid "No {self.basename} with id {pk} exists" msgstr "" -#: .\cookbook\views\api.py:603 +#: .\cookbook\views\api.py:194 +msgid "Cannot merge with the same object!" +msgstr "" + +#: .\cookbook\views\api.py:201 +#, python-brace-format +msgid "No {self.basename} with id {target} exists" +msgstr "" + +#: .\cookbook\views\api.py:206 +msgid "Cannot merge with child object!" +msgstr "" + +#: .\cookbook\views\api.py:239 +#, python-brace-format +msgid "{source.name} was merged successfully with {target.name}" +msgstr "" + +#: .\cookbook\views\api.py:244 +#, python-brace-format +msgid "An error occurred attempting to merge {source.name} with {target.name}" +msgstr "" + +#: .\cookbook\views\api.py:300 +#, python-brace-format +msgid "{child.name} was moved successfully to the root." +msgstr "" + +#: .\cookbook\views\api.py:303 .\cookbook\views\api.py:321 +msgid "An error occurred attempting to move " +msgstr "" + +#: .\cookbook\views\api.py:306 +msgid "Cannot move an object to itself!" +msgstr "" + +#: .\cookbook\views\api.py:312 +#, python-brace-format +msgid "No {self.basename} with id {parent} exists" +msgstr "" + +#: .\cookbook\views\api.py:318 +#, python-brace-format +msgid "{child.name} was moved successfully to parent {parent.name}" +msgstr "" + +#: .\cookbook\views\api.py:470 +#, python-brace-format +msgid "{obj.name} was removed from the shopping list." +msgstr "" + +#: .\cookbook\views\api.py:475 .\cookbook\views\api.py:726 +#, python-brace-format +msgid "{obj.name} was added to the shopping list." +msgstr "" + +#: .\cookbook\views\api.py:587 +msgid "ID of recipe a step is part of. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:588 +msgid "Query string matched (fuzzy) against object name." +msgstr "" + +#: .\cookbook\views\api.py:631 +msgid "" +"Query string matched (fuzzy) against recipe name. In the future also " +"fulltext search." +msgstr "" + +#: .\cookbook\views\api.py:632 +msgid "ID of keyword a recipe should have. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:633 +msgid "ID of food a recipe should have. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:634 +msgid "ID of unit a recipe should have." +msgstr "" + +#: .\cookbook\views\api.py:635 +msgid "Rating a recipe should have. [0 - 5]" +msgstr "" + +#: .\cookbook\views\api.py:636 +msgid "ID of book a recipe should be in. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:637 +msgid "" +"If recipe should have all (AND=false) or any (OR=true) of the " +"provided keywords." +msgstr "" + +#: .\cookbook\views\api.py:638 +msgid "" +"If recipe should have all (AND=false) or any (OR=true) of the " +"provided foods." +msgstr "" + +#: .\cookbook\views\api.py:639 +msgid "" +"If recipe should be in all (AND=false) or any (OR=true) of the " +"provided books." +msgstr "" + +#: .\cookbook\views\api.py:640 +msgid "If only internal recipes should be returned. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:641 +msgid "Returns the results in randomized order. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:642 +msgid "Returns new results first in search results. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:768 +msgid "" +"Returns the shopping list entry with a primary key of id. Multiple values " +"allowed." +msgstr "" + +#: .\cookbook\views\api.py:771 +msgid "" +"Filter shopping list entries on checked. [true, false, both, recent]
- recent includes unchecked items and recently completed items." +msgstr "" + +#: .\cookbook\views\api.py:773 +msgid "Returns the shopping list entries sorted by supermarket category order." +msgstr "" + +#: .\cookbook\views\api.py:922 .\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 "" + +#: .\cookbook\views\api.py:944 msgid "Sync successful!" msgstr "" -#: .\cookbook\views\api.py:608 +#: .\cookbook\views\api.py:949 msgid "Error synchronizing with Storage" msgstr "" -#: .\cookbook\views\api.py:686 +#: .\cookbook\views\api.py:1028 msgid "Nothing to do." msgstr "" -#: .\cookbook\views\api.py:701 +#: .\cookbook\views\api.py:1043 msgid "The requested site provided malformed data and cannot be read." msgstr "" -#: .\cookbook\views\api.py:708 +#: .\cookbook\views\api.py:1050 msgid "The requested page could not be found." msgstr "" -#: .\cookbook\views\api.py:717 +#: .\cookbook\views\api.py:1068 msgid "" "The requested site does not provide any recognized data format to import the " "recipe from." msgstr "" -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:1082 +msgid "Connection Refused." +msgstr "" + +#: .\cookbook\views\api.py:1091 msgid "No useable data could be found." msgstr "" -#: .\cookbook\views\api.py:747 +#: .\cookbook\views\api.py:1107 msgid "I couldn't find anything to do." msgstr "" -#: .\cookbook\views\data.py:31 .\cookbook\views\data.py:122 -#: .\cookbook\views\edit.py:50 .\cookbook\views\import_export.py:67 -#: .\cookbook\views\new.py:32 +#: .\cookbook\views\data.py:34 .\cookbook\views\data.py:129 +#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:80 +#: .\cookbook\views\new.py:33 msgid "You have reached the maximum number of recipes for your space." msgstr "" -#: .\cookbook\views\data.py:35 .\cookbook\views\data.py:126 -#: .\cookbook\views\edit.py:54 .\cookbook\views\import_export.py:71 -#: .\cookbook\views\new.py:36 +#: .\cookbook\views\data.py:38 .\cookbook\views\data.py:133 +#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:84 +#: .\cookbook\views\new.py:37 msgid "You have more users than allowed in your space." msgstr "" -#: .\cookbook\views\data.py:104 +#: .\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] "" -#: .\cookbook\views\delete.py:72 +#: .\cookbook\views\delete.py:101 msgid "Monitor" msgstr "" -#: .\cookbook\views\delete.py:96 .\cookbook\views\lists.py:102 -#: .\cookbook\views\new.py:98 +#: .\cookbook\views\delete.py:125 .\cookbook\views\lists.py:71 +#: .\cookbook\views\new.py:101 msgid "Storage Backend" msgstr "" -#: .\cookbook\views\delete.py:106 +#: .\cookbook\views\delete.py:135 msgid "" "Could not delete this storage backend as it is used in at least one monitor." msgstr "" -#: .\cookbook\views\delete.py:129 .\cookbook\views\edit.py:213 -#: .\cookbook\views\new.py:156 +#: .\cookbook\views\delete.py:158 msgid "Recipe Book" msgstr "" -#: .\cookbook\views\delete.py:141 +#: .\cookbook\views\delete.py:170 msgid "Bookmarks" msgstr "" -#: .\cookbook\views\delete.py:163 .\cookbook\views\new.py:252 +#: .\cookbook\views\delete.py:192 .\cookbook\views\new.py:238 msgid "Invite Link" msgstr "" -#: .\cookbook\views\edit.py:119 -msgid "Food" -msgstr "" - -#: .\cookbook\views\edit.py:128 +#: .\cookbook\views\edit.py:125 msgid "You cannot edit this storage!" msgstr "" -#: .\cookbook\views\edit.py:148 +#: .\cookbook\views\edit.py:149 msgid "Storage saved!" msgstr "" -#: .\cookbook\views\edit.py:154 +#: .\cookbook\views\edit.py:155 msgid "There was an error updating this storage backend!" msgstr "" -#: .\cookbook\views\edit.py:165 -msgid "Storage" -msgstr "" - -#: .\cookbook\views\edit.py:261 +#: .\cookbook\views\edit.py:248 msgid "Changes saved!" msgstr "" -#: .\cookbook\views\edit.py:265 +#: .\cookbook\views\edit.py:252 msgid "Error saving changes!" msgstr "" -#: .\cookbook\views\edit.py:299 -msgid "Units merged!" -msgstr "" - -#: .\cookbook\views\edit.py:301 .\cookbook\views\edit.py:317 -msgid "Cannot merge with the same object!" -msgstr "" - -#: .\cookbook\views\edit.py:315 -msgid "Foods merged!" -msgstr "" - -#: .\cookbook\views\import_export.py:93 +#: .\cookbook\views\import_export.py:106 msgid "Importing is not implemented for this provider" msgstr "" -#: .\cookbook\views\import_export.py:115 +#: .\cookbook\views\import_export.py:127 +msgid "" +"The PDF Exporter is not enabled on this instance as it is still in an " +"experimental state." +msgstr "" + +#: .\cookbook\views\import_export.py:132 msgid "Exporting is not implemented for this provider" msgstr "" -#: .\cookbook\views\lists.py:40 +#: .\cookbook\views\lists.py:25 msgid "Import Log" msgstr "" -#: .\cookbook\views\lists.py:53 +#: .\cookbook\views\lists.py:38 msgid "Discovery" msgstr "" -#: .\cookbook\views\lists.py:85 +#: .\cookbook\views\lists.py:54 msgid "Shopping Lists" msgstr "" -#: .\cookbook\views\new.py:123 -msgid "Imported new recipe!" +#: .\cookbook\views\lists.py:148 +msgid "Supermarkets" +msgstr "" + +#: .\cookbook\views\lists.py:164 +msgid "Shopping Categories" +msgstr "" + +#: .\cookbook\views\lists.py:217 +msgid "Steps" +msgstr "" + +#: .\cookbook\views\lists.py:232 +msgid "New Shopping List" msgstr "" #: .\cookbook\views\new.py:126 +msgid "Imported new recipe!" +msgstr "" + +#: .\cookbook\views\new.py:129 msgid "There was an error importing this recipe!" msgstr "" -#: .\cookbook\views\new.py:226 +#: .\cookbook\views\new.py:212 msgid "Hello" msgstr "" -#: .\cookbook\views\new.py:226 +#: .\cookbook\views\new.py:212 msgid "You have been invited by " msgstr "" -#: .\cookbook\views\new.py:227 +#: .\cookbook\views\new.py:213 msgid " to join their Tandoor Recipes space " msgstr "" -#: .\cookbook\views\new.py:228 +#: .\cookbook\views\new.py:214 msgid "Click the following link to activate your account: " msgstr "" -#: .\cookbook\views\new.py:229 +#: .\cookbook\views\new.py:215 msgid "" "If the link does not work use the following code to manually join the space: " msgstr "" -#: .\cookbook\views\new.py:230 +#: .\cookbook\views\new.py:216 msgid "The invitation is valid until " msgstr "" -#: .\cookbook\views\new.py:231 +#: .\cookbook\views\new.py:217 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " msgstr "" -#: .\cookbook\views\new.py:234 +#: .\cookbook\views\new.py:220 msgid "Tandoor Recipes Invite" msgstr "" -#: .\cookbook\views\new.py:241 +#: .\cookbook\views\new.py:227 msgid "Invite link successfully send to user." msgstr "" -#: .\cookbook\views\new.py:244 +#: .\cookbook\views\new.py:230 msgid "" "You have send to many emails, please share the link manually or wait a few " "hours." msgstr "" -#: .\cookbook\views\new.py:246 +#: .\cookbook\views\new.py:232 msgid "Email to user could not be send, please share link manually." msgstr "" -#: .\cookbook\views\views.py:129 +#: .\cookbook\views\views.py:126 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:177 +#: .\cookbook\views\views.py:174 msgid "You do not have the required permissions to perform this action!" msgstr "" -#: .\cookbook\views\views.py:188 +#: .\cookbook\views\views.py:185 msgid "Comment saved!" msgstr "" -#: .\cookbook\views\views.py:395 +#: .\cookbook\views\views.py:276 +msgid "This feature is not available in the demo version!" +msgstr "" + +#: .\cookbook\views\views.py:335 +msgid "You must select at least one field to search!" +msgstr "" + +#: .\cookbook\views\views.py:340 +msgid "" +"To use this search method you must select at least one full text search " +"field!" +msgstr "" + +#: .\cookbook\views\views.py:344 +msgid "Fuzzy search is not compatible with this search method!" +msgstr "" + +#: .\cookbook\views\views.py:470 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:402 +#: .\cookbook\views\views.py:477 msgid "Passwords dont match!" msgstr "" -#: .\cookbook\views\views.py:418 +#: .\cookbook\views\views.py:493 msgid "User has been created, please login!" msgstr "" -#: .\cookbook\views\views.py:434 +#: .\cookbook\views\views.py:509 msgid "Malformed Invite Link supplied!" msgstr "" -#: .\cookbook\views\views.py:441 +#: .\cookbook\views\views.py:516 msgid "You are already member of a space and therefore cannot join this one." msgstr "" -#: .\cookbook\views\views.py:452 +#: .\cookbook\views\views.py:527 msgid "Successfully joined space." msgstr "" -#: .\cookbook\views\views.py:458 +#: .\cookbook\views\views.py:533 msgid "Invite Link not valid or already used!" msgstr "" -#: .\cookbook\views\views.py:522 +#: .\cookbook\views\views.py:614 msgid "" "Reporting share links is not enabled for this instance. Please notify the " "page administrator to report problems." msgstr "" -#: .\cookbook\views\views.py:528 +#: .\cookbook\views\views.py:620 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 new file mode 100644 index 00000000..6b1797ed Binary files /dev/null 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 new file mode 100644 index 00000000..25163799 --- /dev/null +++ b/cookbook/locale/ro/LC_MESSAGES/django.po @@ -0,0 +1,2572 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +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" +"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" + +#: .\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 "" + +#: .\cookbook\forms.py:54 +msgid "Default unit" +msgstr "" + +#: .\cookbook\forms.py:55 +msgid "Use fractions" +msgstr "" + +#: .\cookbook\forms.py:56 +msgid "Use KJ" +msgstr "" + +#: .\cookbook\forms.py:57 +msgid "Theme" +msgstr "" + +#: .\cookbook\forms.py:58 +msgid "Navbar color" +msgstr "" + +#: .\cookbook\forms.py:59 +msgid "Sticky navbar" +msgstr "" + +#: .\cookbook\forms.py:60 +msgid "Default page" +msgstr "" + +#: .\cookbook\forms.py:61 +msgid "Show recent recipes" +msgstr "" + +#: .\cookbook\forms.py:62 +msgid "Search style" +msgstr "" + +#: .\cookbook\forms.py:63 +msgid "Plan sharing" +msgstr "" + +#: .\cookbook\forms.py:64 +msgid "Ingredient decimal places" +msgstr "" + +#: .\cookbook\forms.py:65 +msgid "Shopping list auto sync period" +msgstr "" + +#: .\cookbook\forms.py:66 .\cookbook\templates\recipe_view.html:21 +#: .\cookbook\templates\space.html:62 .\cookbook\templates\stats.html:47 +msgid "Comments" +msgstr "" + +#: .\cookbook\forms.py:70 +msgid "" +"Color of the top navigation bar. Not all colors work with all themes, just " +"try them out!" +msgstr "" + +#: .\cookbook\forms.py:72 +msgid "Default Unit to be used when inserting a new ingredient into a recipe." +msgstr "" + +#: .\cookbook\forms.py:74 +msgid "" +"Enables support for fractions in ingredient amounts (e.g. convert decimals " +"to fractions automatically)" +msgstr "" + +#: .\cookbook\forms.py:76 +msgid "Display nutritional energy amounts in joules instead of calories" +msgstr "" + +#: .\cookbook\forms.py:78 +msgid "" +"Users with whom newly created meal plan/shopping list entries should be " +"shared by default." +msgstr "" + +#: .\cookbook\forms.py:80 +msgid "Show recently viewed recipes on search page." +msgstr "" + +#: .\cookbook\forms.py:81 +msgid "Number of decimals to round ingredients." +msgstr "" + +#: .\cookbook\forms.py:82 +msgid "If you want to be able to create and see comments underneath recipes." +msgstr "" + +#: .\cookbook\forms.py:84 +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. " +"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 "" + +#: .\cookbook\forms.py:87 +msgid "Makes the navbar stick to the top of the page." +msgstr "" + +#: .\cookbook\forms.py:103 +msgid "" +"Both fields are optional. If none are given the username will be displayed " +"instead" +msgstr "" + +#: .\cookbook\forms.py:124 .\cookbook\forms.py:289 +#: .\cookbook\templates\url_import.html:158 +msgid "Name" +msgstr "" + +#: .\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 "" + +#: .\cookbook\forms.py:126 +msgid "Preparation time in minutes" +msgstr "" + +#: .\cookbook\forms.py:127 +msgid "Waiting time (cooking/baking) in minutes" +msgstr "" + +#: .\cookbook\forms.py:128 .\cookbook\forms.py:259 .\cookbook\forms.py:291 +msgid "Path" +msgstr "" + +#: .\cookbook\forms.py:129 +msgid "Storage UID" +msgstr "" + +#: .\cookbook\forms.py:157 +msgid "Default" +msgstr "" + +#: .\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 "" + +#: .\cookbook\forms.py:190 +msgid "Add your comment: " +msgstr "" + +#: .\cookbook\forms.py:205 +msgid "Leave empty for dropbox and enter app password for nextcloud." +msgstr "" + +#: .\cookbook\forms.py:212 +msgid "Leave empty for nextcloud and enter api token for dropbox." +msgstr "" + +#: .\cookbook\forms.py:221 +msgid "" +"Leave empty for dropbox and enter only base url for nextcloud (/remote." +"php/webdav/ is added automatically)" +msgstr "" + +#: .\cookbook\forms.py:258 .\cookbook\views\edit.py:166 +msgid "Storage" +msgstr "" + +#: .\cookbook\forms.py:260 +msgid "Active" +msgstr "" + +#: .\cookbook\forms.py:265 +msgid "Search String" +msgstr "" + +#: .\cookbook\forms.py:292 +msgid "File ID" +msgstr "" + +#: .\cookbook\forms.py:313 +msgid "You must provide at least a recipe or a title." +msgstr "" + +#: .\cookbook\forms.py:326 +msgid "You can list default users to share recipes with in the settings." +msgstr "" + +#: .\cookbook\forms.py:327 +msgid "" +"You can use markdown to format this field. See the docs here" +msgstr "" + +#: .\cookbook\forms.py:353 +msgid "Maximum number of users for this space reached." +msgstr "" + +#: .\cookbook\forms.py:359 +msgid "Email address already taken!" +msgstr "" + +#: .\cookbook\forms.py:367 +msgid "" +"An email address is not required but if present the invite link will be sent " +"to the user." +msgstr "" + +#: .\cookbook\forms.py:382 +msgid "Name already taken." +msgstr "" + +#: .\cookbook\forms.py:393 +msgid "Accept Terms and Privacy" +msgstr "" + +#: .\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 "" + +#: .\cookbook\forms.py:435 +msgid "" +"Select type method of search. Click here for " +"full desciption of choices." +msgstr "" + +#: .\cookbook\forms.py:436 +msgid "" +"Use fuzzy matching on units, keywords and ingredients when editing and " +"importing recipes." +msgstr "" + +#: .\cookbook\forms.py:438 +msgid "" +"Fields to search ignoring accents. Selecting this option can improve or " +"degrade search quality depending on language" +msgstr "" + +#: .\cookbook\forms.py:440 +msgid "" +"Fields to search for partial matches. (e.g. searching for 'Pie' will return " +"'pie' and 'piece' and 'soapie')" +msgstr "" + +#: .\cookbook\forms.py:442 +msgid "" +"Fields to search for beginning of word matches. (e.g. searching for 'sa' " +"will return 'salad' and 'sandwich')" +msgstr "" + +#: .\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 "" + +#: .\cookbook\forms.py:446 +msgid "" +"Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " +"only function with fulltext fields." +msgstr "" + +#: .\cookbook\forms.py:450 +msgid "Search Method" +msgstr "" + +#: .\cookbook\forms.py:451 +msgid "Fuzzy Lookups" +msgstr "" + +#: .\cookbook\forms.py:452 +msgid "Ignore Accent" +msgstr "" + +#: .\cookbook\forms.py:453 +msgid "Partial Match" +msgstr "" + +#: .\cookbook\forms.py:454 +msgid "Starts Wtih" +msgstr "" + +#: .\cookbook\forms.py:455 +msgid "Fuzzy Search" +msgstr "" + +#: .\cookbook\forms.py:456 +msgid "Full Text" +msgstr "" + +#: .\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 "" + +#: .\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 "" + +#: .\cookbook\helper\permission_helper.py:140 +#: .\cookbook\helper\permission_helper.py:146 +#: .\cookbook\helper\permission_helper.py:171 +#: .\cookbook\helper\permission_helper.py:216 +#: .\cookbook\helper\permission_helper.py:230 +#: .\cookbook\helper\permission_helper.py:241 +#: .\cookbook\helper\permission_helper.py:252 .\cookbook\views\data.py:47 +#: .\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 "" + +#: .\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 "" + +#: .\cookbook\helper\template_helper.py:61 +#: .\cookbook\helper\template_helper.py:63 +msgid "Could not parse template code." +msgstr "" + +#: .\cookbook\integration\integration.py:126 +#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 +#: .\cookbook\templates\import_response.html:7 +#: .\cookbook\templates\test.html:14 .\cookbook\templates\test.html:20 +#: .\cookbook\templates\url_import.html:27 +#: .\cookbook\templates\url_import.html:105 +#: .\cookbook\templates\url_import.html:127 +#: .\cookbook\templates\url_import.html:321 +#: .\cookbook\templates\url_import.html:609 .\cookbook\views\delete.py:89 +#: .\cookbook\views\edit.py:200 +msgid "Import" +msgstr "" + +#: .\cookbook\integration\integration.py:208 +msgid "" +"Importer expected a .zip file. Did you choose the correct importer type for " +"your data ?" +msgstr "" + +#: .\cookbook\integration\integration.py:211 +msgid "" +"An unexpected error occurred during the import. Please make sure you have " +"uploaded a valid file." +msgstr "" + +#: .\cookbook\integration\integration.py:216 +msgid "The following recipes were ignored because they already existed:" +msgstr "" + +#: .\cookbook\integration\integration.py:220 +#, python-format +msgid "Imported %s recipes." +msgstr "" + +#: .\cookbook\integration\paprika.py:46 +msgid "Notes" +msgstr "" + +#: .\cookbook\integration\paprika.py:49 +msgid "Nutritional Information" +msgstr "" + +#: .\cookbook\integration\paprika.py:53 .\cookbook\templates\url_import.html:40 +msgid "Source" +msgstr "" + +#: .\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 "" + +#: .\cookbook\integration\safron.py:25 +msgid "Waiting time" +msgstr "" + +#: .\cookbook\integration\safron.py:27 +msgid "Preparation Time" +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 "" + +#: .\cookbook\integration\safron.py:31 +msgid "Section" +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:14 +msgid "Rebuilds full text search index on Recipe" +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:18 +msgid "Only Postgress databases use full text search, no index to rebuild" +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:29 +msgid "Recipe index rebuild complete." +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:31 +msgid "Recipe index rebuild failed." +msgstr "" + +#: .\cookbook\migrations\0047_auto_20200602_1133.py:14 +msgid "Breakfast" +msgstr "" + +#: .\cookbook\migrations\0047_auto_20200602_1133.py:19 +msgid "Lunch" +msgstr "" + +#: .\cookbook\migrations\0047_auto_20200602_1133.py:24 +msgid "Dinner" +msgstr "" + +#: .\cookbook\migrations\0047_auto_20200602_1133.py:29 +msgid "Other" +msgstr "" + +#: .\cookbook\models.py:150 +msgid "" +"Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " +"upload." +msgstr "" + +#: .\cookbook\models.py:202 .\cookbook\templates\search.html:7 +#: .\cookbook\templates\shopping_list.html:59 +msgid "Search" +msgstr "" + +#: .\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 "" + +#: .\cookbook\models.py:204 .\cookbook\templates\base.html:90 +msgid "Books" +msgstr "" + +#: .\cookbook\models.py:212 +msgid "Small" +msgstr "" + +#: .\cookbook\models.py:212 +msgid "Large" +msgstr "" + +#: .\cookbook\models.py:212 .\cookbook\templates\generic\new_template.html:6 +#: .\cookbook\templates\generic\new_template.html:14 +msgid "New" +msgstr "" + +#: .\cookbook\models.py:396 +msgid " is part of a recipe step and cannot be deleted" +msgstr "" + +#: .\cookbook\models.py:441 .\cookbook\templates\url_import.html:42 +msgid "Text" +msgstr "" + +#: .\cookbook\models.py:441 +msgid "Time" +msgstr "" + +#: .\cookbook\models.py:441 .\cookbook\templates\url_import.html:44 +msgid "File" +msgstr "" + +#: .\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 "" + +#: .\cookbook\models.py:871 .\cookbook\templates\search_info.html:28 +msgid "Simple" +msgstr "" + +#: .\cookbook\models.py:872 .\cookbook\templates\search_info.html:33 +msgid "Phrase" +msgstr "" + +#: .\cookbook\models.py:873 .\cookbook\templates\search_info.html:38 +msgid "Web" +msgstr "" + +#: .\cookbook\models.py:874 .\cookbook\templates\search_info.html:47 +msgid "Raw" +msgstr "" + +#: .\cookbook\models.py:912 +msgid "Food Alias" +msgstr "" + +#: .\cookbook\models.py:912 +msgid "Unit Alias" +msgstr "" + +#: .\cookbook\models.py:912 +msgid "Keyword Alias" +msgstr "" + +#: .\cookbook\serializer.py:157 +msgid "File uploads are not enabled for this Space." +msgstr "" + +#: .\cookbook\serializer.py:168 +msgid "You have reached your file upload limit." +msgstr "" + +#: .\cookbook\tables.py:35 .\cookbook\templates\generic\edit_template.html:6 +#: .\cookbook\templates\generic\edit_template.html:14 +#: .\cookbook\templates\recipes_table.html:82 +#: .\cookbook\templates\shopping_list.html:40 +#: .\cookbook\templates\space.html:90 +msgid "Edit" +msgstr "" + +#: .\cookbook\tables.py:115 .\cookbook\tables.py:138 +#: .\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 "" + +#: .\cookbook\templates\404.html:5 +msgid "404 Error" +msgstr "" + +#: .\cookbook\templates\404.html:18 +msgid "The page you are looking for could not be found." +msgstr "" + +#: .\cookbook\templates\404.html:33 +msgid "Take me Home" +msgstr "" + +#: .\cookbook\templates\404.html:35 +msgid "Report a Bug" +msgstr "" + +#: .\cookbook\templates\account\email.html:6 +#: .\cookbook\templates\account\email.html:17 +msgid "E-mail Addresses" +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:257 .\cookbook\templates\settings.html:6 +#: .\cookbook\templates\settings.html:17 +#: .\cookbook\templates\socialaccount\connections.html:10 +msgid "Settings" +msgstr "" + +#: .\cookbook\templates\account\email.html:13 +msgid "Email" +msgstr "" + +#: .\cookbook\templates\account\email.html:19 +msgid "The following e-mail addresses are associated with your account:" +msgstr "" + +#: .\cookbook\templates\account\email.html:36 +msgid "Verified" +msgstr "" + +#: .\cookbook\templates\account\email.html:38 +msgid "Unverified" +msgstr "" + +#: .\cookbook\templates\account\email.html:40 +msgid "Primary" +msgstr "" + +#: .\cookbook\templates\account\email.html:47 +msgid "Make Primary" +msgstr "" + +#: .\cookbook\templates\account\email.html:49 +msgid "Re-send Verification" +msgstr "" + +#: .\cookbook\templates\account\email.html:50 +#: .\cookbook\templates\generic\delete_template.html:56 +#: .\cookbook\templates\socialaccount\connections.html:44 +msgid "Remove" +msgstr "" + +#: .\cookbook\templates\account\email.html:58 +msgid "Warning:" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\account\email.html:64 +msgid "Add E-mail Address" +msgstr "" + +#: .\cookbook\templates\account\email.html:69 +msgid "Add E-mail" +msgstr "" + +#: .\cookbook\templates\account\email.html:79 +msgid "Do you really want to remove the selected e-mail address?" +msgstr "" + +#: .\cookbook\templates\account\email_confirm.html:6 +#: .\cookbook\templates\account\email_confirm.html:10 +msgid "Confirm E-mail Address" +msgstr "" + +#: .\cookbook\templates\account\email_confirm.html:16 +#, python-format +msgid "" +"Please confirm that\n" +" %(email)s is an e-mail address " +"for user %(user_display)s\n" +" ." +msgstr "" + +#: .\cookbook\templates\account\email_confirm.html:22 +#: .\cookbook\templates\generic\delete_template.html:71 +msgid "Confirm" +msgstr "" + +#: .\cookbook\templates\account\email_confirm.html:29 +#, python-format +msgid "" +"This e-mail confirmation link expired or is invalid. Please\n" +" issue a new e-mail confirmation " +"request." +msgstr "" + +#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:289 +msgid "Login" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\account\login.html:32 +#: .\cookbook\templates\socialaccount\signup.html:8 +#: .\cookbook\templates\socialaccount\signup.html:57 +msgid "Sign Up" +msgstr "" + +#: .\cookbook\templates\account\login.html:36 +#: .\cookbook\templates\account\login.html:37 +#: .\cookbook\templates\account\password_reset.html:29 +msgid "Reset My Password" +msgstr "" + +#: .\cookbook\templates\account\login.html:37 +msgid "Lost your password?" +msgstr "" + +#: .\cookbook\templates\account\login.html:48 +msgid "Social Login" +msgstr "" + +#: .\cookbook\templates\account\login.html:49 +msgid "You can use any of the following providers to sign in." +msgstr "" + +#: .\cookbook\templates\account\logout.html:5 +#: .\cookbook\templates\account\logout.html:9 +#: .\cookbook\templates\account\logout.html:18 +msgid "Sign Out" +msgstr "" + +#: .\cookbook\templates\account\logout.html:11 +msgid "Are you sure you want to sign out?" +msgstr "" + +#: .\cookbook\templates\account\password_change.html:6 +#: .\cookbook\templates\account\password_change.html:16 +#: .\cookbook\templates\account\password_change.html:21 +#: .\cookbook\templates\account\password_reset_from_key.html:7 +#: .\cookbook\templates\account\password_reset_from_key.html:13 +#: .\cookbook\templates\account\password_reset_from_key_done.html:7 +#: .\cookbook\templates\account\password_reset_from_key_done.html:13 +msgid "Change Password" +msgstr "" + +#: .\cookbook\templates\account\password_change.html:12 +#: .\cookbook\templates\account\password_set.html:12 +#: .\cookbook\templates\settings.html:69 +msgid "Password" +msgstr "" + +#: .\cookbook\templates\account\password_change.html:22 +msgid "Forgot Password?" +msgstr "" + +#: .\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 "" + +#: .\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 "" + +#: .\cookbook\templates\account\password_reset.html:32 +msgid "Password reset is disabled on this instance." +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\account\password_reset_from_key.html:13 +msgid "Bad Token" +msgstr "" + +#: .\cookbook\templates\account\password_reset_from_key.html:25 +#, python-format +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used.\n" +" Please request a new " +"password reset." +msgstr "" + +#: .\cookbook\templates\account\password_reset_from_key.html:33 +msgid "change password" +msgstr "" + +#: .\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 "" + +#: .\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 "" + +#: .\cookbook\templates\account\signup.html:6 +msgid "Register" +msgstr "" + +#: .\cookbook\templates\account\signup.html:12 +msgid "Create an Account" +msgstr "" + +#: .\cookbook\templates\account\signup.html:42 +#: .\cookbook\templates\socialaccount\signup.html:33 +msgid "I accept the follwoing" +msgstr "" + +#: .\cookbook\templates\account\signup.html:45 +#: .\cookbook\templates\socialaccount\signup.html:36 +msgid "Terms and Conditions" +msgstr "" + +#: .\cookbook\templates\account\signup.html:48 +#: .\cookbook\templates\socialaccount\signup.html:39 +msgid "and" +msgstr "" + +#: .\cookbook\templates\account\signup.html:52 +#: .\cookbook\templates\socialaccount\signup.html:43 +msgid "Privacy Policy" +msgstr "" + +#: .\cookbook\templates\account\signup.html:65 +msgid "Create User" +msgstr "" + +#: .\cookbook\templates\account\signup.html:69 +msgid "Already have an account?" +msgstr "" + +#: .\cookbook\templates\account\signup_closed.html:5 +#: .\cookbook\templates\account\signup_closed.html:11 +msgid "Sign Up Closed" +msgstr "" + +#: .\cookbook\templates\account\signup_closed.html:13 +msgid "We are sorry, but the sign up is currently closed." +msgstr "" + +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:279 +#: .\cookbook\templates\rest_framework\api.html:11 +msgid "API Documentation" +msgstr "" + +#: .\cookbook\templates\base.html:86 +msgid "Shopping" +msgstr "" + +#: .\cookbook\templates\base.html:113 +msgid "Keyword" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\base.html:151 +#: .\cookbook\templates\shopping_list.html:237 +#: .\cookbook\templates\supermarket.html:7 +msgid "Supermarket" +msgstr "" + +#: .\cookbook\templates\base.html:163 +msgid "Supermarket Category" +msgstr "" + +#: .\cookbook\templates\base.html:175 .\cookbook\views\lists.py:195 +msgid "Automations" +msgstr "" + +#: .\cookbook\templates\base.html:189 .\cookbook\views\lists.py:215 +msgid "Files" +msgstr "" + +#: .\cookbook\templates\base.html:201 +msgid "Batch Edit" +msgstr "" + +#: .\cookbook\templates\base.html:213 .\cookbook\templates\history.html:6 +#: .\cookbook\templates\history.html:14 +msgid "History" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\base.html:244 .\cookbook\templates\index.html:47 +msgid "Import Recipe" +msgstr "" + +#: .\cookbook\templates\base.html:246 +#: .\cookbook\templates\shopping_list.html:195 +#: .\cookbook\templates\shopping_list.html:217 +msgid "Create" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\base.html:262 .\cookbook\templates\space.html:7 +#: .\cookbook\templates\space.html:19 +msgid "Space Settings" +msgstr "" + +#: .\cookbook\templates\base.html:267 .\cookbook\templates\system.html:13 +msgid "System" +msgstr "" + +#: .\cookbook\templates\base.html:269 +msgid "Admin" +msgstr "" + +#: .\cookbook\templates\base.html:273 +msgid "Markdown Guide" +msgstr "" + +#: .\cookbook\templates\base.html:275 +msgid "GitHub" +msgstr "" + +#: .\cookbook\templates\base.html:277 +msgid "Translate Tandoor" +msgstr "" + +#: .\cookbook\templates\base.html:281 +msgid "API Browser" +msgstr "" + +#: .\cookbook\templates\base.html:284 +msgid "Log out" +msgstr "" + +#: .\cookbook\templates\batch\edit.html:6 +msgid "Batch edit Category" +msgstr "" + +#: .\cookbook\templates\batch\edit.html:15 +msgid "Batch edit Recipes" +msgstr "" + +#: .\cookbook\templates\batch\edit.html:20 +msgid "Add the specified keywords to all recipes containing a word" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:82 +msgid "Sync" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:10 +msgid "Manage watched Folders" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:14 +msgid "" +"On this Page you can manage all storage folder locations that should be " +"monitored and synced." +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:16 +msgid "The path must be in the following format" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:20 +#: .\cookbook\templates\forms\edit_import_recipe.html:14 +#: .\cookbook\templates\generic\edit_template.html:23 +#: .\cookbook\templates\generic\new_template.html:23 +#: .\cookbook\templates\include\log_cooking.html:28 +#: .\cookbook\templates\settings.html:63 .\cookbook\templates\settings.html:105 +#: .\cookbook\templates\settings.html:123 +#: .\cookbook\templates\settings.html:195 +#: .\cookbook\templates\shopping_list.html:360 +msgid "Save" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:21 +msgid "Manage External Storage" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:28 +msgid "Sync Now!" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:29 +msgid "Show Recipes" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:30 +msgid "Show Log" +msgstr "" + +#: .\cookbook\templates\batch\waiting.html:4 +#: .\cookbook\templates\batch\waiting.html:10 +msgid "Importing Recipes" +msgstr "" + +#: .\cookbook\templates\batch\waiting.html:28 +msgid "" +"This can take a few minutes, depending on the number of recipes in sync, " +"please wait." +msgstr "" + +#: .\cookbook\templates\books.html:7 +msgid "Recipe Books" +msgstr "" + +#: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6 +msgid "Export Recipes" +msgstr "" + +#: .\cookbook\templates\forms\edit_import_recipe.html:5 +#: .\cookbook\templates\forms\edit_import_recipe.html:9 +msgid "Import new Recipe" +msgstr "" + +#: .\cookbook\templates\forms\edit_internal_recipe.html:7 +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 " +msgstr "" + +#: .\cookbook\templates\generic\delete_template.html:26 +msgid "Protected" +msgstr "" + +#: .\cookbook\templates\generic\delete_template.html:41 +msgid "Cascade" +msgstr "" + +#: .\cookbook\templates\generic\delete_template.html:72 +msgid "Cancel" +msgstr "" + +#: .\cookbook\templates\generic\edit_template.html:32 +msgid "View" +msgstr "" + +#: .\cookbook\templates\generic\edit_template.html:36 +msgid "Delete original file" +msgstr "" + +#: .\cookbook\templates\generic\list_template.html:6 +#: .\cookbook\templates\generic\list_template.html:21 +msgid "List" +msgstr "" + +#: .\cookbook\templates\generic\list_template.html:34 +msgid "Filter" +msgstr "" + +#: .\cookbook\templates\generic\list_template.html:39 +msgid "Import all" +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 "" + +#: .\cookbook\templates\history.html:20 +msgid "View Log" +msgstr "" + +#: .\cookbook\templates\history.html:24 +msgid "Cook Log" +msgstr "" + +#: .\cookbook\templates\import.html:6 .\cookbook\templates\test.html:6 +msgid "Import Recipes" +msgstr "" + +#: .\cookbook\templates\include\log_cooking.html:7 +msgid "Log Recipe Cooking" +msgstr "" + +#: .\cookbook\templates\include\log_cooking.html:13 +msgid "All fields are optional and can be left empty." +msgstr "" + +#: .\cookbook\templates\include\log_cooking.html:19 +msgid "Rating" +msgstr "" + +#: .\cookbook\templates\include\log_cooking.html:27 +#: .\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 "" + +#: .\cookbook\templates\include\storage_backend_warning.html:5 +msgid "" +"\n" +" The Password and Token field are stored as plain text " +"inside the database.\n" +" This is necessary because they are needed to make API requests, but " +"it also increases the risk of\n" +" someone stealing it.
\n" +" To limit the possible damage tokens or accounts with limited access " +"can be used.\n" +" " +msgstr "" + +#: .\cookbook\templates\index.html:29 +msgid "Search recipe ..." +msgstr "" + +#: .\cookbook\templates\index.html:44 +msgid "New Recipe" +msgstr "" + +#: .\cookbook\templates\index.html:53 +msgid "Advanced Search" +msgstr "" + +#: .\cookbook\templates\index.html:57 +msgid "Reset Search" +msgstr "" + +#: .\cookbook\templates\index.html:85 +msgid "Last viewed" +msgstr "" + +#: .\cookbook\templates\index.html:87 .\cookbook\templates\space.html:35 +#: .\cookbook\templates\stats.html:22 +msgid "Recipes" +msgstr "" + +#: .\cookbook\templates\index.html:94 +msgid "Log in to view recipes" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:5 +#: .\cookbook\templates\markdown_info.html:13 +msgid "Markdown Info" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:14 +msgid "" +"\n" +" Markdown is lightweight markup language that can be used to format " +"plain text easily.\n" +" This site uses the Python Markdown library to\n" +" convert your text into nice looking HTML. Its full markdown " +"documentation can be found\n" +" here.\n" +" An incomplete but most likely sufficient documentation can be found " +"below.\n" +" " +msgstr "" + +#: .\cookbook\templates\markdown_info.html:25 +msgid "Headers" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:54 +msgid "Formatting" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\markdown_info.html:57 +#: .\cookbook\templates\markdown_info.html:73 +msgid "or by leaving a blank line inbetween." +msgstr "" + +#: .\cookbook\templates\markdown_info.html:59 +#: .\cookbook\templates\markdown_info.html:74 +msgid "This text is bold" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:60 +#: .\cookbook\templates\markdown_info.html:75 +msgid "This text is italic" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:61 +#: .\cookbook\templates\markdown_info.html:77 +msgid "Blockquotes are also possible" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:84 +msgid "Lists" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:85 +msgid "" +"Lists can ordered or unorderd. It is important to leave a blank line " +"before the list!" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:87 +#: .\cookbook\templates\markdown_info.html:108 +msgid "Ordered List" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:89 +#: .\cookbook\templates\markdown_info.html:90 +#: .\cookbook\templates\markdown_info.html:91 +#: .\cookbook\templates\markdown_info.html:110 +#: .\cookbook\templates\markdown_info.html:111 +#: .\cookbook\templates\markdown_info.html:112 +msgid "unordered list item" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:93 +#: .\cookbook\templates\markdown_info.html:114 +msgid "Unordered List" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:95 +#: .\cookbook\templates\markdown_info.html:96 +#: .\cookbook\templates\markdown_info.html:97 +#: .\cookbook\templates\markdown_info.html:116 +#: .\cookbook\templates\markdown_info.html:117 +#: .\cookbook\templates\markdown_info.html:118 +msgid "ordered list item" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:125 +msgid "Images & Links" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\markdown_info.html:132 +#: .\cookbook\templates\markdown_info.html:145 +msgid "This will become an image" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:152 +msgid "Tables" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:153 +msgid "" +"Markdown tables are hard to create by hand. It is recommended to use a table " +"editor like this one." +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\markdown_info.html:155 +#: .\cookbook\templates\markdown_info.html:172 +msgid "Header" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:157 +#: .\cookbook\templates\markdown_info.html:178 +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 +#: .\cookbook\templates\shopping_list.html:261 +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" +msgstr "" + +#: .\cookbook\templates\no_groups_info.html:17 +msgid "You do not have any groups and therefor cannot use this application." +msgstr "" + +#: .\cookbook\templates\no_groups_info.html:18 +#: .\cookbook\templates\no_perm_info.html:15 +msgid "Please contact your administrator." +msgstr "" + +#: .\cookbook\templates\no_perm_info.html:5 +#: .\cookbook\templates\no_perm_info.html:12 +msgid "No Permission" +msgstr "" + +#: .\cookbook\templates\no_perm_info.html:15 +msgid "" +"You do not have the required permissions to view this page or perform this " +"action." +msgstr "" + +#: .\cookbook\templates\no_space_info.html:6 +#: .\cookbook\templates\no_space_info.html:13 +msgid "No Space" +msgstr "" + +#: .\cookbook\templates\no_space_info.html:17 +msgid "" +"Recipes, foods, shopping lists and more are organized in spaces of one or " +"more people." +msgstr "" + +#: .\cookbook\templates\no_space_info.html:18 +msgid "" +"You can either be invited into an existing space or create your own one." +msgstr "" + +#: .\cookbook\templates\no_space_info.html:31 +#: .\cookbook\templates\no_space_info.html:40 +msgid "Join Space" +msgstr "" + +#: .\cookbook\templates\no_space_info.html:34 +msgid "Join an existing space." +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\no_space_info.html:48 +#: .\cookbook\templates\no_space_info.html:56 +msgid "Create Space" +msgstr "" + +#: .\cookbook\templates\no_space_info.html:51 +msgid "Create your own recipe space." +msgstr "" + +#: .\cookbook\templates\no_space_info.html:52 +msgid "Start your own recipe space and invite other users to it." +msgstr "" + +#: .\cookbook\templates\offline.html:6 +msgid "Offline" +msgstr "" + +#: .\cookbook\templates\offline.html:19 +msgid "You are currently offline!" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\recipe_view.html:26 +msgid "by" +msgstr "" + +#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:147 +#: .\cookbook\views\edit.py:180 +msgid "Comment" +msgstr "" + +#: .\cookbook\templates\recipes_table.html:19 +#: .\cookbook\templates\recipes_table.html:23 +#: .\cookbook\templates\url_import.html:444 +msgid "Recipe Image" +msgstr "" + +#: .\cookbook\templates\recipes_table.html:51 +#: .\cookbook\templates\url_import.html:449 +msgid "Preparation time ca." +msgstr "" + +#: .\cookbook\templates\recipes_table.html:57 +#: .\cookbook\templates\url_import.html:454 +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:165 +msgid "Search Settings" +msgstr "" + +#: .\cookbook\templates\search_info.html:10 +msgid "" +"\n" +" Creating the best search experience is complicated and weighs " +"heavily on your personal configuration. \n" +" Changing any of the search settings can have significant impact on " +"the speed and quality of the results.\n" +" Search Methods, Trigrams and Full Text Search configurations are " +"only available if you are using Postgres for your database.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:19 +msgid "Search Methods" +msgstr "" + +#: .\cookbook\templates\search_info.html:23 +msgid "" +" \n" +" Full text searches attempt to normalize the words provided to " +"match common variants. For example: 'forked', 'forking', 'forks' will all " +"normalize to 'fork'.\n" +" There are several methods available, described below, that will " +"control how the search behavior should react when multiple words are " +"searched.\n" +" Full technical details on how these operate can be viewed on Postgresql's website.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:29 +msgid "" +" \n" +" Simple searches ignore punctuation and common words such as " +"'the', 'a', 'and'. And will treat seperate words as required.\n" +" Searching for 'apple or flour' will return any recipe that " +"includes both 'apple' and 'flour' anywhere in the fields that have been " +"selected for a full text search.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:34 +msgid "" +" \n" +" Phrase searches ignore punctuation, but will search for all of " +"the words in the exact order provided.\n" +" Searching for 'apple or flour' will only return a recipe that " +"includes the exact phrase 'apple or flour' in any of the fields that have " +"been selected for a full text search.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:39 +msgid "" +" \n" +" Web searches simulate functionality found on many web search " +"sites supporting special syntax.\n" +" Placing quotes around several words will convert those words " +"into a phrase.\n" +" 'or' is recongized as searching for the word (or phrase) " +"immediately before 'or' OR the word (or phrase) directly after.\n" +" '-' is recognized as searching for recipes that do not include " +"the word (or phrase) that comes immediately after. \n" +" For example searching for 'apple pie' or cherry -butter will " +"return any recipe that includes the phrase 'apple pie' or the word " +"'cherry' \n" +" in any field included in the full text search but exclude any " +"recipe that has the word 'butter' in any field included.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:48 +msgid "" +" \n" +" Raw search is similar to Web except will take puncuation " +"operators such as '|', '&' and '()'\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:59 +msgid "" +" \n" +" Another approach to searching that also requires Postgresql is " +"fuzzy search or trigram similarity. A trigram is a group of three " +"consecutive characters.\n" +" For example searching for 'apple' will create x trigrams 'app', " +"'ppl', 'ple' and will create a score of how closely words match the " +"generated trigrams.\n" +" One benefit of searching trigams is that a search for 'sandwich' " +"will find mispelled words such as 'sandwhich' that would be missed by other " +"methods.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:69 +msgid "Search Fields" +msgstr "" + +#: .\cookbook\templates\search_info.html:73 +msgid "" +" \n" +" Unaccent is a special case in that it enables searching a field " +"'unaccented' for each search style attempting to ignore accented values. \n" +" For example when you enable unaccent for 'Name' any search " +"(starts with, contains, trigram) will attempt the search ignoring accented " +"characters.\n" +" \n" +" For the other options, you can enable search on any or all " +"fields and they will be combined together with an assumed 'OR'.\n" +" For example enabling 'Name' for Starts With, 'Name' and " +"'Description' for Partial Match and 'Ingredients' and 'Keywords' for Full " +"Search\n" +" and searching for 'apple' will generate a search that will " +"return recipes that have:\n" +" - A recipe name that starts with 'apple'\n" +" - OR a recipe name that contains 'apple'\n" +" - OR a recipe description that contains 'apple'\n" +" - OR a recipe that will have a full text search match ('apple' " +"or 'apples') in ingredients\n" +" - OR a recipe that will have a full text search match in " +"Keywords\n" +"\n" +" Combining too many fields in too many types of search can have a " +"negative impact on performance, create duplicate results or return " +"unexpected results.\n" +" For example, enabling fuzzy search or partial matches will " +"interfere with web search methods. \n" +" Searching for 'apple -pie' with fuzzy search and full text " +"search will return the recipe Apple Pie. Though it is not included in the " +"full text results, it does match the trigram results.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:95 +msgid "Search Index" +msgstr "" + +#: .\cookbook\templates\search_info.html:99 +msgid "" +" \n" +" Trigram search and Full Text Search both rely on database " +"indexes to perform effectively. \n" +" You can rebuild the indexes on all fields in the Admin page for " +"Recipes and selecting all recipes and running 'rebuild index for selected " +"recipes'\n" +" You can also rebuild indexes at the command line by executing " +"the management command 'python manage.py rebuildindex'\n" +" " +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:58 +msgid "Name Settings" +msgstr "" + +#: .\cookbook\templates\settings.html:66 +msgid "Account Settings" +msgstr "" + +#: .\cookbook\templates\settings.html:68 +msgid "Emails" +msgstr "" + +#: .\cookbook\templates\settings.html:71 +#: .\cookbook\templates\socialaccount\connections.html:11 +msgid "Social" +msgstr "" + +#: .\cookbook\templates\settings.html:84 +msgid "Language" +msgstr "" + +#: .\cookbook\templates\settings.html:114 +msgid "Style" +msgstr "" + +#: .\cookbook\templates\settings.html:135 +msgid "API Token" +msgstr "" + +#: .\cookbook\templates\settings.html:136 +msgid "" +"You can use both basic authentication and token based authentication to " +"access the REST API." +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\settings.html:155 +msgid "or" +msgstr "" + +#: .\cookbook\templates\settings.html:166 +msgid "" +"There are many options to configure the search depending on your personal " +"preferences." +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\settings.html:168 +msgid "" +"If you do want to configure the search you can read about the different " +"options here." +msgstr "" + +#: .\cookbook\templates\settings.html:173 +msgid "Fuzzy" +msgstr "" + +#: .\cookbook\templates\settings.html:174 +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:175 +msgid "This is the default behavior" +msgstr "" + +#: .\cookbook\templates\settings.html:176 +#: .\cookbook\templates\settings.html:184 +msgid "Apply" +msgstr "" + +#: .\cookbook\templates\settings.html:181 +msgid "Precise" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\settings.html:183 +msgid "Perfect for large Databases" +msgstr "" + +#: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5 +msgid "Cookbook Setup" +msgstr "" + +#: .\cookbook\templates\setup.html:14 +msgid "Setup" +msgstr "" + +#: .\cookbook\templates\setup.html:15 +msgid "" +"To start using this application you must first create a superuser account." +msgstr "" + +#: .\cookbook\templates\setup.html:20 +msgid "Create Superuser account" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:7 +#: .\cookbook\templates\shopping_list.html:29 +#: .\cookbook\templates\shopping_list.html:721 +msgid "Shopping List" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:34 +msgid "Try the new shopping list" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:63 +msgid "Search Recipe" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:86 +msgid "Shopping Recipes" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:90 +msgid "No recipes selected" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:157 +msgid "Entry Mode" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:165 +msgid "Add Entry" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:181 +msgid "Amount" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:194 +msgid "Select Unit" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:196 +#: .\cookbook\templates\shopping_list.html:218 +#: .\cookbook\templates\shopping_list.html:248 +#: .\cookbook\templates\shopping_list.html:272 +#: .\cookbook\templates\url_import.html:500 +#: .\cookbook\templates\url_import.html:532 +msgid "Select" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:216 +msgid "Select Food" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:247 +msgid "Select Supermarket" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:271 +msgid "Select User" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:290 +msgid "Finished" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:303 +msgid "You are offline, shopping list might not syncronize." +msgstr "" + +#: .\cookbook\templates\shopping_list.html:368 +msgid "Copy/Export" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:372 +msgid "List Prefix" +msgstr "" + +#: .\cookbook\templates\socialaccount\connections.html:4 +#: .\cookbook\templates\socialaccount\connections.html:15 +msgid "Account Connections" +msgstr "" + +#: .\cookbook\templates\socialaccount\connections.html:18 +msgid "" +"You can sign in to your account using any of the following third party\n" +" accounts:" +msgstr "" + +#: .\cookbook\templates\socialaccount\connections.html:52 +msgid "" +"You currently have no social network accounts connected to this account." +msgstr "" + +#: .\cookbook\templates\socialaccount\connections.html:55 +msgid "Add a 3rd Party Account" +msgstr "" + +#: .\cookbook\templates\socialaccount\signup.html:5 +msgid "Signup" +msgstr "" + +#: .\cookbook\templates\socialaccount\signup.html:10 +#, python-format +msgid "" +"You are about to use your\n" +" %(provider_name)s account to login to\n" +" %(site_name)s. As a final step, please complete the following form:" +msgstr "" + +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:23 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:31 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:39 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:47 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:55 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:63 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:71 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:79 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:87 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:95 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:103 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:111 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:119 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:127 +msgid "Sign in using" +msgstr "" + +#: .\cookbook\templates\space.html:23 +msgid "Space:" +msgstr "" + +#: .\cookbook\templates\space.html:24 +msgid "Manage Subscription" +msgstr "" + +#: .\cookbook\templates\space.html:32 .\cookbook\templates\stats.html:19 +msgid "Number of objects" +msgstr "" + +#: .\cookbook\templates\space.html:45 .\cookbook\templates\stats.html:30 +msgid "Recipe Imports" +msgstr "" + +#: .\cookbook\templates\space.html:53 .\cookbook\templates\stats.html:38 +msgid "Objects stats" +msgstr "" + +#: .\cookbook\templates\space.html:56 .\cookbook\templates\stats.html:41 +msgid "Recipes without Keywords" +msgstr "" + +#: .\cookbook\templates\space.html:60 .\cookbook\templates\stats.html:45 +msgid "Internal Recipes" +msgstr "" + +#: .\cookbook\templates\space.html:73 +msgid "Members" +msgstr "" + +#: .\cookbook\templates\space.html:77 +msgid "Invite User" +msgstr "" + +#: .\cookbook\templates\space.html:88 +msgid "User" +msgstr "" + +#: .\cookbook\templates\space.html:89 +msgid "Groups" +msgstr "" + +#: .\cookbook\templates\space.html:105 +msgid "admin" +msgstr "" + +#: .\cookbook\templates\space.html:106 +msgid "user" +msgstr "" + +#: .\cookbook\templates\space.html:107 +msgid "guest" +msgstr "" + +#: .\cookbook\templates\space.html:108 +msgid "remove" +msgstr "" + +#: .\cookbook\templates\space.html:112 +msgid "Update" +msgstr "" + +#: .\cookbook\templates\space.html:116 +msgid "You cannot edit yourself." +msgstr "" + +#: .\cookbook\templates\space.html:123 +msgid "There are no members in your space yet!" +msgstr "" + +#: .\cookbook\templates\space.html:130 .\cookbook\templates\system.html:21 +#: .\cookbook\views\lists.py:100 +msgid "Invite Links" +msgstr "" + +#: .\cookbook\templates\stats.html:4 +msgid "Stats" +msgstr "" + +#: .\cookbook\templates\stats.html:10 +msgid "Statistics" +msgstr "" + +#: .\cookbook\templates\system.html:22 +msgid "Show Links" +msgstr "" + +#: .\cookbook\templates\system.html:32 +msgid "System Information" +msgstr "" + +#: .\cookbook\templates\system.html:34 +msgid "" +"\n" +" Django Recipes is an open source free software application. It can " +"be found on\n" +" GitHub.\n" +" Changelogs can be found here.\n" +" " +msgstr "" + +#: .\cookbook\templates\system.html:48 +msgid "Media Serving" +msgstr "" + +#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 +#: .\cookbook\templates\system.html:80 +msgid "Warning" +msgstr "" + +#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 +#: .\cookbook\templates\system.html:80 .\cookbook\templates\system.html:95 +msgid "Ok" +msgstr "" + +#: .\cookbook\templates\system.html:51 +msgid "" +"Serving media files directly using gunicorn/python is not recommend!\n" +" Please follow the steps described\n" +" here to update\n" +" your installation.\n" +" " +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\system.html:62 +msgid "Secret Key" +msgstr "" + +#: .\cookbook\templates\system.html:66 +msgid "" +"\n" +" You do not have a SECRET_KEY configured in your " +".env file. Django defaulted to the\n" +" standard key\n" +" provided with the installation which is publicly know and " +"insecure! Please set\n" +" SECRET_KEY int the .env configuration " +"file.\n" +" " +msgstr "" + +#: .\cookbook\templates\system.html:78 +msgid "Debug Mode" +msgstr "" + +#: .\cookbook\templates\system.html:82 +msgid "" +"\n" +" This application is still running in debug mode. This is most " +"likely not needed. Turn of debug mode by\n" +" setting\n" +" DEBUG=0 int the .env configuration " +"file.\n" +" " +msgstr "" + +#: .\cookbook\templates\system.html:93 +msgid "Database" +msgstr "" + +#: .\cookbook\templates\system.html:95 +msgid "Info" +msgstr "" + +#: .\cookbook\templates\system.html:97 +msgid "" +"\n" +" This application is not running with a Postgres database " +"backend. This is ok but not recommended as some\n" +" features only work with postgres databases.\n" +" " +msgstr "" + +#: .\cookbook\templates\url_import.html:6 +msgid "URL Import" +msgstr "" + +#: .\cookbook\templates\url_import.html:31 +msgid "Drag me to your bookmarks to import recipes from anywhere" +msgstr "" + +#: .\cookbook\templates\url_import.html:32 +msgid "Bookmark Me!" +msgstr "" + +#: .\cookbook\templates\url_import.html:36 +msgid "URL" +msgstr "" + +#: .\cookbook\templates\url_import.html:38 +msgid "App" +msgstr "" + +#: .\cookbook\templates\url_import.html:62 +msgid "Enter website URL" +msgstr "" + +#: .\cookbook\templates\url_import.html:101 +msgid "Select recipe files to import or drop them here..." +msgstr "" + +#: .\cookbook\templates\url_import.html:122 +msgid "Paste json or html source here to load recipe." +msgstr "" + +#: .\cookbook\templates\url_import.html:150 +msgid "Preview Recipe Data" +msgstr "" + +#: .\cookbook\templates\url_import.html:151 +msgid "Drag recipe attributes from the right into the appropriate box below." +msgstr "" + +#: .\cookbook\templates\url_import.html:160 +#: .\cookbook\templates\url_import.html:177 +#: .\cookbook\templates\url_import.html:194 +#: .\cookbook\templates\url_import.html:213 +#: .\cookbook\templates\url_import.html:231 +#: .\cookbook\templates\url_import.html:246 +#: .\cookbook\templates\url_import.html:261 +#: .\cookbook\templates\url_import.html:277 +#: .\cookbook\templates\url_import.html:304 +#: .\cookbook\templates\url_import.html:355 +msgid "Clear Contents" +msgstr "" + +#: .\cookbook\templates\url_import.html:162 +msgid "Text dragged here will be appended to the name." +msgstr "" + +#: .\cookbook\templates\url_import.html:175 +msgid "Description" +msgstr "" + +#: .\cookbook\templates\url_import.html:179 +msgid "Text dragged here will be appended to the description." +msgstr "" + +#: .\cookbook\templates\url_import.html:196 +msgid "Keywords dragged here will be appended to current list" +msgstr "" + +#: .\cookbook\templates\url_import.html:211 +msgid "Image" +msgstr "" + +#: .\cookbook\templates\url_import.html:243 +msgid "Prep Time" +msgstr "" + +#: .\cookbook\templates\url_import.html:258 +msgid "Cook Time" +msgstr "" + +#: .\cookbook\templates\url_import.html:279 +msgid "Ingredients dragged here will be appended to current list." +msgstr "" + +#: .\cookbook\templates\url_import.html:301 +#: .\cookbook\templates\url_import.html:572 +msgid "Instructions" +msgstr "" + +#: .\cookbook\templates\url_import.html:306 +msgid "" +"Recipe instructions dragged here will be appended to current instructions." +msgstr "" + +#: .\cookbook\templates\url_import.html:329 +msgid "Discovered Attributes" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\url_import.html:348 +msgid "Show Blank Field" +msgstr "" + +#: .\cookbook\templates\url_import.html:353 +msgid "Blank Field" +msgstr "" + +#: .\cookbook\templates\url_import.html:357 +msgid "Items dragged to Blank Field will be appended." +msgstr "" + +#: .\cookbook\templates\url_import.html:404 +msgid "Delete Text" +msgstr "" + +#: .\cookbook\templates\url_import.html:417 +msgid "Delete image" +msgstr "" + +#: .\cookbook\templates\url_import.html:433 +msgid "Recipe Name" +msgstr "" + +#: .\cookbook\templates\url_import.html:437 +msgid "Recipe Description" +msgstr "" + +#: .\cookbook\templates\url_import.html:499 +#: .\cookbook\templates\url_import.html:531 +#: .\cookbook\templates\url_import.html:587 +msgid "Select one" +msgstr "" + +#: .\cookbook\templates\url_import.html:547 +msgid "Note" +msgstr "" + +#: .\cookbook\templates\url_import.html:588 +msgid "Add Keyword" +msgstr "" + +#: .\cookbook\templates\url_import.html:601 +msgid "All Keywords" +msgstr "" + +#: .\cookbook\templates\url_import.html:604 +msgid "Import all keywords, not only the ones already existing." +msgstr "" + +#: .\cookbook\templates\url_import.html:631 +msgid "Information" +msgstr "" + +#: .\cookbook\templates\url_import.html:633 +msgid "" +" Only websites containing ld+json or microdata information can currently\n" +" be imported. Most big recipe pages " +"support this. If you site cannot be imported but\n" +" you think\n" +" it probably has some kind of structured " +"data feel free to post an example in the\n" +" github issues." +msgstr "" + +#: .\cookbook\templates\url_import.html:641 +msgid "Google ld+json Info" +msgstr "" + +#: .\cookbook\templates\url_import.html:644 +msgid "GitHub Issues" +msgstr "" + +#: .\cookbook\templates\url_import.html:646 +msgid "Recipe Markup Specification" +msgstr "" + +#: .\cookbook\views\api.py:83 .\cookbook\views\api.py:132 +msgid "Parameter updated_at incorrectly formatted" +msgstr "" + +#: .\cookbook\views\api.py:152 +#, python-brace-format +msgid "No {self.basename} with id {pk} exists" +msgstr "" + +#: .\cookbook\views\api.py:156 +msgid "Cannot merge with the same object!" +msgstr "" + +#: .\cookbook\views\api.py:163 +#, python-brace-format +msgid "No {self.basename} with id {target} exists" +msgstr "" + +#: .\cookbook\views\api.py:168 +msgid "Cannot merge with child object!" +msgstr "" + +#: .\cookbook\views\api.py:201 +#, python-brace-format +msgid "{source.name} was merged successfully with {target.name}" +msgstr "" + +#: .\cookbook\views\api.py:205 +#, python-brace-format +msgid "An error occurred attempting to merge {source.name} with {target.name}" +msgstr "" + +#: .\cookbook\views\api.py:249 +#, python-brace-format +msgid "No {self.basename} with id {child} exists" +msgstr "" + +#: .\cookbook\views\api.py:258 +#, python-brace-format +msgid "{child.name} was moved successfully to the root." +msgstr "" + +#: .\cookbook\views\api.py:261 .\cookbook\views\api.py:279 +msgid "An error occurred attempting to move " +msgstr "" + +#: .\cookbook\views\api.py:264 +msgid "Cannot move an object to itself!" +msgstr "" + +#: .\cookbook\views\api.py:270 +#, python-brace-format +msgid "No {self.basename} with id {parent} exists" +msgstr "" + +#: .\cookbook\views\api.py:276 +#, python-brace-format +msgid "{child.name} was moved successfully to parent {parent.name}" +msgstr "" + +#: .\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 "" + +#: .\cookbook\views\api.py:745 +msgid "Sync successful!" +msgstr "" + +#: .\cookbook\views\api.py:750 +msgid "Error synchronizing with Storage" +msgstr "" + +#: .\cookbook\views\api.py:828 +msgid "Nothing to do." +msgstr "" + +#: .\cookbook\views\api.py:843 +msgid "The requested site provided malformed data and cannot be read." +msgstr "" + +#: .\cookbook\views\api.py:850 +msgid "The requested page could not be found." +msgstr "" + +#: .\cookbook\views\api.py:859 +msgid "" +"The requested site does not provide any recognized data format to import the " +"recipe from." +msgstr "" + +#: .\cookbook\views\api.py:873 +msgid "No useable data could be found." +msgstr "" + +#: .\cookbook\views\api.py:889 +msgid "I couldn't find anything to do." +msgstr "" + +#: .\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 "" + +#: .\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 "" + +#: .\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] "" + +#: .\cookbook\views\delete.py:101 +msgid "Monitor" +msgstr "" + +#: .\cookbook\views\delete.py:125 .\cookbook\views\lists.py:86 +#: .\cookbook\views\new.py:101 +msgid "Storage Backend" +msgstr "" + +#: .\cookbook\views\delete.py:135 +msgid "" +"Could not delete this storage backend as it is used in at least one monitor." +msgstr "" + +#: .\cookbook\views\delete.py:158 +msgid "Recipe Book" +msgstr "" + +#: .\cookbook\views\delete.py:170 +msgid "Bookmarks" +msgstr "" + +#: .\cookbook\views\delete.py:192 .\cookbook\views\new.py:235 +msgid "Invite Link" +msgstr "" + +#: .\cookbook\views\edit.py:125 +msgid "You cannot edit this storage!" +msgstr "" + +#: .\cookbook\views\edit.py:149 +msgid "Storage saved!" +msgstr "" + +#: .\cookbook\views\edit.py:155 +msgid "There was an error updating this storage backend!" +msgstr "" + +#: .\cookbook\views\edit.py:248 +msgid "Changes saved!" +msgstr "" + +#: .\cookbook\views\edit.py:252 +msgid "Error saving changes!" +msgstr "" + +#: .\cookbook\views\import_export.py:99 +msgid "Importing is not implemented for this provider" +msgstr "" + +#: .\cookbook\views\import_export.py:121 +msgid "Exporting is not implemented for this provider" +msgstr "" + +#: .\cookbook\views\lists.py:26 +msgid "Import Log" +msgstr "" + +#: .\cookbook\views\lists.py:39 +msgid "Discovery" +msgstr "" + +#: .\cookbook\views\lists.py:69 +msgid "Shopping Lists" +msgstr "" + +#: .\cookbook\views\lists.py:129 +msgid "Foods" +msgstr "" + +#: .\cookbook\views\lists.py:163 +msgid "Supermarkets" +msgstr "" + +#: .\cookbook\views\lists.py:179 +msgid "Shopping Categories" +msgstr "" + +#: .\cookbook\views\lists.py:232 +msgid "New Shopping List" +msgstr "" + +#: .\cookbook\views\new.py:126 +msgid "Imported new recipe!" +msgstr "" + +#: .\cookbook\views\new.py:129 +msgid "There was an error importing this recipe!" +msgstr "" + +#: .\cookbook\views\new.py:209 +msgid "Hello" +msgstr "" + +#: .\cookbook\views\new.py:209 +msgid "You have been invited by " +msgstr "" + +#: .\cookbook\views\new.py:210 +msgid " to join their Tandoor Recipes space " +msgstr "" + +#: .\cookbook\views\new.py:211 +msgid "Click the following link to activate your account: " +msgstr "" + +#: .\cookbook\views\new.py:212 +msgid "" +"If the link does not work use the following code to manually join the space: " +msgstr "" + +#: .\cookbook\views\new.py:213 +msgid "The invitation is valid until " +msgstr "" + +#: .\cookbook\views\new.py:214 +msgid "" +"Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " +msgstr "" + +#: .\cookbook\views\new.py:217 +msgid "Tandoor Recipes Invite" +msgstr "" + +#: .\cookbook\views\new.py:224 +msgid "Invite link successfully send to user." +msgstr "" + +#: .\cookbook\views\new.py:227 +msgid "" +"You have send to many emails, please share the link manually or wait a few " +"hours." +msgstr "" + +#: .\cookbook\views\new.py:229 +msgid "Email to user could not be send, please share link manually." +msgstr "" + +#: .\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 "" + +#: .\cookbook\views\views.py:175 +msgid "You do not have the required permissions to perform this action!" +msgstr "" + +#: .\cookbook\views\views.py:186 +msgid "Comment saved!" +msgstr "" + +#: .\cookbook\views\views.py:277 +msgid "This feature is not available in the demo version!" +msgstr "" + +#: .\cookbook\views\views.py:340 +msgid "You must select at least one field to search!" +msgstr "" + +#: .\cookbook\views\views.py:345 +msgid "" +"To use this search method you must select at least one full text search " +"field!" +msgstr "" + +#: .\cookbook\views\views.py:349 +msgid "Fuzzy search is not compatible with this search method!" +msgstr "" + +#: .\cookbook\views\views.py:452 +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:459 +msgid "Passwords dont match!" +msgstr "" + +#: .\cookbook\views\views.py:475 +msgid "User has been created, please login!" +msgstr "" + +#: .\cookbook\views\views.py:491 +msgid "Malformed Invite Link supplied!" +msgstr "" + +#: .\cookbook\views\views.py:498 +msgid "You are already member of a space and therefore cannot join this one." +msgstr "" + +#: .\cookbook\views\views.py:509 +msgid "Successfully joined space." +msgstr "" + +#: .\cookbook\views\views.py:515 +msgid "Invite Link not valid or already used!" +msgstr "" + +#: .\cookbook\views\views.py:579 +msgid "" +"Reporting share links is not enabled for this instance. Please notify the " +"page administrator to report problems." +msgstr "" + +#: .\cookbook\views\views.py:585 +msgid "" +"Recipe sharing link has been disabled! For additional information please " +"contact the page administrator." +msgstr "" diff --git a/cookbook/locale/ru/LC_MESSAGES/django.mo b/cookbook/locale/ru/LC_MESSAGES/django.mo new file mode 100644 index 00000000..00579728 Binary files /dev/null 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 new file mode 100644 index 00000000..77402e37 --- /dev/null +++ b/cookbook/locale/ru/LC_MESSAGES/django.po @@ -0,0 +1,2576 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +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: 2021-10-23 09:06+0000\n" +"Last-Translator: rustam \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.8\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:270 +msgid "Ingredients" +msgstr "ингредиенты" + +#: .\cookbook\forms.py:50 +msgid "" +"Color of the top navigation bar. Not all colors work with all themes, just " +"try them out!" +msgstr "" +"Цвет навигационной панели. Не все цвета работают с некоторыми темами, " +"пробуйте !" + +#: .\cookbook\forms.py:52 +msgid "Default Unit to be used when inserting a new ingredient into a recipe." +msgstr "" +"Будут использоваться единицы измерения по умолчания при добавлении нового " +"ингредиента в рецепт." + +#: .\cookbook\forms.py:54 +msgid "" +"Enables support for fractions in ingredient amounts (e.g. convert decimals " +"to fractions automatically)" +msgstr "Автоматический использовать десятичный формат цифр в ингредиентах" + +#: .\cookbook\forms.py:57 +msgid "" +"Users with whom newly created meal plan/shopping list entries should be " +"shared by default." +msgstr "Пользователи, к которым по умолчанию будет отправлен новый рецепт." + +#: .\cookbook\forms.py:59 +msgid "Show recently viewed recipes on search page." +msgstr "Показывать недавно просмотренные рецпты на странице поиска." + +#: .\cookbook\forms.py:60 +msgid "Number of decimals to round ingredients." +msgstr "Количество десятичных знаков для округления ингредиентов." + +#: .\cookbook\forms.py:61 +msgid "If you want to be able to create and see comments underneath recipes." +msgstr "" +"Если хотите иметь возможность создавать и видеть комментарии под рецептами." + +#: .\cookbook\forms.py:63 +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. " +"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:66 +msgid "Makes the navbar stick to the top of the page." +msgstr "Оставляет навигационную панель в верхней части страницы." + +#: .\cookbook\forms.py:82 +msgid "" +"Both fields are optional. If none are given the username will be displayed " +"instead" +msgstr "" +"Оба поля необязательны. Если ничего не указано, вместо этого будет " +"отображаться имя пользователя" + +#: .\cookbook\forms.py:103 .\cookbook\forms.py:334 +#: .\cookbook\templates\url_import.html:154 +msgid "Name" +msgstr "Имя" + +#: .\cookbook\forms.py:104 .\cookbook\forms.py:335 +#: .\cookbook\templates\space.html:39 .\cookbook\templates\stats.html:24 +#: .\cookbook\templates\url_import.html:188 +#: .\cookbook\templates\url_import.html:573 .\cookbook\views\lists.py:112 +msgid "Keywords" +msgstr "Ключевые поля" + +#: .\cookbook\forms.py:105 +msgid "Preparation time in minutes" +msgstr "Время приготовления в минутах" + +#: .\cookbook\forms.py:106 +msgid "Waiting time (cooking/baking) in minutes" +msgstr "Время ожидания (выпечка) в минутах" + +#: .\cookbook\forms.py:107 .\cookbook\forms.py:336 +msgid "Path" +msgstr "Путь" + +#: .\cookbook\forms.py:108 +msgid "Storage UID" +msgstr "UID хранилища" + +#: .\cookbook\forms.py:134 +msgid "Default" +msgstr "По умолчанию" + +#: .\cookbook\forms.py:145 .\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 "" +"Во избежание дублирования рецепты с тем же именем, что и существующие, " +"игнорируются. Установите этот флажок, чтобы импортировать все." + +#: .\cookbook\forms.py:165 +msgid "New Unit" +msgstr "Новый юнит" + +#: .\cookbook\forms.py:166 +msgid "New unit that other gets replaced by." +msgstr "Новый юнит, который заменяется другим." + +#: .\cookbook\forms.py:171 +msgid "Old Unit" +msgstr "Старый юнит" + +#: .\cookbook\forms.py:172 +msgid "Unit that should be replaced." +msgstr "Юнит, который должен быть заменен." + +#: .\cookbook\forms.py:189 +msgid "New Food" +msgstr "Новый продукт" + +#: .\cookbook\forms.py:190 +msgid "New food that other gets replaced by." +msgstr "Новая продукт, которую заменяют другие." + +#: .\cookbook\forms.py:195 +msgid "Old Food" +msgstr "Старый продукт" + +#: .\cookbook\forms.py:196 +msgid "Food that should be replaced." +msgstr "Продукт, который должен быть заменен." + +#: .\cookbook\forms.py:214 +msgid "Add your comment: " +msgstr "Добавить комментарий: " + +#: .\cookbook\forms.py:256 +msgid "Leave empty for dropbox and enter app password for nextcloud." +msgstr "" +"Оставьте поле пустым для Dropbox и введите пароль приложения для nextcloud." + +#: .\cookbook\forms.py:263 +msgid "Leave empty for nextcloud and enter api token for dropbox." +msgstr "Оставьте поле пустым для nextcloud и введите токен api для dropbox." + +#: .\cookbook\forms.py:272 +msgid "" +"Leave empty for dropbox and enter only base url for nextcloud (/remote." +"php/webdav/ is added automatically)" +msgstr "" +"Оставьте пустым для dropbox и введите только базовый URL для nextcloud (" +" /remote.php/webdav/ добавляется автоматически)" + +#: .\cookbook\forms.py:310 +msgid "Search String" +msgstr "Текст поискового запроса" + +#: .\cookbook\forms.py:337 +msgid "File ID" +msgstr "ID файла" + +#: .\cookbook\forms.py:373 +msgid "You must provide at least a recipe or a title." +msgstr "Вы должны предоставить хотя бы рецепт или название." + +#: .\cookbook\forms.py:386 +msgid "You can list default users to share recipes with in the settings." +msgstr "" +"Вы можете перечислить пользователей по умолчанию, с которыми можно делиться " +"рецептами, в настройках." + +#: .\cookbook\forms.py:387 +msgid "" +"You can use markdown to format this field. See the docs here" +msgstr "" +"Для форматирования этого поля можно использовать markdown. См. документацию здесь " + +#: .\cookbook\forms.py:412 +msgid "Maximum number of users for this space reached." +msgstr "" +"Достигнуто максимальное количество пользователей для этого пространства." + +#: .\cookbook\forms.py:418 +msgid "Email address already taken!" +msgstr "Этот email уже используется!" + +#: .\cookbook\forms.py:426 +msgid "" +"An email address is not required but if present the invite link will be send " +"to the user." +msgstr "" +"email не требуется, но если он присутствует, пользователю будет отправлена " +"ссылка для приглашения." + +#: .\cookbook\forms.py:441 +msgid "Name already taken." +msgstr "Имя уже используется." + +#: .\cookbook\forms.py:452 +msgid "Accept Terms and Privacy" +msgstr "Принять условия пользования и конфиденциальности" + +#: .\cookbook\forms.py:487 +msgid "" +"Select type method of search. Click here for " +"full desciption of choices." +msgstr "" +"Выберите тип метода поиска. Щелкните здесь " +"для получения полного описания вариантов." + +#: .\cookbook\forms.py:488 +msgid "" +"Use fuzzy matching on units, keywords and ingredients when editing and " +"importing recipes." +msgstr "" +"Используйте нечеткое соответствие единиц измерения, ключевых слов и " +"ингредиентов при редактировании и импорте рецептов." + +#: .\cookbook\forms.py:489 +msgid "" +"Fields to search ignoring accents. Selecting this option can improve or " +"degrade search quality depending on language" +msgstr "" +"Поля для поиска без акцентов. Выбор этого параметра может улучшить или " +"ухудшить качество поиска в зависимости от языка" + +#: .\cookbook\forms.py:490 +msgid "" +"Fields to search for partial matches. (e.g. searching for 'Pie' will return " +"'pie' and 'piece' and 'soapie')" +msgstr "" + +#: .\cookbook\forms.py:491 +msgid "" +"Fields to search for beginning of word matches. (e.g. searching for 'sa' " +"will return 'salad' and 'sandwich')" +msgstr "" + +#: .\cookbook\forms.py:492 +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:493 +msgid "" +"Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " +"only function with fulltext fields." +msgstr "" + +#: .\cookbook\forms.py:497 +msgid "Search Method" +msgstr "" + +#: .\cookbook\forms.py:498 +msgid "Fuzzy Lookups" +msgstr "" + +#: .\cookbook\forms.py:499 +msgid "Ignore Accent" +msgstr "" + +#: .\cookbook\forms.py:500 +msgid "Partial Match" +msgstr "" + +#: .\cookbook\forms.py:501 +msgid "Starts Wtih" +msgstr "" + +#: .\cookbook\forms.py:502 +msgid "Fuzzy Search" +msgstr "" + +#: .\cookbook\forms.py:503 +msgid "Full Text" +msgstr "" + +#: .\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 "" + +#: .\cookbook\helper\permission_helper.py:136 +#: .\cookbook\helper\permission_helper.py:159 .\cookbook\views\views.py:150 +msgid "You are not logged in and therefore cannot view this page!" +msgstr "" + +#: .\cookbook\helper\permission_helper.py:140 +#: .\cookbook\helper\permission_helper.py:146 +#: .\cookbook\helper\permission_helper.py:171 +#: .\cookbook\helper\permission_helper.py:216 +#: .\cookbook\helper\permission_helper.py:230 +#: .\cookbook\helper\permission_helper.py:241 +#: .\cookbook\helper\permission_helper.py:252 .\cookbook\views\data.py:40 +#: .\cookbook\views\views.py:161 .\cookbook\views\views.py:168 +#: .\cookbook\views\views.py:245 +msgid "You do not have the required permissions to view this page!" +msgstr "" + +#: .\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 "" + +#: .\cookbook\helper\template_helper.py:61 +#: .\cookbook\helper\template_helper.py:63 +msgid "Could not parse template code." +msgstr "" + +#: .\cookbook\integration\integration.py:119 +#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 +#: .\cookbook\templates\import_response.html:7 +#: .\cookbook\templates\test.html:14 .\cookbook\templates\test.html:20 +#: .\cookbook\templates\url_import.html:27 +#: .\cookbook\templates\url_import.html:101 +#: .\cookbook\templates\url_import.html:123 +#: .\cookbook\templates\url_import.html:317 +#: .\cookbook\templates\url_import.html:604 .\cookbook\views\delete.py:60 +#: .\cookbook\views\edit.py:197 +msgid "Import" +msgstr "" + +#: .\cookbook\integration\integration.py:200 +msgid "" +"Importer expected a .zip file. Did you choose the correct importer type for " +"your data ?" +msgstr "" + +#: .\cookbook\integration\integration.py:203 +msgid "" +"An unexpected error occurred during the import. Please make sure you have " +"uploaded a valid file." +msgstr "" + +#: .\cookbook\integration\integration.py:208 +msgid "The following recipes were ignored because they already existed:" +msgstr "" + +#: .\cookbook\integration\integration.py:212 +#, python-format +msgid "Imported %s recipes." +msgstr "" + +#: .\cookbook\integration\paprika.py:46 +msgid "Notes" +msgstr "" + +#: .\cookbook\integration\paprika.py:49 +msgid "Nutritional Information" +msgstr "" + +#: .\cookbook\integration\paprika.py:53 +msgid "Source" +msgstr "" + +#: .\cookbook\integration\safron.py:23 +#: .\cookbook\templates\include\log_cooking.html:16 +#: .\cookbook\templates\url_import.html:224 +#: .\cookbook\templates\url_import.html:455 +msgid "Servings" +msgstr "" + +#: .\cookbook\integration\safron.py:25 +msgid "Waiting time" +msgstr "" + +#: .\cookbook\integration\safron.py:27 +msgid "Preparation Time" +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 "" + +#: .\cookbook\integration\safron.py:31 +msgid "Section" +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:14 +msgid "Rebuilds full text search index on Recipe" +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:18 +msgid "Only Postgress databases use full text search, no index to rebuild" +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:29 +msgid "Recipe index rebuild complete." +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:31 +msgid "Recipe index rebuild failed." +msgstr "" + +#: .\cookbook\migrations\0047_auto_20200602_1133.py:14 +msgid "Breakfast" +msgstr "" + +#: .\cookbook\migrations\0047_auto_20200602_1133.py:19 +msgid "Lunch" +msgstr "" + +#: .\cookbook\migrations\0047_auto_20200602_1133.py:24 +msgid "Dinner" +msgstr "" + +#: .\cookbook\migrations\0047_auto_20200602_1133.py:29 +msgid "Other" +msgstr "" + +#: .\cookbook\models.py:144 +msgid "" +"Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " +"upload." +msgstr "" + +#: .\cookbook\models.py:196 .\cookbook\templates\search.html:7 +#: .\cookbook\templates\shopping_list.html:52 +msgid "Search" +msgstr "" + +#: .\cookbook\models.py:197 .\cookbook\templates\base.html:82 +#: .\cookbook\templates\meal_plan.html:5 .\cookbook\views\delete.py:152 +#: .\cookbook\views\edit.py:231 .\cookbook\views\new.py:200 +msgid "Meal-Plan" +msgstr "" + +#: .\cookbook\models.py:198 .\cookbook\templates\base.html:90 +msgid "Books" +msgstr "" + +#: .\cookbook\models.py:206 +msgid "Small" +msgstr "" + +#: .\cookbook\models.py:206 +msgid "Large" +msgstr "" + +#: .\cookbook\models.py:206 .\cookbook\templates\generic\new_template.html:6 +#: .\cookbook\templates\generic\new_template.html:14 +#: .\cookbook\templates\meal_plan.html:323 +msgid "New" +msgstr "" + +#: .\cookbook\models.py:389 +msgid " is part of a recipe step and cannot be deleted" +msgstr "" + +#: .\cookbook\models.py:429 +msgid "Text" +msgstr "" + +#: .\cookbook\models.py:429 +msgid "Time" +msgstr "" + +#: .\cookbook\models.py:429 +msgid "File" +msgstr "" + +#: .\cookbook\models.py:429 +#: .\cookbook\templates\include\recipe_open_modal.html:7 +#: .\cookbook\templates\meal_plan.html:247 .\cookbook\views\delete.py:28 +#: .\cookbook\views\edit.py:271 .\cookbook\views\new.py:52 +msgid "Recipe" +msgstr "" + +#: .\cookbook\models.py:836 .\cookbook\templates\search_info.html:28 +msgid "Simple" +msgstr "" + +#: .\cookbook\models.py:837 .\cookbook\templates\search_info.html:33 +msgid "Phrase" +msgstr "" + +#: .\cookbook\models.py:838 .\cookbook\templates\search_info.html:38 +msgid "Web" +msgstr "" + +#: .\cookbook\models.py:839 .\cookbook\templates\search_info.html:47 +msgid "Raw" +msgstr "" + +#: .\cookbook\serializer.py:112 +msgid "File uploads are not enabled for this Space." +msgstr "" + +#: .\cookbook\serializer.py:125 +msgid "You have reached your file upload limit." +msgstr "" + +#: .\cookbook\tables.py:35 .\cookbook\templates\generic\edit_template.html:6 +#: .\cookbook\templates\generic\edit_template.html:14 +#: .\cookbook\templates\meal_plan.html:281 +#: .\cookbook\templates\recipes_table.html:82 +#: .\cookbook\templates\shopping_list.html:33 +#: .\cookbook\templates\space.html:90 +msgid "Edit" +msgstr "" + +#: .\cookbook\tables.py:115 .\cookbook\tables.py:138 +#: .\cookbook\templates\generic\delete_template.html:5 +#: .\cookbook\templates\generic\delete_template.html:13 +#: .\cookbook\templates\generic\edit_template.html:28 +#: .\cookbook\templates\meal_plan.html:277 +#: .\cookbook\templates\recipes_table.html:90 +msgid "Delete" +msgstr "" + +#: .\cookbook\templates\404.html:5 +msgid "404 Error" +msgstr "" + +#: .\cookbook\templates\404.html:18 +msgid "The page you are looking for could not be found." +msgstr "" + +#: .\cookbook\templates\404.html:33 +msgid "Take me Home" +msgstr "" + +#: .\cookbook\templates\404.html:35 +msgid "Report a Bug" +msgstr "" + +#: .\cookbook\templates\account\email.html:6 +#: .\cookbook\templates\account\email.html:17 +msgid "E-mail Addresses" +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:204 .\cookbook\templates\settings.html:6 +#: .\cookbook\templates\settings.html:17 +#: .\cookbook\templates\socialaccount\connections.html:10 +msgid "Settings" +msgstr "" + +#: .\cookbook\templates\account\email.html:13 +msgid "Email" +msgstr "" + +#: .\cookbook\templates\account\email.html:19 +msgid "The following e-mail addresses are associated with your account:" +msgstr "" + +#: .\cookbook\templates\account\email.html:36 +msgid "Verified" +msgstr "" + +#: .\cookbook\templates\account\email.html:38 +msgid "Unverified" +msgstr "" + +#: .\cookbook\templates\account\email.html:40 +msgid "Primary" +msgstr "" + +#: .\cookbook\templates\account\email.html:47 +msgid "Make Primary" +msgstr "" + +#: .\cookbook\templates\account\email.html:49 +msgid "Re-send Verification" +msgstr "" + +#: .\cookbook\templates\account\email.html:50 +#: .\cookbook\templates\socialaccount\connections.html:44 +msgid "Remove" +msgstr "" + +#: .\cookbook\templates\account\email.html:58 +msgid "Warning:" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\account\email.html:64 +msgid "Add E-mail Address" +msgstr "" + +#: .\cookbook\templates\account\email.html:69 +msgid "Add E-mail" +msgstr "" + +#: .\cookbook\templates\account\email.html:79 +msgid "Do you really want to remove the selected e-mail address?" +msgstr "" + +#: .\cookbook\templates\account\email_confirm.html:6 +#: .\cookbook\templates\account\email_confirm.html:10 +msgid "Confirm E-mail Address" +msgstr "" + +#: .\cookbook\templates\account\email_confirm.html:16 +#, python-format +msgid "" +"Please confirm that\n" +" %(email)s is an e-mail address " +"for user %(user_display)s\n" +" ." +msgstr "" + +#: .\cookbook\templates\account\email_confirm.html:22 +#: .\cookbook\templates\generic\delete_template.html:22 +msgid "Confirm" +msgstr "" + +#: .\cookbook\templates\account\email_confirm.html:29 +#, python-format +msgid "" +"This e-mail confirmation link expired or is invalid. Please\n" +" issue a new e-mail confirmation " +"request." +msgstr "" + +#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:234 +msgid "Login" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\account\login.html:32 +#: .\cookbook\templates\socialaccount\signup.html:8 +#: .\cookbook\templates\socialaccount\signup.html:57 +msgid "Sign Up" +msgstr "" + +#: .\cookbook\templates\account\login.html:36 +#: .\cookbook\templates\account\login.html:37 +#: .\cookbook\templates\account\password_reset.html:29 +msgid "Reset My Password" +msgstr "" + +#: .\cookbook\templates\account\login.html:37 +msgid "Lost your password?" +msgstr "" + +#: .\cookbook\templates\account\login.html:48 +msgid "Social Login" +msgstr "" + +#: .\cookbook\templates\account\login.html:49 +msgid "You can use any of the following providers to sign in." +msgstr "" + +#: .\cookbook\templates\account\logout.html:5 +#: .\cookbook\templates\account\logout.html:9 +#: .\cookbook\templates\account\logout.html:18 +msgid "Sign Out" +msgstr "" + +#: .\cookbook\templates\account\logout.html:11 +msgid "Are you sure you want to sign out?" +msgstr "" + +#: .\cookbook\templates\account\password_change.html:6 +#: .\cookbook\templates\account\password_change.html:16 +#: .\cookbook\templates\account\password_change.html:21 +msgid "Change Password" +msgstr "" + +#: .\cookbook\templates\account\password_change.html:12 +#: .\cookbook\templates\account\password_set.html:12 +#: .\cookbook\templates\settings.html:64 +msgid "Password" +msgstr "" + +#: .\cookbook\templates\account\password_change.html:22 +msgid "Forgot Password?" +msgstr "" + +#: .\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 "" + +#: .\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 "" + +#: .\cookbook\templates\account\password_reset.html:32 +msgid "Password reset is disabled on this instance." +msgstr "" + +#: .\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 "" + +#: .\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 "" + +#: .\cookbook\templates\account\signup.html:6 +msgid "Register" +msgstr "" + +#: .\cookbook\templates\account\signup.html:12 +msgid "Create an Account" +msgstr "" + +#: .\cookbook\templates\account\signup.html:42 +#: .\cookbook\templates\socialaccount\signup.html:33 +msgid "I accept the follwoing" +msgstr "" + +#: .\cookbook\templates\account\signup.html:45 +#: .\cookbook\templates\socialaccount\signup.html:36 +msgid "Terms and Conditions" +msgstr "" + +#: .\cookbook\templates\account\signup.html:48 +#: .\cookbook\templates\socialaccount\signup.html:39 +msgid "and" +msgstr "" + +#: .\cookbook\templates\account\signup.html:52 +#: .\cookbook\templates\socialaccount\signup.html:43 +msgid "Privacy Policy" +msgstr "" + +#: .\cookbook\templates\account\signup.html:65 +msgid "Create User" +msgstr "" + +#: .\cookbook\templates\account\signup.html:69 +msgid "Already have an account?" +msgstr "" + +#: .\cookbook\templates\account\signup_closed.html:5 +#: .\cookbook\templates\account\signup_closed.html:11 +msgid "Sign Up Closed" +msgstr "" + +#: .\cookbook\templates\account\signup_closed.html:13 +msgid "We are sorry, but the sign up is currently closed." +msgstr "" + +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:222 +#: .\cookbook\templates\rest_framework\api.html:11 +msgid "API Documentation" +msgstr "" + +#: .\cookbook\templates\base.html:86 +msgid "Shopping" +msgstr "" + +#: .\cookbook\templates\base.html:113 +msgid "Keyword" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\base.html:151 +#: .\cookbook\templates\shopping_list.html:230 +#: .\cookbook\templates\supermarket.html:7 +msgid "Supermarket" +msgstr "" + +#: .\cookbook\templates\base.html:163 +msgid "Batch Edit" +msgstr "" + +#: .\cookbook\templates\base.html:175 .\cookbook\templates\history.html:6 +#: .\cookbook\templates\history.html:14 +msgid "History" +msgstr "" + +#: .\cookbook\templates\base.html:191 .\cookbook\templates\index.html:47 +msgid "Import Recipe" +msgstr "" + +#: .\cookbook\templates\base.html:193 +#: .\cookbook\templates\shopping_list.html:188 +#: .\cookbook\templates\shopping_list.html:210 +msgid "Create" +msgstr "" + +#: .\cookbook\templates\base.html:207 .\cookbook\templates\space.html:7 +#: .\cookbook\templates\space.html:19 +msgid "Space Settings" +msgstr "" + +#: .\cookbook\templates\base.html:212 .\cookbook\templates\system.html:13 +msgid "System" +msgstr "" + +#: .\cookbook\templates\base.html:214 +msgid "Admin" +msgstr "" + +#: .\cookbook\templates\base.html:218 +msgid "Markdown Guide" +msgstr "" + +#: .\cookbook\templates\base.html:220 +msgid "GitHub" +msgstr "" + +#: .\cookbook\templates\base.html:224 +msgid "API Browser" +msgstr "" + +#: .\cookbook\templates\base.html:227 +msgid "Log out" +msgstr "" + +#: .\cookbook\templates\base.html:229 +#: .\cookbook\templates\generic\list_template.html:14 +#: .\cookbook\templates\space.html:58 .\cookbook\templates\stats.html:43 +msgid "External Recipes" +msgstr "" + +#: .\cookbook\templates\batch\edit.html:6 +msgid "Batch edit Category" +msgstr "" + +#: .\cookbook\templates\batch\edit.html:15 +msgid "Batch edit Recipes" +msgstr "" + +#: .\cookbook\templates\batch\edit.html:20 +msgid "Add the specified keywords to all recipes containing a word" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:83 +msgid "Sync" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:10 +msgid "Manage watched Folders" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:14 +msgid "" +"On this Page you can manage all storage folder locations that should be " +"monitored and synced." +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:16 +msgid "The path must be in the following format" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:21 +msgid "Manage External Storage" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:28 +msgid "Sync Now!" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:29 +msgid "Show Recipes" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:30 +msgid "Show Log" +msgstr "" + +#: .\cookbook\templates\batch\waiting.html:4 +#: .\cookbook\templates\batch\waiting.html:10 +msgid "Importing Recipes" +msgstr "" + +#: .\cookbook\templates\batch\waiting.html:28 +msgid "" +"This can take a few minutes, depending on the number of recipes in sync, " +"please wait." +msgstr "" + +#: .\cookbook\templates\books.html:7 +msgid "Recipe Books" +msgstr "" + +#: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6 +msgid "Export Recipes" +msgstr "" + +#: .\cookbook\templates\export.html:14 .\cookbook\templates\export.html:20 +#: .\cookbook\templates\shopping_list.html:351 +#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 +msgid "Export" +msgstr "" + +#: .\cookbook\templates\files.html:7 +msgid "Files" +msgstr "" + +#: .\cookbook\templates\forms\edit_import_recipe.html:5 +#: .\cookbook\templates\forms\edit_import_recipe.html:9 +msgid "Import new Recipe" +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\include\log_cooking.html:28 +#: .\cookbook\templates\meal_plan.html:325 +#: .\cookbook\templates\settings.html:58 .\cookbook\templates\settings.html:99 +#: .\cookbook\templates\settings.html:117 +#: .\cookbook\templates\settings.html:162 +#: .\cookbook\templates\shopping_list.html:353 +msgid "Save" +msgstr "" + +#: .\cookbook\templates\forms\edit_internal_recipe.html:7 +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:19 +#, python-format +msgid "Are you sure you want to delete the %(title)s: %(object)s " +msgstr "" + +#: .\cookbook\templates\generic\delete_template.html:23 +msgid "Cancel" +msgstr "" + +#: .\cookbook\templates\generic\edit_template.html:32 +msgid "View" +msgstr "" + +#: .\cookbook\templates\generic\edit_template.html:36 +msgid "Delete original file" +msgstr "" + +#: .\cookbook\templates\generic\list_template.html:6 +#: .\cookbook\templates\generic\list_template.html:21 +msgid "List" +msgstr "" + +#: .\cookbook\templates\generic\list_template.html:34 +msgid "Filter" +msgstr "" + +#: .\cookbook\templates\generic\list_template.html:39 +msgid "Import all" +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 "" + +#: .\cookbook\templates\history.html:20 +msgid "View Log" +msgstr "" + +#: .\cookbook\templates\history.html:24 +msgid "Cook Log" +msgstr "" + +#: .\cookbook\templates\import.html:6 .\cookbook\templates\test.html:6 +msgid "Import Recipes" +msgstr "" + +#: .\cookbook\templates\include\log_cooking.html:7 +msgid "Log Recipe Cooking" +msgstr "" + +#: .\cookbook\templates\include\log_cooking.html:13 +msgid "All fields are optional and can be left empty." +msgstr "" + +#: .\cookbook\templates\include\log_cooking.html:19 +msgid "Rating" +msgstr "" + +#: .\cookbook\templates\include\log_cooking.html:27 +#: .\cookbook\templates\include\recipe_open_modal.html:18 +#: .\cookbook\templates\meal_plan.html:283 +#: .\cookbook\templates\meal_plan.html:327 +#: .\cookbook\templates\meal_plan.html:366 +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 "" + +#: .\cookbook\templates\include\storage_backend_warning.html:5 +msgid "" +"\n" +" The Password and Token field are stored as plain text " +"inside the database.\n" +" This is necessary because they are needed to make API requests, but " +"it also increases the risk of\n" +" someone stealing it.
\n" +" To limit the possible damage tokens or accounts with limited access " +"can be used.\n" +" " +msgstr "" + +#: .\cookbook\templates\index.html:29 +msgid "Search recipe ..." +msgstr "" + +#: .\cookbook\templates\index.html:44 +msgid "New Recipe" +msgstr "" + +#: .\cookbook\templates\index.html:53 +msgid "Advanced Search" +msgstr "" + +#: .\cookbook\templates\index.html:57 +msgid "Reset Search" +msgstr "" + +#: .\cookbook\templates\index.html:85 +msgid "Last viewed" +msgstr "" + +#: .\cookbook\templates\index.html:87 .\cookbook\templates\meal_plan.html:178 +#: .\cookbook\templates\space.html:35 .\cookbook\templates\stats.html:22 +msgid "Recipes" +msgstr "" + +#: .\cookbook\templates\index.html:94 +msgid "Log in to view recipes" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:5 +#: .\cookbook\templates\markdown_info.html:13 +msgid "Markdown Info" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:14 +msgid "" +"\n" +" Markdown is lightweight markup language that can be used to format " +"plain text easily.\n" +" This site uses the Python Markdown library to\n" +" convert your text into nice looking HTML. Its full markdown " +"documentation can be found\n" +" here.\n" +" An incomplete but most likely sufficient documentation can be found " +"below.\n" +" " +msgstr "" + +#: .\cookbook\templates\markdown_info.html:25 +msgid "Headers" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:54 +msgid "Formatting" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\markdown_info.html:57 +#: .\cookbook\templates\markdown_info.html:73 +msgid "or by leaving a blank line inbetween." +msgstr "" + +#: .\cookbook\templates\markdown_info.html:59 +#: .\cookbook\templates\markdown_info.html:74 +msgid "This text is bold" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:60 +#: .\cookbook\templates\markdown_info.html:75 +msgid "This text is italic" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:61 +#: .\cookbook\templates\markdown_info.html:77 +msgid "Blockquotes are also possible" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:84 +msgid "Lists" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:85 +msgid "" +"Lists can ordered or unorderd. It is important to leave a blank line " +"before the list!" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:87 +#: .\cookbook\templates\markdown_info.html:108 +msgid "Ordered List" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:89 +#: .\cookbook\templates\markdown_info.html:90 +#: .\cookbook\templates\markdown_info.html:91 +#: .\cookbook\templates\markdown_info.html:110 +#: .\cookbook\templates\markdown_info.html:111 +#: .\cookbook\templates\markdown_info.html:112 +msgid "unordered list item" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:93 +#: .\cookbook\templates\markdown_info.html:114 +msgid "Unordered List" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:95 +#: .\cookbook\templates\markdown_info.html:96 +#: .\cookbook\templates\markdown_info.html:97 +#: .\cookbook\templates\markdown_info.html:116 +#: .\cookbook\templates\markdown_info.html:117 +#: .\cookbook\templates\markdown_info.html:118 +msgid "ordered list item" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:125 +msgid "Images & Links" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\markdown_info.html:132 +#: .\cookbook\templates\markdown_info.html:145 +msgid "This will become an image" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:152 +msgid "Tables" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:153 +msgid "" +"Markdown tables are hard to create by hand. It is recommended to use a table " +"editor like this one." +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\markdown_info.html:155 +#: .\cookbook\templates\markdown_info.html:172 +msgid "Header" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:157 +#: .\cookbook\templates\markdown_info.html:178 +msgid "Cell" +msgstr "" + +#: .\cookbook\templates\meal_plan.html:101 +msgid "New Entry" +msgstr "" + +#: .\cookbook\templates\meal_plan.html:113 +#: .\cookbook\templates\shopping_list.html:56 +msgid "Search Recipe" +msgstr "" + +#: .\cookbook\templates\meal_plan.html:139 +msgid "Title" +msgstr "" + +#: .\cookbook\templates\meal_plan.html:141 +msgid "Note (optional)" +msgstr "" + +#: .\cookbook\templates\meal_plan.html:143 +msgid "" +"You can use markdown to format this field. See the docs here" +msgstr "" + +#: .\cookbook\templates\meal_plan.html:147 +#: .\cookbook\templates\meal_plan.html:251 +msgid "Serving Count" +msgstr "" + +#: .\cookbook\templates\meal_plan.html:153 +msgid "Create only note" +msgstr "" + +#: .\cookbook\templates\meal_plan.html:168 +#: .\cookbook\templates\shopping_list.html:7 +#: .\cookbook\templates\shopping_list.html:29 +#: .\cookbook\templates\shopping_list.html:714 +msgid "Shopping List" +msgstr "" + +#: .\cookbook\templates\meal_plan.html:172 +msgid "Shopping list currently empty" +msgstr "" + +#: .\cookbook\templates\meal_plan.html:175 +msgid "Open Shopping List" +msgstr "" + +#: .\cookbook\templates\meal_plan.html:189 +msgid "Plan" +msgstr "" + +#: .\cookbook\templates\meal_plan.html:196 +msgid "Number of Days" +msgstr "" + +#: .\cookbook\templates\meal_plan.html:206 +msgid "Weekday offset" +msgstr "" + +#: .\cookbook\templates\meal_plan.html:209 +msgid "" +"Number of days starting from the first day of the week to offset the default " +"view." +msgstr "" + +#: .\cookbook\templates\meal_plan.html:217 +#: .\cookbook\templates\meal_plan.html:294 +msgid "Edit plan types" +msgstr "" + +#: .\cookbook\templates\meal_plan.html:219 +msgid "Show help" +msgstr "" + +#: .\cookbook\templates\meal_plan.html:220 +msgid "Week iCal export" +msgstr "" + +#: .\cookbook\templates\meal_plan.html:256 +#: .\cookbook\templates\url_import.html:542 +msgid "Note" +msgstr "" + +#: .\cookbook\templates\meal_plan.html:264 +#: .\cookbook\templates\meal_plan_entry.html:18 +msgid "Created by" +msgstr "" + +#: .\cookbook\templates\meal_plan.html:270 +#: .\cookbook\templates\meal_plan_entry.html:20 +#: .\cookbook\templates\shopping_list.html:254 +msgid "Shared with" +msgstr "" + +#: .\cookbook\templates\meal_plan.html:280 +msgid "Add to Shopping" +msgstr "" + +#: .\cookbook\templates\meal_plan.html:323 +msgid "New meal type" +msgstr "" + +#: .\cookbook\templates\meal_plan.html:338 +msgid "Meal Plan Help" +msgstr "" + +#: .\cookbook\templates\meal_plan.html:344 +msgid "" +"\n" +"

The meal plan module allows planning of meals " +"both with recipes and notes.

\n" +"

Simply select a recipe from the list of " +"recently viewed recipes or search the one you\n" +" want and drag it to the desired plan " +"position. You can also add a note and a title and\n" +" then drag the recipe to create a plan entry " +"with a custom title and note. Creating only\n" +" Notes is possible by dragging the create " +"note box into the plan.

\n" +"

Click on a recipe in order to open the " +"detailed view. There you can also add it to the\n" +" shopping list. You can also add all recipes " +"of a day to the shopping list by\n" +" clicking the shopping cart at the top of the " +"table.

\n" +"

Since a common use case is to plan meals " +"together you can define\n" +" users you want to share your plan with in " +"the settings.\n" +"

\n" +"

You can also edit the types of meals you want " +"to plan. If you share your plan with\n" +" someone with\n" +" different meals, their meal types will " +"appear in your list as well. To prevent\n" +" duplicates (e.g. Other and Misc.)\n" +" name your meal types the same as the users " +"you share your meals with and they will be\n" +" merged.

\n" +" " +msgstr "" + +#: .\cookbook\templates\meal_plan_entry.html:6 +msgid "Meal Plan View" +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" +msgstr "" + +#: .\cookbook\templates\no_groups_info.html:17 +msgid "You do not have any groups and therefor cannot use this application." +msgstr "" + +#: .\cookbook\templates\no_groups_info.html:18 +#: .\cookbook\templates\no_perm_info.html:15 +msgid "Please contact your administrator." +msgstr "" + +#: .\cookbook\templates\no_perm_info.html:5 +#: .\cookbook\templates\no_perm_info.html:12 +msgid "No Permission" +msgstr "" + +#: .\cookbook\templates\no_perm_info.html:15 +msgid "" +"You do not have the required permissions to view this page or perform this " +"action." +msgstr "" + +#: .\cookbook\templates\no_space_info.html:6 +#: .\cookbook\templates\no_space_info.html:13 +msgid "No Space" +msgstr "" + +#: .\cookbook\templates\no_space_info.html:17 +msgid "" +"Recipes, foods, shopping lists and more are organized in spaces of one or " +"more people." +msgstr "" + +#: .\cookbook\templates\no_space_info.html:18 +msgid "" +"You can either be invited into an existing space or create your own one." +msgstr "" + +#: .\cookbook\templates\no_space_info.html:31 +#: .\cookbook\templates\no_space_info.html:40 +msgid "Join Space" +msgstr "" + +#: .\cookbook\templates\no_space_info.html:34 +msgid "Join an existing space." +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\no_space_info.html:48 +#: .\cookbook\templates\no_space_info.html:56 +msgid "Create Space" +msgstr "" + +#: .\cookbook\templates\no_space_info.html:51 +msgid "Create your own recipe space." +msgstr "" + +#: .\cookbook\templates\no_space_info.html:52 +msgid "Start your own recipe space and invite other users to it." +msgstr "" + +#: .\cookbook\templates\offline.html:6 +msgid "Offline" +msgstr "" + +#: .\cookbook\templates\offline.html:19 +msgid "You are currently offline!" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\recipe_view.html:21 .\cookbook\templates\space.html:62 +#: .\cookbook\templates\stats.html:47 +msgid "Comments" +msgstr "" + +#: .\cookbook\templates\recipe_view.html:26 +msgid "by" +msgstr "" + +#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:118 +#: .\cookbook\views\edit.py:177 +msgid "Comment" +msgstr "" + +#: .\cookbook\templates\recipes_table.html:19 +#: .\cookbook\templates\recipes_table.html:23 +#: .\cookbook\templates\url_import.html:440 +msgid "Recipe Image" +msgstr "" + +#: .\cookbook\templates\recipes_table.html:51 +#: .\cookbook\templates\url_import.html:445 +msgid "Preparation time ca." +msgstr "" + +#: .\cookbook\templates\recipes_table.html:57 +#: .\cookbook\templates\url_import.html:450 +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:157 +msgid "Search Settings" +msgstr "" + +#: .\cookbook\templates\search_info.html:10 +msgid "" +"\n" +" Creating the best search experience is complicated and weighs " +"heavily on your personal configuration. \n" +" Changing any of the search settings can have significant impact on " +"the speed and quality of the results.\n" +" Search Methods, Trigrams and Full Text Search configurations are " +"only available if you are using Postgres for your database.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:19 +msgid "Search Methods" +msgstr "" + +#: .\cookbook\templates\search_info.html:23 +msgid "" +" \n" +" Full text searches attempt to normalize the words provided to " +"match common variants. For example: 'forked', 'forking', 'forks' will all " +"normalize to 'fork'.\n" +" There are several methods available, described below, that will " +"control how the search behavior should react when multiple words are " +"searched.\n" +" Full technical details on how these operate can be viewed on Postgresql's website.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:29 +msgid "" +" \n" +" Simple searches ignore punctuation and common words such as " +"'the', 'a', 'and'. And will treat seperate words as required.\n" +" Searching for 'apple or flour' will return any recipe that " +"includes both 'apple' and 'flour' anywhere in the fields that have been " +"selected for a full text search.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:34 +msgid "" +" \n" +" Phrase searches ignore punctuation, but will search for all of " +"the words in the exact order provided.\n" +" Searching for 'apple or flour' will only return a recipe that " +"includes the exact phrase 'apple or flour' in any of the fields that have " +"been selected for a full text search.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:39 +msgid "" +" \n" +" Web searches simulate functionality found on many web search " +"sites supporting special syntax.\n" +" Placing quotes around several words will convert those words " +"into a phrase.\n" +" 'or' is recongized as searching for the word (or phrase) " +"immediately before 'or' OR the word (or phrase) directly after.\n" +" '-' is recognized as searching for recipes that do not include " +"the word (or phrase) that comes immediately after. \n" +" For example searching for 'apple pie' or cherry -butter will " +"return any recipe that includes the phrase 'apple pie' or the word " +"'cherry' \n" +" in any field included in the full text search but exclude any " +"recipe that has the word 'butter' in any field included.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:48 +msgid "" +" \n" +" Raw search is similar to Web except will take puncuation " +"operators such as '|', '&' and '()'\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:59 +msgid "" +" \n" +" Another approach to searching that also requires Postgresql is " +"fuzzy search or trigram similarity. A trigram is a group of three " +"consecutive characters.\n" +" For example searching for 'apple' will create x trigrams 'app', " +"'ppl', 'ple' and will create a score of how closely words match the " +"generated trigrams.\n" +" One benefit of searching trigams is that a search for 'sandwich' " +"will find mispelled words such as 'sandwhich' that would be missed by other " +"methods.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:69 +msgid "Search Fields" +msgstr "" + +#: .\cookbook\templates\search_info.html:73 +msgid "" +" \n" +" Unaccent is a special case in that it enables searching a field " +"'unaccented' for each search style attempting to ignore accented values. \n" +" For example when you enable unaccent for 'Name' any search " +"(starts with, contains, trigram) will attempt the search ignoring accented " +"characters.\n" +" \n" +" For the other options, you can enable search on any or all " +"fields and they will be combined together with an assumed 'OR'.\n" +" For example enabling 'Name' for Starts With, 'Name' and " +"'Description' for Partial Match and 'Ingredients' and 'Keywords' for Full " +"Search\n" +" and searching for 'apple' will generate a search that will " +"return recipes that have:\n" +" - A recipe name that starts with 'apple'\n" +" - OR a recipe name that contains 'apple'\n" +" - OR a recipe description that contains 'apple'\n" +" - OR a recipe that will have a full text search match ('apple' " +"or 'apples') in ingredients\n" +" - OR a recipe that will have a full text search match in " +"Keywords\n" +"\n" +" Combining too many fields in too many types of search can have a " +"negative impact on performance, create duplicate results or return " +"unexpected results.\n" +" For example, enabling fuzzy search or partial matches will " +"interfere with web search methods. \n" +" Searching for 'apple -pie' with fuzzy search and full text " +"search will return the recipe Apple Pie. Though it is not included in the " +"full text results, it does match the trigram results.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:95 +msgid "Search Index" +msgstr "" + +#: .\cookbook\templates\search_info.html:99 +msgid "" +" \n" +" Trigram search and Full Text Search both rely on database " +"indexes to perform effectively. \n" +" You can rebuild the indexes on all fields in the Admin page for " +"Recipes and selecting all recipes and running 'rebuild index for selected " +"recipes'\n" +" You can also rebuild indexes at the command line by executing " +"the management command 'python manage.py rebuildindex'\n" +" " +msgstr "" + +#: .\cookbook\templates\settings.html:27 +msgid "Account" +msgstr "" + +#: .\cookbook\templates\settings.html:33 +msgid "Preferences" +msgstr "" + +#: .\cookbook\templates\settings.html:39 +msgid "API-Settings" +msgstr "" + +#: .\cookbook\templates\settings.html:45 +msgid "Search-Settings" +msgstr "" + +#: .\cookbook\templates\settings.html:53 +msgid "Name Settings" +msgstr "" + +#: .\cookbook\templates\settings.html:61 +msgid "Account Settings" +msgstr "" + +#: .\cookbook\templates\settings.html:63 +msgid "Emails" +msgstr "" + +#: .\cookbook\templates\settings.html:66 +#: .\cookbook\templates\socialaccount\connections.html:11 +msgid "Social" +msgstr "" + +#: .\cookbook\templates\settings.html:78 +msgid "Language" +msgstr "" + +#: .\cookbook\templates\settings.html:108 +msgid "Style" +msgstr "" + +#: .\cookbook\templates\settings.html:128 +msgid "API Token" +msgstr "" + +#: .\cookbook\templates\settings.html:129 +msgid "" +"You can use both basic authentication and token based authentication to " +"access the REST API." +msgstr "" + +#: .\cookbook\templates\settings.html:146 +msgid "" +"Use the token as an Authorization header prefixed by the word token as shown " +"in the following examples:" +msgstr "" + +#: .\cookbook\templates\settings.html:148 +msgid "or" +msgstr "" + +#: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5 +msgid "Cookbook Setup" +msgstr "" + +#: .\cookbook\templates\setup.html:14 +msgid "Setup" +msgstr "" + +#: .\cookbook\templates\setup.html:15 +msgid "" +"To start using this application you must first create a superuser account." +msgstr "" + +#: .\cookbook\templates\setup.html:20 +msgid "Create Superuser account" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:79 +msgid "Shopping Recipes" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:83 +msgid "No recipes selected" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:150 +msgid "Entry Mode" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:158 +msgid "Add Entry" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:174 +msgid "Amount" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:187 +msgid "Select Unit" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:189 +#: .\cookbook\templates\shopping_list.html:211 +#: .\cookbook\templates\shopping_list.html:241 +#: .\cookbook\templates\shopping_list.html:265 +#: .\cookbook\templates\url_import.html:495 +#: .\cookbook\templates\url_import.html:527 +msgid "Select" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:209 +msgid "Select Food" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:240 +msgid "Select Supermarket" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:264 +msgid "Select User" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:283 +msgid "Finished" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:296 +msgid "You are offline, shopping list might not syncronize." +msgstr "" + +#: .\cookbook\templates\shopping_list.html:361 +msgid "Copy/Export" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:365 +msgid "List Prefix" +msgstr "" + +#: .\cookbook\templates\socialaccount\connections.html:4 +#: .\cookbook\templates\socialaccount\connections.html:15 +msgid "Account Connections" +msgstr "" + +#: .\cookbook\templates\socialaccount\connections.html:18 +msgid "" +"You can sign in to your account using any of the following third party\n" +" accounts:" +msgstr "" + +#: .\cookbook\templates\socialaccount\connections.html:52 +msgid "" +"You currently have no social network accounts connected to this account." +msgstr "" + +#: .\cookbook\templates\socialaccount\connections.html:55 +msgid "Add a 3rd Party Account" +msgstr "" + +#: .\cookbook\templates\socialaccount\signup.html:5 +msgid "Signup" +msgstr "" + +#: .\cookbook\templates\socialaccount\signup.html:10 +#, python-format +msgid "" +"You are about to use your\n" +" %(provider_name)s account to login to\n" +" %(site_name)s. As a final step, please complete the following form:" +msgstr "" + +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:23 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:31 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:39 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:47 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:55 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:63 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:71 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:79 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:87 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:95 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:103 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:111 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:119 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:127 +msgid "Sign in using" +msgstr "" + +#: .\cookbook\templates\space.html:23 +msgid "Space:" +msgstr "" + +#: .\cookbook\templates\space.html:24 +msgid "Manage Subscription" +msgstr "" + +#: .\cookbook\templates\space.html:32 .\cookbook\templates\stats.html:19 +msgid "Number of objects" +msgstr "" + +#: .\cookbook\templates\space.html:45 .\cookbook\templates\stats.html:30 +msgid "Recipe Imports" +msgstr "" + +#: .\cookbook\templates\space.html:53 .\cookbook\templates\stats.html:38 +msgid "Objects stats" +msgstr "" + +#: .\cookbook\templates\space.html:56 .\cookbook\templates\stats.html:41 +msgid "Recipes without Keywords" +msgstr "" + +#: .\cookbook\templates\space.html:60 .\cookbook\templates\stats.html:45 +msgid "Internal Recipes" +msgstr "" + +#: .\cookbook\templates\space.html:73 +msgid "Members" +msgstr "" + +#: .\cookbook\templates\space.html:77 +msgid "Invite User" +msgstr "" + +#: .\cookbook\templates\space.html:88 +msgid "User" +msgstr "" + +#: .\cookbook\templates\space.html:89 +msgid "Groups" +msgstr "" + +#: .\cookbook\templates\space.html:105 +msgid "admin" +msgstr "" + +#: .\cookbook\templates\space.html:106 +msgid "user" +msgstr "" + +#: .\cookbook\templates\space.html:107 +msgid "guest" +msgstr "" + +#: .\cookbook\templates\space.html:108 +msgid "remove" +msgstr "" + +#: .\cookbook\templates\space.html:112 +msgid "Update" +msgstr "" + +#: .\cookbook\templates\space.html:116 +msgid "You cannot edit yourself." +msgstr "" + +#: .\cookbook\templates\space.html:123 +msgid "There are no members in your space yet!" +msgstr "" + +#: .\cookbook\templates\space.html:130 .\cookbook\templates\system.html:21 +#: .\cookbook\views\lists.py:100 +msgid "Invite Links" +msgstr "" + +#: .\cookbook\templates\stats.html:4 +msgid "Stats" +msgstr "" + +#: .\cookbook\templates\stats.html:10 +msgid "Statistics" +msgstr "" + +#: .\cookbook\templates\system.html:22 +msgid "Show Links" +msgstr "" + +#: .\cookbook\templates\system.html:32 +msgid "System Information" +msgstr "" + +#: .\cookbook\templates\system.html:34 +msgid "" +"\n" +" Django Recipes is an open source free software application. It can " +"be found on\n" +" GitHub.\n" +" Changelogs can be found here.\n" +" " +msgstr "" + +#: .\cookbook\templates\system.html:48 +msgid "Media Serving" +msgstr "" + +#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 +#: .\cookbook\templates\system.html:80 +msgid "Warning" +msgstr "" + +#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 +#: .\cookbook\templates\system.html:80 .\cookbook\templates\system.html:95 +msgid "Ok" +msgstr "" + +#: .\cookbook\templates\system.html:51 +msgid "" +"Serving media files directly using gunicorn/python is not recommend!\n" +" Please follow the steps described\n" +" here to update\n" +" your installation.\n" +" " +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\system.html:62 +msgid "Secret Key" +msgstr "" + +#: .\cookbook\templates\system.html:66 +msgid "" +"\n" +" You do not have a SECRET_KEY configured in your " +".env file. Django defaulted to the\n" +" standard key\n" +" provided with the installation which is publicly know and " +"insecure! Please set\n" +" SECRET_KEY int the .env configuration " +"file.\n" +" " +msgstr "" + +#: .\cookbook\templates\system.html:78 +msgid "Debug Mode" +msgstr "" + +#: .\cookbook\templates\system.html:82 +msgid "" +"\n" +" This application is still running in debug mode. This is most " +"likely not needed. Turn of debug mode by\n" +" setting\n" +" DEBUG=0 int the .env configuration " +"file.\n" +" " +msgstr "" + +#: .\cookbook\templates\system.html:93 +msgid "Database" +msgstr "" + +#: .\cookbook\templates\system.html:95 +msgid "Info" +msgstr "" + +#: .\cookbook\templates\system.html:97 +msgid "" +"\n" +" This application is not running with a Postgres database " +"backend. This is ok but not recommended as some\n" +" features only work with postgres databases.\n" +" " +msgstr "" + +#: .\cookbook\templates\url_import.html:6 +msgid "URL Import" +msgstr "" + +#: .\cookbook\templates\url_import.html:31 +msgid "Drag me to your bookmarks to import recipes from anywhere" +msgstr "" + +#: .\cookbook\templates\url_import.html:32 +msgid "Bookmark Me!" +msgstr "" + +#: .\cookbook\templates\url_import.html:61 +msgid "Enter website URL" +msgstr "" + +#: .\cookbook\templates\url_import.html:97 +msgid "Select recipe files to import or drop them here..." +msgstr "" + +#: .\cookbook\templates\url_import.html:118 +msgid "Paste json or html source here to load recipe." +msgstr "" + +#: .\cookbook\templates\url_import.html:146 +msgid "Preview Recipe Data" +msgstr "" + +#: .\cookbook\templates\url_import.html:147 +msgid "Drag recipe attributes from the right into the appropriate box below." +msgstr "" + +#: .\cookbook\templates\url_import.html:156 +#: .\cookbook\templates\url_import.html:173 +#: .\cookbook\templates\url_import.html:190 +#: .\cookbook\templates\url_import.html:209 +#: .\cookbook\templates\url_import.html:227 +#: .\cookbook\templates\url_import.html:242 +#: .\cookbook\templates\url_import.html:257 +#: .\cookbook\templates\url_import.html:273 +#: .\cookbook\templates\url_import.html:300 +#: .\cookbook\templates\url_import.html:351 +msgid "Clear Contents" +msgstr "" + +#: .\cookbook\templates\url_import.html:158 +msgid "Text dragged here will be appended to the name." +msgstr "" + +#: .\cookbook\templates\url_import.html:171 +msgid "Description" +msgstr "" + +#: .\cookbook\templates\url_import.html:175 +msgid "Text dragged here will be appended to the description." +msgstr "" + +#: .\cookbook\templates\url_import.html:192 +msgid "Keywords dragged here will be appended to current list" +msgstr "" + +#: .\cookbook\templates\url_import.html:207 +msgid "Image" +msgstr "" + +#: .\cookbook\templates\url_import.html:239 +msgid "Prep Time" +msgstr "" + +#: .\cookbook\templates\url_import.html:254 +msgid "Cook Time" +msgstr "" + +#: .\cookbook\templates\url_import.html:275 +msgid "Ingredients dragged here will be appended to current list." +msgstr "" + +#: .\cookbook\templates\url_import.html:297 +#: .\cookbook\templates\url_import.html:567 +msgid "Instructions" +msgstr "" + +#: .\cookbook\templates\url_import.html:302 +msgid "" +"Recipe instructions dragged here will be appended to current instructions." +msgstr "" + +#: .\cookbook\templates\url_import.html:325 +msgid "Discovered Attributes" +msgstr "" + +#: .\cookbook\templates\url_import.html:327 +msgid "" +"Drag recipe attributes from below into the appropriate box on the left. " +"Click any node to display its full properties." +msgstr "" + +#: .\cookbook\templates\url_import.html:344 +msgid "Show Blank Field" +msgstr "" + +#: .\cookbook\templates\url_import.html:349 +msgid "Blank Field" +msgstr "" + +#: .\cookbook\templates\url_import.html:353 +msgid "Items dragged to Blank Field will be appended." +msgstr "" + +#: .\cookbook\templates\url_import.html:400 +msgid "Delete Text" +msgstr "" + +#: .\cookbook\templates\url_import.html:413 +msgid "Delete image" +msgstr "" + +#: .\cookbook\templates\url_import.html:429 +msgid "Recipe Name" +msgstr "" + +#: .\cookbook\templates\url_import.html:433 +msgid "Recipe Description" +msgstr "" + +#: .\cookbook\templates\url_import.html:494 +#: .\cookbook\templates\url_import.html:526 +#: .\cookbook\templates\url_import.html:582 +msgid "Select one" +msgstr "" + +#: .\cookbook\templates\url_import.html:583 +msgid "Add Keyword" +msgstr "" + +#: .\cookbook\templates\url_import.html:596 +msgid "All Keywords" +msgstr "" + +#: .\cookbook\templates\url_import.html:599 +msgid "Import all keywords, not only the ones already existing." +msgstr "" + +#: .\cookbook\templates\url_import.html:626 +msgid "Information" +msgstr "" + +#: .\cookbook\templates\url_import.html:628 +msgid "" +" Only websites containing ld+json or microdata information can currently\n" +" be imported. Most big recipe pages " +"support this. If you site cannot be imported but\n" +" you think\n" +" it probably has some kind of structured " +"data feel free to post an example in the\n" +" github issues." +msgstr "" + +#: .\cookbook\templates\url_import.html:636 +msgid "Google ld+json Info" +msgstr "" + +#: .\cookbook\templates\url_import.html:639 +msgid "GitHub Issues" +msgstr "" + +#: .\cookbook\templates\url_import.html:641 +msgid "Recipe Markup Specification" +msgstr "" + +#: .\cookbook\views\api.py:82 .\cookbook\views\api.py:131 +msgid "Parameter updated_at incorrectly formatted" +msgstr "" + +#: .\cookbook\views\api.py:151 +#, python-brace-format +msgid "No {self.basename} with id {pk} exists" +msgstr "" + +#: .\cookbook\views\api.py:155 .\cookbook\views\edit.py:300 +#: .\cookbook\views\edit.py:316 +msgid "Cannot merge with the same object!" +msgstr "" + +#: .\cookbook\views\api.py:162 +#, python-brace-format +msgid "No {self.basename} with id {target} exists" +msgstr "" + +#: .\cookbook\views\api.py:167 +msgid "Cannot merge with child object!" +msgstr "" + +#: .\cookbook\views\api.py:195 +#, python-brace-format +msgid "{source.name} was merged successfully with {target.name}" +msgstr "" + +#: .\cookbook\views\api.py:199 +#, python-brace-format +msgid "An error occurred attempting to merge {source.name} with {target.name}" +msgstr "" + +#: .\cookbook\views\api.py:239 +#, python-brace-format +msgid "No {self.basename} with id {child} exists" +msgstr "" + +#: .\cookbook\views\api.py:248 +#, python-brace-format +msgid "{child.name} was moved successfully to the root." +msgstr "" + +#: .\cookbook\views\api.py:251 .\cookbook\views\api.py:269 +msgid "An error occurred attempting to move " +msgstr "" + +#: .\cookbook\views\api.py:254 +msgid "Cannot move an object to itself!" +msgstr "" + +#: .\cookbook\views\api.py:260 +#, python-brace-format +msgid "No {self.basename} with id {parent} exists" +msgstr "" + +#: .\cookbook\views\api.py:266 +#, python-brace-format +msgid "{child.name} was moved successfully to parent {parent.name}" +msgstr "" + +#: .\cookbook\views\api.py:704 .\cookbook\views\views.py:289 +msgid "This feature is not available in the demo version!" +msgstr "" + +#: .\cookbook\views\api.py:727 +msgid "Sync successful!" +msgstr "" + +#: .\cookbook\views\api.py:732 +msgid "Error synchronizing with Storage" +msgstr "" + +#: .\cookbook\views\api.py:810 +msgid "Nothing to do." +msgstr "" + +#: .\cookbook\views\api.py:825 +msgid "The requested site provided malformed data and cannot be read." +msgstr "" + +#: .\cookbook\views\api.py:832 +msgid "The requested page could not be found." +msgstr "" + +#: .\cookbook\views\api.py:841 +msgid "" +"The requested site does not provide any recognized data format to import the " +"recipe from." +msgstr "" + +#: .\cookbook\views\api.py:855 +msgid "No useable data could be found." +msgstr "" + +#: .\cookbook\views\api.py:871 +msgid "I couldn't find anything to do." +msgstr "" + +#: .\cookbook\views\data.py:31 .\cookbook\views\data.py:122 +#: .\cookbook\views\edit.py:50 .\cookbook\views\import_export.py:67 +#: .\cookbook\views\new.py:32 +msgid "You have reached the maximum number of recipes for your space." +msgstr "" + +#: .\cookbook\views\data.py:35 .\cookbook\views\data.py:126 +#: .\cookbook\views\edit.py:54 .\cookbook\views\import_export.py:71 +#: .\cookbook\views\new.py:36 +msgid "You have more users than allowed in your space." +msgstr "" + +#: .\cookbook\views\data.py:104 +#, 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] "" + +#: .\cookbook\views\delete.py:72 +msgid "Monitor" +msgstr "" + +#: .\cookbook\views\delete.py:96 .\cookbook\views\lists.py:86 +#: .\cookbook\views\new.py:97 +msgid "Storage Backend" +msgstr "" + +#: .\cookbook\views\delete.py:106 +msgid "" +"Could not delete this storage backend as it is used in at least one monitor." +msgstr "" + +#: .\cookbook\views\delete.py:129 .\cookbook\views\edit.py:211 +#: .\cookbook\views\new.py:155 +msgid "Recipe Book" +msgstr "" + +#: .\cookbook\views\delete.py:141 +msgid "Bookmarks" +msgstr "" + +#: .\cookbook\views\delete.py:163 .\cookbook\views\new.py:251 +msgid "Invite Link" +msgstr "" + +#: .\cookbook\views\edit.py:126 +msgid "You cannot edit this storage!" +msgstr "" + +#: .\cookbook\views\edit.py:146 +msgid "Storage saved!" +msgstr "" + +#: .\cookbook\views\edit.py:152 +msgid "There was an error updating this storage backend!" +msgstr "" + +#: .\cookbook\views\edit.py:163 +msgid "Storage" +msgstr "" + +#: .\cookbook\views\edit.py:259 +msgid "Changes saved!" +msgstr "" + +#: .\cookbook\views\edit.py:263 +msgid "Error saving changes!" +msgstr "" + +#: .\cookbook\views\edit.py:298 +msgid "Units merged!" +msgstr "" + +#: .\cookbook\views\edit.py:314 +msgid "Foods merged!" +msgstr "" + +#: .\cookbook\views\import_export.py:93 +msgid "Importing is not implemented for this provider" +msgstr "" + +#: .\cookbook\views\import_export.py:115 +msgid "Exporting is not implemented for this provider" +msgstr "" + +#: .\cookbook\views\lists.py:26 +msgid "Import Log" +msgstr "" + +#: .\cookbook\views\lists.py:39 +msgid "Discovery" +msgstr "" + +#: .\cookbook\views\lists.py:69 +msgid "Shopping Lists" +msgstr "" + +#: .\cookbook\views\lists.py:129 +msgid "Foods" +msgstr "" + +#: .\cookbook\views\lists.py:163 +msgid "Supermarkets" +msgstr "" + +#: .\cookbook\views\lists.py:179 +msgid "Shopping Categories" +msgstr "" + +#: .\cookbook\views\new.py:122 +msgid "Imported new recipe!" +msgstr "" + +#: .\cookbook\views\new.py:125 +msgid "There was an error importing this recipe!" +msgstr "" + +#: .\cookbook\views\new.py:225 +msgid "Hello" +msgstr "" + +#: .\cookbook\views\new.py:225 +msgid "You have been invited by " +msgstr "" + +#: .\cookbook\views\new.py:226 +msgid " to join their Tandoor Recipes space " +msgstr "" + +#: .\cookbook\views\new.py:227 +msgid "Click the following link to activate your account: " +msgstr "" + +#: .\cookbook\views\new.py:228 +msgid "" +"If the link does not work use the following code to manually join the space: " +msgstr "" + +#: .\cookbook\views\new.py:229 +msgid "The invitation is valid until " +msgstr "" + +#: .\cookbook\views\new.py:230 +msgid "" +"Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " +msgstr "" + +#: .\cookbook\views\new.py:233 +msgid "Tandoor Recipes Invite" +msgstr "" + +#: .\cookbook\views\new.py:240 +msgid "Invite link successfully send to user." +msgstr "" + +#: .\cookbook\views\new.py:243 +msgid "" +"You have send to many emails, please share the link manually or wait a few " +"hours." +msgstr "" + +#: .\cookbook\views\new.py:245 +msgid "Email to user could not be send, please share link manually." +msgstr "" + +#: .\cookbook\views\views.py:128 +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:176 +msgid "You do not have the required permissions to perform this action!" +msgstr "" + +#: .\cookbook\views\views.py:187 +msgid "Comment saved!" +msgstr "" + +#: .\cookbook\views\views.py:351 +msgid "You must select at least one field to search!" +msgstr "" + +#: .\cookbook\views\views.py:354 +msgid "" +"To use this search method you must select at least one full text search " +"field!" +msgstr "" + +#: .\cookbook\views\views.py:357 +msgid "Fuzzy search is not compatible with this search method!" +msgstr "" + +#: .\cookbook\views\views.py:437 +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:444 +msgid "Passwords dont match!" +msgstr "" + +#: .\cookbook\views\views.py:460 +msgid "User has been created, please login!" +msgstr "" + +#: .\cookbook\views\views.py:476 +msgid "Malformed Invite Link supplied!" +msgstr "" + +#: .\cookbook\views\views.py:483 +msgid "You are already member of a space and therefore cannot join this one." +msgstr "" + +#: .\cookbook\views\views.py:494 +msgid "Successfully joined space." +msgstr "" + +#: .\cookbook\views\views.py:500 +msgid "Invite Link not valid or already used!" +msgstr "" + +#: .\cookbook\views\views.py:564 +msgid "" +"Reporting share links is not enabled for this instance. Please notify the " +"page administrator to report problems." +msgstr "" + +#: .\cookbook\views\views.py:570 +msgid "" +"Recipe sharing link has been disabled! For additional information please " +"contact the page administrator." +msgstr "" diff --git a/cookbook/locale/sl/LC_MESSAGES/django.mo b/cookbook/locale/sl/LC_MESSAGES/django.mo new file mode 100644 index 00000000..cc60fc1a Binary files /dev/null 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 new file mode 100644 index 00000000..e0a3ffa0 --- /dev/null +++ b/cookbook/locale/sl/LC_MESSAGES/django.po @@ -0,0 +1,2609 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +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" +"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" + +#: .\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 "Sestavine" + +#: .\cookbook\forms.py:54 +msgid "Default unit" +msgstr "Privzeta enota" + +#: .\cookbook\forms.py:55 +msgid "Use fractions" +msgstr "Uporabi ulomke/frakcije" + +#: .\cookbook\forms.py:56 +msgid "Use KJ" +msgstr "Uporabi KJ" + +#: .\cookbook\forms.py:57 +msgid "Theme" +msgstr "Tema" + +#: .\cookbook\forms.py:58 +msgid "Navbar color" +msgstr "Barva navigacijske vrstice" + +#: .\cookbook\forms.py:59 +msgid "Sticky navbar" +msgstr "Lepljiva navigacijska vrstica" + +#: .\cookbook\forms.py:60 +msgid "Default page" +msgstr "Privzeta stran" + +#: .\cookbook\forms.py:61 +msgid "Show recent recipes" +msgstr "Prikaži nedavne recepte" + +#: .\cookbook\forms.py:62 +msgid "Search style" +msgstr "Vrsta iskalnika" + +#: .\cookbook\forms.py:63 +msgid "Plan sharing" +msgstr "Deli planer" + +#: .\cookbook\forms.py:64 +msgid "Ingredient decimal places" +msgstr "Decimalno mesto pri sestavini" + +#: .\cookbook\forms.py:65 +msgid "Shopping list auto sync period" +msgstr "Čas avtomatske sinhronizacije pri nakupovalnem listku" + +#: .\cookbook\forms.py:66 .\cookbook\templates\recipe_view.html:21 +#: .\cookbook\templates\space.html:62 .\cookbook\templates\stats.html:47 +msgid "Comments" +msgstr "Komentarji" + +#: .\cookbook\forms.py:70 +msgid "" +"Color of the top navigation bar. Not all colors work with all themes, just " +"try them out!" +msgstr "" +"Barva zgornje vrstice za krmarjenje. Ne delujejo vse barve z vsemi temami!" + +#: .\cookbook\forms.py:72 +msgid "Default Unit to be used when inserting a new ingredient into a recipe." +msgstr "" +"Privzeta enota, ki se uporablja pri vstavljanju nove sestavine v recept." + +#: .\cookbook\forms.py:74 +msgid "" +"Enables support for fractions in ingredient amounts (e.g. convert decimals " +"to fractions automatically)" +msgstr "" +"Omogoča podporo ulomkom/frakcijam v količinah sestavin (npr. samodejno " +"pretvori decimalke v ulomke)" + +#: .\cookbook\forms.py:76 +msgid "Display nutritional energy amounts in joules instead of calories" +msgstr "Prikazuj hranilne energijske količine v joules namesto v kalorijah" + +#: .\cookbook\forms.py:78 +msgid "" +"Users with whom newly created meal plan/shopping list entries should be " +"shared by default." +msgstr "" +"Uporabniki, s katerimi je privzeto deljen novo ustvarjen načrt ali " +"nakupovalni listek." + +#: .\cookbook\forms.py:80 +msgid "Show recently viewed recipes on search page." +msgstr "Prikaži nedavno videne recepte na iskalniku." + +#: .\cookbook\forms.py:81 +msgid "Number of decimals to round ingredients." +msgstr "Število decimalk, ki so zaokrožene pri sestavinah." + +#: .\cookbook\forms.py:82 +msgid "If you want to be able to create and see comments underneath recipes." +msgstr "V primeru, da želite ustvariti in videti komentarje pod recepti." + +#: .\cookbook\forms.py:84 +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. " +"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 "" +"Nastavitev na 0 bo onemogočila avtomatsko sinhronizacijo. V pogledu " +"nakupovalnega listka, se seznam osvežuje vsake toliko sekund, če nekdo drug " +"naredi spremembo. To je najbolj uporabno, če nakupovalni listek delimo z " +"večimi osebami. Paziti je potrebno, saj porabi nekaj podatkov v mobilnem " +"omrežju." + +#: .\cookbook\forms.py:87 +msgid "Makes the navbar stick to the top of the page." +msgstr "Nastavi navigacijsko vrstico na vrh strani." + +#: .\cookbook\forms.py:103 +msgid "" +"Both fields are optional. If none are given the username will be displayed " +"instead" +msgstr "" +"Obe polji sta opcijski. V primeru, da ju pustimo prazni bo prikazano " +"uporabniško ime" + +#: .\cookbook\forms.py:124 .\cookbook\forms.py:289 +#: .\cookbook\templates\url_import.html:158 +msgid "Name" +msgstr "Ime" + +#: .\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 "Ključne besede" + +#: .\cookbook\forms.py:126 +msgid "Preparation time in minutes" +msgstr "Priprava v minutah" + +#: .\cookbook\forms.py:127 +msgid "Waiting time (cooking/baking) in minutes" +msgstr "Čas čakanja v minutah" + +#: .\cookbook\forms.py:128 .\cookbook\forms.py:259 .\cookbook\forms.py:291 +msgid "Path" +msgstr "Pot" + +#: .\cookbook\forms.py:129 +msgid "Storage UID" +msgstr "UID shrambe" + +#: .\cookbook\forms.py:157 +msgid "Default" +msgstr "Privzeto" + +#: .\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 "" +"V primeru, da želite preprečiti dvojnike receptov z enakim imenom kot so " +"obstoječi. Če želite uvoziti vse, potrdite to polje." + +#: .\cookbook\forms.py:190 +msgid "Add your comment: " +msgstr "Dodaj komentar: " + +#: .\cookbook\forms.py:205 +msgid "Leave empty for dropbox and enter app password for nextcloud." +msgstr "Pusti prazno za dropbox in vnesi geslo za nextcloud." + +#: .\cookbook\forms.py:212 +msgid "Leave empty for nextcloud and enter api token for dropbox." +msgstr "Pusti prazno za nextcloud in vnesi API žeton za dropbox." + +#: .\cookbook\forms.py:221 +msgid "" +"Leave empty for dropbox and enter only base url for nextcloud (/remote." +"php/webdav/ is added automatically)" +msgstr "" +"Pusti prazno za dropbox in vnesi URL za nextcloud (/remote.php/webdav/" +" je dodano avtomatsko)" + +#: .\cookbook\forms.py:258 .\cookbook\views\edit.py:166 +msgid "Storage" +msgstr "Shramba" + +#: .\cookbook\forms.py:260 +msgid "Active" +msgstr "Aktivno" + +#: .\cookbook\forms.py:265 +msgid "Search String" +msgstr "Iskalni niz" + +#: .\cookbook\forms.py:292 +msgid "File ID" +msgstr "ID datoteke" + +#: .\cookbook\forms.py:313 +msgid "You must provide at least a recipe or a title." +msgstr "Vpisati moraš vsaj recept ali naslov." + +#: .\cookbook\forms.py:326 +msgid "You can list default users to share recipes with in the settings." +msgstr "Seznam uporabnikov za deljenje receptov lahko vidiš v nastavitvah." + +#: .\cookbook\forms.py:327 +msgid "" +"You can use markdown to format this field. See the docs here" +msgstr "" +"Lahko uporabiš \"markdown\", da urediš to polje. Preveri tukaj" + +#: .\cookbook\forms.py:353 +msgid "Maximum number of users for this space reached." +msgstr "Maksimalno število uporabnikov za ta prostor je doseženo." + +#: .\cookbook\forms.py:359 +msgid "Email address already taken!" +msgstr "Email naslov je že v uporabi!" + +#: .\cookbook\forms.py:367 +msgid "" +"An email address is not required but if present the invite link will be sent " +"to the user." +msgstr "" +"E-poštni naslov ni potreben, vendar če je vnešeno, bo povabilo poslano do " +"uporabnika." + +#: .\cookbook\forms.py:382 +msgid "Name already taken." +msgstr "Ime je že zasedeno." + +#: .\cookbook\forms.py:393 +msgid "Accept Terms and Privacy" +msgstr "Sprejmi pogoje uporabe" + +#: .\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 "" +"Določa, kakšno je iskanje, če uporablja trigram podobnost ujemanje (npr. " +"nizke vrednosti pomenijo več, tipkanje se prezre)." + +#: .\cookbook\forms.py:435 +msgid "" +"Select type method of search. Click here for " +"full desciption of choices." +msgstr "" +"Izberi metodo iskanja. Klikni tukaj za " +"prikaz vseh izbir." + +#: .\cookbook\forms.py:436 +msgid "" +"Use fuzzy matching on units, keywords and ingredients when editing and " +"importing recipes." +msgstr "" +"Pri urejanju in uvozu receptov uporabite mehka ujemanja na enotah, ključnih " +"besedah in sestavinah." + +#: .\cookbook\forms.py:438 +msgid "" +"Fields to search ignoring accents. Selecting this option can improve or " +"degrade search quality depending on language" +msgstr "" +"Polja za iskanje prezrtih naglasov. Če izberete to možnost, lahko izboljšate " +"ali poslabšate kakovost iskanja, odvisno od jezika" + +#: .\cookbook\forms.py:440 +msgid "" +"Fields to search for partial matches. (e.g. searching for 'Pie' will return " +"'pie' and 'piece' and 'soapie')" +msgstr "" +"Polja za iskanje delnih ujemajev. (npr. iskanje \"Pie\" vrne \"pie\" in " +"\"piece\" in \"soapie\")" + +#: .\cookbook\forms.py:442 +msgid "" +"Fields to search for beginning of word matches. (e.g. searching for 'sa' " +"will return 'salad' and 'sandwich')" +msgstr "" +"Polja za iskanje začetka ujemanja besed. (npr. iskanje \"sa\" vrne \"salad\" " +"in \"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 "" +"Polja za \"mehko\" iskanje. (npr. iskanje \"recpie\" bo našlo \"recipe\".)" + +#: .\cookbook\forms.py:446 +msgid "" +"Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " +"only function with fulltext fields." +msgstr "" + +#: .\cookbook\forms.py:450 +msgid "Search Method" +msgstr "" + +#: .\cookbook\forms.py:451 +msgid "Fuzzy Lookups" +msgstr "" + +#: .\cookbook\forms.py:452 +msgid "Ignore Accent" +msgstr "" + +#: .\cookbook\forms.py:453 +msgid "Partial Match" +msgstr "" + +#: .\cookbook\forms.py:454 +msgid "Starts Wtih" +msgstr "" + +#: .\cookbook\forms.py:455 +msgid "Fuzzy Search" +msgstr "" + +#: .\cookbook\forms.py:456 +msgid "Full Text" +msgstr "" + +#: .\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 "" + +#: .\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 "" + +#: .\cookbook\helper\permission_helper.py:140 +#: .\cookbook\helper\permission_helper.py:146 +#: .\cookbook\helper\permission_helper.py:171 +#: .\cookbook\helper\permission_helper.py:216 +#: .\cookbook\helper\permission_helper.py:230 +#: .\cookbook\helper\permission_helper.py:241 +#: .\cookbook\helper\permission_helper.py:252 .\cookbook\views\data.py:47 +#: .\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 "" + +#: .\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 "" + +#: .\cookbook\helper\template_helper.py:61 +#: .\cookbook\helper\template_helper.py:63 +msgid "Could not parse template code." +msgstr "" + +#: .\cookbook\integration\integration.py:126 +#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 +#: .\cookbook\templates\import_response.html:7 +#: .\cookbook\templates\test.html:14 .\cookbook\templates\test.html:20 +#: .\cookbook\templates\url_import.html:27 +#: .\cookbook\templates\url_import.html:105 +#: .\cookbook\templates\url_import.html:127 +#: .\cookbook\templates\url_import.html:321 +#: .\cookbook\templates\url_import.html:609 .\cookbook\views\delete.py:89 +#: .\cookbook\views\edit.py:200 +msgid "Import" +msgstr "" + +#: .\cookbook\integration\integration.py:208 +msgid "" +"Importer expected a .zip file. Did you choose the correct importer type for " +"your data ?" +msgstr "" + +#: .\cookbook\integration\integration.py:211 +msgid "" +"An unexpected error occurred during the import. Please make sure you have " +"uploaded a valid file." +msgstr "" + +#: .\cookbook\integration\integration.py:216 +msgid "The following recipes were ignored because they already existed:" +msgstr "" + +#: .\cookbook\integration\integration.py:220 +#, python-format +msgid "Imported %s recipes." +msgstr "" + +#: .\cookbook\integration\paprika.py:46 +msgid "Notes" +msgstr "" + +#: .\cookbook\integration\paprika.py:49 +msgid "Nutritional Information" +msgstr "" + +#: .\cookbook\integration\paprika.py:53 .\cookbook\templates\url_import.html:40 +msgid "Source" +msgstr "" + +#: .\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 "Porcije" + +#: .\cookbook\integration\safron.py:25 +msgid "Waiting time" +msgstr "" + +#: .\cookbook\integration\safron.py:27 +msgid "Preparation Time" +msgstr "Čas Priprave" + +#: .\cookbook\integration\safron.py:29 .\cookbook\templates\base.html:78 +#: .\cookbook\templates\forms\ingredients.html:7 +#: .\cookbook\templates\index.html:7 +msgid "Cookbook" +msgstr "" + +#: .\cookbook\integration\safron.py:31 +msgid "Section" +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:14 +msgid "Rebuilds full text search index on Recipe" +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:18 +msgid "Only Postgress databases use full text search, no index to rebuild" +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:29 +msgid "Recipe index rebuild complete." +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:31 +msgid "Recipe index rebuild failed." +msgstr "" + +#: .\cookbook\migrations\0047_auto_20200602_1133.py:14 +msgid "Breakfast" +msgstr "Zajtrk" + +#: .\cookbook\migrations\0047_auto_20200602_1133.py:19 +msgid "Lunch" +msgstr "Kosilo" + +#: .\cookbook\migrations\0047_auto_20200602_1133.py:24 +msgid "Dinner" +msgstr "Večerja" + +#: .\cookbook\migrations\0047_auto_20200602_1133.py:29 +msgid "Other" +msgstr "Ostalo" + +#: .\cookbook\models.py:150 +msgid "" +"Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " +"upload." +msgstr "" + +#: .\cookbook\models.py:202 .\cookbook\templates\search.html:7 +#: .\cookbook\templates\shopping_list.html:59 +msgid "Search" +msgstr "" + +#: .\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 "" + +#: .\cookbook\models.py:204 .\cookbook\templates\base.html:90 +msgid "Books" +msgstr "Knjige" + +#: .\cookbook\models.py:212 +msgid "Small" +msgstr "" + +#: .\cookbook\models.py:212 +msgid "Large" +msgstr "" + +#: .\cookbook\models.py:212 .\cookbook\templates\generic\new_template.html:6 +#: .\cookbook\templates\generic\new_template.html:14 +msgid "New" +msgstr "" + +#: .\cookbook\models.py:396 +msgid " is part of a recipe step and cannot be deleted" +msgstr "" + +#: .\cookbook\models.py:441 .\cookbook\templates\url_import.html:42 +msgid "Text" +msgstr "" + +#: .\cookbook\models.py:441 +msgid "Time" +msgstr "" + +#: .\cookbook\models.py:441 .\cookbook\templates\url_import.html:44 +msgid "File" +msgstr "" + +#: .\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 "Recept" + +#: .\cookbook\models.py:871 .\cookbook\templates\search_info.html:28 +msgid "Simple" +msgstr "" + +#: .\cookbook\models.py:872 .\cookbook\templates\search_info.html:33 +msgid "Phrase" +msgstr "" + +#: .\cookbook\models.py:873 .\cookbook\templates\search_info.html:38 +msgid "Web" +msgstr "" + +#: .\cookbook\models.py:874 .\cookbook\templates\search_info.html:47 +msgid "Raw" +msgstr "" + +#: .\cookbook\models.py:912 +msgid "Food Alias" +msgstr "" + +#: .\cookbook\models.py:912 +msgid "Unit Alias" +msgstr "" + +#: .\cookbook\models.py:912 +msgid "Keyword Alias" +msgstr "" + +#: .\cookbook\serializer.py:157 +msgid "File uploads are not enabled for this Space." +msgstr "" + +#: .\cookbook\serializer.py:168 +msgid "You have reached your file upload limit." +msgstr "" + +#: .\cookbook\tables.py:35 .\cookbook\templates\generic\edit_template.html:6 +#: .\cookbook\templates\generic\edit_template.html:14 +#: .\cookbook\templates\recipes_table.html:82 +#: .\cookbook\templates\shopping_list.html:40 +#: .\cookbook\templates\space.html:90 +msgid "Edit" +msgstr "Uredi" + +#: .\cookbook\tables.py:115 .\cookbook\tables.py:138 +#: .\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 "Izbriši" + +#: .\cookbook\templates\404.html:5 +msgid "404 Error" +msgstr "" + +#: .\cookbook\templates\404.html:18 +msgid "The page you are looking for could not be found." +msgstr "" + +#: .\cookbook\templates\404.html:33 +msgid "Take me Home" +msgstr "" + +#: .\cookbook\templates\404.html:35 +msgid "Report a Bug" +msgstr "Prijavi Napako" + +#: .\cookbook\templates\account\email.html:6 +#: .\cookbook\templates\account\email.html:17 +msgid "E-mail Addresses" +msgstr "E-mail Naslovi" + +#: .\cookbook\templates\account\email.html:12 +#: .\cookbook\templates\account\password_change.html:11 +#: .\cookbook\templates\account\password_set.html:11 +#: .\cookbook\templates\base.html:257 .\cookbook\templates\settings.html:6 +#: .\cookbook\templates\settings.html:17 +#: .\cookbook\templates\socialaccount\connections.html:10 +msgid "Settings" +msgstr "Nastavitve" + +#: .\cookbook\templates\account\email.html:13 +msgid "Email" +msgstr "" + +#: .\cookbook\templates\account\email.html:19 +msgid "The following e-mail addresses are associated with your account:" +msgstr "" + +#: .\cookbook\templates\account\email.html:36 +msgid "Verified" +msgstr "" + +#: .\cookbook\templates\account\email.html:38 +msgid "Unverified" +msgstr "" + +#: .\cookbook\templates\account\email.html:40 +msgid "Primary" +msgstr "" + +#: .\cookbook\templates\account\email.html:47 +msgid "Make Primary" +msgstr "" + +#: .\cookbook\templates\account\email.html:49 +msgid "Re-send Verification" +msgstr "" + +#: .\cookbook\templates\account\email.html:50 +#: .\cookbook\templates\generic\delete_template.html:56 +#: .\cookbook\templates\socialaccount\connections.html:44 +msgid "Remove" +msgstr "" + +#: .\cookbook\templates\account\email.html:58 +msgid "Warning:" +msgstr "Opozorilo:" + +#: .\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 "" + +#: .\cookbook\templates\account\email.html:64 +msgid "Add E-mail Address" +msgstr "" + +#: .\cookbook\templates\account\email.html:69 +msgid "Add E-mail" +msgstr "Dodaj E-mail" + +#: .\cookbook\templates\account\email.html:79 +msgid "Do you really want to remove the selected e-mail address?" +msgstr "" + +#: .\cookbook\templates\account\email_confirm.html:6 +#: .\cookbook\templates\account\email_confirm.html:10 +msgid "Confirm E-mail Address" +msgstr "" + +#: .\cookbook\templates\account\email_confirm.html:16 +#, python-format +msgid "" +"Please confirm that\n" +" %(email)s is an e-mail address " +"for user %(user_display)s\n" +" ." +msgstr "" + +#: .\cookbook\templates\account\email_confirm.html:22 +#: .\cookbook\templates\generic\delete_template.html:71 +msgid "Confirm" +msgstr "" + +#: .\cookbook\templates\account\email_confirm.html:29 +#, python-format +msgid "" +"This e-mail confirmation link expired or is invalid. Please\n" +" issue a new e-mail confirmation " +"request." +msgstr "" + +#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:289 +msgid "Login" +msgstr "Prijava" + +#: .\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 "" + +#: .\cookbook\templates\account\login.html:32 +#: .\cookbook\templates\socialaccount\signup.html:8 +#: .\cookbook\templates\socialaccount\signup.html:57 +msgid "Sign Up" +msgstr "" + +#: .\cookbook\templates\account\login.html:36 +#: .\cookbook\templates\account\login.html:37 +#: .\cookbook\templates\account\password_reset.html:29 +msgid "Reset My Password" +msgstr "" + +#: .\cookbook\templates\account\login.html:37 +msgid "Lost your password?" +msgstr "" + +#: .\cookbook\templates\account\login.html:48 +msgid "Social Login" +msgstr "" + +#: .\cookbook\templates\account\login.html:49 +msgid "You can use any of the following providers to sign in." +msgstr "" + +#: .\cookbook\templates\account\logout.html:5 +#: .\cookbook\templates\account\logout.html:9 +#: .\cookbook\templates\account\logout.html:18 +msgid "Sign Out" +msgstr "Odjava" + +#: .\cookbook\templates\account\logout.html:11 +msgid "Are you sure you want to sign out?" +msgstr "" + +#: .\cookbook\templates\account\password_change.html:6 +#: .\cookbook\templates\account\password_change.html:16 +#: .\cookbook\templates\account\password_change.html:21 +#: .\cookbook\templates\account\password_reset_from_key.html:7 +#: .\cookbook\templates\account\password_reset_from_key.html:13 +#: .\cookbook\templates\account\password_reset_from_key_done.html:7 +#: .\cookbook\templates\account\password_reset_from_key_done.html:13 +msgid "Change Password" +msgstr "" + +#: .\cookbook\templates\account\password_change.html:12 +#: .\cookbook\templates\account\password_set.html:12 +#: .\cookbook\templates\settings.html:69 +msgid "Password" +msgstr "" + +#: .\cookbook\templates\account\password_change.html:22 +msgid "Forgot Password?" +msgstr "" + +#: .\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 "" + +#: .\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 "" + +#: .\cookbook\templates\account\password_reset.html:32 +msgid "Password reset is disabled on this instance." +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\account\password_reset_from_key.html:13 +msgid "Bad Token" +msgstr "" + +#: .\cookbook\templates\account\password_reset_from_key.html:25 +#, python-format +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used.\n" +" Please request a new " +"password reset." +msgstr "" + +#: .\cookbook\templates\account\password_reset_from_key.html:33 +msgid "change password" +msgstr "" + +#: .\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 "" + +#: .\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 "" + +#: .\cookbook\templates\account\signup.html:6 +msgid "Register" +msgstr "" + +#: .\cookbook\templates\account\signup.html:12 +msgid "Create an Account" +msgstr "" + +#: .\cookbook\templates\account\signup.html:42 +#: .\cookbook\templates\socialaccount\signup.html:33 +msgid "I accept the follwoing" +msgstr "" + +#: .\cookbook\templates\account\signup.html:45 +#: .\cookbook\templates\socialaccount\signup.html:36 +msgid "Terms and Conditions" +msgstr "" + +#: .\cookbook\templates\account\signup.html:48 +#: .\cookbook\templates\socialaccount\signup.html:39 +msgid "and" +msgstr "" + +#: .\cookbook\templates\account\signup.html:52 +#: .\cookbook\templates\socialaccount\signup.html:43 +msgid "Privacy Policy" +msgstr "" + +#: .\cookbook\templates\account\signup.html:65 +msgid "Create User" +msgstr "" + +#: .\cookbook\templates\account\signup.html:69 +msgid "Already have an account?" +msgstr "" + +#: .\cookbook\templates\account\signup_closed.html:5 +#: .\cookbook\templates\account\signup_closed.html:11 +msgid "Sign Up Closed" +msgstr "" + +#: .\cookbook\templates\account\signup_closed.html:13 +msgid "We are sorry, but the sign up is currently closed." +msgstr "" + +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:279 +#: .\cookbook\templates\rest_framework\api.html:11 +msgid "API Documentation" +msgstr "" + +#: .\cookbook\templates\base.html:86 +msgid "Shopping" +msgstr "" + +#: .\cookbook\templates\base.html:113 +msgid "Keyword" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\base.html:151 +#: .\cookbook\templates\shopping_list.html:237 +#: .\cookbook\templates\supermarket.html:7 +msgid "Supermarket" +msgstr "" + +#: .\cookbook\templates\base.html:163 +msgid "Supermarket Category" +msgstr "" + +#: .\cookbook\templates\base.html:175 .\cookbook\views\lists.py:195 +msgid "Automations" +msgstr "" + +#: .\cookbook\templates\base.html:189 .\cookbook\views\lists.py:215 +msgid "Files" +msgstr "" + +#: .\cookbook\templates\base.html:201 +msgid "Batch Edit" +msgstr "" + +#: .\cookbook\templates\base.html:213 .\cookbook\templates\history.html:6 +#: .\cookbook\templates\history.html:14 +msgid "History" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\base.html:244 .\cookbook\templates\index.html:47 +msgid "Import Recipe" +msgstr "" + +#: .\cookbook\templates\base.html:246 +#: .\cookbook\templates\shopping_list.html:195 +#: .\cookbook\templates\shopping_list.html:217 +msgid "Create" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\base.html:262 .\cookbook\templates\space.html:7 +#: .\cookbook\templates\space.html:19 +msgid "Space Settings" +msgstr "" + +#: .\cookbook\templates\base.html:267 .\cookbook\templates\system.html:13 +msgid "System" +msgstr "" + +#: .\cookbook\templates\base.html:269 +msgid "Admin" +msgstr "" + +#: .\cookbook\templates\base.html:273 +msgid "Markdown Guide" +msgstr "" + +#: .\cookbook\templates\base.html:275 +msgid "GitHub" +msgstr "" + +#: .\cookbook\templates\base.html:277 +msgid "Translate Tandoor" +msgstr "" + +#: .\cookbook\templates\base.html:281 +msgid "API Browser" +msgstr "" + +#: .\cookbook\templates\base.html:284 +msgid "Log out" +msgstr "" + +#: .\cookbook\templates\batch\edit.html:6 +msgid "Batch edit Category" +msgstr "" + +#: .\cookbook\templates\batch\edit.html:15 +msgid "Batch edit Recipes" +msgstr "" + +#: .\cookbook\templates\batch\edit.html:20 +msgid "Add the specified keywords to all recipes containing a word" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:82 +msgid "Sync" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:10 +msgid "Manage watched Folders" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:14 +msgid "" +"On this Page you can manage all storage folder locations that should be " +"monitored and synced." +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:16 +msgid "The path must be in the following format" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:20 +#: .\cookbook\templates\forms\edit_import_recipe.html:14 +#: .\cookbook\templates\generic\edit_template.html:23 +#: .\cookbook\templates\generic\new_template.html:23 +#: .\cookbook\templates\include\log_cooking.html:28 +#: .\cookbook\templates\settings.html:63 .\cookbook\templates\settings.html:105 +#: .\cookbook\templates\settings.html:123 +#: .\cookbook\templates\settings.html:195 +#: .\cookbook\templates\shopping_list.html:360 +msgid "Save" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:21 +msgid "Manage External Storage" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:28 +msgid "Sync Now!" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:29 +msgid "Show Recipes" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:30 +msgid "Show Log" +msgstr "" + +#: .\cookbook\templates\batch\waiting.html:4 +#: .\cookbook\templates\batch\waiting.html:10 +msgid "Importing Recipes" +msgstr "" + +#: .\cookbook\templates\batch\waiting.html:28 +msgid "" +"This can take a few minutes, depending on the number of recipes in sync, " +"please wait." +msgstr "" + +#: .\cookbook\templates\books.html:7 +msgid "Recipe Books" +msgstr "" + +#: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6 +msgid "Export Recipes" +msgstr "" + +#: .\cookbook\templates\forms\edit_import_recipe.html:5 +#: .\cookbook\templates\forms\edit_import_recipe.html:9 +msgid "Import new Recipe" +msgstr "" + +#: .\cookbook\templates\forms\edit_internal_recipe.html:7 +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 " +msgstr "" + +#: .\cookbook\templates\generic\delete_template.html:26 +msgid "Protected" +msgstr "" + +#: .\cookbook\templates\generic\delete_template.html:41 +msgid "Cascade" +msgstr "" + +#: .\cookbook\templates\generic\delete_template.html:72 +msgid "Cancel" +msgstr "" + +#: .\cookbook\templates\generic\edit_template.html:32 +msgid "View" +msgstr "" + +#: .\cookbook\templates\generic\edit_template.html:36 +msgid "Delete original file" +msgstr "" + +#: .\cookbook\templates\generic\list_template.html:6 +#: .\cookbook\templates\generic\list_template.html:21 +msgid "List" +msgstr "" + +#: .\cookbook\templates\generic\list_template.html:34 +msgid "Filter" +msgstr "" + +#: .\cookbook\templates\generic\list_template.html:39 +msgid "Import all" +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 "" + +#: .\cookbook\templates\history.html:20 +msgid "View Log" +msgstr "" + +#: .\cookbook\templates\history.html:24 +msgid "Cook Log" +msgstr "" + +#: .\cookbook\templates\import.html:6 .\cookbook\templates\test.html:6 +msgid "Import Recipes" +msgstr "" + +#: .\cookbook\templates\include\log_cooking.html:7 +msgid "Log Recipe Cooking" +msgstr "" + +#: .\cookbook\templates\include\log_cooking.html:13 +msgid "All fields are optional and can be left empty." +msgstr "" + +#: .\cookbook\templates\include\log_cooking.html:19 +msgid "Rating" +msgstr "" + +#: .\cookbook\templates\include\log_cooking.html:27 +#: .\cookbook\templates\include\recipe_open_modal.html:18 +msgid "Close" +msgstr "Zapri" + +#: .\cookbook\templates\include\recipe_open_modal.html:32 +msgid "Open Recipe" +msgstr "" + +#: .\cookbook\templates\include\storage_backend_warning.html:4 +msgid "Security Warning" +msgstr "" + +#: .\cookbook\templates\include\storage_backend_warning.html:5 +msgid "" +"\n" +" The Password and Token field are stored as plain text " +"inside the database.\n" +" This is necessary because they are needed to make API requests, but " +"it also increases the risk of\n" +" someone stealing it.
\n" +" To limit the possible damage tokens or accounts with limited access " +"can be used.\n" +" " +msgstr "" + +#: .\cookbook\templates\index.html:29 +msgid "Search recipe ..." +msgstr "" + +#: .\cookbook\templates\index.html:44 +msgid "New Recipe" +msgstr "Nov Recept" + +#: .\cookbook\templates\index.html:53 +msgid "Advanced Search" +msgstr "" + +#: .\cookbook\templates\index.html:57 +msgid "Reset Search" +msgstr "" + +#: .\cookbook\templates\index.html:85 +msgid "Last viewed" +msgstr "" + +#: .\cookbook\templates\index.html:87 .\cookbook\templates\space.html:35 +#: .\cookbook\templates\stats.html:22 +msgid "Recipes" +msgstr "" + +#: .\cookbook\templates\index.html:94 +msgid "Log in to view recipes" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:5 +#: .\cookbook\templates\markdown_info.html:13 +msgid "Markdown Info" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:14 +msgid "" +"\n" +" Markdown is lightweight markup language that can be used to format " +"plain text easily.\n" +" This site uses the Python Markdown library to\n" +" convert your text into nice looking HTML. Its full markdown " +"documentation can be found\n" +" here.\n" +" An incomplete but most likely sufficient documentation can be found " +"below.\n" +" " +msgstr "" + +#: .\cookbook\templates\markdown_info.html:25 +msgid "Headers" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:54 +msgid "Formatting" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\markdown_info.html:57 +#: .\cookbook\templates\markdown_info.html:73 +msgid "or by leaving a blank line inbetween." +msgstr "" + +#: .\cookbook\templates\markdown_info.html:59 +#: .\cookbook\templates\markdown_info.html:74 +msgid "This text is bold" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:60 +#: .\cookbook\templates\markdown_info.html:75 +msgid "This text is italic" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:61 +#: .\cookbook\templates\markdown_info.html:77 +msgid "Blockquotes are also possible" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:84 +msgid "Lists" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:85 +msgid "" +"Lists can ordered or unorderd. It is important to leave a blank line " +"before the list!" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:87 +#: .\cookbook\templates\markdown_info.html:108 +msgid "Ordered List" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:89 +#: .\cookbook\templates\markdown_info.html:90 +#: .\cookbook\templates\markdown_info.html:91 +#: .\cookbook\templates\markdown_info.html:110 +#: .\cookbook\templates\markdown_info.html:111 +#: .\cookbook\templates\markdown_info.html:112 +msgid "unordered list item" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:93 +#: .\cookbook\templates\markdown_info.html:114 +msgid "Unordered List" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:95 +#: .\cookbook\templates\markdown_info.html:96 +#: .\cookbook\templates\markdown_info.html:97 +#: .\cookbook\templates\markdown_info.html:116 +#: .\cookbook\templates\markdown_info.html:117 +#: .\cookbook\templates\markdown_info.html:118 +msgid "ordered list item" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:125 +msgid "Images & Links" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\markdown_info.html:132 +#: .\cookbook\templates\markdown_info.html:145 +msgid "This will become an image" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:152 +msgid "Tables" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:153 +msgid "" +"Markdown tables are hard to create by hand. It is recommended to use a table " +"editor like this one." +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\markdown_info.html:155 +#: .\cookbook\templates\markdown_info.html:172 +msgid "Header" +msgstr "" + +#: .\cookbook\templates\markdown_info.html:157 +#: .\cookbook\templates\markdown_info.html:178 +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 +#: .\cookbook\templates\shopping_list.html:261 +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" +msgstr "" + +#: .\cookbook\templates\no_groups_info.html:17 +msgid "You do not have any groups and therefor cannot use this application." +msgstr "" + +#: .\cookbook\templates\no_groups_info.html:18 +#: .\cookbook\templates\no_perm_info.html:15 +msgid "Please contact your administrator." +msgstr "" + +#: .\cookbook\templates\no_perm_info.html:5 +#: .\cookbook\templates\no_perm_info.html:12 +msgid "No Permission" +msgstr "" + +#: .\cookbook\templates\no_perm_info.html:15 +msgid "" +"You do not have the required permissions to view this page or perform this " +"action." +msgstr "" + +#: .\cookbook\templates\no_space_info.html:6 +#: .\cookbook\templates\no_space_info.html:13 +msgid "No Space" +msgstr "" + +#: .\cookbook\templates\no_space_info.html:17 +msgid "" +"Recipes, foods, shopping lists and more are organized in spaces of one or " +"more people." +msgstr "" + +#: .\cookbook\templates\no_space_info.html:18 +msgid "" +"You can either be invited into an existing space or create your own one." +msgstr "" + +#: .\cookbook\templates\no_space_info.html:31 +#: .\cookbook\templates\no_space_info.html:40 +msgid "Join Space" +msgstr "" + +#: .\cookbook\templates\no_space_info.html:34 +msgid "Join an existing space." +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\no_space_info.html:48 +#: .\cookbook\templates\no_space_info.html:56 +msgid "Create Space" +msgstr "" + +#: .\cookbook\templates\no_space_info.html:51 +msgid "Create your own recipe space." +msgstr "" + +#: .\cookbook\templates\no_space_info.html:52 +msgid "Start your own recipe space and invite other users to it." +msgstr "" + +#: .\cookbook\templates\offline.html:6 +msgid "Offline" +msgstr "" + +#: .\cookbook\templates\offline.html:19 +msgid "You are currently offline!" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\recipe_view.html:26 +msgid "by" +msgstr "" + +#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:147 +#: .\cookbook\views\edit.py:180 +msgid "Comment" +msgstr "Komentar" + +#: .\cookbook\templates\recipes_table.html:19 +#: .\cookbook\templates\recipes_table.html:23 +#: .\cookbook\templates\url_import.html:444 +msgid "Recipe Image" +msgstr "" + +#: .\cookbook\templates\recipes_table.html:51 +#: .\cookbook\templates\url_import.html:449 +msgid "Preparation time ca." +msgstr "" + +#: .\cookbook\templates\recipes_table.html:57 +#: .\cookbook\templates\url_import.html:454 +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:165 +msgid "Search Settings" +msgstr "" + +#: .\cookbook\templates\search_info.html:10 +msgid "" +"\n" +" Creating the best search experience is complicated and weighs " +"heavily on your personal configuration. \n" +" Changing any of the search settings can have significant impact on " +"the speed and quality of the results.\n" +" Search Methods, Trigrams and Full Text Search configurations are " +"only available if you are using Postgres for your database.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:19 +msgid "Search Methods" +msgstr "" + +#: .\cookbook\templates\search_info.html:23 +msgid "" +" \n" +" Full text searches attempt to normalize the words provided to " +"match common variants. For example: 'forked', 'forking', 'forks' will all " +"normalize to 'fork'.\n" +" There are several methods available, described below, that will " +"control how the search behavior should react when multiple words are " +"searched.\n" +" Full technical details on how these operate can be viewed on Postgresql's website.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:29 +msgid "" +" \n" +" Simple searches ignore punctuation and common words such as " +"'the', 'a', 'and'. And will treat seperate words as required.\n" +" Searching for 'apple or flour' will return any recipe that " +"includes both 'apple' and 'flour' anywhere in the fields that have been " +"selected for a full text search.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:34 +msgid "" +" \n" +" Phrase searches ignore punctuation, but will search for all of " +"the words in the exact order provided.\n" +" Searching for 'apple or flour' will only return a recipe that " +"includes the exact phrase 'apple or flour' in any of the fields that have " +"been selected for a full text search.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:39 +msgid "" +" \n" +" Web searches simulate functionality found on many web search " +"sites supporting special syntax.\n" +" Placing quotes around several words will convert those words " +"into a phrase.\n" +" 'or' is recongized as searching for the word (or phrase) " +"immediately before 'or' OR the word (or phrase) directly after.\n" +" '-' is recognized as searching for recipes that do not include " +"the word (or phrase) that comes immediately after. \n" +" For example searching for 'apple pie' or cherry -butter will " +"return any recipe that includes the phrase 'apple pie' or the word " +"'cherry' \n" +" in any field included in the full text search but exclude any " +"recipe that has the word 'butter' in any field included.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:48 +msgid "" +" \n" +" Raw search is similar to Web except will take puncuation " +"operators such as '|', '&' and '()'\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:59 +msgid "" +" \n" +" Another approach to searching that also requires Postgresql is " +"fuzzy search or trigram similarity. A trigram is a group of three " +"consecutive characters.\n" +" For example searching for 'apple' will create x trigrams 'app', " +"'ppl', 'ple' and will create a score of how closely words match the " +"generated trigrams.\n" +" One benefit of searching trigams is that a search for 'sandwich' " +"will find mispelled words such as 'sandwhich' that would be missed by other " +"methods.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:69 +msgid "Search Fields" +msgstr "" + +#: .\cookbook\templates\search_info.html:73 +msgid "" +" \n" +" Unaccent is a special case in that it enables searching a field " +"'unaccented' for each search style attempting to ignore accented values. \n" +" For example when you enable unaccent for 'Name' any search " +"(starts with, contains, trigram) will attempt the search ignoring accented " +"characters.\n" +" \n" +" For the other options, you can enable search on any or all " +"fields and they will be combined together with an assumed 'OR'.\n" +" For example enabling 'Name' for Starts With, 'Name' and " +"'Description' for Partial Match and 'Ingredients' and 'Keywords' for Full " +"Search\n" +" and searching for 'apple' will generate a search that will " +"return recipes that have:\n" +" - A recipe name that starts with 'apple'\n" +" - OR a recipe name that contains 'apple'\n" +" - OR a recipe description that contains 'apple'\n" +" - OR a recipe that will have a full text search match ('apple' " +"or 'apples') in ingredients\n" +" - OR a recipe that will have a full text search match in " +"Keywords\n" +"\n" +" Combining too many fields in too many types of search can have a " +"negative impact on performance, create duplicate results or return " +"unexpected results.\n" +" For example, enabling fuzzy search or partial matches will " +"interfere with web search methods. \n" +" Searching for 'apple -pie' with fuzzy search and full text " +"search will return the recipe Apple Pie. Though it is not included in the " +"full text results, it does match the trigram results.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:95 +msgid "Search Index" +msgstr "" + +#: .\cookbook\templates\search_info.html:99 +msgid "" +" \n" +" Trigram search and Full Text Search both rely on database " +"indexes to perform effectively. \n" +" You can rebuild the indexes on all fields in the Admin page for " +"Recipes and selecting all recipes and running 'rebuild index for selected " +"recipes'\n" +" You can also rebuild indexes at the command line by executing " +"the management command 'python manage.py rebuildindex'\n" +" " +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:58 +msgid "Name Settings" +msgstr "" + +#: .\cookbook\templates\settings.html:66 +msgid "Account Settings" +msgstr "" + +#: .\cookbook\templates\settings.html:68 +msgid "Emails" +msgstr "" + +#: .\cookbook\templates\settings.html:71 +#: .\cookbook\templates\socialaccount\connections.html:11 +msgid "Social" +msgstr "" + +#: .\cookbook\templates\settings.html:84 +msgid "Language" +msgstr "Jezik" + +#: .\cookbook\templates\settings.html:114 +msgid "Style" +msgstr "" + +#: .\cookbook\templates\settings.html:135 +msgid "API Token" +msgstr "" + +#: .\cookbook\templates\settings.html:136 +msgid "" +"You can use both basic authentication and token based authentication to " +"access the REST API." +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\settings.html:155 +msgid "or" +msgstr "" + +#: .\cookbook\templates\settings.html:166 +msgid "" +"There are many options to configure the search depending on your personal " +"preferences." +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\settings.html:168 +msgid "" +"If you do want to configure the search you can read about the different " +"options here." +msgstr "" + +#: .\cookbook\templates\settings.html:173 +msgid "Fuzzy" +msgstr "" + +#: .\cookbook\templates\settings.html:174 +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:175 +msgid "This is the default behavior" +msgstr "" + +#: .\cookbook\templates\settings.html:176 +#: .\cookbook\templates\settings.html:184 +msgid "Apply" +msgstr "" + +#: .\cookbook\templates\settings.html:181 +msgid "Precise" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\settings.html:183 +msgid "Perfect for large Databases" +msgstr "" + +#: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5 +msgid "Cookbook Setup" +msgstr "" + +#: .\cookbook\templates\setup.html:14 +msgid "Setup" +msgstr "" + +#: .\cookbook\templates\setup.html:15 +msgid "" +"To start using this application you must first create a superuser account." +msgstr "" + +#: .\cookbook\templates\setup.html:20 +msgid "Create Superuser account" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:7 +#: .\cookbook\templates\shopping_list.html:29 +#: .\cookbook\templates\shopping_list.html:721 +msgid "Shopping List" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:34 +msgid "Try the new shopping list" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:63 +msgid "Search Recipe" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:86 +msgid "Shopping Recipes" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:90 +msgid "No recipes selected" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:157 +msgid "Entry Mode" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:165 +msgid "Add Entry" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:181 +msgid "Amount" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:194 +msgid "Select Unit" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:196 +#: .\cookbook\templates\shopping_list.html:218 +#: .\cookbook\templates\shopping_list.html:248 +#: .\cookbook\templates\shopping_list.html:272 +#: .\cookbook\templates\url_import.html:500 +#: .\cookbook\templates\url_import.html:532 +msgid "Select" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:216 +msgid "Select Food" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:247 +msgid "Select Supermarket" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:271 +msgid "Select User" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:290 +msgid "Finished" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:303 +msgid "You are offline, shopping list might not syncronize." +msgstr "" + +#: .\cookbook\templates\shopping_list.html:368 +msgid "Copy/Export" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:372 +msgid "List Prefix" +msgstr "" + +#: .\cookbook\templates\socialaccount\connections.html:4 +#: .\cookbook\templates\socialaccount\connections.html:15 +msgid "Account Connections" +msgstr "" + +#: .\cookbook\templates\socialaccount\connections.html:18 +msgid "" +"You can sign in to your account using any of the following third party\n" +" accounts:" +msgstr "" + +#: .\cookbook\templates\socialaccount\connections.html:52 +msgid "" +"You currently have no social network accounts connected to this account." +msgstr "" + +#: .\cookbook\templates\socialaccount\connections.html:55 +msgid "Add a 3rd Party Account" +msgstr "" + +#: .\cookbook\templates\socialaccount\signup.html:5 +msgid "Signup" +msgstr "" + +#: .\cookbook\templates\socialaccount\signup.html:10 +#, python-format +msgid "" +"You are about to use your\n" +" %(provider_name)s account to login to\n" +" %(site_name)s. As a final step, please complete the following form:" +msgstr "" + +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:23 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:31 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:39 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:47 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:55 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:63 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:71 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:79 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:87 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:95 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:103 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:111 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:119 +#: .\cookbook\templates\socialaccount\snippets\provider_list.html:127 +msgid "Sign in using" +msgstr "" + +#: .\cookbook\templates\space.html:23 +msgid "Space:" +msgstr "" + +#: .\cookbook\templates\space.html:24 +msgid "Manage Subscription" +msgstr "" + +#: .\cookbook\templates\space.html:32 .\cookbook\templates\stats.html:19 +msgid "Number of objects" +msgstr "" + +#: .\cookbook\templates\space.html:45 .\cookbook\templates\stats.html:30 +msgid "Recipe Imports" +msgstr "" + +#: .\cookbook\templates\space.html:53 .\cookbook\templates\stats.html:38 +msgid "Objects stats" +msgstr "" + +#: .\cookbook\templates\space.html:56 .\cookbook\templates\stats.html:41 +msgid "Recipes without Keywords" +msgstr "" + +#: .\cookbook\templates\space.html:60 .\cookbook\templates\stats.html:45 +msgid "Internal Recipes" +msgstr "" + +#: .\cookbook\templates\space.html:73 +msgid "Members" +msgstr "" + +#: .\cookbook\templates\space.html:77 +msgid "Invite User" +msgstr "" + +#: .\cookbook\templates\space.html:88 +msgid "User" +msgstr "" + +#: .\cookbook\templates\space.html:89 +msgid "Groups" +msgstr "" + +#: .\cookbook\templates\space.html:105 +msgid "admin" +msgstr "" + +#: .\cookbook\templates\space.html:106 +msgid "user" +msgstr "" + +#: .\cookbook\templates\space.html:107 +msgid "guest" +msgstr "" + +#: .\cookbook\templates\space.html:108 +msgid "remove" +msgstr "" + +#: .\cookbook\templates\space.html:112 +msgid "Update" +msgstr "" + +#: .\cookbook\templates\space.html:116 +msgid "You cannot edit yourself." +msgstr "" + +#: .\cookbook\templates\space.html:123 +msgid "There are no members in your space yet!" +msgstr "" + +#: .\cookbook\templates\space.html:130 .\cookbook\templates\system.html:21 +#: .\cookbook\views\lists.py:100 +msgid "Invite Links" +msgstr "" + +#: .\cookbook\templates\stats.html:4 +msgid "Stats" +msgstr "" + +#: .\cookbook\templates\stats.html:10 +msgid "Statistics" +msgstr "" + +#: .\cookbook\templates\system.html:22 +msgid "Show Links" +msgstr "" + +#: .\cookbook\templates\system.html:32 +msgid "System Information" +msgstr "" + +#: .\cookbook\templates\system.html:34 +msgid "" +"\n" +" Django Recipes is an open source free software application. It can " +"be found on\n" +" GitHub.\n" +" Changelogs can be found here.\n" +" " +msgstr "" + +#: .\cookbook\templates\system.html:48 +msgid "Media Serving" +msgstr "" + +#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 +#: .\cookbook\templates\system.html:80 +msgid "Warning" +msgstr "" + +#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 +#: .\cookbook\templates\system.html:80 .\cookbook\templates\system.html:95 +msgid "Ok" +msgstr "" + +#: .\cookbook\templates\system.html:51 +msgid "" +"Serving media files directly using gunicorn/python is not recommend!\n" +" Please follow the steps described\n" +" here to update\n" +" your installation.\n" +" " +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\system.html:62 +msgid "Secret Key" +msgstr "" + +#: .\cookbook\templates\system.html:66 +msgid "" +"\n" +" You do not have a SECRET_KEY configured in your " +".env file. Django defaulted to the\n" +" standard key\n" +" provided with the installation which is publicly know and " +"insecure! Please set\n" +" SECRET_KEY int the .env configuration " +"file.\n" +" " +msgstr "" + +#: .\cookbook\templates\system.html:78 +msgid "Debug Mode" +msgstr "" + +#: .\cookbook\templates\system.html:82 +msgid "" +"\n" +" This application is still running in debug mode. This is most " +"likely not needed. Turn of debug mode by\n" +" setting\n" +" DEBUG=0 int the .env configuration " +"file.\n" +" " +msgstr "" + +#: .\cookbook\templates\system.html:93 +msgid "Database" +msgstr "" + +#: .\cookbook\templates\system.html:95 +msgid "Info" +msgstr "" + +#: .\cookbook\templates\system.html:97 +msgid "" +"\n" +" This application is not running with a Postgres database " +"backend. This is ok but not recommended as some\n" +" features only work with postgres databases.\n" +" " +msgstr "" + +#: .\cookbook\templates\url_import.html:6 +msgid "URL Import" +msgstr "" + +#: .\cookbook\templates\url_import.html:31 +msgid "Drag me to your bookmarks to import recipes from anywhere" +msgstr "" + +#: .\cookbook\templates\url_import.html:32 +msgid "Bookmark Me!" +msgstr "" + +#: .\cookbook\templates\url_import.html:36 +msgid "URL" +msgstr "" + +#: .\cookbook\templates\url_import.html:38 +msgid "App" +msgstr "" + +#: .\cookbook\templates\url_import.html:62 +msgid "Enter website URL" +msgstr "" + +#: .\cookbook\templates\url_import.html:101 +msgid "Select recipe files to import or drop them here..." +msgstr "" + +#: .\cookbook\templates\url_import.html:122 +msgid "Paste json or html source here to load recipe." +msgstr "" + +#: .\cookbook\templates\url_import.html:150 +msgid "Preview Recipe Data" +msgstr "" + +#: .\cookbook\templates\url_import.html:151 +msgid "Drag recipe attributes from the right into the appropriate box below." +msgstr "" + +#: .\cookbook\templates\url_import.html:160 +#: .\cookbook\templates\url_import.html:177 +#: .\cookbook\templates\url_import.html:194 +#: .\cookbook\templates\url_import.html:213 +#: .\cookbook\templates\url_import.html:231 +#: .\cookbook\templates\url_import.html:246 +#: .\cookbook\templates\url_import.html:261 +#: .\cookbook\templates\url_import.html:277 +#: .\cookbook\templates\url_import.html:304 +#: .\cookbook\templates\url_import.html:355 +msgid "Clear Contents" +msgstr "" + +#: .\cookbook\templates\url_import.html:162 +msgid "Text dragged here will be appended to the name." +msgstr "" + +#: .\cookbook\templates\url_import.html:175 +msgid "Description" +msgstr "" + +#: .\cookbook\templates\url_import.html:179 +msgid "Text dragged here will be appended to the description." +msgstr "" + +#: .\cookbook\templates\url_import.html:196 +msgid "Keywords dragged here will be appended to current list" +msgstr "" + +#: .\cookbook\templates\url_import.html:211 +msgid "Image" +msgstr "" + +#: .\cookbook\templates\url_import.html:243 +msgid "Prep Time" +msgstr "" + +#: .\cookbook\templates\url_import.html:258 +msgid "Cook Time" +msgstr "" + +#: .\cookbook\templates\url_import.html:279 +msgid "Ingredients dragged here will be appended to current list." +msgstr "" + +#: .\cookbook\templates\url_import.html:301 +#: .\cookbook\templates\url_import.html:572 +msgid "Instructions" +msgstr "" + +#: .\cookbook\templates\url_import.html:306 +msgid "" +"Recipe instructions dragged here will be appended to current instructions." +msgstr "" + +#: .\cookbook\templates\url_import.html:329 +msgid "Discovered Attributes" +msgstr "" + +#: .\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 "" + +#: .\cookbook\templates\url_import.html:348 +msgid "Show Blank Field" +msgstr "" + +#: .\cookbook\templates\url_import.html:353 +msgid "Blank Field" +msgstr "" + +#: .\cookbook\templates\url_import.html:357 +msgid "Items dragged to Blank Field will be appended." +msgstr "" + +#: .\cookbook\templates\url_import.html:404 +msgid "Delete Text" +msgstr "" + +#: .\cookbook\templates\url_import.html:417 +msgid "Delete image" +msgstr "" + +#: .\cookbook\templates\url_import.html:433 +msgid "Recipe Name" +msgstr "" + +#: .\cookbook\templates\url_import.html:437 +msgid "Recipe Description" +msgstr "" + +#: .\cookbook\templates\url_import.html:499 +#: .\cookbook\templates\url_import.html:531 +#: .\cookbook\templates\url_import.html:587 +msgid "Select one" +msgstr "" + +#: .\cookbook\templates\url_import.html:547 +msgid "Note" +msgstr "" + +#: .\cookbook\templates\url_import.html:588 +msgid "Add Keyword" +msgstr "" + +#: .\cookbook\templates\url_import.html:601 +msgid "All Keywords" +msgstr "" + +#: .\cookbook\templates\url_import.html:604 +msgid "Import all keywords, not only the ones already existing." +msgstr "" + +#: .\cookbook\templates\url_import.html:631 +msgid "Information" +msgstr "" + +#: .\cookbook\templates\url_import.html:633 +msgid "" +" Only websites containing ld+json or microdata information can currently\n" +" be imported. Most big recipe pages " +"support this. If you site cannot be imported but\n" +" you think\n" +" it probably has some kind of structured " +"data feel free to post an example in the\n" +" github issues." +msgstr "" + +#: .\cookbook\templates\url_import.html:641 +msgid "Google ld+json Info" +msgstr "" + +#: .\cookbook\templates\url_import.html:644 +msgid "GitHub Issues" +msgstr "" + +#: .\cookbook\templates\url_import.html:646 +msgid "Recipe Markup Specification" +msgstr "" + +#: .\cookbook\views\api.py:83 .\cookbook\views\api.py:132 +msgid "Parameter updated_at incorrectly formatted" +msgstr "" + +#: .\cookbook\views\api.py:152 +#, python-brace-format +msgid "No {self.basename} with id {pk} exists" +msgstr "" + +#: .\cookbook\views\api.py:156 +msgid "Cannot merge with the same object!" +msgstr "" + +#: .\cookbook\views\api.py:163 +#, python-brace-format +msgid "No {self.basename} with id {target} exists" +msgstr "" + +#: .\cookbook\views\api.py:168 +msgid "Cannot merge with child object!" +msgstr "" + +#: .\cookbook\views\api.py:201 +#, python-brace-format +msgid "{source.name} was merged successfully with {target.name}" +msgstr "" + +#: .\cookbook\views\api.py:205 +#, python-brace-format +msgid "An error occurred attempting to merge {source.name} with {target.name}" +msgstr "" + +#: .\cookbook\views\api.py:249 +#, python-brace-format +msgid "No {self.basename} with id {child} exists" +msgstr "" + +#: .\cookbook\views\api.py:258 +#, python-brace-format +msgid "{child.name} was moved successfully to the root." +msgstr "" + +#: .\cookbook\views\api.py:261 .\cookbook\views\api.py:279 +msgid "An error occurred attempting to move " +msgstr "" + +#: .\cookbook\views\api.py:264 +msgid "Cannot move an object to itself!" +msgstr "" + +#: .\cookbook\views\api.py:270 +#, python-brace-format +msgid "No {self.basename} with id {parent} exists" +msgstr "" + +#: .\cookbook\views\api.py:276 +#, python-brace-format +msgid "{child.name} was moved successfully to parent {parent.name}" +msgstr "" + +#: .\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 "" + +#: .\cookbook\views\api.py:745 +msgid "Sync successful!" +msgstr "" + +#: .\cookbook\views\api.py:750 +msgid "Error synchronizing with Storage" +msgstr "" + +#: .\cookbook\views\api.py:828 +msgid "Nothing to do." +msgstr "" + +#: .\cookbook\views\api.py:843 +msgid "The requested site provided malformed data and cannot be read." +msgstr "" + +#: .\cookbook\views\api.py:850 +msgid "The requested page could not be found." +msgstr "" + +#: .\cookbook\views\api.py:859 +msgid "" +"The requested site does not provide any recognized data format to import the " +"recipe from." +msgstr "" + +#: .\cookbook\views\api.py:873 +msgid "No useable data could be found." +msgstr "" + +#: .\cookbook\views\api.py:889 +msgid "I couldn't find anything to do." +msgstr "" + +#: .\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 "" + +#: .\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 "" + +#: .\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[3] "" + +#: .\cookbook\views\delete.py:101 +msgid "Monitor" +msgstr "" + +#: .\cookbook\views\delete.py:125 .\cookbook\views\lists.py:86 +#: .\cookbook\views\new.py:101 +msgid "Storage Backend" +msgstr "" + +#: .\cookbook\views\delete.py:135 +msgid "" +"Could not delete this storage backend as it is used in at least one monitor." +msgstr "" + +#: .\cookbook\views\delete.py:158 +msgid "Recipe Book" +msgstr "" + +#: .\cookbook\views\delete.py:170 +msgid "Bookmarks" +msgstr "" + +#: .\cookbook\views\delete.py:192 .\cookbook\views\new.py:235 +msgid "Invite Link" +msgstr "" + +#: .\cookbook\views\edit.py:125 +msgid "You cannot edit this storage!" +msgstr "" + +#: .\cookbook\views\edit.py:149 +msgid "Storage saved!" +msgstr "" + +#: .\cookbook\views\edit.py:155 +msgid "There was an error updating this storage backend!" +msgstr "" + +#: .\cookbook\views\edit.py:248 +msgid "Changes saved!" +msgstr "" + +#: .\cookbook\views\edit.py:252 +msgid "Error saving changes!" +msgstr "" + +#: .\cookbook\views\import_export.py:99 +msgid "Importing is not implemented for this provider" +msgstr "" + +#: .\cookbook\views\import_export.py:121 +msgid "Exporting is not implemented for this provider" +msgstr "" + +#: .\cookbook\views\lists.py:26 +msgid "Import Log" +msgstr "" + +#: .\cookbook\views\lists.py:39 +msgid "Discovery" +msgstr "" + +#: .\cookbook\views\lists.py:69 +msgid "Shopping Lists" +msgstr "" + +#: .\cookbook\views\lists.py:129 +msgid "Foods" +msgstr "" + +#: .\cookbook\views\lists.py:163 +msgid "Supermarkets" +msgstr "" + +#: .\cookbook\views\lists.py:179 +msgid "Shopping Categories" +msgstr "" + +#: .\cookbook\views\lists.py:232 +msgid "New Shopping List" +msgstr "" + +#: .\cookbook\views\new.py:126 +msgid "Imported new recipe!" +msgstr "Nov recept uvožen!" + +#: .\cookbook\views\new.py:129 +msgid "There was an error importing this recipe!" +msgstr "" + +#: .\cookbook\views\new.py:209 +msgid "Hello" +msgstr "" + +#: .\cookbook\views\new.py:209 +msgid "You have been invited by " +msgstr "" + +#: .\cookbook\views\new.py:210 +msgid " to join their Tandoor Recipes space " +msgstr "" + +#: .\cookbook\views\new.py:211 +msgid "Click the following link to activate your account: " +msgstr "" + +#: .\cookbook\views\new.py:212 +msgid "" +"If the link does not work use the following code to manually join the space: " +msgstr "" + +#: .\cookbook\views\new.py:213 +msgid "The invitation is valid until " +msgstr "" + +#: .\cookbook\views\new.py:214 +msgid "" +"Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " +msgstr "" + +#: .\cookbook\views\new.py:217 +msgid "Tandoor Recipes Invite" +msgstr "" + +#: .\cookbook\views\new.py:224 +msgid "Invite link successfully send to user." +msgstr "" + +#: .\cookbook\views\new.py:227 +msgid "" +"You have send to many emails, please share the link manually or wait a few " +"hours." +msgstr "" + +#: .\cookbook\views\new.py:229 +msgid "Email to user could not be send, please share link manually." +msgstr "" + +#: .\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 "" + +#: .\cookbook\views\views.py:175 +msgid "You do not have the required permissions to perform this action!" +msgstr "" + +#: .\cookbook\views\views.py:186 +msgid "Comment saved!" +msgstr "" + +#: .\cookbook\views\views.py:277 +msgid "This feature is not available in the demo version!" +msgstr "" + +#: .\cookbook\views\views.py:340 +msgid "You must select at least one field to search!" +msgstr "" + +#: .\cookbook\views\views.py:345 +msgid "" +"To use this search method you must select at least one full text search " +"field!" +msgstr "" + +#: .\cookbook\views\views.py:349 +msgid "Fuzzy search is not compatible with this search method!" +msgstr "" + +#: .\cookbook\views\views.py:452 +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:459 +msgid "Passwords dont match!" +msgstr "" + +#: .\cookbook\views\views.py:475 +msgid "User has been created, please login!" +msgstr "" + +#: .\cookbook\views\views.py:491 +msgid "Malformed Invite Link supplied!" +msgstr "" + +#: .\cookbook\views\views.py:498 +msgid "You are already member of a space and therefore cannot join this one." +msgstr "" + +#: .\cookbook\views\views.py:509 +msgid "Successfully joined space." +msgstr "" + +#: .\cookbook\views\views.py:515 +msgid "Invite Link not valid or already used!" +msgstr "" + +#: .\cookbook\views\views.py:579 +msgid "" +"Reporting share links is not enabled for this instance. Please notify the " +"page administrator to report problems." +msgstr "" + +#: .\cookbook\views\views.py:585 +msgid "" +"Recipe sharing link has been disabled! For additional information please " +"contact the page administrator." +msgstr "" diff --git a/cookbook/locale/tr/LC_MESSAGES/django.po b/cookbook/locale/tr/LC_MESSAGES/django.po index ea5e41e7..66f1d3b9 100644 --- a/cookbook/locale/tr/LC_MESSAGES/django.po +++ b/cookbook/locale/tr/LC_MESSAGES/django.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-08-17 08:44+0200\n" +"POT-Creation-Date: 2022-01-18 14:52+0100\n" "PO-Revision-Date: 2020-06-02 19:28+0000\n" "Last-Translator: Emre S, 2020\n" "Language-Team: Turkish (https://www.transifex.com/django-recipes/" @@ -22,15 +22,70 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: .\cookbook\filters.py:23 .\cookbook\templates\base.html:98 -#: .\cookbook\templates\forms\edit_internal_recipe.html:269 -#: .\cookbook\templates\forms\ingredients.html:34 -#: .\cookbook\templates\space.html:43 .\cookbook\templates\stats.html:28 -#: .\cookbook\templates\url_import.html:270 .\cookbook\views\lists.py:67 +#: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 +#: .\cookbook\templates\space.html:50 .\cookbook\templates\stats.html:28 +#: .\cookbook\templates\url_import.html:277 msgid "Ingredients" msgstr "Malzemeler" -#: .\cookbook\forms.py:49 +#: .\cookbook\forms.py:56 +msgid "Default unit" +msgstr "" + +#: .\cookbook\forms.py:57 +msgid "Use fractions" +msgstr "" + +#: .\cookbook\forms.py:58 +msgid "Use KJ" +msgstr "" + +#: .\cookbook\forms.py:59 +msgid "Theme" +msgstr "" + +#: .\cookbook\forms.py:60 +msgid "Navbar color" +msgstr "" + +#: .\cookbook\forms.py:61 +msgid "Sticky navbar" +msgstr "" + +#: .\cookbook\forms.py:62 +msgid "Default page" +msgstr "" + +#: .\cookbook\forms.py:63 +#, 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:64 +msgid "Search style" +msgstr "" + +#: .\cookbook\forms.py:65 +msgid "Plan sharing" +msgstr "" + +#: .\cookbook\forms.py:66 +#, fuzzy +#| msgid "Ingredients" +msgid "Ingredient decimal places" +msgstr "Malzemeler" + +#: .\cookbook\forms.py:67 +msgid "Shopping list auto sync period" +msgstr "" + +#: .\cookbook\forms.py:68 .\cookbook\templates\recipe_view.html:21 +#: .\cookbook\templates\space.html:77 .\cookbook\templates\stats.html:47 +msgid "Comments" +msgstr "" + +#: .\cookbook\forms.py:72 msgid "" "Color of the top navigation bar. Not all colors work with all themes, just " "try them out!" @@ -38,35 +93,41 @@ msgstr "" "Gezinti çubuğunun rengi. Bütün renkeler bütün temalarla çalışmayabilir, önce " "deneyin!" -#: .\cookbook\forms.py:51 +#: .\cookbook\forms.py:74 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:53 +#: .\cookbook\forms.py:76 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" msgstr "" -#: .\cookbook\forms.py:56 -msgid "" -"Users with whom newly created meal plan/shopping list entries should be " -"shared by default." +#: .\cookbook\forms.py:78 +msgid "Display nutritional energy amounts in joules instead of calories" msgstr "" -#: .\cookbook\forms.py:58 +#: .\cookbook\forms.py:79 +msgid "Users with whom newly created meal plans should be shared by default." +msgstr "" + +#: .\cookbook\forms.py:80 +msgid "Users with whom to share shopping lists." +msgstr "" + +#: .\cookbook\forms.py:82 msgid "Show recently viewed recipes on search page." msgstr "Son görüntülenen tarifleri arama sayfasında göster." -#: .\cookbook\forms.py:59 +#: .\cookbook\forms.py:83 msgid "Number of decimals to round ingredients." msgstr "Malzeme birimleri için yuvarlanma basamağı." -#: .\cookbook\forms.py:60 +#: .\cookbook\forms.py:84 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:62 +#: .\cookbook\forms.py:86 .\cookbook\forms.py:493 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. " @@ -79,216 +140,375 @@ 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:65 +#: .\cookbook\forms.py:89 msgid "Makes the navbar stick to the top of the page." msgstr "" -#: .\cookbook\forms.py:81 +#: .\cookbook\forms.py:90 .\cookbook\forms.py:496 +msgid "Automatically add meal plan ingredients to shopping list." +msgstr "" + +#: .\cookbook\forms.py:91 +msgid "Exclude ingredients that are on hand." +msgstr "" + +#: .\cookbook\forms.py:108 msgid "" "Both fields are optional. If none are given the username will be displayed " "instead" msgstr "" -#: .\cookbook\forms.py:102 .\cookbook\forms.py:331 -#: .\cookbook\templates\forms\edit_internal_recipe.html:49 -#: .\cookbook\templates\url_import.html:154 +#: .\cookbook\forms.py:129 .\cookbook\forms.py:298 +#: .\cookbook\templates\url_import.html:161 msgid "Name" msgstr "İsim" -#: .\cookbook\forms.py:103 .\cookbook\forms.py:332 -#: .\cookbook\templates\base.html:108 .\cookbook\templates\base.html:169 -#: .\cookbook\templates\forms\edit_internal_recipe.html:85 -#: .\cookbook\templates\space.html:39 .\cookbook\templates\stats.html:24 -#: .\cookbook\templates\url_import.html:188 -#: .\cookbook\templates\url_import.html:573 +#: .\cookbook\forms.py:130 .\cookbook\forms.py:299 +#: .\cookbook\templates\space.html:44 .\cookbook\templates\stats.html:24 +#: .\cookbook\templates\url_import.html:195 +#: .\cookbook\templates\url_import.html:585 .\cookbook\views\lists.py:97 msgid "Keywords" msgstr "" -#: .\cookbook\forms.py:104 +#: .\cookbook\forms.py:131 msgid "Preparation time in minutes" msgstr "" -#: .\cookbook\forms.py:105 +#: .\cookbook\forms.py:132 msgid "Waiting time (cooking/baking) in minutes" msgstr "" -#: .\cookbook\forms.py:106 .\cookbook\forms.py:333 +#: .\cookbook\forms.py:133 .\cookbook\forms.py:267 .\cookbook\forms.py:300 msgid "Path" msgstr "" -#: .\cookbook\forms.py:107 +#: .\cookbook\forms.py:134 msgid "Storage UID" msgstr "" -#: .\cookbook\forms.py:133 +#: .\cookbook\forms.py:164 msgid "Default" msgstr "" -#: .\cookbook\forms.py:144 .\cookbook\templates\url_import.html:90 +#: .\cookbook\forms.py:175 .\cookbook\templates\url_import.html:97 msgid "" "To prevent duplicates recipes with the same name as existing ones are " "ignored. Check this box to import everything." msgstr "" -#: .\cookbook\forms.py:164 -msgid "New Unit" -msgstr "" - -#: .\cookbook\forms.py:165 -msgid "New unit that other gets replaced by." -msgstr "" - -#: .\cookbook\forms.py:170 -msgid "Old Unit" -msgstr "" - -#: .\cookbook\forms.py:171 -msgid "Unit that should be replaced." -msgstr "" - -#: .\cookbook\forms.py:187 -msgid "New Food" -msgstr "" - -#: .\cookbook\forms.py:188 -msgid "New food that other gets replaced by." -msgstr "" - -#: .\cookbook\forms.py:193 -msgid "Old Food" -msgstr "" - -#: .\cookbook\forms.py:194 -msgid "Food that should be replaced." -msgstr "" - -#: .\cookbook\forms.py:212 +#: .\cookbook\forms.py:197 msgid "Add your comment: " msgstr "" -#: .\cookbook\forms.py:253 +#: .\cookbook\forms.py:212 msgid "Leave empty for dropbox and enter app password for nextcloud." msgstr "" -#: .\cookbook\forms.py:260 +#: .\cookbook\forms.py:219 msgid "Leave empty for nextcloud and enter api token for dropbox." msgstr "" -#: .\cookbook\forms.py:269 +#: .\cookbook\forms.py:228 msgid "" "Leave empty for dropbox and enter only base url for nextcloud (/remote." "php/webdav/ is added automatically)" msgstr "" -#: .\cookbook\forms.py:307 +#: .\cookbook\forms.py:266 .\cookbook\views\edit.py:166 +msgid "Storage" +msgstr "" + +#: .\cookbook\forms.py:268 +msgid "Active" +msgstr "" + +#: .\cookbook\forms.py:274 msgid "Search String" msgstr "" -#: .\cookbook\forms.py:334 +#: .\cookbook\forms.py:301 msgid "File ID" msgstr "" -#: .\cookbook\forms.py:370 +#: .\cookbook\forms.py:323 msgid "You must provide at least a recipe or a title." msgstr "" -#: .\cookbook\forms.py:383 +#: .\cookbook\forms.py:336 msgid "You can list default users to share recipes with in the settings." msgstr "" -#: .\cookbook\forms.py:384 -#: .\cookbook\templates\forms\edit_internal_recipe.html:427 +#: .\cookbook\forms.py:337 msgid "" "You can use markdown to format this field. See the docs here" msgstr "" -#: .\cookbook\forms.py:409 +#: .\cookbook\forms.py:363 msgid "Maximum number of users for this space reached." msgstr "" -#: .\cookbook\forms.py:415 +#: .\cookbook\forms.py:369 msgid "Email address already taken!" msgstr "" -#: .\cookbook\forms.py:423 +#: .\cookbook\forms.py:377 msgid "" -"An email address is not required but if present the invite link will be send " +"An email address is not required but if present the invite link will be sent " "to the user." msgstr "" -#: .\cookbook\forms.py:438 +#: .\cookbook\forms.py:392 msgid "Name already taken." msgstr "" -#: .\cookbook\forms.py:449 +#: .\cookbook\forms.py:403 msgid "Accept Terms and Privacy" msgstr "" +#: .\cookbook\forms.py:435 +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:445 +msgid "" +"Select type method of search. Click here for " +"full desciption of choices." +msgstr "" + +#: .\cookbook\forms.py:446 +msgid "" +"Use fuzzy matching on units, keywords and ingredients when editing and " +"importing recipes." +msgstr "" + +#: .\cookbook\forms.py:448 +msgid "" +"Fields to search ignoring accents. Selecting this option can improve or " +"degrade search quality depending on language" +msgstr "" + +#: .\cookbook\forms.py:450 +msgid "" +"Fields to search for partial matches. (e.g. searching for 'Pie' will return " +"'pie' and 'piece' and 'soapie')" +msgstr "" + +#: .\cookbook\forms.py:452 +msgid "" +"Fields to search for beginning of word matches. (e.g. searching for 'sa' " +"will return 'salad' and 'sandwich')" +msgstr "" + +#: .\cookbook\forms.py:454 +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:456 +msgid "" +"Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " +"only function with fulltext fields." +msgstr "" + +#: .\cookbook\forms.py:460 +msgid "Search Method" +msgstr "" + +#: .\cookbook\forms.py:461 +msgid "Fuzzy Lookups" +msgstr "" + +#: .\cookbook\forms.py:462 +msgid "Ignore Accent" +msgstr "" + +#: .\cookbook\forms.py:463 +msgid "Partial Match" +msgstr "" + +#: .\cookbook\forms.py:464 +msgid "Starts Wtih" +msgstr "" + +#: .\cookbook\forms.py:465 +msgid "Fuzzy Search" +msgstr "" + +#: .\cookbook\forms.py:466 +msgid "Full Text" +msgstr "" + +#: .\cookbook\forms.py:491 +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:497 +msgid "" +"When adding a meal plan to the shopping list (manually or automatically), " +"include all related recipes." +msgstr "" + +#: .\cookbook\forms.py:498 +msgid "" +"When adding a meal plan to the shopping list (manually or automatically), " +"exclude ingredients that are on hand." +msgstr "" + +#: .\cookbook\forms.py:499 +msgid "Default number of hours to delay a shopping list entry." +msgstr "" + +#: .\cookbook\forms.py:500 +msgid "Filter shopping list to only include supermarket categories." +msgstr "" + +#: .\cookbook\forms.py:501 +msgid "Days of recent shopping list entries to display." +msgstr "" + +#: .\cookbook\forms.py:502 +msgid "Mark food 'On Hand' when checked off shopping list." +msgstr "" + +#: .\cookbook\forms.py:503 +msgid "Delimiter to use for CSV exports." +msgstr "" + +#: .\cookbook\forms.py:504 +msgid "Prefix to add when copying list to the clipboard." +msgstr "" + +#: .\cookbook\forms.py:508 +msgid "Share Shopping List" +msgstr "" + +#: .\cookbook\forms.py:509 +msgid "Autosync" +msgstr "" + +#: .\cookbook\forms.py:510 +msgid "Auto Add Meal Plan" +msgstr "" + +#: .\cookbook\forms.py:511 +msgid "Exclude On Hand" +msgstr "" + +#: .\cookbook\forms.py:512 +msgid "Include Related" +msgstr "" + +#: .\cookbook\forms.py:513 +msgid "Default Delay Hours" +msgstr "" + +#: .\cookbook\forms.py:514 +msgid "Filter to Supermarket" +msgstr "" + +#: .\cookbook\forms.py:515 +msgid "Recent Days" +msgstr "" + +#: .\cookbook\forms.py:516 +msgid "CSV Delimiter" +msgstr "" + +#: .\cookbook\forms.py:517 .\cookbook\templates\shopping_list.html:322 +msgid "List Prefix" +msgstr "" + +#: .\cookbook\forms.py:518 +msgid "Auto On Hand" +msgstr "" + +#: .\cookbook\forms.py:528 +msgid "Reset Food Inheritance" +msgstr "" + +#: .\cookbook\forms.py:529 +msgid "Reset all food to inherit the fields configured." +msgstr "" + +#: .\cookbook\forms.py:541 +msgid "Fields on food that should be inherited by default." +msgstr "" + +#: .\cookbook\forms.py:542 +#, 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 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:138 -#: .\cookbook\helper\permission_helper.py:161 .\cookbook\views\views.py:151 +#: .\cookbook\helper\permission_helper.py:136 +#: .\cookbook\helper\permission_helper.py:159 .\cookbook\views\views.py:148 msgid "You are not logged in and therefore cannot view this page!" msgstr "" -#: .\cookbook\helper\permission_helper.py:142 -#: .\cookbook\helper\permission_helper.py:148 -#: .\cookbook\helper\permission_helper.py:173 -#: .\cookbook\helper\permission_helper.py:218 -#: .\cookbook\helper\permission_helper.py:232 -#: .\cookbook\helper\permission_helper.py:243 -#: .\cookbook\helper\permission_helper.py:254 .\cookbook\views\data.py:40 -#: .\cookbook\views\views.py:162 .\cookbook\views\views.py:169 -#: .\cookbook\views\views.py:259 +#: .\cookbook\helper\permission_helper.py:140 +#: .\cookbook\helper\permission_helper.py:146 +#: .\cookbook\helper\permission_helper.py:171 +#: .\cookbook\helper\permission_helper.py:219 +#: .\cookbook\helper\permission_helper.py:233 +#: .\cookbook\helper\permission_helper.py:244 +#: .\cookbook\helper\permission_helper.py:255 .\cookbook\views\data.py:47 +#: .\cookbook\views\views.py:159 .\cookbook\views\views.py:166 +#: .\cookbook\views\views.py:232 msgid "You do not have the required permissions to view this page!" msgstr "" -#: .\cookbook\helper\permission_helper.py:166 -#: .\cookbook\helper\permission_helper.py:189 -#: .\cookbook\helper\permission_helper.py:204 +#: .\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 "" -#: .\cookbook\helper\template_helper.py:60 -#: .\cookbook\helper\template_helper.py:62 +#: .\cookbook\helper\recipe_search.py:473 +msgid "One of queryset or hash_key must be provided" +msgstr "" + +#: .\cookbook\helper\shopping_helper.py:54 +msgid "You must supply a recipe or mealplan" +msgstr "" + +#: .\cookbook\helper\shopping_helper.py:58 +msgid "You must supply a created_by" +msgstr "" + +#: .\cookbook\helper\template_helper.py:61 +#: .\cookbook\helper\template_helper.py:63 msgid "Could not parse template code." msgstr "" -#: .\cookbook\integration\integration.py:104 -#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 -#: .\cookbook\templates\import_response.html:7 -#: .\cookbook\templates\test.html:14 .\cookbook\templates\test.html:20 -#: .\cookbook\templates\url_import.html:27 -#: .\cookbook\templates\url_import.html:101 -#: .\cookbook\templates\url_import.html:123 -#: .\cookbook\templates\url_import.html:317 -#: .\cookbook\templates\url_import.html:604 .\cookbook\views\delete.py:60 -#: .\cookbook\views\edit.py:199 -msgid "Import" -msgstr "" - -#: .\cookbook\integration\integration.py:185 +#: .\cookbook\integration\integration.py:200 msgid "" "Importer expected a .zip file. Did you choose the correct importer type for " "your data ?" msgstr "" -#: .\cookbook\integration\integration.py:188 +#: .\cookbook\integration\integration.py:203 msgid "" "An unexpected error occurred during the import. Please make sure you have " "uploaded a valid file." msgstr "" -#: .\cookbook\integration\integration.py:192 +#: .\cookbook\integration\integration.py:208 msgid "The following recipes were ignored because they already existed:" msgstr "" -#: .\cookbook\integration\integration.py:196 +#: .\cookbook\integration\integration.py:212 #, python-format msgid "Imported %s recipes." msgstr "" @@ -301,37 +521,51 @@ msgstr "" msgid "Nutritional Information" msgstr "" -#: .\cookbook\integration\paprika.py:53 +#: .\cookbook\integration\paprika.py:53 .\cookbook\templates\url_import.html:42 msgid "Source" msgstr "" -#: .\cookbook\integration\safron.py:23 -#: .\cookbook\templates\forms\edit_internal_recipe.html:79 -#: .\cookbook\templates\include\log_cooking.html:16 -#: .\cookbook\templates\url_import.html:224 -#: .\cookbook\templates\url_import.html:455 +#: .\cookbook\integration\saffron.py:23 +#: .\cookbook\templates\include\log_cooking.html:18 +#: .\cookbook\templates\url_import.html:231 +#: .\cookbook\templates\url_import.html:462 msgid "Servings" msgstr "" -#: .\cookbook\integration\safron.py:25 +#: .\cookbook\integration\saffron.py:25 msgid "Waiting time" msgstr "" -#: .\cookbook\integration\safron.py:27 -#: .\cookbook\templates\forms\edit_internal_recipe.html:73 +#: .\cookbook\integration\saffron.py:27 msgid "Preparation Time" msgstr "" -#: .\cookbook\integration\safron.py:29 .\cookbook\templates\base.html:78 +#: .\cookbook\integration\saffron.py:29 .\cookbook\templates\base.html:78 #: .\cookbook\templates\forms\ingredients.html:7 #: .\cookbook\templates\index.html:7 msgid "Cookbook" msgstr "" -#: .\cookbook\integration\safron.py:31 +#: .\cookbook\integration\saffron.py:31 msgid "Section" msgstr "" +#: .\cookbook\management\commands\rebuildindex.py:14 +msgid "Rebuilds full text search index on Recipe" +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:18 +msgid "Only Postgress databases use full text search, no index to rebuild" +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:29 +msgid "Recipe index rebuild complete." +msgstr "" + +#: .\cookbook\management\commands\rebuildindex.py:31 +msgid "Recipe index rebuild failed." +msgstr "" + #: .\cookbook\migrations\0047_auto_20200602_1133.py:14 msgid "Breakfast" msgstr "" @@ -348,90 +582,143 @@ msgstr "" msgid "Other" msgstr "" -#: .\cookbook\models.py:72 +#: .\cookbook\models.py:246 msgid "" "Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " "upload." msgstr "" -#: .\cookbook\models.py:123 .\cookbook\templates\search.html:7 -#: .\cookbook\templates\shopping_list.html:52 +#: .\cookbook\models.py:300 .\cookbook\templates\search.html:7 +#: .\cookbook\templates\shopping_list.html:53 msgid "Search" msgstr "" -#: .\cookbook\models.py:124 .\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 +#: .\cookbook\models.py:301 .\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 "" -#: .\cookbook\models.py:125 .\cookbook\templates\base.html:89 +#: .\cookbook\models.py:302 .\cookbook\templates\base.html:90 msgid "Books" msgstr "" -#: .\cookbook\models.py:133 +#: .\cookbook\models.py:310 msgid "Small" msgstr "" -#: .\cookbook\models.py:133 +#: .\cookbook\models.py:310 msgid "Large" msgstr "" -#: .\cookbook\models.py:133 .\cookbook\templates\generic\new_template.html:6 +#: .\cookbook\models.py:310 .\cookbook\templates\generic\new_template.html:6 #: .\cookbook\templates\generic\new_template.html:14 -#: .\cookbook\templates\meal_plan.html:323 msgid "New" msgstr "" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:202 +#: .\cookbook\models.py:512 +msgid " is part of a recipe step and cannot be deleted" +msgstr "" + +#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:44 msgid "Text" msgstr "" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:203 +#: .\cookbook\models.py:586 msgid "Time" msgstr "" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:204 -#: .\cookbook\templates\forms\edit_internal_recipe.html:219 +#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:46 msgid "File" msgstr "" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:205 -#: .\cookbook\templates\forms\edit_internal_recipe.html:241 +#: .\cookbook\models.py:586 #: .\cookbook\templates\include\recipe_open_modal.html:7 -#: .\cookbook\templates\meal_plan.html:247 .\cookbook\views\delete.py:28 -#: .\cookbook\views\edit.py:273 .\cookbook\views\new.py:52 +#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260 +#: .\cookbook\views\new.py:53 msgid "Recipe" msgstr "" -#: .\cookbook\serializer.py:109 +#: .\cookbook\models.py:1041 .\cookbook\templates\search_info.html:28 +msgid "Simple" +msgstr "" + +#: .\cookbook\models.py:1042 .\cookbook\templates\search_info.html:33 +msgid "Phrase" +msgstr "" + +#: .\cookbook\models.py:1043 .\cookbook\templates\search_info.html:38 +msgid "Web" +msgstr "" + +#: .\cookbook\models.py:1044 .\cookbook\templates\search_info.html:47 +msgid "Raw" +msgstr "" + +#: .\cookbook\models.py:1082 +msgid "Food Alias" +msgstr "" + +#: .\cookbook\models.py:1082 +msgid "Unit Alias" +msgstr "" + +#: .\cookbook\models.py:1082 +msgid "Keyword Alias" +msgstr "" + +#: .\cookbook\serializer.py:175 +msgid "A user is required" +msgstr "" + +#: .\cookbook\serializer.py:195 msgid "File uploads are not enabled for this Space." msgstr "" -#: .\cookbook\serializer.py:117 +#: .\cookbook\serializer.py:206 msgid "You have reached your file upload limit." msgstr "" -#: .\cookbook\tables.py:35 .\cookbook\templates\books.html:36 -#: .\cookbook\templates\generic\edit_template.html:6 +#: .\cookbook\serializer.py:962 +msgid "Existing shopping list to update" +msgstr "" + +#: .\cookbook\serializer.py:964 +msgid "" +"List of ingredient IDs from the recipe to add, if not provided all " +"ingredients will be added." +msgstr "" + +#: .\cookbook\serializer.py:965 +msgid "" +"Providing a list_recipe ID and servings of 0 will delete that shopping list." +msgstr "" + +#: .\cookbook\serializer.py:973 +msgid "Amount of food to add to the shopping list" +msgstr "" + +#: .\cookbook\serializer.py:974 +msgid "ID of unit to use for the shopping list" +msgstr "" + +#: .\cookbook\serializer.py:975 +msgid "When set to true will delete all food from active shopping lists." +msgstr "" + +#: .\cookbook\tables.py:35 .\cookbook\templates\generic\edit_template.html:6 #: .\cookbook\templates\generic\edit_template.html:14 -#: .\cookbook\templates\meal_plan.html:281 #: .\cookbook\templates\recipes_table.html:82 -#: .\cookbook\templates\shopping_list.html:33 -#: .\cookbook\templates\space.html:90 +#: .\cookbook\templates\shopping_list.html:37 +#: .\cookbook\templates\space.html:109 msgid "Edit" msgstr "" -#: .\cookbook\tables.py:124 .\cookbook\tables.py:147 -#: .\cookbook\templates\books.html:38 -#: .\cookbook\templates\generic\delete_template.html:5 -#: .\cookbook\templates\generic\delete_template.html:13 -#: .\cookbook\templates\generic\edit_template.html:27 -#: .\cookbook\templates\meal_plan.html:277 +#: .\cookbook\tables.py:115 .\cookbook\tables.py:138 +#: .\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 "" @@ -460,7 +747,7 @@ 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:154 .\cookbook\templates\settings.html:6 +#: .\cookbook\templates\base.html:257 .\cookbook\templates\settings.html:6 #: .\cookbook\templates\settings.html:17 #: .\cookbook\templates\socialaccount\connections.html:10 msgid "Settings" @@ -495,6 +782,7 @@ msgid "Re-send Verification" msgstr "" #: .\cookbook\templates\account\email.html:50 +#: .\cookbook\templates\generic\delete_template.html:56 #: .\cookbook\templates\socialaccount\connections.html:44 msgid "Remove" msgstr "" @@ -536,7 +824,7 @@ msgid "" msgstr "" #: .\cookbook\templates\account\email_confirm.html:22 -#: .\cookbook\templates\generic\delete_template.html:21 +#: .\cookbook\templates\generic\delete_template.html:71 msgid "Confirm" msgstr "" @@ -548,7 +836,7 @@ msgid "" "request." msgstr "" -#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:189 +#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:289 msgid "Login" msgstr "" @@ -559,27 +847,27 @@ msgstr "" msgid "Sign In" msgstr "" -#: .\cookbook\templates\account\login.html:32 +#: .\cookbook\templates\account\login.html:34 #: .\cookbook\templates\socialaccount\signup.html:8 #: .\cookbook\templates\socialaccount\signup.html:57 msgid "Sign Up" msgstr "" -#: .\cookbook\templates\account\login.html:36 -#: .\cookbook\templates\account\login.html:37 +#: .\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:37 +#: .\cookbook\templates\account\login.html:40 msgid "Lost your password?" msgstr "" -#: .\cookbook\templates\account\login.html:48 +#: .\cookbook\templates\account\login.html:52 msgid "Social Login" msgstr "" -#: .\cookbook\templates\account\login.html:49 +#: .\cookbook\templates\account\login.html:53 msgid "You can use any of the following providers to sign in." msgstr "" @@ -596,12 +884,16 @@ msgstr "" #: .\cookbook\templates\account\password_change.html:6 #: .\cookbook\templates\account\password_change.html:16 #: .\cookbook\templates\account\password_change.html:21 +#: .\cookbook\templates\account\password_reset_from_key.html:7 +#: .\cookbook\templates\account\password_reset_from_key.html:13 +#: .\cookbook\templates\account\password_reset_from_key_done.html:7 +#: .\cookbook\templates\account\password_reset_from_key_done.html:13 msgid "Change Password" msgstr "" #: .\cookbook\templates\account\password_change.html:12 #: .\cookbook\templates\account\password_set.html:12 -#: .\cookbook\templates\settings.html:52 +#: .\cookbook\templates\settings.html:76 msgid "Password" msgstr "" @@ -632,6 +924,28 @@ msgid "" "within a few minutes." msgstr "" +#: .\cookbook\templates\account\password_reset_from_key.html:13 +msgid "Bad Token" +msgstr "" + +#: .\cookbook\templates\account\password_reset_from_key.html:25 +#, python-format +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used.\n" +" Please request a new " +"password reset." +msgstr "" + +#: .\cookbook\templates\account\password_reset_from_key.html:33 +msgid "change password" +msgstr "" + +#: .\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 "" + #: .\cookbook\templates\account\password_set.html:6 #: .\cookbook\templates\account\password_set.html:16 #: .\cookbook\templates\account\password_set.html:21 @@ -683,98 +997,110 @@ msgstr "" msgid "We are sorry, but the sign up is currently closed." msgstr "" -#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:179 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:279 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "" -#: .\cookbook\templates\base.html:85 -msgid "Utensils" -msgstr "" - -#: .\cookbook\templates\base.html:95 +#: .\cookbook\templates\base.html:86 msgid "Shopping" msgstr "" -#: .\cookbook\templates\base.html:101 -#: .\cookbook\templates\shopping_list.html:230 +#: .\cookbook\templates\base.html:113 +msgid "Keyword" +msgstr "" + +#: .\cookbook\templates\base.html:125 .\cookbook\views\lists.py:114 +msgid "Foods" +msgstr "" + +#: .\cookbook\templates\base.html:137 +#: .\cookbook\templates\forms\ingredients.html:24 +#: .\cookbook\templates\space.html:47 .\cookbook\templates\stats.html:26 +#: .\cookbook\views\lists.py:131 +msgid "Units" +msgstr "" + +#: .\cookbook\templates\base.html:151 +#: .\cookbook\templates\shopping_list.html:208 #: .\cookbook\templates\supermarket.html:7 msgid "Supermarket" msgstr "" -#: .\cookbook\templates\base.html:112 .\cookbook\views\delete.py:84 -#: .\cookbook\views\edit.py:102 .\cookbook\views\lists.py:26 -#: .\cookbook\views\new.py:78 -msgid "Keyword" +#: .\cookbook\templates\base.html:163 +msgid "Supermarket Category" msgstr "" -#: .\cookbook\templates\base.html:114 +#: .\cookbook\templates\base.html:175 .\cookbook\views\lists.py:180 +msgid "Automations" +msgstr "" + +#: .\cookbook\templates\base.html:189 .\cookbook\views\lists.py:200 +msgid "Files" +msgstr "" + +#: .\cookbook\templates\base.html:201 msgid "Batch Edit" msgstr "" -#: .\cookbook\templates\base.html:119 -msgid "Storage Data" -msgstr "" - -#: .\cookbook\templates\base.html:123 -msgid "Storage Backends" -msgstr "" - -#: .\cookbook\templates\base.html:125 -msgid "Configure Sync" -msgstr "" - -#: .\cookbook\templates\base.html:127 -msgid "Discovered Recipes" -msgstr "" - -#: .\cookbook\templates\base.html:129 -msgid "Discovery Log" -msgstr "" - -#: .\cookbook\templates\base.html:131 .\cookbook\templates\stats.html:10 -msgid "Statistics" -msgstr "" - -#: .\cookbook\templates\base.html:133 -msgid "Units & Ingredients" -msgstr "" - -#: .\cookbook\templates\base.html:135 .\cookbook\templates\index.html:47 -msgid "Import Recipe" -msgstr "" - -#: .\cookbook\templates\base.html:156 .\cookbook\templates\history.html:6 +#: .\cookbook\templates\base.html:213 .\cookbook\templates\history.html:6 #: .\cookbook\templates\history.html:14 msgid "History" msgstr "" -#: .\cookbook\templates\base.html:159 .\cookbook\templates\space.html:7 -#: .\cookbook\templates\space.html:19 +#: .\cookbook\templates\base.html:228 .\cookbook\templates\export.html:14 +#: .\cookbook\templates\export.html:20 +#: .\cookbook\templates\shopping_list.html:310 +#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 +msgid "Export" +msgstr "" + +#: .\cookbook\templates\base.html:244 .\cookbook\templates\index.html:47 +msgid "Import Recipe" +msgstr "" + +#: .\cookbook\templates\base.html:246 +#: .\cookbook\templates\shopping_list.html:165 +#: .\cookbook\templates\shopping_list.html:188 +msgid "Create" +msgstr "" + +#: .\cookbook\templates\base.html:259 +#: .\cookbook\templates\generic\list_template.html:14 +#: .\cookbook\templates\space.html:69 .\cookbook\templates\stats.html:43 +msgid "External Recipes" +msgstr "" + +#: .\cookbook\templates\base.html:262 .\cookbook\templates\space.html:8 +#: .\cookbook\templates\space.html:20 .\cookbook\templates\space.html:150 msgid "Space Settings" msgstr "" -#: .\cookbook\templates\base.html:163 .\cookbook\templates\system.html:13 +#: .\cookbook\templates\base.html:267 .\cookbook\templates\system.html:13 msgid "System" msgstr "" -#: .\cookbook\templates\base.html:165 .\cookbook\templates\base.html:171 +#: .\cookbook\templates\base.html:269 msgid "Admin" msgstr "" -#: .\cookbook\templates\base.html:175 +#: .\cookbook\templates\base.html:273 msgid "Markdown Guide" msgstr "" -#: .\cookbook\templates\base.html:177 +#: .\cookbook\templates\base.html:275 msgid "GitHub" msgstr "" -#: .\cookbook\templates\base.html:181 +#: .\cookbook\templates\base.html:277 +msgid "Translate Tandoor" +msgstr "" + +#: .\cookbook\templates\base.html:281 msgid "API Browser" msgstr "" -#: .\cookbook\templates\base.html:184 +#: .\cookbook\templates\base.html:284 msgid "Log out" msgstr "" @@ -790,7 +1116,7 @@ msgstr "" msgid "Add the specified keywords to all recipes containing a word" msgstr "" -#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:85 +#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:82 msgid "Sync" msgstr "" @@ -808,10 +1134,36 @@ msgstr "" msgid "The path must be in the following format" msgstr "" -#: .\cookbook\templates\batch\monitor.html:27 +#: .\cookbook\templates\batch\monitor.html:20 +#: .\cookbook\templates\forms\edit_import_recipe.html:14 +#: .\cookbook\templates\generic\edit_template.html:23 +#: .\cookbook\templates\generic\new_template.html:23 +#: .\cookbook\templates\include\log_cooking.html:30 +#: .\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\shopping_list.html:311 +#: .\cookbook\templates\space.html:155 +msgid "Save" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:21 +msgid "Manage External Storage" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:28 msgid "Sync Now!" msgstr "" +#: .\cookbook\templates\batch\monitor.html:29 +msgid "Show Recipes" +msgstr "" + +#: .\cookbook\templates\batch\monitor.html:30 +msgid "Show Log" +msgstr "" + #: .\cookbook\templates\batch\waiting.html:4 #: .\cookbook\templates\batch\waiting.html:10 msgid "Importing Recipes" @@ -823,257 +1175,23 @@ msgid "" "please wait." msgstr "" -#: .\cookbook\templates\books.html:5 .\cookbook\templates\books.html:11 +#: .\cookbook\templates\books.html:7 msgid "Recipe Books" msgstr "" -#: .\cookbook\templates\books.html:15 -msgid "New Book" -msgstr "" - -#: .\cookbook\templates\books.html:27 .\cookbook\templates\recipe_view.html:26 -msgid "by" -msgstr "" - -#: .\cookbook\templates\books.html:34 -msgid "Toggle Recipes" -msgstr "" - -#: .\cookbook\templates\books.html:54 -#: .\cookbook\templates\meal_plan_entry.html:48 -#: .\cookbook\templates\recipes_table.html:64 -msgid "Last cooked" -msgstr "" - -#: .\cookbook\templates\books.html:71 -msgid "There are no recipes in this book yet." -msgstr "" - #: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6 msgid "Export Recipes" msgstr "" -#: .\cookbook\templates\export.html:14 .\cookbook\templates\export.html:20 -#: .\cookbook\templates\shopping_list.html:351 -#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 -msgid "Export" -msgstr "" - -#: .\cookbook\templates\files.html:7 -msgid "Files" -msgstr "" - #: .\cookbook\templates\forms\edit_import_recipe.html:5 #: .\cookbook\templates\forms\edit_import_recipe.html:9 msgid "Import new Recipe" msgstr "" -#: .\cookbook\templates\forms\edit_import_recipe.html:14 -#: .\cookbook\templates\forms\edit_internal_recipe.html:439 -#: .\cookbook\templates\forms\edit_internal_recipe.html:471 -#: .\cookbook\templates\generic\edit_template.html:23 -#: .\cookbook\templates\generic\new_template.html:23 -#: .\cookbook\templates\include\log_cooking.html:28 -#: .\cookbook\templates\meal_plan.html:325 -#: .\cookbook\templates\settings.html:46 .\cookbook\templates\settings.html:87 -#: .\cookbook\templates\settings.html:105 -#: .\cookbook\templates\shopping_list.html:353 -msgid "Save" -msgstr "" - #: .\cookbook\templates\forms\edit_internal_recipe.html:7 -#: .\cookbook\templates\forms\edit_internal_recipe.html:34 msgid "Edit Recipe" msgstr "" -#: .\cookbook\templates\forms\edit_internal_recipe.html:56 -#: .\cookbook\templates\url_import.html:171 -msgid "Description" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:76 -msgid "Waiting Time" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:82 -msgid "Servings Text" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:93 -msgid "Select Keywords" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:94 -#: .\cookbook\templates\url_import.html:583 -msgid "Add Keyword" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:112 -msgid "Nutrition" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:116 -#: .\cookbook\templates\forms\edit_internal_recipe.html:166 -msgid "Delete Step" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:120 -msgid "Calories" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:123 -msgid "Carbohydrates" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:126 -msgid "Fats" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:128 -msgid "Proteins" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:150 -#: .\cookbook\templates\forms\edit_internal_recipe.html:504 -msgid "Step" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:171 -msgid "Show as header" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:177 -msgid "Hide as header" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:182 -msgid "Move Up" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:187 -msgid "Move Down" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:196 -msgid "Step Name" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:200 -msgid "Step Type" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:213 -msgid "Step time in Minutes" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:229 -msgid "Select File" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:230 -#: .\cookbook\templates\forms\edit_internal_recipe.html:252 -#: .\cookbook\templates\forms\edit_internal_recipe.html:313 -#: .\cookbook\templates\forms\edit_internal_recipe.html:337 -#: .\cookbook\templates\shopping_list.html:189 -#: .\cookbook\templates\shopping_list.html:211 -#: .\cookbook\templates\shopping_list.html:241 -#: .\cookbook\templates\shopping_list.html:265 -#: .\cookbook\templates\url_import.html:495 -#: .\cookbook\templates\url_import.html:527 -msgid "Select" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:251 -msgid "Select Recipe" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:311 -#: .\cookbook\templates\shopping_list.html:187 -msgid "Select Unit" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:312 -#: .\cookbook\templates\forms\edit_internal_recipe.html:336 -#: .\cookbook\templates\shopping_list.html:188 -#: .\cookbook\templates\shopping_list.html:210 -msgid "Create" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:335 -#: .\cookbook\templates\shopping_list.html:209 -msgid "Select Food" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:352 -#: .\cookbook\templates\meal_plan.html:256 -#: .\cookbook\templates\url_import.html:542 -msgid "Note" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:369 -msgid "Delete Ingredient" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:375 -msgid "Make Header" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:381 -msgid "Make Ingredient" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:387 -msgid "Disable Amount" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:393 -msgid "Enable Amount" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:398 -msgid "Copy Template Reference" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:424 -#: .\cookbook\templates\url_import.html:297 -#: .\cookbook\templates\url_import.html:567 -msgid "Instructions" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:437 -#: .\cookbook\templates\forms\edit_internal_recipe.html:468 -msgid "Save & View" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:441 -#: .\cookbook\templates\forms\edit_internal_recipe.html:474 -msgid "Add Step" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:444 -#: .\cookbook\templates\forms\edit_internal_recipe.html:478 -msgid "Add Nutrition" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:446 -#: .\cookbook\templates\forms\edit_internal_recipe.html:480 -msgid "Remove Nutrition" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:448 -#: .\cookbook\templates\forms\edit_internal_recipe.html:483 -msgid "View Recipe" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:450 -#: .\cookbook\templates\forms\edit_internal_recipe.html:485 -msgid "Delete Recipe" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:491 -msgid "Steps" -msgstr "" - #: .\cookbook\templates\forms\ingredients.html:15 msgid "Edit Ingredients" msgstr "" @@ -1089,11 +1207,6 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\forms\ingredients.html:24 -#: .\cookbook\templates\space.html:41 .\cookbook\templates\stats.html:26 -msgid "Units" -msgstr "" - #: .\cookbook\templates\forms\ingredients.html:26 msgid "Are you sure that you want to merge these two units?" msgstr "" @@ -1107,29 +1220,46 @@ msgstr "" msgid "Are you sure that you want to merge these two ingredients?" msgstr "" -#: .\cookbook\templates\generic\delete_template.html:18 +#: .\cookbook\templates\generic\delete_template.html:21 #, python-format msgid "Are you sure you want to delete the %(title)s: %(object)s " msgstr "" -#: .\cookbook\templates\generic\edit_template.html:30 +#: .\cookbook\templates\generic\delete_template.html:26 +msgid "Protected" +msgstr "" + +#: .\cookbook\templates\generic\delete_template.html:41 +msgid "Cascade" +msgstr "" + +#: .\cookbook\templates\generic\delete_template.html:72 +msgid "Cancel" +msgstr "" + +#: .\cookbook\templates\generic\edit_template.html:32 msgid "View" msgstr "" -#: .\cookbook\templates\generic\edit_template.html:34 +#: .\cookbook\templates\generic\edit_template.html:36 msgid "Delete original file" msgstr "" #: .\cookbook\templates\generic\list_template.html:6 -#: .\cookbook\templates\generic\list_template.html:12 +#: .\cookbook\templates\generic\list_template.html:22 msgid "List" msgstr "" -#: .\cookbook\templates\generic\list_template.html:25 +#: .\cookbook\templates\generic\list_template.html:33 +#: .\cookbook\templates\shopping_list.html:33 +msgid "Try the new shopping list" +msgstr "" + +#: .\cookbook\templates\generic\list_template.html:45 msgid "Filter" msgstr "" -#: .\cookbook\templates\generic\list_template.html:30 +#: .\cookbook\templates\generic\list_template.html:50 msgid "Import all" msgstr "" @@ -1155,23 +1285,32 @@ msgstr "" msgid "Import Recipes" msgstr "" -#: .\cookbook\templates\include\log_cooking.html:7 +#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 +#: .\cookbook\templates\import_response.html:7 +#: .\cookbook\templates\test.html:14 .\cookbook\templates\test.html:20 +#: .\cookbook\templates\url_import.html:29 +#: .\cookbook\templates\url_import.html:108 +#: .\cookbook\templates\url_import.html:130 +#: .\cookbook\templates\url_import.html:324 +#: .\cookbook\templates\url_import.html:618 .\cookbook\views\delete.py:89 +#: .\cookbook\views\edit.py:200 +msgid "Import" +msgstr "" + +#: .\cookbook\templates\include\log_cooking.html:9 msgid "Log Recipe Cooking" msgstr "" -#: .\cookbook\templates\include\log_cooking.html:13 +#: .\cookbook\templates\include\log_cooking.html:15 msgid "All fields are optional and can be left empty." msgstr "" -#: .\cookbook\templates\include\log_cooking.html:19 +#: .\cookbook\templates\include\log_cooking.html:21 msgid "Rating" msgstr "" -#: .\cookbook\templates\include\log_cooking.html:27 +#: .\cookbook\templates\include\log_cooking.html:29 #: .\cookbook\templates\include\recipe_open_modal.html:18 -#: .\cookbook\templates\meal_plan.html:283 -#: .\cookbook\templates\meal_plan.html:327 -#: .\cookbook\templates\meal_plan.html:366 msgid "Close" msgstr "" @@ -1216,8 +1355,8 @@ msgstr "" msgid "Last viewed" msgstr "" -#: .\cookbook\templates\index.html:87 .\cookbook\templates\meal_plan.html:178 -#: .\cookbook\templates\space.html:35 .\cookbook\templates\stats.html:22 +#: .\cookbook\templates\index.html:87 .\cookbook\templates\space.html:37 +#: .\cookbook\templates\stats.html:22 msgid "Recipes" msgstr "" @@ -1360,145 +1499,22 @@ msgstr "" msgid "Cell" msgstr "" -#: .\cookbook\templates\meal_plan.html:101 -msgid "New Entry" +#: .\cookbook\templates\meal_plan_entry.html:6 +msgid "Meal Plan View" msgstr "" -#: .\cookbook\templates\meal_plan.html:113 -#: .\cookbook\templates\shopping_list.html:56 -msgid "Search Recipe" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:139 -msgid "Title" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:141 -msgid "Note (optional)" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:143 -msgid "" -"You can use markdown to format this field. See the docs here" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:147 -#: .\cookbook\templates\meal_plan.html:251 -msgid "Serving Count" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:153 -msgid "Create only note" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:168 -#: .\cookbook\templates\shopping_list.html:7 -#: .\cookbook\templates\shopping_list.html:29 -#: .\cookbook\templates\shopping_list.html:714 -msgid "Shopping List" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:172 -msgid "Shopping list currently empty" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:175 -msgid "Open Shopping List" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:189 -msgid "Plan" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:196 -msgid "Number of Days" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:206 -msgid "Weekday offset" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:209 -msgid "" -"Number of days starting from the first day of the week to offset the default " -"view." -msgstr "" - -#: .\cookbook\templates\meal_plan.html:217 -#: .\cookbook\templates\meal_plan.html:294 -msgid "Edit plan types" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:219 -msgid "Show help" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:220 -msgid "Week iCal export" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:264 #: .\cookbook\templates\meal_plan_entry.html:18 msgid "Created by" msgstr "" -#: .\cookbook\templates\meal_plan.html:270 #: .\cookbook\templates\meal_plan_entry.html:20 -#: .\cookbook\templates\shopping_list.html:254 +#: .\cookbook\templates\shopping_list.html:232 msgid "Shared with" msgstr "" -#: .\cookbook\templates\meal_plan.html:280 -msgid "Add to Shopping" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:323 -msgid "New meal type" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:338 -msgid "Meal Plan Help" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:344 -msgid "" -"\n" -"

The meal plan module allows planning of meals " -"both with recipes and notes.

\n" -"

Simply select a recipe from the list of " -"recently viewed recipes or search the one you\n" -" want and drag it to the desired plan " -"position. You can also add a note and a title and\n" -" then drag the recipe to create a plan entry " -"with a custom title and note. Creating only\n" -" Notes is possible by dragging the create " -"note box into the plan.

\n" -"

Click on a recipe in order to open the " -"detailed view. There you can also add it to the\n" -" shopping list. You can also add all recipes " -"of a day to the shopping list by\n" -" clicking the shopping cart at the top of the " -"table.

\n" -"

Since a common use case is to plan meals " -"together you can define\n" -" users you want to share your plan with in " -"the settings.\n" -"

\n" -"

You can also edit the types of meals you want " -"to plan. If you share your plan with\n" -" someone with\n" -" different meals, their meal types will " -"appear in your list as well. To prevent\n" -" duplicates (e.g. Other and Misc.)\n" -" name your meal types the same as the users " -"you share your meals with and they will be\n" -" merged.

\n" -" " -msgstr "" - -#: .\cookbook\templates\meal_plan_entry.html:6 -msgid "Meal Plan View" +#: .\cookbook\templates\meal_plan_entry.html:48 +#: .\cookbook\templates\recipes_table.html:64 +msgid "Last cooked" msgstr "" #: .\cookbook\templates\meal_plan_entry.html:50 @@ -1592,29 +1608,28 @@ msgid "" "recently viewed them. Keep in mind that data might be outdated." msgstr "" -#: .\cookbook\templates\recipe_view.html:21 .\cookbook\templates\space.html:62 -#: .\cookbook\templates\stats.html:47 -msgid "Comments" +#: .\cookbook\templates\recipe_view.html:26 +msgid "by" msgstr "" -#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:118 -#: .\cookbook\views\edit.py:179 +#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:147 +#: .\cookbook\views\edit.py:180 msgid "Comment" msgstr "" #: .\cookbook\templates\recipes_table.html:19 #: .\cookbook\templates\recipes_table.html:23 -#: .\cookbook\templates\url_import.html:440 +#: .\cookbook\templates\url_import.html:447 msgid "Recipe Image" msgstr "" #: .\cookbook\templates\recipes_table.html:51 -#: .\cookbook\templates\url_import.html:445 +#: .\cookbook\templates\url_import.html:452 msgid "Preparation time ca." msgstr "" #: .\cookbook\templates\recipes_table.html:57 -#: .\cookbook\templates\url_import.html:450 +#: .\cookbook\templates\url_import.html:457 msgid "Waiting time ca." msgstr "" @@ -1630,63 +1645,284 @@ msgstr "" msgid "Recipe Home" msgstr "" -#: .\cookbook\templates\settings.html:25 +#: .\cookbook\templates\search_info.html:5 +#: .\cookbook\templates\search_info.html:9 +#: .\cookbook\templates\settings.html:172 +msgid "Search Settings" +msgstr "" + +#: .\cookbook\templates\search_info.html:10 +msgid "" +"\n" +" Creating the best search experience is complicated and weighs " +"heavily on your personal configuration. \n" +" Changing any of the search settings can have significant impact on " +"the speed and quality of the results.\n" +" Search Methods, Trigrams and Full Text Search configurations are " +"only available if you are using Postgres for your database.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:19 +msgid "Search Methods" +msgstr "" + +#: .\cookbook\templates\search_info.html:23 +msgid "" +" \n" +" Full text searches attempt to normalize the words provided to " +"match common variants. For example: 'forked', 'forking', 'forks' will all " +"normalize to 'fork'.\n" +" There are several methods available, described below, that will " +"control how the search behavior should react when multiple words are " +"searched.\n" +" Full technical details on how these operate can be viewed on Postgresql's website.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:29 +msgid "" +" \n" +" Simple searches ignore punctuation and common words such as " +"'the', 'a', 'and'. And will treat seperate words as required.\n" +" Searching for 'apple or flour' will return any recipe that " +"includes both 'apple' and 'flour' anywhere in the fields that have been " +"selected for a full text search.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:34 +msgid "" +" \n" +" Phrase searches ignore punctuation, but will search for all of " +"the words in the exact order provided.\n" +" Searching for 'apple or flour' will only return a recipe that " +"includes the exact phrase 'apple or flour' in any of the fields that have " +"been selected for a full text search.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:39 +msgid "" +" \n" +" Web searches simulate functionality found on many web search " +"sites supporting special syntax.\n" +" Placing quotes around several words will convert those words " +"into a phrase.\n" +" 'or' is recongized as searching for the word (or phrase) " +"immediately before 'or' OR the word (or phrase) directly after.\n" +" '-' is recognized as searching for recipes that do not include " +"the word (or phrase) that comes immediately after. \n" +" For example searching for 'apple pie' or cherry -butter will " +"return any recipe that includes the phrase 'apple pie' or the word " +"'cherry' \n" +" in any field included in the full text search but exclude any " +"recipe that has the word 'butter' in any field included.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:48 +msgid "" +" \n" +" Raw search is similar to Web except will take puncuation " +"operators such as '|', '&' and '()'\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:59 +msgid "" +" \n" +" Another approach to searching that also requires Postgresql is " +"fuzzy search or trigram similarity. A trigram is a group of three " +"consecutive characters.\n" +" For example searching for 'apple' will create x trigrams 'app', " +"'ppl', 'ple' and will create a score of how closely words match the " +"generated trigrams.\n" +" One benefit of searching trigams is that a search for 'sandwich' " +"will find mispelled words such as 'sandwhich' that would be missed by other " +"methods.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:69 +msgid "Search Fields" +msgstr "" + +#: .\cookbook\templates\search_info.html:73 +msgid "" +" \n" +" Unaccent is a special case in that it enables searching a field " +"'unaccented' for each search style attempting to ignore accented values. \n" +" For example when you enable unaccent for 'Name' any search " +"(starts with, contains, trigram) will attempt the search ignoring accented " +"characters.\n" +" \n" +" For the other options, you can enable search on any or all " +"fields and they will be combined together with an assumed 'OR'.\n" +" For example enabling 'Name' for Starts With, 'Name' and " +"'Description' for Partial Match and 'Ingredients' and 'Keywords' for Full " +"Search\n" +" and searching for 'apple' will generate a search that will " +"return recipes that have:\n" +" - A recipe name that starts with 'apple'\n" +" - OR a recipe name that contains 'apple'\n" +" - OR a recipe description that contains 'apple'\n" +" - OR a recipe that will have a full text search match ('apple' " +"or 'apples') in ingredients\n" +" - OR a recipe that will have a full text search match in " +"Keywords\n" +"\n" +" Combining too many fields in too many types of search can have a " +"negative impact on performance, create duplicate results or return " +"unexpected results.\n" +" For example, enabling fuzzy search or partial matches will " +"interfere with web search methods. \n" +" Searching for 'apple -pie' with fuzzy search and full text " +"search will return the recipe Apple Pie. Though it is not included in the " +"full text results, it does match the trigram results.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:95 +msgid "Search Index" +msgstr "" + +#: .\cookbook\templates\search_info.html:99 +msgid "" +" \n" +" Trigram search and Full Text Search both rely on database " +"indexes to perform effectively. \n" +" You can rebuild the indexes on all fields in the Admin page for " +"Recipes and selecting all recipes and running 'rebuild index for selected " +"recipes'\n" +" You can also rebuild indexes at the command line by executing " +"the management command 'python manage.py rebuildindex'\n" +" " +msgstr "" + +#: .\cookbook\templates\settings.html:28 msgid "Account" msgstr "" -#: .\cookbook\templates\settings.html:29 +#: .\cookbook\templates\settings.html:35 msgid "Preferences" msgstr "" -#: .\cookbook\templates\settings.html:33 +#: .\cookbook\templates\settings.html:42 msgid "API-Settings" msgstr "" -#: .\cookbook\templates\settings.html:41 +#: .\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:49 +#: .\cookbook\templates\settings.html:73 msgid "Account Settings" msgstr "" -#: .\cookbook\templates\settings.html:51 +#: .\cookbook\templates\settings.html:75 msgid "Emails" msgstr "" -#: .\cookbook\templates\settings.html:54 +#: .\cookbook\templates\settings.html:78 #: .\cookbook\templates\socialaccount\connections.html:11 msgid "Social" msgstr "" -#: .\cookbook\templates\settings.html:66 +#: .\cookbook\templates\settings.html:91 msgid "Language" msgstr "" -#: .\cookbook\templates\settings.html:96 +#: .\cookbook\templates\settings.html:121 msgid "Style" msgstr "" -#: .\cookbook\templates\settings.html:116 +#: .\cookbook\templates\settings.html:142 msgid "API Token" msgstr "" -#: .\cookbook\templates\settings.html:117 +#: .\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:134 +#: .\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:136 +#: .\cookbook\templates\settings.html:162 msgid "or" msgstr "" +#: .\cookbook\templates\settings.html:173 +msgid "" +"There are many options to configure the search depending on your personal " +"preferences." +msgstr "" + +#: .\cookbook\templates\settings.html:174 +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 +msgid "" +"If you do want to configure the search you can read about the different " +"options here." +msgstr "" + +#: .\cookbook\templates\settings.html:180 +msgid "Fuzzy" +msgstr "" + +#: .\cookbook\templates\settings.html:181 +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 +msgid "This is the default behavior" +msgstr "" + +#: .\cookbook\templates\settings.html:183 +#: .\cookbook\templates\settings.html:191 +msgid "Apply" +msgstr "" + +#: .\cookbook\templates\settings.html:188 +msgid "Precise" +msgstr "" + +#: .\cookbook\templates\settings.html:189 +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 +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 "" @@ -1704,50 +1940,73 @@ msgstr "" msgid "Create Superuser account" msgstr "" -#: .\cookbook\templates\shopping_list.html:79 +#: .\cookbook\templates\shopping_list.html:8 +#: .\cookbook\templates\shopping_list.html:29 +#: .\cookbook\templates\shopping_list.html:663 +msgid "Shopping List" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:55 +msgid "Search Recipe" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:72 msgid "Shopping Recipes" msgstr "" -#: .\cookbook\templates\shopping_list.html:83 +#: .\cookbook\templates\shopping_list.html:74 msgid "No recipes selected" msgstr "" -#: .\cookbook\templates\shopping_list.html:150 +#: .\cookbook\templates\shopping_list.html:131 msgid "Entry Mode" msgstr "" -#: .\cookbook\templates\shopping_list.html:158 +#: .\cookbook\templates\shopping_list.html:139 msgid "Add Entry" msgstr "" -#: .\cookbook\templates\shopping_list.html:174 +#: .\cookbook\templates\shopping_list.html:152 msgid "Amount" msgstr "" -#: .\cookbook\templates\shopping_list.html:240 +#: .\cookbook\templates\shopping_list.html:164 +msgid "Select Unit" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:166 +#: .\cookbook\templates\shopping_list.html:189 +#: .\cookbook\templates\shopping_list.html:219 +#: .\cookbook\templates\shopping_list.html:243 +#: .\cookbook\templates\url_import.html:505 +#: .\cookbook\templates\url_import.html:537 +msgid "Select" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:187 +msgid "Select Food" +msgstr "" + +#: .\cookbook\templates\shopping_list.html:218 msgid "Select Supermarket" msgstr "" -#: .\cookbook\templates\shopping_list.html:264 +#: .\cookbook\templates\shopping_list.html:242 msgid "Select User" msgstr "" -#: .\cookbook\templates\shopping_list.html:283 +#: .\cookbook\templates\shopping_list.html:258 msgid "Finished" msgstr "" -#: .\cookbook\templates\shopping_list.html:296 +#: .\cookbook\templates\shopping_list.html:267 msgid "You are offline, shopping list might not syncronize." msgstr "" -#: .\cookbook\templates\shopping_list.html:361 +#: .\cookbook\templates\shopping_list.html:318 msgid "Copy/Export" msgstr "" -#: .\cookbook\templates\shopping_list.html:365 -msgid "List Prefix" -msgstr "" - #: .\cookbook\templates\socialaccount\connections.html:4 #: .\cookbook\templates\socialaccount\connections.html:15 msgid "Account Connections" @@ -1797,84 +2056,80 @@ msgstr "" msgid "Sign in using" msgstr "" -#: .\cookbook\templates\space.html:23 +#: .\cookbook\templates\space.html:25 msgid "Space:" msgstr "" -#: .\cookbook\templates\space.html:24 +#: .\cookbook\templates\space.html:26 msgid "Manage Subscription" msgstr "" -#: .\cookbook\templates\space.html:32 .\cookbook\templates\stats.html:19 +#: .\cookbook\templates\space.html:34 .\cookbook\templates\stats.html:19 msgid "Number of objects" msgstr "" -#: .\cookbook\templates\space.html:45 .\cookbook\templates\stats.html:30 +#: .\cookbook\templates\space.html:54 .\cookbook\templates\stats.html:30 msgid "Recipe Imports" msgstr "" -#: .\cookbook\templates\space.html:53 .\cookbook\templates\stats.html:38 +#: .\cookbook\templates\space.html:62 .\cookbook\templates\stats.html:38 msgid "Objects stats" msgstr "" -#: .\cookbook\templates\space.html:56 .\cookbook\templates\stats.html:41 +#: .\cookbook\templates\space.html:65 .\cookbook\templates\stats.html:41 msgid "Recipes without Keywords" msgstr "" -#: .\cookbook\templates\space.html:58 .\cookbook\templates\stats.html:43 -msgid "External Recipes" -msgstr "" - -#: .\cookbook\templates\space.html:60 .\cookbook\templates\stats.html:45 +#: .\cookbook\templates\space.html:73 .\cookbook\templates\stats.html:45 msgid "Internal Recipes" msgstr "" -#: .\cookbook\templates\space.html:73 +#: .\cookbook\templates\space.html:89 msgid "Members" msgstr "" -#: .\cookbook\templates\space.html:77 +#: .\cookbook\templates\space.html:95 msgid "Invite User" msgstr "" -#: .\cookbook\templates\space.html:88 +#: .\cookbook\templates\space.html:107 msgid "User" msgstr "" -#: .\cookbook\templates\space.html:89 +#: .\cookbook\templates\space.html:108 msgid "Groups" msgstr "" -#: .\cookbook\templates\space.html:105 +#: .\cookbook\templates\space.html:119 msgid "admin" msgstr "" -#: .\cookbook\templates\space.html:106 +#: .\cookbook\templates\space.html:120 msgid "user" msgstr "" -#: .\cookbook\templates\space.html:107 +#: .\cookbook\templates\space.html:121 msgid "guest" msgstr "" -#: .\cookbook\templates\space.html:108 +#: .\cookbook\templates\space.html:122 msgid "remove" msgstr "" -#: .\cookbook\templates\space.html:112 +#: .\cookbook\templates\space.html:126 msgid "Update" msgstr "" -#: .\cookbook\templates\space.html:116 +#: .\cookbook\templates\space.html:130 msgid "You cannot edit yourself." msgstr "" -#: .\cookbook\templates\space.html:123 +#: .\cookbook\templates\space.html:136 msgid "There are no members in your space yet!" msgstr "" -#: .\cookbook\templates\space.html:130 .\cookbook\templates\system.html:21 -#: .\cookbook\views\lists.py:115 +#: .\cookbook\templates\space.html:143 .\cookbook\templates\system.html:21 +#: .\cookbook\views\lists.py:85 msgid "Invite Links" msgstr "" @@ -1882,6 +2137,10 @@ msgstr "" msgid "Stats" msgstr "" +#: .\cookbook\templates\stats.html:10 +msgid "Statistics" +msgstr "" + #: .\cookbook\templates\system.html:22 msgid "Show Links" msgstr "" @@ -1979,141 +2238,166 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\url_import.html:6 +#: .\cookbook\templates\url_import.html:8 msgid "URL Import" msgstr "" -#: .\cookbook\templates\url_import.html:31 +#: .\cookbook\templates\url_import.html:33 msgid "Drag me to your bookmarks to import recipes from anywhere" msgstr "" -#: .\cookbook\templates\url_import.html:32 +#: .\cookbook\templates\url_import.html:34 msgid "Bookmark Me!" msgstr "" -#: .\cookbook\templates\url_import.html:61 +#: .\cookbook\templates\url_import.html:38 +msgid "URL" +msgstr "" + +#: .\cookbook\templates\url_import.html:40 +msgid "App" +msgstr "" + +#: .\cookbook\templates\url_import.html:64 msgid "Enter website URL" msgstr "" -#: .\cookbook\templates\url_import.html:97 +#: .\cookbook\templates\url_import.html:104 msgid "Select recipe files to import or drop them here..." msgstr "" -#: .\cookbook\templates\url_import.html:118 +#: .\cookbook\templates\url_import.html:125 msgid "Paste json or html source here to load recipe." msgstr "" -#: .\cookbook\templates\url_import.html:146 +#: .\cookbook\templates\url_import.html:153 msgid "Preview Recipe Data" msgstr "" -#: .\cookbook\templates\url_import.html:147 +#: .\cookbook\templates\url_import.html:154 msgid "Drag recipe attributes from the right into the appropriate box below." msgstr "" -#: .\cookbook\templates\url_import.html:156 -#: .\cookbook\templates\url_import.html:173 -#: .\cookbook\templates\url_import.html:190 -#: .\cookbook\templates\url_import.html:209 -#: .\cookbook\templates\url_import.html:227 -#: .\cookbook\templates\url_import.html:242 -#: .\cookbook\templates\url_import.html:257 -#: .\cookbook\templates\url_import.html:273 -#: .\cookbook\templates\url_import.html:300 -#: .\cookbook\templates\url_import.html:351 +#: .\cookbook\templates\url_import.html:163 +#: .\cookbook\templates\url_import.html:180 +#: .\cookbook\templates\url_import.html:197 +#: .\cookbook\templates\url_import.html:216 +#: .\cookbook\templates\url_import.html:234 +#: .\cookbook\templates\url_import.html:249 +#: .\cookbook\templates\url_import.html:264 +#: .\cookbook\templates\url_import.html:280 +#: .\cookbook\templates\url_import.html:307 +#: .\cookbook\templates\url_import.html:358 msgid "Clear Contents" msgstr "" -#: .\cookbook\templates\url_import.html:158 +#: .\cookbook\templates\url_import.html:165 msgid "Text dragged here will be appended to the name." msgstr "" -#: .\cookbook\templates\url_import.html:175 +#: .\cookbook\templates\url_import.html:178 +msgid "Description" +msgstr "" + +#: .\cookbook\templates\url_import.html:182 msgid "Text dragged here will be appended to the description." msgstr "" -#: .\cookbook\templates\url_import.html:192 +#: .\cookbook\templates\url_import.html:199 msgid "Keywords dragged here will be appended to current list" msgstr "" -#: .\cookbook\templates\url_import.html:207 +#: .\cookbook\templates\url_import.html:214 msgid "Image" msgstr "" -#: .\cookbook\templates\url_import.html:239 +#: .\cookbook\templates\url_import.html:246 msgid "Prep Time" msgstr "" -#: .\cookbook\templates\url_import.html:254 +#: .\cookbook\templates\url_import.html:261 msgid "Cook Time" msgstr "" -#: .\cookbook\templates\url_import.html:275 +#: .\cookbook\templates\url_import.html:282 msgid "Ingredients dragged here will be appended to current list." msgstr "" -#: .\cookbook\templates\url_import.html:302 +#: .\cookbook\templates\url_import.html:304 +#: .\cookbook\templates\url_import.html:579 +msgid "Instructions" +msgstr "" + +#: .\cookbook\templates\url_import.html:309 msgid "" "Recipe instructions dragged here will be appended to current instructions." msgstr "" -#: .\cookbook\templates\url_import.html:325 +#: .\cookbook\templates\url_import.html:332 msgid "Discovered Attributes" msgstr "" -#: .\cookbook\templates\url_import.html:327 +#: .\cookbook\templates\url_import.html:334 msgid "" "Drag recipe attributes from below into the appropriate box on the left. " "Click any node to display its full properties." msgstr "" -#: .\cookbook\templates\url_import.html:344 +#: .\cookbook\templates\url_import.html:351 msgid "Show Blank Field" msgstr "" -#: .\cookbook\templates\url_import.html:349 +#: .\cookbook\templates\url_import.html:356 msgid "Blank Field" msgstr "" -#: .\cookbook\templates\url_import.html:353 +#: .\cookbook\templates\url_import.html:360 msgid "Items dragged to Blank Field will be appended." msgstr "" -#: .\cookbook\templates\url_import.html:400 +#: .\cookbook\templates\url_import.html:407 msgid "Delete Text" msgstr "" -#: .\cookbook\templates\url_import.html:413 +#: .\cookbook\templates\url_import.html:420 msgid "Delete image" msgstr "" -#: .\cookbook\templates\url_import.html:429 +#: .\cookbook\templates\url_import.html:436 msgid "Recipe Name" msgstr "" -#: .\cookbook\templates\url_import.html:433 +#: .\cookbook\templates\url_import.html:440 msgid "Recipe Description" msgstr "" -#: .\cookbook\templates\url_import.html:494 -#: .\cookbook\templates\url_import.html:526 -#: .\cookbook\templates\url_import.html:582 +#: .\cookbook\templates\url_import.html:504 +#: .\cookbook\templates\url_import.html:536 +#: .\cookbook\templates\url_import.html:596 msgid "Select one" msgstr "" -#: .\cookbook\templates\url_import.html:596 +#: .\cookbook\templates\url_import.html:554 +msgid "Note" +msgstr "" + +#: .\cookbook\templates\url_import.html:597 +msgid "Add Keyword" +msgstr "" + +#: .\cookbook\templates\url_import.html:610 msgid "All Keywords" msgstr "" -#: .\cookbook\templates\url_import.html:599 +#: .\cookbook\templates\url_import.html:613 msgid "Import all keywords, not only the ones already existing." msgstr "" -#: .\cookbook\templates\url_import.html:626 +#: .\cookbook\templates\url_import.html:640 msgid "Information" msgstr "" -#: .\cookbook\templates\url_import.html:628 +#: .\cookbook\templates\url_import.html:642 msgid "" " Only websites containing ld+json or microdata information can currently\n" " be imported. Most big recipe pages " @@ -2124,274 +2408,439 @@ msgid "" " github issues." msgstr "" -#: .\cookbook\templates\url_import.html:636 +#: .\cookbook\templates\url_import.html:650 msgid "Google ld+json Info" msgstr "" -#: .\cookbook\templates\url_import.html:639 +#: .\cookbook\templates\url_import.html:653 msgid "GitHub Issues" msgstr "" -#: .\cookbook\templates\url_import.html:641 +#: .\cookbook\templates\url_import.html:655 msgid "Recipe Markup Specification" msgstr "" -#: .\cookbook\views\api.py:79 +#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:170 msgid "Parameter updated_at incorrectly formatted" msgstr "" -#: .\cookbook\views\api.py:580 .\cookbook\views\views.py:303 -msgid "This feature is not available in the demo version!" +#: .\cookbook\views\api.py:190 .\cookbook\views\api.py:291 +#, python-brace-format +msgid "No {self.basename} with id {pk} exists" msgstr "" -#: .\cookbook\views\api.py:603 +#: .\cookbook\views\api.py:194 +msgid "Cannot merge with the same object!" +msgstr "" + +#: .\cookbook\views\api.py:201 +#, python-brace-format +msgid "No {self.basename} with id {target} exists" +msgstr "" + +#: .\cookbook\views\api.py:206 +msgid "Cannot merge with child object!" +msgstr "" + +#: .\cookbook\views\api.py:239 +#, python-brace-format +msgid "{source.name} was merged successfully with {target.name}" +msgstr "" + +#: .\cookbook\views\api.py:244 +#, python-brace-format +msgid "An error occurred attempting to merge {source.name} with {target.name}" +msgstr "" + +#: .\cookbook\views\api.py:300 +#, python-brace-format +msgid "{child.name} was moved successfully to the root." +msgstr "" + +#: .\cookbook\views\api.py:303 .\cookbook\views\api.py:321 +msgid "An error occurred attempting to move " +msgstr "" + +#: .\cookbook\views\api.py:306 +msgid "Cannot move an object to itself!" +msgstr "" + +#: .\cookbook\views\api.py:312 +#, python-brace-format +msgid "No {self.basename} with id {parent} exists" +msgstr "" + +#: .\cookbook\views\api.py:318 +#, python-brace-format +msgid "{child.name} was moved successfully to parent {parent.name}" +msgstr "" + +#: .\cookbook\views\api.py:470 +#, python-brace-format +msgid "{obj.name} was removed from the shopping list." +msgstr "" + +#: .\cookbook\views\api.py:475 .\cookbook\views\api.py:726 +#, python-brace-format +msgid "{obj.name} was added to the shopping list." +msgstr "" + +#: .\cookbook\views\api.py:587 +msgid "ID of recipe a step is part of. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:588 +msgid "Query string matched (fuzzy) against object name." +msgstr "" + +#: .\cookbook\views\api.py:631 +msgid "" +"Query string matched (fuzzy) against recipe name. In the future also " +"fulltext search." +msgstr "" + +#: .\cookbook\views\api.py:632 +msgid "ID of keyword a recipe should have. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:633 +msgid "ID of food a recipe should have. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:634 +msgid "ID of unit a recipe should have." +msgstr "" + +#: .\cookbook\views\api.py:635 +msgid "Rating a recipe should have. [0 - 5]" +msgstr "" + +#: .\cookbook\views\api.py:636 +msgid "ID of book a recipe should be in. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:637 +msgid "" +"If recipe should have all (AND=false) or any (OR=true) of the " +"provided keywords." +msgstr "" + +#: .\cookbook\views\api.py:638 +msgid "" +"If recipe should have all (AND=false) or any (OR=true) of the " +"provided foods." +msgstr "" + +#: .\cookbook\views\api.py:639 +msgid "" +"If recipe should be in all (AND=false) or any (OR=true) of the " +"provided books." +msgstr "" + +#: .\cookbook\views\api.py:640 +msgid "If only internal recipes should be returned. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:641 +msgid "Returns the results in randomized order. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:642 +msgid "Returns new results first in search results. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:768 +msgid "" +"Returns the shopping list entry with a primary key of id. Multiple values " +"allowed." +msgstr "" + +#: .\cookbook\views\api.py:771 +msgid "" +"Filter shopping list entries on checked. [true, false, both, recent]
- recent includes unchecked items and recently completed items." +msgstr "" + +#: .\cookbook\views\api.py:773 +msgid "Returns the shopping list entries sorted by supermarket category order." +msgstr "" + +#: .\cookbook\views\api.py:922 .\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 "" + +#: .\cookbook\views\api.py:944 msgid "Sync successful!" msgstr "" -#: .\cookbook\views\api.py:608 +#: .\cookbook\views\api.py:949 msgid "Error synchronizing with Storage" msgstr "" -#: .\cookbook\views\api.py:686 +#: .\cookbook\views\api.py:1028 msgid "Nothing to do." msgstr "" -#: .\cookbook\views\api.py:701 +#: .\cookbook\views\api.py:1043 msgid "The requested site provided malformed data and cannot be read." msgstr "" -#: .\cookbook\views\api.py:708 +#: .\cookbook\views\api.py:1050 msgid "The requested page could not be found." msgstr "" -#: .\cookbook\views\api.py:717 +#: .\cookbook\views\api.py:1068 msgid "" "The requested site does not provide any recognized data format to import the " "recipe from." msgstr "" -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:1082 +msgid "Connection Refused." +msgstr "" + +#: .\cookbook\views\api.py:1091 msgid "No useable data could be found." msgstr "" -#: .\cookbook\views\api.py:747 +#: .\cookbook\views\api.py:1107 msgid "I couldn't find anything to do." msgstr "" -#: .\cookbook\views\data.py:31 .\cookbook\views\data.py:122 -#: .\cookbook\views\edit.py:50 .\cookbook\views\import_export.py:67 -#: .\cookbook\views\new.py:32 +#: .\cookbook\views\data.py:34 .\cookbook\views\data.py:129 +#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:80 +#: .\cookbook\views\new.py:33 msgid "You have reached the maximum number of recipes for your space." msgstr "" -#: .\cookbook\views\data.py:35 .\cookbook\views\data.py:126 -#: .\cookbook\views\edit.py:54 .\cookbook\views\import_export.py:71 -#: .\cookbook\views\new.py:36 +#: .\cookbook\views\data.py:38 .\cookbook\views\data.py:133 +#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:84 +#: .\cookbook\views\new.py:37 msgid "You have more users than allowed in your space." msgstr "" -#: .\cookbook\views\data.py:104 +#: .\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] "" -#: .\cookbook\views\delete.py:72 +#: .\cookbook\views\delete.py:101 msgid "Monitor" msgstr "" -#: .\cookbook\views\delete.py:96 .\cookbook\views\lists.py:102 -#: .\cookbook\views\new.py:98 +#: .\cookbook\views\delete.py:125 .\cookbook\views\lists.py:71 +#: .\cookbook\views\new.py:101 msgid "Storage Backend" msgstr "" -#: .\cookbook\views\delete.py:106 +#: .\cookbook\views\delete.py:135 msgid "" "Could not delete this storage backend as it is used in at least one monitor." msgstr "" -#: .\cookbook\views\delete.py:129 .\cookbook\views\edit.py:213 -#: .\cookbook\views\new.py:156 +#: .\cookbook\views\delete.py:158 msgid "Recipe Book" msgstr "" -#: .\cookbook\views\delete.py:141 +#: .\cookbook\views\delete.py:170 msgid "Bookmarks" msgstr "" -#: .\cookbook\views\delete.py:163 .\cookbook\views\new.py:252 +#: .\cookbook\views\delete.py:192 .\cookbook\views\new.py:238 msgid "Invite Link" msgstr "" -#: .\cookbook\views\edit.py:119 -msgid "Food" -msgstr "" - -#: .\cookbook\views\edit.py:128 +#: .\cookbook\views\edit.py:125 msgid "You cannot edit this storage!" msgstr "" -#: .\cookbook\views\edit.py:148 +#: .\cookbook\views\edit.py:149 msgid "Storage saved!" msgstr "" -#: .\cookbook\views\edit.py:154 +#: .\cookbook\views\edit.py:155 msgid "There was an error updating this storage backend!" msgstr "" -#: .\cookbook\views\edit.py:165 -msgid "Storage" -msgstr "" - -#: .\cookbook\views\edit.py:261 +#: .\cookbook\views\edit.py:248 msgid "Changes saved!" msgstr "" -#: .\cookbook\views\edit.py:265 +#: .\cookbook\views\edit.py:252 msgid "Error saving changes!" msgstr "" -#: .\cookbook\views\edit.py:299 -msgid "Units merged!" -msgstr "" - -#: .\cookbook\views\edit.py:301 .\cookbook\views\edit.py:317 -msgid "Cannot merge with the same object!" -msgstr "" - -#: .\cookbook\views\edit.py:315 -msgid "Foods merged!" -msgstr "" - -#: .\cookbook\views\import_export.py:93 +#: .\cookbook\views\import_export.py:106 msgid "Importing is not implemented for this provider" msgstr "" -#: .\cookbook\views\import_export.py:115 +#: .\cookbook\views\import_export.py:127 +msgid "" +"The PDF Exporter is not enabled on this instance as it is still in an " +"experimental state." +msgstr "" + +#: .\cookbook\views\import_export.py:132 msgid "Exporting is not implemented for this provider" msgstr "" -#: .\cookbook\views\lists.py:40 +#: .\cookbook\views\lists.py:25 msgid "Import Log" msgstr "" -#: .\cookbook\views\lists.py:53 +#: .\cookbook\views\lists.py:38 msgid "Discovery" msgstr "" -#: .\cookbook\views\lists.py:85 +#: .\cookbook\views\lists.py:54 msgid "Shopping Lists" msgstr "" -#: .\cookbook\views\new.py:123 -msgid "Imported new recipe!" +#: .\cookbook\views\lists.py:148 +msgid "Supermarkets" +msgstr "" + +#: .\cookbook\views\lists.py:164 +msgid "Shopping Categories" +msgstr "" + +#: .\cookbook\views\lists.py:217 +msgid "Steps" +msgstr "" + +#: .\cookbook\views\lists.py:232 +msgid "New Shopping List" msgstr "" #: .\cookbook\views\new.py:126 +msgid "Imported new recipe!" +msgstr "" + +#: .\cookbook\views\new.py:129 msgid "There was an error importing this recipe!" msgstr "" -#: .\cookbook\views\new.py:226 +#: .\cookbook\views\new.py:212 msgid "Hello" msgstr "" -#: .\cookbook\views\new.py:226 +#: .\cookbook\views\new.py:212 msgid "You have been invited by " msgstr "" -#: .\cookbook\views\new.py:227 +#: .\cookbook\views\new.py:213 msgid " to join their Tandoor Recipes space " msgstr "" -#: .\cookbook\views\new.py:228 +#: .\cookbook\views\new.py:214 msgid "Click the following link to activate your account: " msgstr "" -#: .\cookbook\views\new.py:229 +#: .\cookbook\views\new.py:215 msgid "" "If the link does not work use the following code to manually join the space: " msgstr "" -#: .\cookbook\views\new.py:230 +#: .\cookbook\views\new.py:216 msgid "The invitation is valid until " msgstr "" -#: .\cookbook\views\new.py:231 +#: .\cookbook\views\new.py:217 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " msgstr "" -#: .\cookbook\views\new.py:234 +#: .\cookbook\views\new.py:220 msgid "Tandoor Recipes Invite" msgstr "" -#: .\cookbook\views\new.py:241 +#: .\cookbook\views\new.py:227 msgid "Invite link successfully send to user." msgstr "" -#: .\cookbook\views\new.py:244 +#: .\cookbook\views\new.py:230 msgid "" "You have send to many emails, please share the link manually or wait a few " "hours." msgstr "" -#: .\cookbook\views\new.py:246 +#: .\cookbook\views\new.py:232 msgid "Email to user could not be send, please share link manually." msgstr "" -#: .\cookbook\views\views.py:129 +#: .\cookbook\views\views.py:126 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:177 +#: .\cookbook\views\views.py:174 msgid "You do not have the required permissions to perform this action!" msgstr "" -#: .\cookbook\views\views.py:188 +#: .\cookbook\views\views.py:185 msgid "Comment saved!" msgstr "" -#: .\cookbook\views\views.py:395 +#: .\cookbook\views\views.py:276 +msgid "This feature is not available in the demo version!" +msgstr "" + +#: .\cookbook\views\views.py:335 +msgid "You must select at least one field to search!" +msgstr "" + +#: .\cookbook\views\views.py:340 +msgid "" +"To use this search method you must select at least one full text search " +"field!" +msgstr "" + +#: .\cookbook\views\views.py:344 +msgid "Fuzzy search is not compatible with this search method!" +msgstr "" + +#: .\cookbook\views\views.py:470 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:402 +#: .\cookbook\views\views.py:477 msgid "Passwords dont match!" msgstr "" -#: .\cookbook\views\views.py:418 +#: .\cookbook\views\views.py:493 msgid "User has been created, please login!" msgstr "" -#: .\cookbook\views\views.py:434 +#: .\cookbook\views\views.py:509 msgid "Malformed Invite Link supplied!" msgstr "" -#: .\cookbook\views\views.py:441 +#: .\cookbook\views\views.py:516 msgid "You are already member of a space and therefore cannot join this one." msgstr "" -#: .\cookbook\views\views.py:452 +#: .\cookbook\views\views.py:527 msgid "Successfully joined space." msgstr "" -#: .\cookbook\views\views.py:458 +#: .\cookbook\views\views.py:533 msgid "Invite Link not valid or already used!" msgstr "" -#: .\cookbook\views\views.py:522 +#: .\cookbook\views\views.py:614 msgid "" "Reporting share links is not enabled for this instance. Please notify the " "page administrator to report problems." msgstr "" -#: .\cookbook\views\views.py:528 +#: .\cookbook\views\views.py:620 msgid "" "Recipe sharing link has been disabled! For additional information please " "contact the page administrator." diff --git a/cookbook/locale/zh_CN/LC_MESSAGES/django.mo b/cookbook/locale/zh_CN/LC_MESSAGES/django.mo index 63e8def8..acd79c34 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 f45bbf7e..b1a09da1 100644 --- a/cookbook/locale/zh_CN/LC_MESSAGES/django.po +++ b/cookbook/locale/zh_CN/LC_MESSAGES/django.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-08-17 08:44+0200\n" -"PO-Revision-Date: 2021-08-20 19:28+0000\n" -"Last-Translator: Danny Tsui \n" +"POT-Creation-Date: 2022-01-18 14:52+0100\n" +"PO-Revision-Date: 2022-01-22 03:30+0000\n" +"Last-Translator: 糖多 <1365143958@qq.com>\n" "Language-Team: Chinese (Simplified) \n" "Language: zh_CN\n" @@ -17,208 +17,426 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.7.2\n" +"X-Generator: Weblate 4.8\n" -#: .\cookbook\filters.py:23 .\cookbook\templates\base.html:98 -#: .\cookbook\templates\forms\edit_internal_recipe.html:269 -#: .\cookbook\templates\forms\ingredients.html:34 -#: .\cookbook\templates\space.html:43 .\cookbook\templates\stats.html:28 -#: .\cookbook\templates\url_import.html:270 .\cookbook\views\lists.py:67 +#: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 +#: .\cookbook\templates\space.html:50 .\cookbook\templates\stats.html:28 +#: .\cookbook\templates\url_import.html:277 msgid "Ingredients" msgstr "材料" -#: .\cookbook\forms.py:49 +#: .\cookbook\forms.py:56 +msgid "Default unit" +msgstr "默认单位" + +#: .\cookbook\forms.py:57 +msgid "Use fractions" +msgstr "使用分数" + +#: .\cookbook\forms.py:58 +msgid "Use KJ" +msgstr "使用千焦" + +#: .\cookbook\forms.py:59 +msgid "Theme" +msgstr "主题" + +#: .\cookbook\forms.py:60 +msgid "Navbar color" +msgstr "导航栏颜色" + +#: .\cookbook\forms.py:61 +msgid "Sticky navbar" +msgstr "悬浮导航栏" + +#: .\cookbook\forms.py:62 +msgid "Default page" +msgstr "默认页面" + +#: .\cookbook\forms.py:63 +msgid "Show recent recipes" +msgstr "显示最近的菜谱" + +#: .\cookbook\forms.py:64 +msgid "Search style" +msgstr "搜索风格" + +#: .\cookbook\forms.py:65 +msgid "Plan sharing" +msgstr "计划分享" + +#: .\cookbook\forms.py:66 +msgid "Ingredient decimal places" +msgstr "材料小数位" + +#: .\cookbook\forms.py:67 +msgid "Shopping list auto sync period" +msgstr "购物清单自动同步周期" + +#: .\cookbook\forms.py:68 .\cookbook\templates\recipe_view.html:21 +#: .\cookbook\templates\space.html:77 .\cookbook\templates\stats.html:47 +msgid "Comments" +msgstr "评论" + +#: .\cookbook\forms.py:72 msgid "" "Color of the top navigation bar. Not all colors work with all themes, just " "try them out!" -msgstr "顶部导航栏的颜色。并非所有的颜色都适用于所有的主题,只要试一试就可以了!" +msgstr "" +"顶部导航栏的颜色。并非所有的颜色都适用于所有的主题,只要试一试就可以了!" -#: .\cookbook\forms.py:51 +#: .\cookbook\forms.py:74 msgid "Default Unit to be used when inserting a new ingredient into a recipe." msgstr "在配方中插入新原料时使用的默认单位。" -#: .\cookbook\forms.py:53 +#: .\cookbook\forms.py:76 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" msgstr "启用对原料数量的分数支持(例如自动将小数转换为分数)" -#: .\cookbook\forms.py:56 -#, fuzzy -msgid "" -"Users with whom newly created meal plan/shopping list entries should be " -"shared by default." -msgstr "默认情况下,新创建的膳食计划/购物清单条目应与之共享的用户。" +#: .\cookbook\forms.py:78 +msgid "Display nutritional energy amounts in joules instead of calories" +msgstr "用焦耳来显示营养能量而不是卡路里" -#: .\cookbook\forms.py:58 +#: .\cookbook\forms.py:79 +msgid "Users with whom newly created meal plans should be shared by default." +msgstr "默认情况下,新创建的膳食计划应与之共享的用户。" + +#: .\cookbook\forms.py:80 +msgid "Users with whom to share shopping lists." +msgstr "与之共享购物清单的用户。" + +#: .\cookbook\forms.py:82 msgid "Show recently viewed recipes on search page." msgstr "在搜索页面上显示最近查看的菜谱。" -#: .\cookbook\forms.py:59 +#: .\cookbook\forms.py:83 msgid "Number of decimals to round ingredients." msgstr "四舍五入成分的小数点数目。" -#: .\cookbook\forms.py:60 +#: .\cookbook\forms.py:84 msgid "If you want to be able to create and see comments underneath recipes." msgstr "如果你希望能够在菜谱下面创建并看到评论。" -#: .\cookbook\forms.py:62 +#: .\cookbook\forms.py:86 .\cookbook\forms.py:493 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. " "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将禁用自动同步。当查看购物清单时,清单会每隔几秒钟更新一次,以同步其他人可能做出的改变。在与多人一起购物时很有用,但可能会消耗一点移动数据。如果低" +"设置为0将禁用自动同步。当查看购物清单时,清单会每隔几秒钟更新一次,以同步其他" +"人可能做出的改变。在与多人一起购物时很有用,但可能会消耗一点移动数据。如果低" "于实例限制,它将在保存时被重置。" -#: .\cookbook\forms.py:65 +#: .\cookbook\forms.py:89 msgid "Makes the navbar stick to the top of the page." -msgstr "使导航条粘在页面的顶部。" +msgstr "使导航栏悬浮在页面的顶部。" -#: .\cookbook\forms.py:81 +#: .\cookbook\forms.py:90 .\cookbook\forms.py:496 +msgid "Automatically add meal plan ingredients to shopping list." +msgstr "自动将膳食计划原料添加到购物清单中。" + +#: .\cookbook\forms.py:91 +msgid "Exclude ingredients that are on hand." +msgstr "排除现有材料。" + +#: .\cookbook\forms.py:108 msgid "" "Both fields are optional. If none are given the username will be displayed " "instead" msgstr "这两个字段都是可选的。如果没有给出,将显示用户名" -#: .\cookbook\forms.py:102 .\cookbook\forms.py:331 -#: .\cookbook\templates\forms\edit_internal_recipe.html:49 -#: .\cookbook\templates\url_import.html:154 +#: .\cookbook\forms.py:129 .\cookbook\forms.py:298 +#: .\cookbook\templates\url_import.html:161 msgid "Name" -msgstr "名称" +msgstr "名字" -#: .\cookbook\forms.py:103 .\cookbook\forms.py:332 -#: .\cookbook\templates\base.html:108 .\cookbook\templates\base.html:169 -#: .\cookbook\templates\forms\edit_internal_recipe.html:85 -#: .\cookbook\templates\space.html:39 .\cookbook\templates\stats.html:24 -#: .\cookbook\templates\url_import.html:188 -#: .\cookbook\templates\url_import.html:573 +#: .\cookbook\forms.py:130 .\cookbook\forms.py:299 +#: .\cookbook\templates\space.html:44 .\cookbook\templates\stats.html:24 +#: .\cookbook\templates\url_import.html:195 +#: .\cookbook\templates\url_import.html:585 .\cookbook\views\lists.py:97 msgid "Keywords" -msgstr "关键字" +msgstr "关键词" -#: .\cookbook\forms.py:104 +#: .\cookbook\forms.py:131 msgid "Preparation time in minutes" -msgstr "准备时间(分钟)" +msgstr "准备时间(分钟)" -#: .\cookbook\forms.py:105 +#: .\cookbook\forms.py:132 msgid "Waiting time (cooking/baking) in minutes" -msgstr "等候时间(分钟)" +msgstr "等候(烹饪、烘焙等)时间(分钟)" -#: .\cookbook\forms.py:106 .\cookbook\forms.py:333 +#: .\cookbook\forms.py:133 .\cookbook\forms.py:267 .\cookbook\forms.py:300 msgid "Path" msgstr "路径" -#: .\cookbook\forms.py:107 +#: .\cookbook\forms.py:134 msgid "Storage UID" msgstr "存储 UID" -#: .\cookbook\forms.py:133 +#: .\cookbook\forms.py:164 msgid "Default" -msgstr "预置" +msgstr "默认" -#: .\cookbook\forms.py:144 .\cookbook\templates\url_import.html:90 +#: .\cookbook\forms.py:175 .\cookbook\templates\url_import.html:97 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 "新单位" - -#: .\cookbook\forms.py:165 -#, fuzzy -msgid "New unit that other gets replaced by." -msgstr "新的单位被其他取代." - -#: .\cookbook\forms.py:170 -msgid "Old Unit" -msgstr "旧单位" - -#: .\cookbook\forms.py:171 -msgid "Unit that should be replaced." -msgstr "单位应被取代." - -#: .\cookbook\forms.py:187 -msgid "New Food" -msgstr "新的食品" - -#: .\cookbook\forms.py:188 -#, fuzzy -msgid "New food that other gets replaced by." -msgstr "新食品被其他取代." - -#: .\cookbook\forms.py:193 -msgid "Old Food" -msgstr "旧的食品" - -#: .\cookbook\forms.py:194 -msgid "Food that should be replaced." -msgstr "食品应被取代." +#: .\cookbook\forms.py:197 +msgid "Add your comment: " +msgstr "发表评论: " #: .\cookbook\forms.py:212 -msgid "Add your comment: " -msgstr "发表评论: " - -#: .\cookbook\forms.py:253 msgid "Leave empty for dropbox and enter app password for nextcloud." -msgstr "dropbox留空和为nextcloud输入应用密码。" +msgstr "Dropbox 留空并输入 Nextcloud 应用密码。" -#: .\cookbook\forms.py:260 +#: .\cookbook\forms.py:219 msgid "Leave empty for nextcloud and enter api token for dropbox." -msgstr "" +msgstr "Nextcloud 留空并输入 Dropbox API 令牌。" -#: .\cookbook\forms.py:269 +#: .\cookbook\forms.py:228 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 +#: .\cookbook\forms.py:266 .\cookbook\views\edit.py:166 +msgid "Storage" +msgstr "存储" + +#: .\cookbook\forms.py:268 +msgid "Active" +msgstr "活跃" + +#: .\cookbook\forms.py:274 msgid "Search String" msgstr "搜索字符串" -#: .\cookbook\forms.py:334 +#: .\cookbook\forms.py:301 msgid "File ID" msgstr "文件编号" -#: .\cookbook\forms.py:370 +#: .\cookbook\forms.py:323 msgid "You must provide at least a recipe or a title." msgstr "你必须至少提供一份菜谱或一个标题。" -#: .\cookbook\forms.py:383 +#: .\cookbook\forms.py:336 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:427 +#: .\cookbook\forms.py:337 msgid "" "You can use markdown to format this field. See the docs here" -msgstr "" +msgstr "可以使用 Markdown 设置此字段格式。查看文档" -#: .\cookbook\forms.py:409 +#: .\cookbook\forms.py:363 msgid "Maximum number of users for this space reached." msgstr "已达到该空间的最大用户数。" -#: .\cookbook\forms.py:415 +#: .\cookbook\forms.py:369 msgid "Email address already taken!" -msgstr "电子邮件地址已被注册!" +msgstr "电子邮件地址已被注册!" -#: .\cookbook\forms.py:423 +#: .\cookbook\forms.py:377 msgid "" -"An email address is not required but if present the invite link will be send " +"An email address is not required but if present the invite link will be sent " "to the user." msgstr "电子邮件地址不是必需的,但如果存在,邀请链接将被发送给用户。" -#: .\cookbook\forms.py:438 +#: .\cookbook\forms.py:392 msgid "Name already taken." msgstr "名字已被占用。" -#: .\cookbook\forms.py:449 +#: .\cookbook\forms.py:403 msgid "Accept Terms and Privacy" -msgstr "接受条款细则及私隐政策" +msgstr "接受条款及隐私政策" + +#: .\cookbook\forms.py:435 +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:445 +#, fuzzy +msgid "" +"Select type method of search. Click here for " +"full desciption of choices." +msgstr "选择搜索类型方法。点击此处 查看选项的完整说明。" + +#: .\cookbook\forms.py:446 +msgid "" +"Use fuzzy matching on units, keywords and ingredients when editing and " +"importing recipes." +msgstr "编辑和导入菜谱时,对单位、关键词和材料使用模糊匹配。" + +#: .\cookbook\forms.py:448 +msgid "" +"Fields to search ignoring accents. Selecting this option can improve or " +"degrade search quality depending on language" +msgstr "忽略搜索字段的重音。此选项会因语言差异导致搜索质量产生变化" + +#: .\cookbook\forms.py:450 +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:452 +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:454 +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 "“模糊”搜索字段。(例如搜索“recpie”将会找到“recipe”。)注意:此选项将与“web”和“raw”搜索方法冲突。" + +#: .\cookbook\forms.py:456 +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:460 +msgid "Search Method" +msgstr "搜索方法" + +#: .\cookbook\forms.py:461 +msgid "Fuzzy Lookups" +msgstr "模糊查找" + +#: .\cookbook\forms.py:462 +msgid "Ignore Accent" +msgstr "忽略重音" + +#: .\cookbook\forms.py:463 +msgid "Partial Match" +msgstr "部分匹配" + +#: .\cookbook\forms.py:464 +msgid "Starts Wtih" +msgstr "起始于" + +#: .\cookbook\forms.py:465 +msgid "Fuzzy Search" +msgstr "模糊搜索" + +#: .\cookbook\forms.py:466 +msgid "Full Text" +msgstr "全文" + +#: .\cookbook\forms.py:491 +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:497 +msgid "" +"When adding a meal plan to the shopping list (manually or automatically), " +"include all related recipes." +msgstr "将膳食计划(手动或自动)添加到购物清单时,包括所有相关菜谱。" + +#: .\cookbook\forms.py:498 +msgid "" +"When adding a meal plan to the shopping list (manually or automatically), " +"exclude ingredients that are on hand." +msgstr "将膳食计划(手动或自动)添加到购物清单时,排除现有材料。" + +#: .\cookbook\forms.py:499 +msgid "Default number of hours to delay a shopping list entry." +msgstr "延迟购物清单条目的默认小时数。" + +#: .\cookbook\forms.py:500 +msgid "Filter shopping list to only include supermarket categories." +msgstr "筛选购物清单仅包括超市类型。" + +#: .\cookbook\forms.py:501 +#, fuzzy +msgid "Days of recent shopping list entries to display." +msgstr "显示最近几天的购物清单条目。" + +#: .\cookbook\forms.py:502 +msgid "Mark food 'On Hand' when checked off shopping list." +msgstr "在核对购物清单时,将食物标记为“入手”。" + +#: .\cookbook\forms.py:503 +msgid "Delimiter to use for CSV exports." +msgstr "用于 CSV 导出的分隔符。" + +#: .\cookbook\forms.py:504 +msgid "Prefix to add when copying list to the clipboard." +msgstr "将清单复制到剪贴板时要添加的前缀。" + +#: .\cookbook\forms.py:508 +msgid "Share Shopping List" +msgstr "分享购物清单" + +#: .\cookbook\forms.py:509 +msgid "Autosync" +msgstr "自动同步" + +#: .\cookbook\forms.py:510 +msgid "Auto Add Meal Plan" +msgstr "自动添加膳食计划" + +#: .\cookbook\forms.py:511 +msgid "Exclude On Hand" +msgstr "排除现有" + +#: .\cookbook\forms.py:512 +msgid "Include Related" +msgstr "包括相关" + +#: .\cookbook\forms.py:513 +msgid "Default Delay Hours" +msgstr "默认延迟时间" + +#: .\cookbook\forms.py:514 +#, fuzzy +#| msgid "Supermarket" +msgid "Filter to Supermarket" +msgstr "筛选到超市" + +#: .\cookbook\forms.py:515 +msgid "Recent Days" +msgstr "最近几天" + +#: .\cookbook\forms.py:516 +msgid "CSV Delimiter" +msgstr "CSV 分隔符" + +#: .\cookbook\forms.py:517 .\cookbook\templates\shopping_list.html:322 +msgid "List Prefix" +msgstr "清单前缀" + +#: .\cookbook\forms.py:518 +msgid "Auto On Hand" +msgstr "自动入手" + +#: .\cookbook\forms.py:528 +msgid "Reset Food Inheritance" +msgstr "重置食物材料" + +#: .\cookbook\forms.py:529 +msgid "Reset all food to inherit the fields configured." +msgstr "重置所有食物以继承配置的字段。" + +#: .\cookbook\forms.py:541 +msgid "Fields on food that should be inherited by default." +msgstr "默认情况下应继承的食物上的字段。" + +#: .\cookbook\forms.py:542 +msgid "Show recipe counts on search filters" +msgstr "显示搜索筛选器上的菜谱计数" #: .\cookbook\helper\AllAuthCustomAdapter.py:36 msgid "" @@ -226,65 +444,63 @@ msgid "" "few minutes and try again." msgstr "为了防止垃圾邮件,所要求的电子邮件没有被发送。请等待几分钟后再试。" -#: .\cookbook\helper\permission_helper.py:138 -#: .\cookbook\helper\permission_helper.py:161 .\cookbook\views\views.py:151 +#: .\cookbook\helper\permission_helper.py:136 +#: .\cookbook\helper\permission_helper.py:159 .\cookbook\views\views.py:148 msgid "You are not logged in and therefore cannot view this page!" -msgstr "你没有登录,因此不能查看这个页面!" +msgstr "你没有登录,因此不能查看这个页面!" -#: .\cookbook\helper\permission_helper.py:142 -#: .\cookbook\helper\permission_helper.py:148 -#: .\cookbook\helper\permission_helper.py:173 -#: .\cookbook\helper\permission_helper.py:218 -#: .\cookbook\helper\permission_helper.py:232 -#: .\cookbook\helper\permission_helper.py:243 -#: .\cookbook\helper\permission_helper.py:254 .\cookbook\views\data.py:40 -#: .\cookbook\views\views.py:162 .\cookbook\views\views.py:169 -#: .\cookbook\views\views.py:259 +#: .\cookbook\helper\permission_helper.py:140 +#: .\cookbook\helper\permission_helper.py:146 +#: .\cookbook\helper\permission_helper.py:171 +#: .\cookbook\helper\permission_helper.py:219 +#: .\cookbook\helper\permission_helper.py:233 +#: .\cookbook\helper\permission_helper.py:244 +#: .\cookbook\helper\permission_helper.py:255 .\cookbook\views\data.py:47 +#: .\cookbook\views\views.py:159 .\cookbook\views\views.py:166 +#: .\cookbook\views\views.py:232 msgid "You do not have the required permissions to view this page!" -msgstr "你没有必要的权限来查看这个页面!" +msgstr "你没有必要的权限来查看这个页面!" -#: .\cookbook\helper\permission_helper.py:166 -#: .\cookbook\helper\permission_helper.py:189 -#: .\cookbook\helper\permission_helper.py:204 -#, fuzzy +#: .\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 "你不能与此对象交互,因为它不属于你!" -#: .\cookbook\helper\template_helper.py:60 -#: .\cookbook\helper\template_helper.py:62 +#: .\cookbook\helper\recipe_search.py:473 +msgid "One of queryset or hash_key must be provided" +msgstr "必须提供 queryset 或 hash_key 之一" + +#: .\cookbook\helper\shopping_helper.py:54 +msgid "You must supply a recipe or mealplan" +msgstr "你必须提供菜谱或膳食计划" + +#: .\cookbook\helper\shopping_helper.py:58 +msgid "You must supply a created_by" +msgstr "你必须提供创建者" + +#: .\cookbook\helper\template_helper.py:61 +#: .\cookbook\helper\template_helper.py:63 msgid "Could not parse template code." msgstr "无法解析模板代码。" -#: .\cookbook\integration\integration.py:104 -#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 -#: .\cookbook\templates\import_response.html:7 -#: .\cookbook\templates\test.html:14 .\cookbook\templates\test.html:20 -#: .\cookbook\templates\url_import.html:27 -#: .\cookbook\templates\url_import.html:101 -#: .\cookbook\templates\url_import.html:123 -#: .\cookbook\templates\url_import.html:317 -#: .\cookbook\templates\url_import.html:604 .\cookbook\views\delete.py:60 -#: .\cookbook\views\edit.py:199 -msgid "Import" -msgstr "导入" - -#: .\cookbook\integration\integration.py:185 +#: .\cookbook\integration\integration.py:200 msgid "" "Importer expected a .zip file. Did you choose the correct importer type for " "your data ?" -msgstr "输入者需要一个.zip文件。你为你的数据选择了正确的导入器类型吗?" +msgstr "需要一个 .zip 文件。你是否为数据选择了正确的导入器类型?" -#: .\cookbook\integration\integration.py:188 +#: .\cookbook\integration\integration.py:203 msgid "" "An unexpected error occurred during the import. Please make sure you have " "uploaded a valid file." msgstr "在导入过程中发生了一个意外的错误。请确认你已经上传了一个有效的文件。" -#: .\cookbook\integration\integration.py:192 +#: .\cookbook\integration\integration.py:208 msgid "The following recipes were ignored because they already existed:" msgstr "以下菜谱被忽略了,因为它们已经存在了:" -#: .\cookbook\integration\integration.py:196 +#: .\cookbook\integration\integration.py:212 #, python-format msgid "Imported %s recipes." msgstr "导入了%s菜谱。" @@ -295,38 +511,52 @@ msgstr "说明" #: .\cookbook\integration\paprika.py:49 msgid "Nutritional Information" -msgstr "营养资料" +msgstr "营养信息" -#: .\cookbook\integration\paprika.py:53 +#: .\cookbook\integration\paprika.py:53 .\cookbook\templates\url_import.html:42 msgid "Source" msgstr "来源" -#: .\cookbook\integration\safron.py:23 -#: .\cookbook\templates\forms\edit_internal_recipe.html:79 -#: .\cookbook\templates\include\log_cooking.html:16 -#: .\cookbook\templates\url_import.html:224 -#: .\cookbook\templates\url_import.html:455 +#: .\cookbook\integration\saffron.py:23 +#: .\cookbook\templates\include\log_cooking.html:18 +#: .\cookbook\templates\url_import.html:231 +#: .\cookbook\templates\url_import.html:462 msgid "Servings" msgstr "份量" -#: .\cookbook\integration\safron.py:25 +#: .\cookbook\integration\saffron.py:25 msgid "Waiting time" msgstr "等待时间" -#: .\cookbook\integration\safron.py:27 -#: .\cookbook\templates\forms\edit_internal_recipe.html:73 +#: .\cookbook\integration\saffron.py:27 msgid "Preparation Time" msgstr "准备时间" -#: .\cookbook\integration\safron.py:29 .\cookbook\templates\base.html:78 +#: .\cookbook\integration\saffron.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 +#: .\cookbook\integration\saffron.py:31 msgid "Section" -msgstr "节" +msgstr "部分" + +#: .\cookbook\management\commands\rebuildindex.py:14 +msgid "Rebuilds full text search index on Recipe" +msgstr "在菜谱上重建全文搜索索引" + +#: .\cookbook\management\commands\rebuildindex.py:18 +msgid "Only Postgress databases use full text search, no index to rebuild" +msgstr "仅 Postgress 数据库使用全文搜索,没有重建索引" + +#: .\cookbook\management\commands\rebuildindex.py:29 +msgid "Recipe index rebuild complete." +msgstr "菜谱索引重建完成。" + +#: .\cookbook\management\commands\rebuildindex.py:31 +msgid "Recipe index rebuild failed." +msgstr "菜谱索引重建失败。" #: .\cookbook\migrations\0047_auto_20200602_1133.py:14 msgid "Breakfast" @@ -344,90 +574,143 @@ msgstr "晚餐" msgid "Other" msgstr "其他" -#: .\cookbook\models.py:72 +#: .\cookbook\models.py:246 msgid "" "Maximum file storage for space in MB. 0 for unlimited, -1 to disable file " "upload." -msgstr "空间的最大文件存储量,单位为MB。0表示无限制,-1表示禁止文件上传。" +msgstr "空间的最大文件存储量,单位为 MB。0表示无限制,-1表示禁止上传文件。" -#: .\cookbook\models.py:123 .\cookbook\templates\search.html:7 -#: .\cookbook\templates\shopping_list.html:52 +#: .\cookbook\models.py:300 .\cookbook\templates\search.html:7 +#: .\cookbook\templates\shopping_list.html:53 msgid "Search" msgstr "搜索" -#: .\cookbook\models.py:124 .\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 +#: .\cookbook\models.py:301 .\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 "膳食计划" -#: .\cookbook\models.py:125 .\cookbook\templates\base.html:89 +#: .\cookbook\models.py:302 .\cookbook\templates\base.html:90 msgid "Books" msgstr "书籍" -#: .\cookbook\models.py:133 +#: .\cookbook\models.py:310 msgid "Small" msgstr "小" -#: .\cookbook\models.py:133 +#: .\cookbook\models.py:310 msgid "Large" msgstr "大" -#: .\cookbook\models.py:133 .\cookbook\templates\generic\new_template.html:6 +#: .\cookbook\models.py:310 .\cookbook\templates\generic\new_template.html:6 #: .\cookbook\templates\generic\new_template.html:14 -#: .\cookbook\templates\meal_plan.html:323 msgid "New" msgstr "新" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:202 +#: .\cookbook\models.py:512 +msgid " is part of a recipe step and cannot be deleted" +msgstr " 是菜谱步骤的一部分,不能删除" + +#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:44 msgid "Text" msgstr "文本" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:203 +#: .\cookbook\models.py:586 msgid "Time" msgstr "时间" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:204 -#: .\cookbook\templates\forms\edit_internal_recipe.html:219 +#: .\cookbook\models.py:586 .\cookbook\templates\url_import.html:46 msgid "File" msgstr "文件" -#: .\cookbook\models.py:338 -#: .\cookbook\templates\forms\edit_internal_recipe.html:205 -#: .\cookbook\templates\forms\edit_internal_recipe.html:241 +#: .\cookbook\models.py:586 #: .\cookbook\templates\include\recipe_open_modal.html:7 -#: .\cookbook\templates\meal_plan.html:247 .\cookbook\views\delete.py:28 -#: .\cookbook\views\edit.py:273 .\cookbook\views\new.py:52 +#: .\cookbook\views\delete.py:39 .\cookbook\views\edit.py:260 +#: .\cookbook\views\new.py:53 msgid "Recipe" msgstr "菜谱" -#: .\cookbook\serializer.py:109 +#: .\cookbook\models.py:1041 .\cookbook\templates\search_info.html:28 +msgid "Simple" +msgstr "简明" + +#: .\cookbook\models.py:1042 .\cookbook\templates\search_info.html:33 +msgid "Phrase" +msgstr "短语" + +#: .\cookbook\models.py:1043 .\cookbook\templates\search_info.html:38 +msgid "Web" +msgstr "网络" + +#: .\cookbook\models.py:1044 .\cookbook\templates\search_info.html:47 +msgid "Raw" +msgstr "原始" + +#: .\cookbook\models.py:1082 +msgid "Food Alias" +msgstr "食物别名" + +#: .\cookbook\models.py:1082 +msgid "Unit Alias" +msgstr "单位别名" + +#: .\cookbook\models.py:1082 +msgid "Keyword Alias" +msgstr "关键词别名" + +#: .\cookbook\serializer.py:175 +msgid "A user is required" +msgstr "需要一个用户" + +#: .\cookbook\serializer.py:195 msgid "File uploads are not enabled for this Space." -msgstr "文件不能上载此空间。" +msgstr "未为此空间启用文件上传。" -#: .\cookbook\serializer.py:117 +#: .\cookbook\serializer.py:206 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 +#: .\cookbook\serializer.py:962 +msgid "Existing shopping list to update" +msgstr "要更新现有的购物清单" + +#: .\cookbook\serializer.py:964 +msgid "" +"List of ingredient IDs from the recipe to add, if not provided all " +"ingredients will be added." +msgstr "要添加的菜谱中材料识别符列表,不提供则添加所有材料。" + +#: .\cookbook\serializer.py:965 +msgid "" +"Providing a list_recipe ID and servings of 0 will delete that shopping list." +msgstr "提供一个菜谱列表识别符或份数为0将删除该购物清单。" + +#: .\cookbook\serializer.py:973 +msgid "Amount of food to add to the shopping list" +msgstr "要添加到购物清单中的食物数量" + +#: .\cookbook\serializer.py:974 +msgid "ID of unit to use for the shopping list" +msgstr "用于购物清单的单位识别符" + +#: .\cookbook\serializer.py:975 +msgid "When set to true will delete all food from active shopping lists." +msgstr "当设置为 true 时,将从活动的购物列表中删除所有食物。" + +#: .\cookbook\tables.py:35 .\cookbook\templates\generic\edit_template.html:6 #: .\cookbook\templates\generic\edit_template.html:14 -#: .\cookbook\templates\meal_plan.html:281 #: .\cookbook\templates\recipes_table.html:82 -#: .\cookbook\templates\shopping_list.html:33 -#: .\cookbook\templates\space.html:90 +#: .\cookbook\templates\shopping_list.html:37 +#: .\cookbook\templates\space.html:109 msgid "Edit" msgstr "编辑" -#: .\cookbook\tables.py:124 .\cookbook\tables.py:147 -#: .\cookbook\templates\books.html:38 -#: .\cookbook\templates\generic\delete_template.html:5 -#: .\cookbook\templates\generic\delete_template.html:13 -#: .\cookbook\templates\generic\edit_template.html:27 -#: .\cookbook\templates\meal_plan.html:277 +#: .\cookbook\tables.py:115 .\cookbook\tables.py:138 +#: .\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 "删除" @@ -442,7 +725,7 @@ msgstr "找不到你要找的页面。" #: .\cookbook\templates\404.html:33 msgid "Take me Home" -msgstr "带我回家" +msgstr "回到主页" #: .\cookbook\templates\404.html:35 msgid "Report a Bug" @@ -456,7 +739,7 @@ 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:154 .\cookbook\templates\settings.html:6 +#: .\cookbook\templates\base.html:257 .\cookbook\templates\settings.html:6 #: .\cookbook\templates\settings.html:17 #: .\cookbook\templates\socialaccount\connections.html:10 msgid "Settings" @@ -468,7 +751,7 @@ msgstr "电子邮件" #: .\cookbook\templates\account\email.html:19 msgid "The following e-mail addresses are associated with your account:" -msgstr "以下电子邮件地址与您的账户相关联:" +msgstr "以下电子邮件地址与你的帐号相关联:" #: .\cookbook\templates\account\email.html:36 msgid "Verified" @@ -493,19 +776,20 @@ msgid "Re-send Verification" msgstr "重新发送验证" #: .\cookbook\templates\account\email.html:50 +#: .\cookbook\templates\generic\delete_template.html:56 #: .\cookbook\templates\socialaccount\connections.html:44 msgid "Remove" msgstr "移除" #: .\cookbook\templates\account\email.html:58 msgid "Warning:" -msgstr "警告:" +msgstr "警告:" #: .\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 "你目前没有设置任何电子邮件地址。你真的应该添加一个电子邮件地址,这样你就可以收到通知,重置你的密码,等等。" +msgstr "你目前没有设置任何电子邮件地址。你真的应该添加一个电子邮件地址,这样你就可以收到通知,重置你的密码等等。" #: .\cookbook\templates\account\email.html:64 msgid "Add E-mail Address" @@ -532,9 +816,13 @@ msgid "" "for user %(user_display)s\n" " ." msgstr "" +"请确认\n" +" %(email)s 是用户 %(user_display)s " +"的电子邮件地址\n" +" ." #: .\cookbook\templates\account\email_confirm.html:22 -#: .\cookbook\templates\generic\delete_template.html:21 +#: .\cookbook\templates\generic\delete_template.html:71 msgid "Confirm" msgstr "确认" @@ -545,8 +833,10 @@ msgid "" " issue a new e-mail confirmation " "request." msgstr "" +"此电子邮件确认链接已过期或无效。请\n" +" 发起新的电子邮件确认请求。" -#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:189 +#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:289 msgid "Login" msgstr "登录" @@ -555,51 +845,55 @@ msgstr "登录" #: .\cookbook\templates\account\signup.html:69 #: .\cookbook\templates\account\signup_closed.html:15 msgid "Sign In" -msgstr "登入" +msgstr "登录" -#: .\cookbook\templates\account\login.html:32 +#: .\cookbook\templates\account\login.html:34 #: .\cookbook\templates\socialaccount\signup.html:8 #: .\cookbook\templates\socialaccount\signup.html:57 msgid "Sign Up" msgstr "注册" -#: .\cookbook\templates\account\login.html:36 -#: .\cookbook\templates\account\login.html:37 +#: .\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:37 +#: .\cookbook\templates\account\login.html:40 msgid "Lost your password?" msgstr "遗失密码?" -#: .\cookbook\templates\account\login.html:48 +#: .\cookbook\templates\account\login.html:52 msgid "Social Login" -msgstr "社交登录" +msgstr "关联登录" -#: .\cookbook\templates\account\login.html:49 +#: .\cookbook\templates\account\login.html:53 msgid "You can use any of the following providers to sign in." -msgstr "你可以使用以下任何一个供应商来登录。" +msgstr "你可以使用以下任意提供程序来登录。" #: .\cookbook\templates\account\logout.html:5 #: .\cookbook\templates\account\logout.html:9 #: .\cookbook\templates\account\logout.html:18 msgid "Sign Out" -msgstr "登出" +msgstr "退出" #: .\cookbook\templates\account\logout.html:11 msgid "Are you sure you want to sign out?" -msgstr "你确定你要登出吗?" +msgstr "你确定要退出吗?" #: .\cookbook\templates\account\password_change.html:6 #: .\cookbook\templates\account\password_change.html:16 #: .\cookbook\templates\account\password_change.html:21 +#: .\cookbook\templates\account\password_reset_from_key.html:7 +#: .\cookbook\templates\account\password_reset_from_key.html:13 +#: .\cookbook\templates\account\password_reset_from_key_done.html:7 +#: .\cookbook\templates\account\password_reset_from_key_done.html:13 msgid "Change Password" msgstr "更改密码" #: .\cookbook\templates\account\password_change.html:12 #: .\cookbook\templates\account\password_set.html:12 -#: .\cookbook\templates\settings.html:52 +#: .\cookbook\templates\settings.html:76 msgid "Password" msgstr "密码" @@ -618,7 +912,9 @@ msgstr "密码重置" msgid "" "Forgotten your password? Enter your e-mail address below, and we'll send you " "an e-mail allowing you to reset it." -msgstr "忘记密码了吗?请在下面输入你的电子邮件地址,我们将向你发送一封电子邮件,允许你重新设置密码。" +msgstr "" +"忘记密码了吗?请在下面输入你的电子邮件地址,我们将向你发送一封电子邮件,允许" +"你重新设置密码。" #: .\cookbook\templates\account\password_reset.html:32 msgid "Password reset is disabled on this instance." @@ -628,7 +924,32 @@ msgstr "该实例上的密码重置被禁用。" msgid "" "We have sent you an e-mail. Please contact us if you do not receive it " "within a few minutes." -msgstr "我们已经向您发送了一封电子邮件。如果你在几分钟内没有收到,请联系我们。" +msgstr "我们已经向你发送了一封电子邮件。如果你在几分钟内没有收到,请联系我们。" + +#: .\cookbook\templates\account\password_reset_from_key.html:13 +#, fuzzy +msgid "Bad Token" +msgstr "坏令牌" + +#: .\cookbook\templates\account\password_reset_from_key.html:25 +#, python-format +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used.\n" +" Please request a new " +"password reset." +msgstr "" +"密码重置链接无效,可能是因为它已经被使用。\n" +" 请重新请求 重设密码。" + +#: .\cookbook\templates\account\password_reset_from_key.html:33 +msgid "change password" +msgstr "更改密码" + +#: .\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 "你的密码现在更改了。" #: .\cookbook\templates\account\password_set.html:6 #: .\cookbook\templates\account\password_set.html:16 @@ -642,7 +963,7 @@ msgstr "注册" #: .\cookbook\templates\account\signup.html:12 msgid "Create an Account" -msgstr "创建账户" +msgstr "创建帐号" #: .\cookbook\templates\account\signup.html:42 #: .\cookbook\templates\socialaccount\signup.html:33 @@ -670,413 +991,215 @@ msgstr "创建用户" #: .\cookbook\templates\account\signup.html:69 msgid "Already have an account?" -msgstr "已有账户?" +msgstr "已有帐号?" #: .\cookbook\templates\account\signup_closed.html:5 #: .\cookbook\templates\account\signup_closed.html:11 msgid "Sign Up Closed" -msgstr "注册关闭" +msgstr "注册已关闭" #: .\cookbook\templates\account\signup_closed.html:13 msgid "We are sorry, but the sign up is currently closed." msgstr "我们很抱歉,但目前注册已经结束。" -#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:179 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:279 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" -msgstr "API文档" +msgstr "应用程序接口文档" -#: .\cookbook\templates\base.html:85 -msgid "Utensils" -msgstr "厨具" - -#: .\cookbook\templates\base.html:95 +#: .\cookbook\templates\base.html:86 msgid "Shopping" msgstr "购物" -#: .\cookbook\templates\base.html:101 -#: .\cookbook\templates\shopping_list.html:230 +#: .\cookbook\templates\base.html:113 +msgid "Keyword" +msgstr "关键词" + +#: .\cookbook\templates\base.html:125 .\cookbook\views\lists.py:114 +msgid "Foods" +msgstr "食物" + +#: .\cookbook\templates\base.html:137 +#: .\cookbook\templates\forms\ingredients.html:24 +#: .\cookbook\templates\space.html:47 .\cookbook\templates\stats.html:26 +#: .\cookbook\views\lists.py:131 +msgid "Units" +msgstr "单位" + +#: .\cookbook\templates\base.html:151 +#: .\cookbook\templates\shopping_list.html:208 #: .\cookbook\templates\supermarket.html:7 msgid "Supermarket" msgstr "超市" -#: .\cookbook\templates\base.html:112 .\cookbook\views\delete.py:84 -#: .\cookbook\views\edit.py:102 .\cookbook\views\lists.py:26 -#: .\cookbook\views\new.py:78 -msgid "Keyword" -msgstr "关键词" +#: .\cookbook\templates\base.html:163 +msgid "Supermarket Category" +msgstr "超市类型" -#: .\cookbook\templates\base.html:114 +#: .\cookbook\templates\base.html:175 .\cookbook\views\lists.py:180 +msgid "Automations" +msgstr "自动化" + +#: .\cookbook\templates\base.html:189 .\cookbook\views\lists.py:200 +msgid "Files" +msgstr "文件" + +#: .\cookbook\templates\base.html:201 msgid "Batch Edit" msgstr "批量编辑" -#: .\cookbook\templates\base.html:119 -msgid "Storage Data" -msgstr "存储数据" - -#: .\cookbook\templates\base.html:123 -msgid "Storage Backends" -msgstr "存储后端" - -#: .\cookbook\templates\base.html:125 -msgid "Configure Sync" -msgstr "配置同步" - -#: .\cookbook\templates\base.html:127 -msgid "Discovered Recipes" -msgstr "" - -#: .\cookbook\templates\base.html:129 -msgid "Discovery Log" -msgstr "" - -#: .\cookbook\templates\base.html:131 .\cookbook\templates\stats.html:10 -msgid "Statistics" -msgstr "" - -#: .\cookbook\templates\base.html:133 -msgid "Units & Ingredients" -msgstr "" - -#: .\cookbook\templates\base.html:135 .\cookbook\templates\index.html:47 -msgid "Import Recipe" -msgstr "" - -#: .\cookbook\templates\base.html:156 .\cookbook\templates\history.html:6 +#: .\cookbook\templates\base.html:213 .\cookbook\templates\history.html:6 #: .\cookbook\templates\history.html:14 msgid "History" -msgstr "" +msgstr "历史" -#: .\cookbook\templates\base.html:159 .\cookbook\templates\space.html:7 -#: .\cookbook\templates\space.html:19 +#: .\cookbook\templates\base.html:228 .\cookbook\templates\export.html:14 +#: .\cookbook\templates\export.html:20 +#: .\cookbook\templates\shopping_list.html:310 +#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 +msgid "Export" +msgstr "导出" + +#: .\cookbook\templates\base.html:244 .\cookbook\templates\index.html:47 +msgid "Import Recipe" +msgstr "导入菜谱" + +#: .\cookbook\templates\base.html:246 +#: .\cookbook\templates\shopping_list.html:165 +#: .\cookbook\templates\shopping_list.html:188 +msgid "Create" +msgstr "创建" + +#: .\cookbook\templates\base.html:259 +#: .\cookbook\templates\generic\list_template.html:14 +#: .\cookbook\templates\space.html:69 .\cookbook\templates\stats.html:43 +msgid "External Recipes" +msgstr "外部菜谱" + +#: .\cookbook\templates\base.html:262 .\cookbook\templates\space.html:8 +#: .\cookbook\templates\space.html:20 .\cookbook\templates\space.html:150 msgid "Space Settings" -msgstr "" +msgstr "空间设置" -#: .\cookbook\templates\base.html:163 .\cookbook\templates\system.html:13 +#: .\cookbook\templates\base.html:267 .\cookbook\templates\system.html:13 msgid "System" -msgstr "" +msgstr "系统" -#: .\cookbook\templates\base.html:165 .\cookbook\templates\base.html:171 +#: .\cookbook\templates\base.html:269 msgid "Admin" -msgstr "" +msgstr "管理员" -#: .\cookbook\templates\base.html:175 +#: .\cookbook\templates\base.html:273 msgid "Markdown Guide" -msgstr "" +msgstr "Markdown 手册" -#: .\cookbook\templates\base.html:177 +#: .\cookbook\templates\base.html:275 msgid "GitHub" -msgstr "" +msgstr "GitHub" -#: .\cookbook\templates\base.html:181 +#: .\cookbook\templates\base.html:277 +msgid "Translate Tandoor" +msgstr "翻译筒状泥炉<_<" + +#: .\cookbook\templates\base.html:281 msgid "API Browser" -msgstr "" +msgstr "应用程序接口浏览器" -#: .\cookbook\templates\base.html:184 +#: .\cookbook\templates\base.html:284 msgid "Log out" -msgstr "" +msgstr "退出" #: .\cookbook\templates\batch\edit.html:6 msgid "Batch edit Category" -msgstr "" +msgstr "批量编辑类型" #: .\cookbook\templates\batch\edit.html:15 msgid "Batch edit Recipes" -msgstr "" +msgstr "批量编辑菜谱" #: .\cookbook\templates\batch\edit.html:20 msgid "Add the specified keywords to all recipes containing a word" -msgstr "" +msgstr "将指定的关键词添加到包含单词的所有菜谱中" -#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:85 +#: .\cookbook\templates\batch\monitor.html:6 .\cookbook\views\edit.py:82 msgid "Sync" -msgstr "" +msgstr "同步" #: .\cookbook\templates\batch\monitor.html:10 msgid "Manage watched Folders" -msgstr "" +msgstr "管理关注的文件夹" #: .\cookbook\templates\batch\monitor.html:14 msgid "" "On this Page you can manage all storage folder locations that should be " "monitored and synced." -msgstr "" +msgstr "在此页面上,你可以管理应该监视和同步的所有存储文件夹位置。" #: .\cookbook\templates\batch\monitor.html:16 msgid "The path must be in the following format" -msgstr "" +msgstr "路径必须采用以下格式" -#: .\cookbook\templates\batch\monitor.html:27 +#: .\cookbook\templates\batch\monitor.html:20 +#: .\cookbook\templates\forms\edit_import_recipe.html:14 +#: .\cookbook\templates\generic\edit_template.html:23 +#: .\cookbook\templates\generic\new_template.html:23 +#: .\cookbook\templates\include\log_cooking.html:30 +#: .\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\shopping_list.html:311 +#: .\cookbook\templates\space.html:155 +msgid "Save" +msgstr "保存" + +#: .\cookbook\templates\batch\monitor.html:21 +msgid "Manage External Storage" +msgstr "管理外部存储" + +#: .\cookbook\templates\batch\monitor.html:28 msgid "Sync Now!" -msgstr "" +msgstr "现在同步!" + +#: .\cookbook\templates\batch\monitor.html:29 +msgid "Show Recipes" +msgstr "显示菜谱" + +#: .\cookbook\templates\batch\monitor.html:30 +msgid "Show Log" +msgstr "显示记录" #: .\cookbook\templates\batch\waiting.html:4 #: .\cookbook\templates\batch\waiting.html:10 msgid "Importing Recipes" -msgstr "" +msgstr "导入配方" #: .\cookbook\templates\batch\waiting.html:28 msgid "" "This can take a few minutes, depending on the number of recipes in sync, " "please wait." -msgstr "" +msgstr "这可能需要几分钟,取决于同步的菜谱数量,请等待。" -#: .\cookbook\templates\books.html:5 .\cookbook\templates\books.html:11 +#: .\cookbook\templates\books.html:7 msgid "Recipe Books" -msgstr "" - -#: .\cookbook\templates\books.html:15 -msgid "New Book" -msgstr "" - -#: .\cookbook\templates\books.html:27 .\cookbook\templates\recipe_view.html:26 -msgid "by" -msgstr "" - -#: .\cookbook\templates\books.html:34 -msgid "Toggle Recipes" -msgstr "" - -#: .\cookbook\templates\books.html:54 -#: .\cookbook\templates\meal_plan_entry.html:48 -#: .\cookbook\templates\recipes_table.html:64 -msgid "Last cooked" -msgstr "" - -#: .\cookbook\templates\books.html:71 -msgid "There are no recipes in this book yet." -msgstr "" +msgstr "菜谱书" #: .\cookbook\templates\export.html:6 .\cookbook\templates\test2.html:6 msgid "Export Recipes" -msgstr "" - -#: .\cookbook\templates\export.html:14 .\cookbook\templates\export.html:20 -#: .\cookbook\templates\shopping_list.html:351 -#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20 -msgid "Export" -msgstr "" - -#: .\cookbook\templates\files.html:7 -msgid "Files" -msgstr "" +msgstr "导出菜谱" #: .\cookbook\templates\forms\edit_import_recipe.html:5 #: .\cookbook\templates\forms\edit_import_recipe.html:9 msgid "Import new Recipe" -msgstr "" - -#: .\cookbook\templates\forms\edit_import_recipe.html:14 -#: .\cookbook\templates\forms\edit_internal_recipe.html:439 -#: .\cookbook\templates\forms\edit_internal_recipe.html:471 -#: .\cookbook\templates\generic\edit_template.html:23 -#: .\cookbook\templates\generic\new_template.html:23 -#: .\cookbook\templates\include\log_cooking.html:28 -#: .\cookbook\templates\meal_plan.html:325 -#: .\cookbook\templates\settings.html:46 .\cookbook\templates\settings.html:87 -#: .\cookbook\templates\settings.html:105 -#: .\cookbook\templates\shopping_list.html:353 -msgid "Save" -msgstr "" +msgstr "导入新菜谱" #: .\cookbook\templates\forms\edit_internal_recipe.html:7 -#: .\cookbook\templates\forms\edit_internal_recipe.html:34 msgid "Edit Recipe" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:56 -#: .\cookbook\templates\url_import.html:171 -msgid "Description" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:76 -msgid "Waiting Time" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:82 -msgid "Servings Text" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:93 -msgid "Select Keywords" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:94 -#: .\cookbook\templates\url_import.html:583 -msgid "Add Keyword" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:112 -msgid "Nutrition" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:116 -#: .\cookbook\templates\forms\edit_internal_recipe.html:166 -msgid "Delete Step" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:120 -msgid "Calories" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:123 -msgid "Carbohydrates" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:126 -msgid "Fats" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:128 -msgid "Proteins" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:150 -#: .\cookbook\templates\forms\edit_internal_recipe.html:504 -msgid "Step" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:171 -msgid "Show as header" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:177 -msgid "Hide as header" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:182 -msgid "Move Up" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:187 -msgid "Move Down" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:196 -msgid "Step Name" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:200 -msgid "Step Type" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:213 -msgid "Step time in Minutes" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:229 -msgid "Select File" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:230 -#: .\cookbook\templates\forms\edit_internal_recipe.html:252 -#: .\cookbook\templates\forms\edit_internal_recipe.html:313 -#: .\cookbook\templates\forms\edit_internal_recipe.html:337 -#: .\cookbook\templates\shopping_list.html:189 -#: .\cookbook\templates\shopping_list.html:211 -#: .\cookbook\templates\shopping_list.html:241 -#: .\cookbook\templates\shopping_list.html:265 -#: .\cookbook\templates\url_import.html:495 -#: .\cookbook\templates\url_import.html:527 -msgid "Select" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:251 -#, fuzzy -#| msgid "Select one" -msgid "Select Recipe" -msgstr "选择一项" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:311 -#: .\cookbook\templates\shopping_list.html:187 -msgid "Select Unit" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:312 -#: .\cookbook\templates\forms\edit_internal_recipe.html:336 -#: .\cookbook\templates\shopping_list.html:188 -#: .\cookbook\templates\shopping_list.html:210 -msgid "Create" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:335 -#: .\cookbook\templates\shopping_list.html:209 -msgid "Select Food" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:352 -#: .\cookbook\templates\meal_plan.html:256 -#: .\cookbook\templates\url_import.html:542 -msgid "Note" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:369 -msgid "Delete Ingredient" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:375 -msgid "Make Header" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:381 -msgid "Make Ingredient" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:387 -msgid "Disable Amount" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:393 -msgid "Enable Amount" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:398 -msgid "Copy Template Reference" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:424 -#: .\cookbook\templates\url_import.html:297 -#: .\cookbook\templates\url_import.html:567 -msgid "Instructions" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:437 -#: .\cookbook\templates\forms\edit_internal_recipe.html:468 -msgid "Save & View" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:441 -#: .\cookbook\templates\forms\edit_internal_recipe.html:474 -msgid "Add Step" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:444 -#: .\cookbook\templates\forms\edit_internal_recipe.html:478 -msgid "Add Nutrition" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:446 -#: .\cookbook\templates\forms\edit_internal_recipe.html:480 -msgid "Remove Nutrition" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:448 -#: .\cookbook\templates\forms\edit_internal_recipe.html:483 -msgid "View Recipe" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:450 -#: .\cookbook\templates\forms\edit_internal_recipe.html:485 -msgid "Delete Recipe" -msgstr "" - -#: .\cookbook\templates\forms\edit_internal_recipe.html:491 -msgid "Steps" -msgstr "" +msgstr "编辑菜谱" #: .\cookbook\templates\forms\ingredients.html:15 msgid "Edit Ingredients" -msgstr "" +msgstr "编辑材料" #: .\cookbook\templates\forms\ingredients.html:16 msgid "" @@ -1088,100 +1211,125 @@ msgid "" "them.\n" " " msgstr "" - -#: .\cookbook\templates\forms\ingredients.html:24 -#: .\cookbook\templates\space.html:41 .\cookbook\templates\stats.html:26 -msgid "Units" -msgstr "" +"\n" +" 如果两个(或更多)单位或材料应该是相同的,则可使用以下形式。\n" +" 它合并了两个单位或材料,并使用它们更新所有菜谱。\n" +" " #: .\cookbook\templates\forms\ingredients.html:26 msgid "Are you sure that you want to merge these two units?" -msgstr "" +msgstr "你确定要合并这两个单位吗?" #: .\cookbook\templates\forms\ingredients.html:31 #: .\cookbook\templates\forms\ingredients.html:40 msgid "Merge" -msgstr "" +msgstr "合并" #: .\cookbook\templates\forms\ingredients.html:36 msgid "Are you sure that you want to merge these two ingredients?" -msgstr "" +msgstr "你确定要合并这两种材料吗?" -#: .\cookbook\templates\generic\delete_template.html:18 +#: .\cookbook\templates\generic\delete_template.html:21 #, python-format msgid "Are you sure you want to delete the %(title)s: %(object)s " -msgstr "" +msgstr "你确定要删除 %(title)s:%(object)s " -#: .\cookbook\templates\generic\edit_template.html:30 +#: .\cookbook\templates\generic\delete_template.html:26 +msgid "Protected" +msgstr "受保护的" + +#: .\cookbook\templates\generic\delete_template.html:41 +msgid "Cascade" +msgstr "串联" + +#: .\cookbook\templates\generic\delete_template.html:72 +msgid "Cancel" +msgstr "取消" + +#: .\cookbook\templates\generic\edit_template.html:32 msgid "View" -msgstr "" +msgstr "查看" -#: .\cookbook\templates\generic\edit_template.html:34 +#: .\cookbook\templates\generic\edit_template.html:36 msgid "Delete original file" -msgstr "" +msgstr "删除原文件" #: .\cookbook\templates\generic\list_template.html:6 -#: .\cookbook\templates\generic\list_template.html:12 +#: .\cookbook\templates\generic\list_template.html:22 msgid "List" -msgstr "" +msgstr "清单" -#: .\cookbook\templates\generic\list_template.html:25 +#: .\cookbook\templates\generic\list_template.html:33 +#: .\cookbook\templates\shopping_list.html:33 +msgid "Try the new shopping list" +msgstr "试试新的购物清单" + +#: .\cookbook\templates\generic\list_template.html:45 msgid "Filter" -msgstr "" +msgstr "筛选" -#: .\cookbook\templates\generic\list_template.html:30 +#: .\cookbook\templates\generic\list_template.html:50 msgid "Import all" -msgstr "" +msgstr "全部导入" #: .\cookbook\templates\generic\table_template.html:76 #: .\cookbook\templates\recipes_table.html:121 msgid "previous" -msgstr "" +msgstr "之前" #: .\cookbook\templates\generic\table_template.html:98 #: .\cookbook\templates\recipes_table.html:143 msgid "next" -msgstr "" +msgstr "之后" #: .\cookbook\templates\history.html:20 msgid "View Log" -msgstr "" +msgstr "查看记录" #: .\cookbook\templates\history.html:24 msgid "Cook Log" -msgstr "" +msgstr "烹饪记录" #: .\cookbook\templates\import.html:6 .\cookbook\templates\test.html:6 msgid "Import Recipes" -msgstr "" +msgstr "导入菜谱" -#: .\cookbook\templates\include\log_cooking.html:7 +#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 +#: .\cookbook\templates\import_response.html:7 +#: .\cookbook\templates\test.html:14 .\cookbook\templates\test.html:20 +#: .\cookbook\templates\url_import.html:29 +#: .\cookbook\templates\url_import.html:108 +#: .\cookbook\templates\url_import.html:130 +#: .\cookbook\templates\url_import.html:324 +#: .\cookbook\templates\url_import.html:618 .\cookbook\views\delete.py:89 +#: .\cookbook\views\edit.py:200 +msgid "Import" +msgstr "导入" + +#: .\cookbook\templates\include\log_cooking.html:9 msgid "Log Recipe Cooking" -msgstr "" +msgstr "菜谱烹饪记录" -#: .\cookbook\templates\include\log_cooking.html:13 +#: .\cookbook\templates\include\log_cooking.html:15 msgid "All fields are optional and can be left empty." -msgstr "" +msgstr "所有字段都是可选的,可以留空。" -#: .\cookbook\templates\include\log_cooking.html:19 +#: .\cookbook\templates\include\log_cooking.html:21 msgid "Rating" -msgstr "" +msgstr "评分" -#: .\cookbook\templates\include\log_cooking.html:27 +#: .\cookbook\templates\include\log_cooking.html:29 #: .\cookbook\templates\include\recipe_open_modal.html:18 -#: .\cookbook\templates\meal_plan.html:283 -#: .\cookbook\templates\meal_plan.html:327 -#: .\cookbook\templates\meal_plan.html:366 msgid "Close" -msgstr "" +msgstr "关闭" #: .\cookbook\templates\include\recipe_open_modal.html:32 msgid "Open Recipe" -msgstr "" +msgstr "打开菜谱" #: .\cookbook\templates\include\storage_backend_warning.html:4 msgid "Security Warning" -msgstr "" +msgstr "安全警告" #: .\cookbook\templates\include\storage_backend_warning.html:5 msgid "" @@ -1195,40 +1343,45 @@ msgid "" "can be used.\n" " " msgstr "" +"\n" +" 密码和令牌字段在数据库中存储为明文。\n" +" 这是必要的,因为它们需要发出应用程序接口请求,但这也增加了被窃取的风险。
\n" +" 为了限制可能的损害,可以使用访问受限的令牌或帐户。\n" +" " #: .\cookbook\templates\index.html:29 msgid "Search recipe ..." -msgstr "" +msgstr "搜索菜谱……" #: .\cookbook\templates\index.html:44 msgid "New Recipe" -msgstr "" +msgstr "新菜谱" #: .\cookbook\templates\index.html:53 msgid "Advanced Search" -msgstr "" +msgstr "高级搜索" #: .\cookbook\templates\index.html:57 msgid "Reset Search" -msgstr "" +msgstr "重置搜索" #: .\cookbook\templates\index.html:85 msgid "Last viewed" -msgstr "" +msgstr "最近查看" -#: .\cookbook\templates\index.html:87 .\cookbook\templates\meal_plan.html:178 -#: .\cookbook\templates\space.html:35 .\cookbook\templates\stats.html:22 +#: .\cookbook\templates\index.html:87 .\cookbook\templates\space.html:37 +#: .\cookbook\templates\stats.html:22 msgid "Recipes" -msgstr "" +msgstr "菜谱" #: .\cookbook\templates\index.html:94 msgid "Log in to view recipes" -msgstr "" +msgstr "登录查看菜谱" #: .\cookbook\templates\markdown_info.html:5 #: .\cookbook\templates\markdown_info.html:13 msgid "Markdown Info" -msgstr "" +msgstr "Markdown 信息" #: .\cookbook\templates\markdown_info.html:14 msgid "" @@ -1245,54 +1398,62 @@ msgid "" "below.\n" " " msgstr "" +"\n" +" Markdown 是轻量标记语言,很方便格式化纯文本。\n" +" 本站使用 Python Markdown 库转换你的文本信息成好看的 HTML。\n" +" 完整的 Markdown 文档可 点击这里 查看。\n" +" 下面可以找到一个不完整但很可能够用的文档。\n" +" " #: .\cookbook\templates\markdown_info.html:25 msgid "Headers" -msgstr "" +msgstr "标题" #: .\cookbook\templates\markdown_info.html:54 msgid "Formatting" -msgstr "" +msgstr "格式化" #: .\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 "" +msgstr "通过在行尾后添加两个空格插入换行符" #: .\cookbook\templates\markdown_info.html:57 #: .\cookbook\templates\markdown_info.html:73 msgid "or by leaving a blank line inbetween." -msgstr "" +msgstr "或者在中间留一个空行。" #: .\cookbook\templates\markdown_info.html:59 #: .\cookbook\templates\markdown_info.html:74 msgid "This text is bold" -msgstr "" +msgstr "这个文本是粗体的" #: .\cookbook\templates\markdown_info.html:60 #: .\cookbook\templates\markdown_info.html:75 msgid "This text is italic" -msgstr "" +msgstr "这个文本是斜体的" #: .\cookbook\templates\markdown_info.html:61 #: .\cookbook\templates\markdown_info.html:77 msgid "Blockquotes are also possible" -msgstr "" +msgstr "块引用也可以" #: .\cookbook\templates\markdown_info.html:84 msgid "Lists" -msgstr "" +msgstr "列表" #: .\cookbook\templates\markdown_info.html:85 msgid "" "Lists can ordered or unorderd. It is important to leave a blank line " "before the list!" -msgstr "" +msgstr "列表可以是有序或无序的。重要的是 在列表前留下一个空行!" #: .\cookbook\templates\markdown_info.html:87 #: .\cookbook\templates\markdown_info.html:108 msgid "Ordered List" -msgstr "" +msgstr "有序列表" #: .\cookbook\templates\markdown_info.html:89 #: .\cookbook\templates\markdown_info.html:90 @@ -1301,12 +1462,12 @@ msgstr "" #: .\cookbook\templates\markdown_info.html:111 #: .\cookbook\templates\markdown_info.html:112 msgid "unordered list item" -msgstr "" +msgstr "无序列表项" #: .\cookbook\templates\markdown_info.html:93 #: .\cookbook\templates\markdown_info.html:114 msgid "Unordered List" -msgstr "" +msgstr "无序列表" #: .\cookbook\templates\markdown_info.html:95 #: .\cookbook\templates\markdown_info.html:96 @@ -1315,26 +1476,26 @@ msgstr "" #: .\cookbook\templates\markdown_info.html:117 #: .\cookbook\templates\markdown_info.html:118 msgid "ordered list item" -msgstr "" +msgstr "有序列表项" #: .\cookbook\templates\markdown_info.html:125 msgid "Images & Links" -msgstr "" +msgstr "图片和链接" #: .\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 "" +msgstr "链接可以使用 Markdown 格式化。此应用程序还允许粘贴链接到 markdown 字段而无需格式化。" #: .\cookbook\templates\markdown_info.html:132 #: .\cookbook\templates\markdown_info.html:145 msgid "This will become an image" -msgstr "" +msgstr "这将变成一个图像" #: .\cookbook\templates\markdown_info.html:152 msgid "Tables" -msgstr "" +msgstr "表格" #: .\cookbook\templates\markdown_info.html:153 msgid "" @@ -1342,435 +1503,575 @@ msgid "" "editor like this one." msgstr "" +"Markdown 表格难以手写。推荐使用像 这个 " +"的表格编辑器。" #: .\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 "表格" #: .\cookbook\templates\markdown_info.html:155 #: .\cookbook\templates\markdown_info.html:172 msgid "Header" -msgstr "" +msgstr "头部" #: .\cookbook\templates\markdown_info.html:157 #: .\cookbook\templates\markdown_info.html:178 msgid "Cell" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:101 -msgid "New Entry" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:113 -#: .\cookbook\templates\shopping_list.html:56 -msgid "Search Recipe" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:139 -msgid "Title" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:141 -msgid "Note (optional)" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:143 -msgid "" -"You can use markdown to format this field. See the docs here" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:147 -#: .\cookbook\templates\meal_plan.html:251 -msgid "Serving Count" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:153 -msgid "Create only note" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:168 -#: .\cookbook\templates\shopping_list.html:7 -#: .\cookbook\templates\shopping_list.html:29 -#: .\cookbook\templates\shopping_list.html:714 -msgid "Shopping List" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:172 -msgid "Shopping list currently empty" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:175 -msgid "Open Shopping List" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:189 -msgid "Plan" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:196 -msgid "Number of Days" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:206 -msgid "Weekday offset" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:209 -msgid "" -"Number of days starting from the first day of the week to offset the default " -"view." -msgstr "" - -#: .\cookbook\templates\meal_plan.html:217 -#: .\cookbook\templates\meal_plan.html:294 -msgid "Edit plan types" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:219 -msgid "Show help" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:220 -msgid "Week iCal export" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:264 -#: .\cookbook\templates\meal_plan_entry.html:18 -msgid "Created by" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:270 -#: .\cookbook\templates\meal_plan_entry.html:20 -#: .\cookbook\templates\shopping_list.html:254 -msgid "Shared with" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:280 -msgid "Add to Shopping" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:323 -msgid "New meal type" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:338 -msgid "Meal Plan Help" -msgstr "" - -#: .\cookbook\templates\meal_plan.html:344 -msgid "" -"\n" -"

The meal plan module allows planning of meals " -"both with recipes and notes.

\n" -"

Simply select a recipe from the list of " -"recently viewed recipes or search the one you\n" -" want and drag it to the desired plan " -"position. You can also add a note and a title and\n" -" then drag the recipe to create a plan entry " -"with a custom title and note. Creating only\n" -" Notes is possible by dragging the create " -"note box into the plan.

\n" -"

Click on a recipe in order to open the " -"detailed view. There you can also add it to the\n" -" shopping list. You can also add all recipes " -"of a day to the shopping list by\n" -" clicking the shopping cart at the top of the " -"table.

\n" -"

Since a common use case is to plan meals " -"together you can define\n" -" users you want to share your plan with in " -"the settings.\n" -"

\n" -"

You can also edit the types of meals you want " -"to plan. If you share your plan with\n" -" someone with\n" -" different meals, their meal types will " -"appear in your list as well. To prevent\n" -" duplicates (e.g. Other and Misc.)\n" -" name your meal types the same as the users " -"you share your meals with and they will be\n" -" merged.

\n" -" " -msgstr "" +msgstr "单元格" #: .\cookbook\templates\meal_plan_entry.html:6 msgid "Meal Plan View" -msgstr "" +msgstr "膳食计划视图" + +#: .\cookbook\templates\meal_plan_entry.html:18 +msgid "Created by" +msgstr "创建者" + +#: .\cookbook\templates\meal_plan_entry.html:20 +#: .\cookbook\templates\shopping_list.html:232 +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 "" +msgstr "从来没有烹饪。" #: .\cookbook\templates\meal_plan_entry.html:76 msgid "Other meals on this day" -msgstr "" +msgstr "这天的其他餐点" #: .\cookbook\templates\no_groups_info.html:5 #: .\cookbook\templates\no_groups_info.html:12 msgid "No Permissions" -msgstr "" +msgstr "没有权限" #: .\cookbook\templates\no_groups_info.html:17 msgid "You do not have any groups and therefor cannot use this application." -msgstr "" +msgstr "你没有任何组,因此无法使用此应用程序。" #: .\cookbook\templates\no_groups_info.html:18 #: .\cookbook\templates\no_perm_info.html:15 msgid "Please contact your administrator." -msgstr "" +msgstr "请联系你的管理员。" #: .\cookbook\templates\no_perm_info.html:5 #: .\cookbook\templates\no_perm_info.html:12 msgid "No Permission" -msgstr "" +msgstr "没有权限" #: .\cookbook\templates\no_perm_info.html:15 msgid "" "You do not have the required permissions to view this page or perform this " "action." -msgstr "" +msgstr "你没有必要的权限来查看此页面或执行此操作。" #: .\cookbook\templates\no_space_info.html:6 #: .\cookbook\templates\no_space_info.html:13 msgid "No Space" -msgstr "" +msgstr "没有空间" #: .\cookbook\templates\no_space_info.html:17 msgid "" "Recipes, foods, shopping lists and more are organized in spaces of one or " "more people." -msgstr "" +msgstr "菜谱、食物、购物清单等都组织在一个人或多个人的空间中。" #: .\cookbook\templates\no_space_info.html:18 msgid "" "You can either be invited into an existing space or create your own one." -msgstr "" +msgstr "你可以被邀请进入现有空间,也可以创建自己的空间。" #: .\cookbook\templates\no_space_info.html:31 #: .\cookbook\templates\no_space_info.html:40 msgid "Join Space" -msgstr "" +msgstr "加入空间" #: .\cookbook\templates\no_space_info.html:34 msgid "Join an existing space." -msgstr "" +msgstr "加入一个现有的空间。" #: .\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 "" +msgstr "要加入一个现有的空间,要么输入你的邀请令牌,要么单击空间所有者发送给你的邀请链接。" #: .\cookbook\templates\no_space_info.html:48 #: .\cookbook\templates\no_space_info.html:56 msgid "Create Space" -msgstr "" +msgstr "创建空间" #: .\cookbook\templates\no_space_info.html:51 msgid "Create your own recipe space." -msgstr "" +msgstr "创建你自己的菜谱空间。" #: .\cookbook\templates\no_space_info.html:52 msgid "Start your own recipe space and invite other users to it." -msgstr "" +msgstr "创建自己的食谱空间,并邀请其他用户加入。" #: .\cookbook\templates\offline.html:6 msgid "Offline" -msgstr "" +msgstr "离线" #: .\cookbook\templates\offline.html:19 msgid "You are currently offline!" -msgstr "" +msgstr "你目前处于离线状态!" #: .\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 "" +msgstr "下面列出的菜谱可以离线查看,因为你最近已经查看过了。请记住,数据可能是过时的。" -#: .\cookbook\templates\recipe_view.html:21 .\cookbook\templates\space.html:62 -#: .\cookbook\templates\stats.html:47 -msgid "Comments" -msgstr "" +#: .\cookbook\templates\recipe_view.html:26 +msgid "by" +msgstr "评论者" -#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:118 -#: .\cookbook\views\edit.py:179 +#: .\cookbook\templates\recipe_view.html:44 .\cookbook\views\delete.py:147 +#: .\cookbook\views\edit.py:180 msgid "Comment" -msgstr "" +msgstr "评论" #: .\cookbook\templates\recipes_table.html:19 #: .\cookbook\templates\recipes_table.html:23 -#: .\cookbook\templates\url_import.html:440 +#: .\cookbook\templates\url_import.html:447 msgid "Recipe Image" -msgstr "" +msgstr "菜谱图像" #: .\cookbook\templates\recipes_table.html:51 -#: .\cookbook\templates\url_import.html:445 +#: .\cookbook\templates\url_import.html:452 msgid "Preparation time ca." -msgstr "" +msgstr "准备时间约" #: .\cookbook\templates\recipes_table.html:57 -#: .\cookbook\templates\url_import.html:450 +#: .\cookbook\templates\url_import.html:457 msgid "Waiting time ca." -msgstr "" +msgstr "等待时间约" #: .\cookbook\templates\recipes_table.html:60 msgid "External" -msgstr "" +msgstr "外部" #: .\cookbook\templates\recipes_table.html:86 msgid "Log Cooking" -msgstr "" +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 +msgid "Search Settings" +msgstr "搜索设置" + +#: .\cookbook\templates\search_info.html:10 +msgid "" +"\n" +" Creating the best search experience is complicated and weighs " +"heavily on your personal configuration. \n" +" Changing any of the search settings can have significant impact on " +"the speed and quality of the results.\n" +" Search Methods, Trigrams and Full Text Search configurations are " +"only available if you are using Postgres for your database.\n" +" " +msgstr "" +"\n" +" 创造最佳的搜索体验非常复杂,并且对您的个人配置有很大影响。\n" +" 改变任何搜索设置都可能对搜索结果的速度和质量产生重大影响。\n" +" 只有在数据库使用 Postgres 时,才可以使用搜索方法、卦和全文搜索配置。\n" +" " + +#: .\cookbook\templates\search_info.html:19 +msgid "Search Methods" +msgstr "搜索方法" + +#: .\cookbook\templates\search_info.html:23 +msgid "" +" \n" +" Full text searches attempt to normalize the words provided to " +"match common variants. For example: 'forked', 'forking', 'forks' will all " +"normalize to 'fork'.\n" +" There are several methods available, described below, that will " +"control how the search behavior should react when multiple words are " +"searched.\n" +" Full technical details on how these operate can be viewed on Postgresql's website.\n" +" " +msgstr "" +" \n" +" 全文搜索尝试规范化提供的单词以匹配常见变体。例如:“forked”、“forking”、“forks”都将归为“fork”。\n" +" 下面将介绍几种可用的方法,可以控制搜索多个单词时搜索行为的反应。\n" +" 关于这些操作的完整技术细节可以在 Postgresql的网站 上查看。\n" +" " + +#: .\cookbook\templates\search_info.html:29 +msgid "" +" \n" +" Simple searches ignore punctuation and common words such as " +"'the', 'a', 'and'. And will treat seperate words as required.\n" +" Searching for 'apple or flour' will return any recipe that " +"includes both 'apple' and 'flour' anywhere in the fields that have been " +"selected for a full text search.\n" +" " +msgstr "" +" \n" +" 简单搜索会忽略标点符号和常用词,如“the”、“a”、“and”。并将根据需要处理单独的单词。\n" +" 搜索“apple or flour”将会在全文搜索中返回任意包含“apple”和“flour”的菜谱。\n" +" " + +#: .\cookbook\templates\search_info.html:34 +msgid "" +" \n" +" Phrase searches ignore punctuation, but will search for all of " +"the words in the exact order provided.\n" +" Searching for 'apple or flour' will only return a recipe that " +"includes the exact phrase 'apple or flour' in any of the fields that have " +"been selected for a full text search.\n" +" " msgstr "" -#: .\cookbook\templates\settings.html:25 +#: .\cookbook\templates\search_info.html:39 +msgid "" +" \n" +" Web searches simulate functionality found on many web search " +"sites supporting special syntax.\n" +" Placing quotes around several words will convert those words " +"into a phrase.\n" +" 'or' is recongized as searching for the word (or phrase) " +"immediately before 'or' OR the word (or phrase) directly after.\n" +" '-' is recognized as searching for recipes that do not include " +"the word (or phrase) that comes immediately after. \n" +" For example searching for 'apple pie' or cherry -butter will " +"return any recipe that includes the phrase 'apple pie' or the word " +"'cherry' \n" +" in any field included in the full text search but exclude any " +"recipe that has the word 'butter' in any field included.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:48 +msgid "" +" \n" +" Raw search is similar to Web except will take puncuation " +"operators such as '|', '&' and '()'\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:59 +msgid "" +" \n" +" Another approach to searching that also requires Postgresql is " +"fuzzy search or trigram similarity. A trigram is a group of three " +"consecutive characters.\n" +" For example searching for 'apple' will create x trigrams 'app', " +"'ppl', 'ple' and will create a score of how closely words match the " +"generated trigrams.\n" +" One benefit of searching trigams is that a search for 'sandwich' " +"will find mispelled words such as 'sandwhich' that would be missed by other " +"methods.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:69 +msgid "Search Fields" +msgstr "搜索字段" + +#: .\cookbook\templates\search_info.html:73 +msgid "" +" \n" +" Unaccent is a special case in that it enables searching a field " +"'unaccented' for each search style attempting to ignore accented values. \n" +" For example when you enable unaccent for 'Name' any search " +"(starts with, contains, trigram) will attempt the search ignoring accented " +"characters.\n" +" \n" +" For the other options, you can enable search on any or all " +"fields and they will be combined together with an assumed 'OR'.\n" +" For example enabling 'Name' for Starts With, 'Name' and " +"'Description' for Partial Match and 'Ingredients' and 'Keywords' for Full " +"Search\n" +" and searching for 'apple' will generate a search that will " +"return recipes that have:\n" +" - A recipe name that starts with 'apple'\n" +" - OR a recipe name that contains 'apple'\n" +" - OR a recipe description that contains 'apple'\n" +" - OR a recipe that will have a full text search match ('apple' " +"or 'apples') in ingredients\n" +" - OR a recipe that will have a full text search match in " +"Keywords\n" +"\n" +" Combining too many fields in too many types of search can have a " +"negative impact on performance, create duplicate results or return " +"unexpected results.\n" +" For example, enabling fuzzy search or partial matches will " +"interfere with web search methods. \n" +" Searching for 'apple -pie' with fuzzy search and full text " +"search will return the recipe Apple Pie. Though it is not included in the " +"full text results, it does match the trigram results.\n" +" " +msgstr "" + +#: .\cookbook\templates\search_info.html:95 +msgid "Search Index" +msgstr "搜索索引" + +#: .\cookbook\templates\search_info.html:99 +msgid "" +" \n" +" Trigram search and Full Text Search both rely on database " +"indexes to perform effectively. \n" +" You can rebuild the indexes on all fields in the Admin page for " +"Recipes and selecting all recipes and running 'rebuild index for selected " +"recipes'\n" +" You can also rebuild indexes at the command line by executing " +"the management command 'python manage.py rebuildindex'\n" +" " +msgstr "" + +#: .\cookbook\templates\settings.html:28 msgid "Account" -msgstr "" +msgstr "帐号" -#: .\cookbook\templates\settings.html:29 +#: .\cookbook\templates\settings.html:35 msgid "Preferences" -msgstr "" +msgstr "首选项" -#: .\cookbook\templates\settings.html:33 +#: .\cookbook\templates\settings.html:42 msgid "API-Settings" -msgstr "" - -#: .\cookbook\templates\settings.html:41 -msgid "Name Settings" -msgstr "" +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 "" +msgstr "帐号设置" -#: .\cookbook\templates\settings.html:51 +#: .\cookbook\templates\settings.html:75 msgid "Emails" -msgstr "" +msgstr "电子邮件" -#: .\cookbook\templates\settings.html:54 +#: .\cookbook\templates\settings.html:78 #: .\cookbook\templates\socialaccount\connections.html:11 msgid "Social" -msgstr "" +msgstr "社交" -#: .\cookbook\templates\settings.html:66 +#: .\cookbook\templates\settings.html:91 msgid "Language" -msgstr "" +msgstr "语言" -#: .\cookbook\templates\settings.html:96 +#: .\cookbook\templates\settings.html:121 msgid "Style" -msgstr "" +msgstr "样式" -#: .\cookbook\templates\settings.html:116 +#: .\cookbook\templates\settings.html:142 msgid "API Token" -msgstr "" +msgstr "应用程序接口令牌" -#: .\cookbook\templates\settings.html:117 +#: .\cookbook\templates\settings.html:143 msgid "" "You can use both basic authentication and token based authentication to " "access the REST API." -msgstr "" +msgstr "您可以使用基本身份验证和基于令牌的身份验证来访问表现层状态转换应用程序接口(REST API)。" -#: .\cookbook\templates\settings.html:134 +#: .\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:136 +#: .\cookbook\templates\settings.html:162 msgid "or" -msgstr "" +msgstr "或" + +#: .\cookbook\templates\settings.html:173 +msgid "" +"There are many options to configure the search depending on your personal " +"preferences." +msgstr "根据个人偏好,有许多选项可以配置搜索。" + +#: .\cookbook\templates\settings.html:174 +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 +msgid "" +"If you do want to configure the search you can read about the different " +"options here." +msgstr "如果你想要配置搜索,可以在 这里 阅读不同的选项。" + +#: .\cookbook\templates\settings.html:180 +msgid "Fuzzy" +msgstr "模糊" + +#: .\cookbook\templates\settings.html:181 +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 +msgid "This is the default behavior" +msgstr "这是默认行为" + +#: .\cookbook\templates\settings.html:183 +#: .\cookbook\templates\settings.html:191 +msgid "Apply" +msgstr "应用" + +#: .\cookbook\templates\settings.html:188 +msgid "Precise" +msgstr "精确" + +#: .\cookbook\templates\settings.html:189 +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 +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 "" +msgstr "安装菜谱" #: .\cookbook\templates\setup.html:14 msgid "Setup" -msgstr "" +msgstr "安装" #: .\cookbook\templates\setup.html:15 msgid "" "To start using this application you must first create a superuser account." -msgstr "" +msgstr "要开始使用这个应用程序,你必须先创建一个超级用户帐号。" #: .\cookbook\templates\setup.html:20 msgid "Create Superuser account" -msgstr "" +msgstr "创建超级用户帐号" -#: .\cookbook\templates\shopping_list.html:79 +#: .\cookbook\templates\shopping_list.html:8 +#: .\cookbook\templates\shopping_list.html:29 +#: .\cookbook\templates\shopping_list.html:663 +msgid "Shopping List" +msgstr "采购单" + +#: .\cookbook\templates\shopping_list.html:55 +msgid "Search Recipe" +msgstr "搜索菜谱" + +#: .\cookbook\templates\shopping_list.html:72 msgid "Shopping Recipes" -msgstr "" +msgstr "购物菜谱" -#: .\cookbook\templates\shopping_list.html:83 +#: .\cookbook\templates\shopping_list.html:74 msgid "No recipes selected" -msgstr "" +msgstr "没选择菜谱" -#: .\cookbook\templates\shopping_list.html:150 +#: .\cookbook\templates\shopping_list.html:131 +#, fuzzy msgid "Entry Mode" -msgstr "" +msgstr "条目模式" -#: .\cookbook\templates\shopping_list.html:158 +#: .\cookbook\templates\shopping_list.html:139 +#, fuzzy msgid "Add Entry" -msgstr "" +msgstr "添加条目" -#: .\cookbook\templates\shopping_list.html:174 +#: .\cookbook\templates\shopping_list.html:152 msgid "Amount" -msgstr "" +msgstr "数量" -#: .\cookbook\templates\shopping_list.html:240 +#: .\cookbook\templates\shopping_list.html:164 +msgid "Select Unit" +msgstr "选择单位" + +#: .\cookbook\templates\shopping_list.html:166 +#: .\cookbook\templates\shopping_list.html:189 +#: .\cookbook\templates\shopping_list.html:219 +#: .\cookbook\templates\shopping_list.html:243 +#: .\cookbook\templates\url_import.html:505 +#: .\cookbook\templates\url_import.html:537 +msgid "Select" +msgstr "选择" + +#: .\cookbook\templates\shopping_list.html:187 +msgid "Select Food" +msgstr "选择食物" + +#: .\cookbook\templates\shopping_list.html:218 msgid "Select Supermarket" -msgstr "" +msgstr "选择超市" -#: .\cookbook\templates\shopping_list.html:264 +#: .\cookbook\templates\shopping_list.html:242 msgid "Select User" -msgstr "" +msgstr "选择用户" -#: .\cookbook\templates\shopping_list.html:283 +#: .\cookbook\templates\shopping_list.html:258 msgid "Finished" -msgstr "" +msgstr "完成" -#: .\cookbook\templates\shopping_list.html:296 +#: .\cookbook\templates\shopping_list.html:267 msgid "You are offline, shopping list might not syncronize." -msgstr "" +msgstr "你已离线,购物清单可能无法同步。" -#: .\cookbook\templates\shopping_list.html:361 +#: .\cookbook\templates\shopping_list.html:318 msgid "Copy/Export" -msgstr "" - -#: .\cookbook\templates\shopping_list.html:365 -msgid "List Prefix" -msgstr "" +msgstr "复制或导出" #: .\cookbook\templates\socialaccount\connections.html:4 #: .\cookbook\templates\socialaccount\connections.html:15 msgid "Account Connections" -msgstr "" +msgstr "帐号连接" #: .\cookbook\templates\socialaccount\connections.html:18 msgid "" "You can sign in to your account using any of the following third party\n" " accounts:" -msgstr "" +msgstr "你可以使用以下任何第三方帐号登录你的帐号:" #: .\cookbook\templates\socialaccount\connections.html:52 msgid "" "You currently have no social network accounts connected to this account." -msgstr "" +msgstr "你目前没有与此帐号连接的社交网络帐号。" #: .\cookbook\templates\socialaccount\connections.html:55 msgid "Add a 3rd Party Account" -msgstr "" +msgstr "添加第三方帐号" #: .\cookbook\templates\socialaccount\signup.html:5 msgid "Signup" -msgstr "" +msgstr "注册" #: .\cookbook\templates\socialaccount\signup.html:10 #, python-format @@ -1797,98 +2098,98 @@ msgstr "" msgid "Sign in using" msgstr "" -#: .\cookbook\templates\space.html:23 +#: .\cookbook\templates\space.html:25 msgid "Space:" -msgstr "" +msgstr "空间:" -#: .\cookbook\templates\space.html:24 +#: .\cookbook\templates\space.html:26 msgid "Manage Subscription" -msgstr "" +msgstr "管理订阅" -#: .\cookbook\templates\space.html:32 .\cookbook\templates\stats.html:19 +#: .\cookbook\templates\space.html:34 .\cookbook\templates\stats.html:19 msgid "Number of objects" msgstr "" -#: .\cookbook\templates\space.html:45 .\cookbook\templates\stats.html:30 +#: .\cookbook\templates\space.html:54 .\cookbook\templates\stats.html:30 msgid "Recipe Imports" msgstr "" -#: .\cookbook\templates\space.html:53 .\cookbook\templates\stats.html:38 +#: .\cookbook\templates\space.html:62 .\cookbook\templates\stats.html:38 msgid "Objects stats" msgstr "" -#: .\cookbook\templates\space.html:56 .\cookbook\templates\stats.html:41 +#: .\cookbook\templates\space.html:65 .\cookbook\templates\stats.html:41 msgid "Recipes without Keywords" msgstr "" -#: .\cookbook\templates\space.html:58 .\cookbook\templates\stats.html:43 -msgid "External Recipes" -msgstr "" - -#: .\cookbook\templates\space.html:60 .\cookbook\templates\stats.html:45 +#: .\cookbook\templates\space.html:73 .\cookbook\templates\stats.html:45 msgid "Internal Recipes" -msgstr "" - -#: .\cookbook\templates\space.html:73 -msgid "Members" -msgstr "" - -#: .\cookbook\templates\space.html:77 -msgid "Invite User" -msgstr "" - -#: .\cookbook\templates\space.html:88 -msgid "User" -msgstr "" +msgstr "内部菜谱" #: .\cookbook\templates\space.html:89 -msgid "Groups" -msgstr "" +msgid "Members" +msgstr "成员" -#: .\cookbook\templates\space.html:105 -msgid "admin" -msgstr "" - -#: .\cookbook\templates\space.html:106 -msgid "user" -msgstr "" +#: .\cookbook\templates\space.html:95 +msgid "Invite User" +msgstr "邀请用户" #: .\cookbook\templates\space.html:107 -msgid "guest" -msgstr "" +msgid "User" +msgstr "用户" #: .\cookbook\templates\space.html:108 +msgid "Groups" +msgstr "群组" + +#: .\cookbook\templates\space.html:119 +msgid "admin" +msgstr "管理" + +#: .\cookbook\templates\space.html:120 +msgid "user" +msgstr "用户" + +#: .\cookbook\templates\space.html:121 +msgid "guest" +msgstr "访客" + +#: .\cookbook\templates\space.html:122 msgid "remove" -msgstr "" +msgstr "删除" -#: .\cookbook\templates\space.html:112 +#: .\cookbook\templates\space.html:126 msgid "Update" -msgstr "" +msgstr "更新" -#: .\cookbook\templates\space.html:116 +#: .\cookbook\templates\space.html:130 msgid "You cannot edit yourself." -msgstr "" +msgstr "你不能编辑自己。" -#: .\cookbook\templates\space.html:123 +#: .\cookbook\templates\space.html:136 msgid "There are no members in your space yet!" -msgstr "" +msgstr "你的空间里还没有成员!" -#: .\cookbook\templates\space.html:130 .\cookbook\templates\system.html:21 -#: .\cookbook\views\lists.py:115 +#: .\cookbook\templates\space.html:143 .\cookbook\templates\system.html:21 +#: .\cookbook\views\lists.py:85 msgid "Invite Links" -msgstr "" +msgstr "邀请链接" #: .\cookbook\templates\stats.html:4 msgid "Stats" -msgstr "" +msgstr "统计数据" + +#: .\cookbook\templates\stats.html:10 +msgid "Statistics" +msgstr "统计数据" #: .\cookbook\templates\system.html:22 msgid "Show Links" -msgstr "" +msgstr "显示链接" #: .\cookbook\templates\system.html:32 msgid "System Information" -msgstr "" +msgstr "系统信息" #: .\cookbook\templates\system.html:34 msgid "" @@ -1900,20 +2201,27 @@ msgid "" "recipes/releases\">here.\n" " " msgstr "" +"\n" +" Django Recipes 是一个开源应用程序。\n" +" 你可以在 GitHub " +"中找到。\n" +" 更新日志在 这里。\n" +" " #: .\cookbook\templates\system.html:48 msgid "Media Serving" -msgstr "" +msgstr "媒体服务" #: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 #: .\cookbook\templates\system.html:80 msgid "Warning" -msgstr "" +msgstr "警告" #: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 #: .\cookbook\templates\system.html:80 .\cookbook\templates\system.html:95 msgid "Ok" -msgstr "" +msgstr "好的" #: .\cookbook\templates\system.html:51 msgid "" @@ -1924,15 +2232,19 @@ msgid "" " your installation.\n" " " msgstr "" +"不推荐 使用 gunicorn/python 提供媒体文件。\n" +" 请按照 这里 描述的步骤操作更新安装。\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 "一切都好!" #: .\cookbook\templates\system.html:62 msgid "Secret Key" -msgstr "" +msgstr "密钥" #: .\cookbook\templates\system.html:66 msgid "" @@ -1949,7 +2261,7 @@ msgstr "" #: .\cookbook\templates\system.html:78 msgid "Debug Mode" -msgstr "" +msgstr "调试模式" #: .\cookbook\templates\system.html:82 msgid "" @@ -1964,11 +2276,11 @@ msgstr "" #: .\cookbook\templates\system.html:93 msgid "Database" -msgstr "" +msgstr "数据库" #: .\cookbook\templates\system.html:95 msgid "Info" -msgstr "" +msgstr "信息" #: .\cookbook\templates\system.html:97 msgid "" @@ -1979,141 +2291,166 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\url_import.html:6 +#: .\cookbook\templates\url_import.html:8 msgid "URL Import" -msgstr "" +msgstr "链接导入" -#: .\cookbook\templates\url_import.html:31 +#: .\cookbook\templates\url_import.html:33 msgid "Drag me to your bookmarks to import recipes from anywhere" -msgstr "" +msgstr "将我拖到书签以从任何地方导入食谱" -#: .\cookbook\templates\url_import.html:32 +#: .\cookbook\templates\url_import.html:34 msgid "Bookmark Me!" -msgstr "" +msgstr "给我加书签!" -#: .\cookbook\templates\url_import.html:61 +#: .\cookbook\templates\url_import.html:38 +msgid "URL" +msgstr "链接" + +#: .\cookbook\templates\url_import.html:40 +msgid "App" +msgstr "应用程序" + +#: .\cookbook\templates\url_import.html:64 msgid "Enter website URL" -msgstr "" +msgstr "输入网站链接" -#: .\cookbook\templates\url_import.html:97 +#: .\cookbook\templates\url_import.html:104 msgid "Select recipe files to import or drop them here..." -msgstr "" +msgstr "选择要导入的菜谱文件或将其放到此处……" -#: .\cookbook\templates\url_import.html:118 +#: .\cookbook\templates\url_import.html:125 msgid "Paste json or html source here to load recipe." -msgstr "" +msgstr "将 json 或 html 源代码粘贴到此处以加载菜谱。" -#: .\cookbook\templates\url_import.html:146 +#: .\cookbook\templates\url_import.html:153 msgid "Preview Recipe Data" -msgstr "" +msgstr "预览菜谱数据" -#: .\cookbook\templates\url_import.html:147 +#: .\cookbook\templates\url_import.html:154 msgid "Drag recipe attributes from the right into the appropriate box below." -msgstr "" +msgstr "将菜谱属性从右侧拖动到下面相应的框中。" -#: .\cookbook\templates\url_import.html:156 -#: .\cookbook\templates\url_import.html:173 -#: .\cookbook\templates\url_import.html:190 -#: .\cookbook\templates\url_import.html:209 -#: .\cookbook\templates\url_import.html:227 -#: .\cookbook\templates\url_import.html:242 -#: .\cookbook\templates\url_import.html:257 -#: .\cookbook\templates\url_import.html:273 -#: .\cookbook\templates\url_import.html:300 -#: .\cookbook\templates\url_import.html:351 +#: .\cookbook\templates\url_import.html:163 +#: .\cookbook\templates\url_import.html:180 +#: .\cookbook\templates\url_import.html:197 +#: .\cookbook\templates\url_import.html:216 +#: .\cookbook\templates\url_import.html:234 +#: .\cookbook\templates\url_import.html:249 +#: .\cookbook\templates\url_import.html:264 +#: .\cookbook\templates\url_import.html:280 +#: .\cookbook\templates\url_import.html:307 +#: .\cookbook\templates\url_import.html:358 msgid "Clear Contents" msgstr "清除内容" -#: .\cookbook\templates\url_import.html:158 +#: .\cookbook\templates\url_import.html:165 msgid "Text dragged here will be appended to the name." -msgstr "" +msgstr "拖动到此处的文本将附加到名称中。" -#: .\cookbook\templates\url_import.html:175 +#: .\cookbook\templates\url_import.html:178 +msgid "Description" +msgstr "描述" + +#: .\cookbook\templates\url_import.html:182 msgid "Text dragged here will be appended to the description." -msgstr "" +msgstr "拖动到此处的文本将附加到描述中。" -#: .\cookbook\templates\url_import.html:192 +#: .\cookbook\templates\url_import.html:199 msgid "Keywords dragged here will be appended to current list" -msgstr "" +msgstr "拖动到这里的关键字将被添加到当前列表" -#: .\cookbook\templates\url_import.html:207 +#: .\cookbook\templates\url_import.html:214 msgid "Image" -msgstr "影像" +msgstr "图片" -#: .\cookbook\templates\url_import.html:239 +#: .\cookbook\templates\url_import.html:246 msgid "Prep Time" msgstr "准备时间" -#: .\cookbook\templates\url_import.html:254 +#: .\cookbook\templates\url_import.html:261 msgid "Cook Time" msgstr "烹调时间" -#: .\cookbook\templates\url_import.html:275 +#: .\cookbook\templates\url_import.html:282 msgid "Ingredients dragged here will be appended to current list." -msgstr "" +msgstr "拖动到这里的材料将被添加到当前列表。" -#: .\cookbook\templates\url_import.html:302 +#: .\cookbook\templates\url_import.html:304 +#: .\cookbook\templates\url_import.html:579 +msgid "Instructions" +msgstr "说明" + +#: .\cookbook\templates\url_import.html:309 msgid "" "Recipe instructions dragged here will be appended to current instructions." msgstr "" -#: .\cookbook\templates\url_import.html:325 +#: .\cookbook\templates\url_import.html:332 msgid "Discovered Attributes" msgstr "" -#: .\cookbook\templates\url_import.html:327 +#: .\cookbook\templates\url_import.html:334 msgid "" "Drag recipe attributes from below into the appropriate box on the left. " "Click any node to display its full properties." msgstr "" -#: .\cookbook\templates\url_import.html:344 +#: .\cookbook\templates\url_import.html:351 msgid "Show Blank Field" msgstr "显示空白域" -#: .\cookbook\templates\url_import.html:349 +#: .\cookbook\templates\url_import.html:356 msgid "Blank Field" msgstr "空白域" -#: .\cookbook\templates\url_import.html:353 +#: .\cookbook\templates\url_import.html:360 msgid "Items dragged to Blank Field will be appended." msgstr "" -#: .\cookbook\templates\url_import.html:400 +#: .\cookbook\templates\url_import.html:407 msgid "Delete Text" msgstr "删除文本" -#: .\cookbook\templates\url_import.html:413 +#: .\cookbook\templates\url_import.html:420 msgid "Delete image" msgstr "删除影像" -#: .\cookbook\templates\url_import.html:429 +#: .\cookbook\templates\url_import.html:436 msgid "Recipe Name" msgstr "菜谱名称" -#: .\cookbook\templates\url_import.html:433 +#: .\cookbook\templates\url_import.html:440 msgid "Recipe Description" msgstr "菜谱描述" -#: .\cookbook\templates\url_import.html:494 -#: .\cookbook\templates\url_import.html:526 -#: .\cookbook\templates\url_import.html:582 +#: .\cookbook\templates\url_import.html:504 +#: .\cookbook\templates\url_import.html:536 +#: .\cookbook\templates\url_import.html:596 msgid "Select one" msgstr "选择一项" -#: .\cookbook\templates\url_import.html:596 +#: .\cookbook\templates\url_import.html:554 +msgid "Note" +msgstr "笔记" + +#: .\cookbook\templates\url_import.html:597 +msgid "Add Keyword" +msgstr "添加关键词" + +#: .\cookbook\templates\url_import.html:610 msgid "All Keywords" -msgstr "所有关键字" +msgstr "所有关键词" -#: .\cookbook\templates\url_import.html:599 +#: .\cookbook\templates\url_import.html:613 msgid "Import all keywords, not only the ones already existing." -msgstr "导入所有关键字,并不只是现有的。" +msgstr "导入所有关键词,并不只是现有的。" -#: .\cookbook\templates\url_import.html:626 +#: .\cookbook\templates\url_import.html:640 msgid "Information" -msgstr "" +msgstr "更多信息" -#: .\cookbook\templates\url_import.html:628 +#: .\cookbook\templates\url_import.html:642 msgid "" " Only websites containing ld+json or microdata information can currently\n" " be imported. Most big recipe pages " @@ -2124,275 +2461,480 @@ msgid "" " github issues." msgstr "" -#: .\cookbook\templates\url_import.html:636 +#: .\cookbook\templates\url_import.html:650 msgid "Google ld+json Info" msgstr "" -#: .\cookbook\templates\url_import.html:639 +#: .\cookbook\templates\url_import.html:653 msgid "GitHub Issues" -msgstr "GitHub问题" +msgstr "GitHub 问题" -#: .\cookbook\templates\url_import.html:641 +#: .\cookbook\templates\url_import.html:655 msgid "Recipe Markup Specification" -msgstr "" +msgstr "菜谱标记规范" -#: .\cookbook\views\api.py:79 +#: .\cookbook\views\api.py:88 .\cookbook\views\api.py:170 msgid "Parameter updated_at incorrectly formatted" +msgstr "参数 updated_at 格式不正确" + +#: .\cookbook\views\api.py:190 .\cookbook\views\api.py:291 +#, python-brace-format +msgid "No {self.basename} with id {pk} exists" msgstr "" -#: .\cookbook\views\api.py:580 .\cookbook\views\views.py:303 -msgid "This feature is not available in the demo version!" +#: .\cookbook\views\api.py:194 +msgid "Cannot merge with the same object!" +msgstr "无法与同一对象合并!" + +#: .\cookbook\views\api.py:201 +#, python-brace-format +msgid "No {self.basename} with id {target} exists" msgstr "" -#: .\cookbook\views\api.py:603 +#: .\cookbook\views\api.py:206 +msgid "Cannot merge with child object!" +msgstr "无法与子对象合并!" + +#: .\cookbook\views\api.py:239 +#, python-brace-format +msgid "{source.name} was merged successfully with {target.name}" +msgstr "{source.name} 已成功与 {target.name} 合并" + +#: .\cookbook\views\api.py:244 +#, python-brace-format +msgid "An error occurred attempting to merge {source.name} with {target.name}" +msgstr "视图合并 {source.name} 和 {target.name} 时出错" + +#: .\cookbook\views\api.py:300 +#, python-brace-format +msgid "{child.name} was moved successfully to the root." +msgstr "{child.name} 已成功移动到根目录。" + +#: .\cookbook\views\api.py:303 .\cookbook\views\api.py:321 +msgid "An error occurred attempting to move " +msgstr "尝试移动时出错 " + +#: .\cookbook\views\api.py:306 +msgid "Cannot move an object to itself!" +msgstr "无法将对象移动到自身!" + +#: .\cookbook\views\api.py:312 +#, python-brace-format +msgid "No {self.basename} with id {parent} exists" +msgstr "" + +#: .\cookbook\views\api.py:318 +#, python-brace-format +msgid "{child.name} was moved successfully to parent {parent.name}" +msgstr "{child.name} 成功移动到父节点 {parent.name}" + +#: .\cookbook\views\api.py:470 +#, python-brace-format +msgid "{obj.name} was removed from the shopping list." +msgstr "{obj.name} 已从购物清单中删除。" + +#: .\cookbook\views\api.py:475 .\cookbook\views\api.py:726 +#, python-brace-format +msgid "{obj.name} was added to the shopping list." +msgstr "{obj.name} 已添加到购物清单中。" + +#: .\cookbook\views\api.py:587 +msgid "ID of recipe a step is part of. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:588 +msgid "Query string matched (fuzzy) against object name." +msgstr "" + +#: .\cookbook\views\api.py:631 +msgid "" +"Query string matched (fuzzy) against recipe name. In the future also " +"fulltext search." +msgstr "" + +#: .\cookbook\views\api.py:632 +msgid "ID of keyword a recipe should have. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:633 +msgid "ID of food a recipe should have. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:634 +msgid "ID of unit a recipe should have." +msgstr "" + +#: .\cookbook\views\api.py:635 +msgid "Rating a recipe should have. [0 - 5]" +msgstr "" + +#: .\cookbook\views\api.py:636 +msgid "ID of book a recipe should be in. For multiple repeat parameter." +msgstr "" + +#: .\cookbook\views\api.py:637 +msgid "" +"If recipe should have all (AND=false) or any (OR=true) of the " +"provided keywords." +msgstr "" + +#: .\cookbook\views\api.py:638 +msgid "" +"If recipe should have all (AND=false) or any (OR=true) of the " +"provided foods." +msgstr "" + +#: .\cookbook\views\api.py:639 +msgid "" +"If recipe should be in all (AND=false) or any (OR=true) of the " +"provided books." +msgstr "" + +#: .\cookbook\views\api.py:640 +msgid "If only internal recipes should be returned. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:641 +msgid "Returns the results in randomized order. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:642 +msgid "Returns new results first in search results. [true/false]" +msgstr "" + +#: .\cookbook\views\api.py:768 +msgid "" +"Returns the shopping list entry with a primary key of id. Multiple values " +"allowed." +msgstr "" + +#: .\cookbook\views\api.py:771 +msgid "" +"Filter shopping list entries on checked. [true, false, both, recent]
- recent includes unchecked items and recently completed items." +msgstr "" + +#: .\cookbook\views\api.py:773 +msgid "Returns the shopping list entries sorted by supermarket category order." +msgstr "" + +#: .\cookbook\views\api.py:922 .\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 "" + +#: .\cookbook\views\api.py:944 msgid "Sync successful!" -msgstr "" +msgstr "同步成功!" -#: .\cookbook\views\api.py:608 +#: .\cookbook\views\api.py:949 msgid "Error synchronizing with Storage" -msgstr "" +msgstr "与存储同步时出错" -#: .\cookbook\views\api.py:686 +#: .\cookbook\views\api.py:1028 msgid "Nothing to do." -msgstr "" +msgstr "无事可做。" -#: .\cookbook\views\api.py:701 +#: .\cookbook\views\api.py:1043 msgid "The requested site provided malformed data and cannot be read." -msgstr "" +msgstr "请求的站点提供了格式错误的数据,无法读取。" -#: .\cookbook\views\api.py:708 +#: .\cookbook\views\api.py:1050 msgid "The requested page could not be found." -msgstr "" +msgstr "找不到请求的页面。" -#: .\cookbook\views\api.py:717 +#: .\cookbook\views\api.py:1068 msgid "" "The requested site does not provide any recognized data format to import the " "recipe from." -msgstr "" +msgstr "请求的站点未提供任何可识别的数据格式,无法从中导入菜谱。" -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:1082 +msgid "Connection Refused." +msgstr "连接被拒绝。" + +#: .\cookbook\views\api.py:1091 msgid "No useable data could be found." -msgstr "" +msgstr "找不到可用的数据。" -#: .\cookbook\views\api.py:747 +#: .\cookbook\views\api.py:1107 msgid "I couldn't find anything to do." -msgstr "" +msgstr "无所事事。" -#: .\cookbook\views\data.py:31 .\cookbook\views\data.py:122 -#: .\cookbook\views\edit.py:50 .\cookbook\views\import_export.py:67 -#: .\cookbook\views\new.py:32 +#: .\cookbook\views\data.py:34 .\cookbook\views\data.py:129 +#: .\cookbook\views\edit.py:49 .\cookbook\views\import_export.py:80 +#: .\cookbook\views\new.py:33 msgid "You have reached the maximum number of recipes for your space." -msgstr "" +msgstr "你已经达到了空间的菜谱的最大数量。" -#: .\cookbook\views\data.py:35 .\cookbook\views\data.py:126 -#: .\cookbook\views\edit.py:54 .\cookbook\views\import_export.py:71 -#: .\cookbook\views\new.py:36 +#: .\cookbook\views\data.py:38 .\cookbook\views\data.py:133 +#: .\cookbook\views\edit.py:53 .\cookbook\views\import_export.py:84 +#: .\cookbook\views\new.py:37 msgid "You have more users than allowed in your space." -msgstr "" +msgstr "你的空间中的用户数超过了允许的数量。" -#: .\cookbook\views\data.py:104 +#: .\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[0] "批量编辑完成。%(count)d 个菜谱已更新。" -#: .\cookbook\views\delete.py:72 +#: .\cookbook\views\delete.py:101 msgid "Monitor" msgstr "监测" -#: .\cookbook\views\delete.py:96 .\cookbook\views\lists.py:102 -#: .\cookbook\views\new.py:98 +#: .\cookbook\views\delete.py:125 .\cookbook\views\lists.py:71 +#: .\cookbook\views\new.py:101 msgid "Storage Backend" msgstr "存储后端" -#: .\cookbook\views\delete.py:106 +#: .\cookbook\views\delete.py:135 msgid "" "Could not delete this storage backend as it is used in at least one monitor." msgstr "" -#: .\cookbook\views\delete.py:129 .\cookbook\views\edit.py:213 -#: .\cookbook\views\new.py:156 +#: .\cookbook\views\delete.py:158 msgid "Recipe Book" -msgstr "" +msgstr "菜谱书" -#: .\cookbook\views\delete.py:141 +#: .\cookbook\views\delete.py:170 msgid "Bookmarks" msgstr "书签" -#: .\cookbook\views\delete.py:163 .\cookbook\views\new.py:252 +#: .\cookbook\views\delete.py:192 .\cookbook\views\new.py:238 msgid "Invite Link" -msgstr "" +msgstr "邀请链接" -#: .\cookbook\views\edit.py:119 -msgid "Food" -msgstr "食物" - -#: .\cookbook\views\edit.py:128 +#: .\cookbook\views\edit.py:125 msgid "You cannot edit this storage!" -msgstr "" +msgstr "你不能编辑此存储空间!" -#: .\cookbook\views\edit.py:148 +#: .\cookbook\views\edit.py:149 +#, fuzzy msgid "Storage saved!" msgstr "存储已存储!" -#: .\cookbook\views\edit.py:154 +#: .\cookbook\views\edit.py:155 msgid "There was an error updating this storage backend!" -msgstr "" +msgstr "更新此存储后端时出错!" -#: .\cookbook\views\edit.py:165 -msgid "Storage" -msgstr "" - -#: .\cookbook\views\edit.py:261 +#: .\cookbook\views\edit.py:248 msgid "Changes saved!" -msgstr "更改已保存!" +msgstr "更改已保存!" -#: .\cookbook\views\edit.py:265 +#: .\cookbook\views\edit.py:252 msgid "Error saving changes!" -msgstr "" +msgstr "保存更改时出错!" -#: .\cookbook\views\edit.py:299 -msgid "Units merged!" -msgstr "" - -#: .\cookbook\views\edit.py:301 .\cookbook\views\edit.py:317 -msgid "Cannot merge with the same object!" -msgstr "" - -#: .\cookbook\views\edit.py:315 -msgid "Foods merged!" -msgstr "" - -#: .\cookbook\views\import_export.py:93 +#: .\cookbook\views\import_export.py:106 msgid "Importing is not implemented for this provider" -msgstr "" +msgstr "此提供程序未实现导入" -#: .\cookbook\views\import_export.py:115 +#: .\cookbook\views\import_export.py:127 +msgid "" +"The PDF Exporter is not enabled on this instance as it is still in an " +"experimental state." +msgstr "此实例上未启用 PDF 导出器,因为它仍处于实验状态。" + +#: .\cookbook\views\import_export.py:132 msgid "Exporting is not implemented for this provider" -msgstr "" +msgstr "此提供程序未实现导出" -#: .\cookbook\views\lists.py:40 +#: .\cookbook\views\lists.py:25 msgid "Import Log" -msgstr "" +msgstr "导入日志" -#: .\cookbook\views\lists.py:53 +#: .\cookbook\views\lists.py:38 msgid "Discovery" msgstr "探索" -#: .\cookbook\views\lists.py:85 +#: .\cookbook\views\lists.py:54 msgid "Shopping Lists" msgstr "购物清单" -#: .\cookbook\views\new.py:123 -msgid "Imported new recipe!" -msgstr "" +#: .\cookbook\views\lists.py:148 +msgid "Supermarkets" +msgstr "超市" + +#: .\cookbook\views\lists.py:164 +msgid "Shopping Categories" +msgstr "购物类别" + +#: .\cookbook\views\lists.py:217 +msgid "Steps" +msgstr "步骤" + +#: .\cookbook\views\lists.py:232 +msgid "New Shopping List" +msgstr "新购物清单" #: .\cookbook\views\new.py:126 -msgid "There was an error importing this recipe!" -msgstr "" +msgid "Imported new recipe!" +msgstr "导入新菜谱!" -#: .\cookbook\views\new.py:226 +#: .\cookbook\views\new.py:129 +msgid "There was an error importing this recipe!" +msgstr "导入此菜谱时出错!" + +#: .\cookbook\views\new.py:212 msgid "Hello" msgstr "你好" -#: .\cookbook\views\new.py:226 +#: .\cookbook\views\new.py:212 msgid "You have been invited by " msgstr "" -#: .\cookbook\views\new.py:227 +#: .\cookbook\views\new.py:213 msgid " to join their Tandoor Recipes space " msgstr "" -#: .\cookbook\views\new.py:228 +#: .\cookbook\views\new.py:214 msgid "Click the following link to activate your account: " msgstr "" -#: .\cookbook\views\new.py:229 +#: .\cookbook\views\new.py:215 msgid "" "If the link does not work use the following code to manually join the space: " msgstr "" -#: .\cookbook\views\new.py:230 +#: .\cookbook\views\new.py:216 msgid "The invitation is valid until " msgstr "邀请有效期至 " -#: .\cookbook\views\new.py:231 +#: .\cookbook\views\new.py:217 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " msgstr "" -#: .\cookbook\views\new.py:234 +#: .\cookbook\views\new.py:220 msgid "Tandoor Recipes Invite" msgstr "" -#: .\cookbook\views\new.py:241 +#: .\cookbook\views\new.py:227 msgid "Invite link successfully send to user." msgstr "" -#: .\cookbook\views\new.py:244 +#: .\cookbook\views\new.py:230 msgid "" "You have send to many emails, please share the link manually or wait a few " "hours." msgstr "" -#: .\cookbook\views\new.py:246 +#: .\cookbook\views\new.py:232 msgid "Email to user could not be send, please share link manually." msgstr "" -#: .\cookbook\views\views.py:129 +#: .\cookbook\views\views.py:126 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:177 +#: .\cookbook\views\views.py:174 msgid "You do not have the required permissions to perform this action!" msgstr "" -#: .\cookbook\views\views.py:188 +#: .\cookbook\views\views.py:185 msgid "Comment saved!" -msgstr "评论已保存!" +msgstr "评论已保存!" -#: .\cookbook\views\views.py:395 +#: .\cookbook\views\views.py:276 +msgid "This feature is not available in the demo version!" +msgstr "此功能在演示版本中不可用!" + +#: .\cookbook\views\views.py:335 +msgid "You must select at least one field to search!" +msgstr "你必须至少选择一个字段进行搜索!" + +#: .\cookbook\views\views.py:340 +msgid "" +"To use this search method you must select at least one full text search " +"field!" +msgstr "要使用此搜索方法,至少选择一个全文搜索字段!" + +#: .\cookbook\views\views.py:344 +msgid "Fuzzy search is not compatible with this search method!" +msgstr "模糊搜索与此搜索方法不兼容!" + +#: .\cookbook\views\views.py:470 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 "" +msgstr "设置页面只能用于创建第一个用户!如果您忘记了超级用户凭据,请参阅 Django 文档,了解如何重置密码。" -#: .\cookbook\views\views.py:402 +#: .\cookbook\views\views.py:477 msgid "Passwords dont match!" -msgstr "密码不匹配!" +msgstr "密码不匹配!" -#: .\cookbook\views\views.py:418 +#: .\cookbook\views\views.py:493 msgid "User has been created, please login!" -msgstr "用户已创建,請登录!" +msgstr "用户已创建,请登录!" -#: .\cookbook\views\views.py:434 +#: .\cookbook\views\views.py:509 msgid "Malformed Invite Link supplied!" -msgstr "" +msgstr "提供了格式错误的邀请链接!" -#: .\cookbook\views\views.py:441 +#: .\cookbook\views\views.py:516 msgid "You are already member of a space and therefore cannot join this one." msgstr "你已是空间的成员,因此未能加入。" -#: .\cookbook\views\views.py:452 +#: .\cookbook\views\views.py:527 msgid "Successfully joined space." msgstr "成功加入空间。" -#: .\cookbook\views\views.py:458 +#: .\cookbook\views\views.py:533 msgid "Invite Link not valid or already used!" -msgstr "邀请连结无效或已使用!" +msgstr "邀请链接无效或已使用!" -#: .\cookbook\views\views.py:522 +#: .\cookbook\views\views.py:614 msgid "" "Reporting share links is not enabled for this instance. Please notify the " "page administrator to report problems." -msgstr "" +msgstr "未为此实例启用报告共享链接。请通知页面管理员报告问题。" -#: .\cookbook\views\views.py:528 +#: .\cookbook\views\views.py:620 msgid "" "Recipe sharing link has been disabled! For additional information please " "contact the page administrator." -msgstr "" +msgstr "菜谱共享链接已被禁用!有关更多信息,请与页面管理员联系。" + +#~ msgid "New Unit" +#~ msgstr "新单位" + +#, fuzzy +#~ msgid "New unit that other gets replaced by." +#~ msgstr "新的单位被其他取代." + +#~ msgid "Old Unit" +#~ msgstr "旧单位" + +#~ msgid "Unit that should be replaced." +#~ msgstr "单位应被取代." + +#~ msgid "New Food" +#~ msgstr "新的食品" + +#, fuzzy +#~ msgid "New food that other gets replaced by." +#~ msgstr "新食品被其他取代." + +#~ msgid "Old Food" +#~ msgstr "旧的食品" + +#~ msgid "Utensils" +#~ msgstr "厨具" + +#~ msgid "Storage Data" +#~ msgstr "存储数据" + +#~ msgid "Storage Backends" +#~ msgstr "存储后端" + +#~ msgid "Configure Sync" +#~ msgstr "配置同步" + +#, fuzzy +#~| msgid "Select one" +#~ msgid "Select Recipe" +#~ msgstr "选择一项" diff --git a/cookbook/management/commands/rebuildindex.py b/cookbook/management/commands/rebuildindex.py index 425727df..6ca4038c 100644 --- a/cookbook/management/commands/rebuildindex.py +++ b/cookbook/management/commands/rebuildindex.py @@ -15,7 +15,7 @@ class Command(BaseCommand): def handle(self, *args, **options): if settings.DATABASES['default']['ENGINE'] not in ['django.db.backends.postgresql_psycopg2', 'django.db.backends.postgresql']: - self.stdout.write(self.style.WARNING(_('Only Postgress databases use full text search, no index to rebuild'))) + self.stdout.write(self.style.WARNING(_('Only Postgresql databases use full text search, no index to rebuild'))) try: language = DICTIONARY.get(translation.get_language(), 'simple') diff --git a/cookbook/migrations/0143_build_full_text_index.py b/cookbook/migrations/0143_build_full_text_index.py index ca58fb0e..927eaa94 100644 --- a/cookbook/migrations/0143_build_full_text_index.py +++ b/cookbook/migrations/0143_build_full_text_index.py @@ -2,13 +2,15 @@ import annoying.fields from django.conf import settings from django.contrib.postgres.indexes import GinIndex -from django.contrib.postgres.search import SearchVectorField, SearchVector +from django.contrib.postgres.search import SearchVector, SearchVectorField from django.db import migrations, models from django.db.models import deletion -from django_scopes import scopes_disabled from django.utils import translation +from django_scopes import scopes_disabled + from cookbook.managers import DICTIONARY -from cookbook.models import Recipe, Step, Index, PermissionModelMixin, nameSearchField, allSearchFields +from cookbook.models import (Index, PermissionModelMixin, Recipe, Step, allSearchFields, + nameSearchField) def set_default_search_vector(apps, schema_editor): @@ -16,8 +18,6 @@ def set_default_search_vector(apps, schema_editor): return language = DICTIONARY.get(translation.get_language(), 'simple') with scopes_disabled(): - # TODO this approach doesn't work terribly well if multiple languages are in use - # I'm also uncertain about forcing unaccent here Recipe.objects.all().update( name_search_vector=SearchVector('name__unaccent', weight='A', config=language), desc_search_vector=SearchVector('description__unaccent', weight='B', config=language) diff --git a/cookbook/migrations/0150_food_to_tree.py b/cookbook/migrations/0150_food_to_tree.py new file mode 100644 index 00000000..1bcb933c --- /dev/null +++ b/cookbook/migrations/0150_food_to_tree.py @@ -0,0 +1,57 @@ +# Generated by Django 3.2.5 on 2021-08-14 15:40 + +from treebeard.mp_tree import MP_Node +from django.db import migrations, models +from django_scopes import scopes_disabled +# update if needed +steplen = MP_Node.steplen +alphabet = MP_Node.alphabet +node_order_by = ["name"] + + +def update_paths(apps, schema_editor): + with scopes_disabled(): + Node = apps.get_model("cookbook", "Food") + nodes = Node.objects.all().order_by(*node_order_by) + for i, node in enumerate(nodes, 1): + # for default values, this resolves to: "{:04d}".format(i) + node.path = f"{{:{alphabet[0]}{steplen}d}}".format(i) + if nodes: + Node.objects.bulk_update(nodes, ["path"]) + + +def backwards(apps, schema_editor): + """nothing to do""" + + +class Migration(migrations.Migration): + + dependencies = [ + ('cookbook', '0149_fix_leading_trailing_spaces'), + ] + + operations = [ + migrations.AddField( + model_name='food', + name='depth', + field=models.PositiveIntegerField(default=1), + preserve_default=False, + ), + migrations.AddField( + model_name='food', + name='numchild', + field=models.PositiveIntegerField(default=0), + ), + migrations.AddField( + model_name='food', + name='path', + field=models.CharField(default=0, max_length=255, unique=False), + preserve_default=False, + ), + migrations.RunPython(update_paths, backwards), + migrations.AlterField( + model_name="food", + name="path", + field=models.CharField(max_length=255, unique=True), + ), + ] diff --git a/cookbook/migrations/0151_auto_20210915_1037.py b/cookbook/migrations/0151_auto_20210915_1037.py new file mode 100644 index 00000000..4e3c9c3b --- /dev/null +++ b/cookbook/migrations/0151_auto_20210915_1037.py @@ -0,0 +1,40 @@ +# Generated by Django 3.2.7 on 2021-09-15 08:37 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('cookbook', '0150_food_to_tree'), + ] + + operations = [ + migrations.RemoveIndex( + model_name='cooklog', + name='cookbook_co_id_37485a_idx', + ), + migrations.RemoveIndex( + model_name='viewlog', + name='cookbook_vi_recipe__5cd178_idx', + ), + migrations.AlterField( + model_name='ingredient', + name='food', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='cookbook.food'), + ), + migrations.AlterField( + model_name='userpreference', + name='search_style', + field=models.CharField(choices=[('SMALL', 'Small'), ('LARGE', 'Large'), ('NEW', 'New')], default='NEW', max_length=64), + ), + migrations.AddIndex( + model_name='cooklog', + index=models.Index(fields=['id', 'recipe', '-created_at', 'rating', 'created_by'], name='cookbook_co_id_93d841_idx'), + ), + migrations.AddIndex( + model_name='viewlog', + index=models.Index(fields=['recipe', '-created_at', 'created_by'], name='cookbook_vi_recipe__1b051f_idx'), + ), + ] diff --git a/cookbook/migrations/0152_automation.py b/cookbook/migrations/0152_automation.py new file mode 100644 index 00000000..f383f6ab --- /dev/null +++ b/cookbook/migrations/0152_automation.py @@ -0,0 +1,35 @@ +# Generated by Django 3.2.7 on 2021-09-15 10:12 + +import cookbook.models +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('cookbook', '0151_auto_20210915_1037'), + ] + + operations = [ + migrations.CreateModel( + name='Automation', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('type', models.CharField(choices=[('FOOD_ALIAS', 'Food Alias'), ('UNIT_ALIAS', 'Unit Alias'), ('KEYWORD_ALIAS', 'Keyword Alias')], max_length=128)), + ('name', models.CharField(default='', max_length=128)), + ('description', models.TextField(blank=True, null=True)), + ('param_1', models.CharField(blank=True, max_length=128, null=True)), + ('param_2', models.CharField(blank=True, max_length=128, null=True)), + ('param_3', models.CharField(blank=True, max_length=128, null=True)), + ('disabled', models.BooleanField(default=False)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('space', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cookbook.space')), + ], + bases=(models.Model, cookbook.models.PermissionModelMixin), + ), + ] diff --git a/cookbook/migrations/0153_auto_20210915_2327.py b/cookbook/migrations/0153_auto_20210915_2327.py new file mode 100644 index 00000000..3997e3c3 --- /dev/null +++ b/cookbook/migrations/0153_auto_20210915_2327.py @@ -0,0 +1,106 @@ +# Generated by Django 3.2.7 on 2021-09-15 21:27 + +import django.contrib.postgres.indexes +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cookbook', '0152_automation'), + ] + + operations = [ + migrations.RemoveIndex( + model_name='cooklog', + name='cookbook_co_id_93d841_idx', + ), + migrations.RemoveIndex( + model_name='food', + name='cookbook_fo_id_22b733_idx', + ), + migrations.RemoveIndex( + model_name='ingredient', + name='cookbook_in_id_3368be_idx', + ), + migrations.RemoveIndex( + model_name='recipe', + name='cookbook_re_name_se_bdf3ca_gin', + ), + migrations.RemoveIndex( + model_name='recipe', + name='cookbook_re_id_e4c2d4_idx', + ), + migrations.RemoveIndex( + model_name='recipebook', + name='cookbook_re_name_bbe446_idx', + ), + migrations.AddIndex( + model_name='cooklog', + index=models.Index(fields=['id'], name='cookbook_co_id_553a6d_idx'), + ), + migrations.AddIndex( + model_name='cooklog', + index=models.Index(fields=['recipe'], name='cookbook_co_recipe__8ec719_idx'), + ), + migrations.AddIndex( + model_name='cooklog', + index=models.Index(fields=['-created_at'], name='cookbook_co_created_f6e244_idx'), + ), + migrations.AddIndex( + model_name='cooklog', + index=models.Index(fields=['rating'], name='cookbook_co_rating_aa7662_idx'), + ), + migrations.AddIndex( + model_name='cooklog', + index=models.Index(fields=['created_by'], name='cookbook_co_created_7ea086_idx'), + ), + migrations.AddIndex( + model_name='cooklog', + index=models.Index(fields=['created_by', 'rating'], name='cookbook_co_created_f5ccd7_idx'), + ), + migrations.AddIndex( + model_name='food', + index=models.Index(fields=['id'], name='cookbook_fo_id_3c379b_idx'), + ), + migrations.AddIndex( + model_name='food', + index=models.Index(fields=['name'], name='cookbook_fo_name_c848b6_idx'), + ), + migrations.AddIndex( + model_name='ingredient', + index=models.Index(fields=['id'], name='cookbook_in_id_2c1f57_idx'), + ), + migrations.AddIndex( + model_name='recipe', + index=django.contrib.postgres.indexes.GinIndex(fields=['name_search_vector'], name='cookbook_re_name_se_5dbbd5_gin'), + ), + migrations.AddIndex( + model_name='recipe', + index=django.contrib.postgres.indexes.GinIndex(fields=['desc_search_vector'], name='cookbook_re_desc_se_fdee30_gin'), + ), + migrations.AddIndex( + model_name='recipe', + index=models.Index(fields=['id'], name='cookbook_re_id_b2bdcf_idx'), + ), + migrations.AddIndex( + model_name='recipe', + index=models.Index(fields=['name'], name='cookbook_re_name_b8a027_idx'), + ), + migrations.AddIndex( + model_name='recipebook', + index=models.Index(fields=['name'], name='cookbook_re_name_94cc63_idx'), + ), + migrations.AddIndex( + model_name='viewlog', + index=models.Index(fields=['recipe'], name='cookbook_vi_recipe__ce995d_idx'), + ), + migrations.AddIndex( + model_name='viewlog', + index=models.Index(fields=['-created_at'], name='cookbook_vi_created_bd2b5f_idx'), + ), + migrations.AddIndex( + model_name='viewlog', + index=models.Index(fields=['created_by'], name='cookbook_vi_created_f9385c_idx'), + ), + ] diff --git a/cookbook/migrations/0154_auto_20210922_1705.py b/cookbook/migrations/0154_auto_20210922_1705.py new file mode 100644 index 00000000..bcbbfb77 --- /dev/null +++ b/cookbook/migrations/0154_auto_20210922_1705.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.7 on 2021-09-22 15:05 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cookbook', '0153_auto_20210915_2327'), + ] + + operations = [ + migrations.AddField( + model_name='mealtype', + name='color', + field=models.CharField(blank=True, max_length=7, null=True), + ), + migrations.AddField( + model_name='mealtype', + name='icon', + field=models.CharField(blank=True, max_length=16, null=True), + ), + ] diff --git a/cookbook/migrations/0155_mealtype_default.py b/cookbook/migrations/0155_mealtype_default.py new file mode 100644 index 00000000..6519916e --- /dev/null +++ b/cookbook/migrations/0155_mealtype_default.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.7 on 2021-09-23 11:38 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cookbook', '0154_auto_20210922_1705'), + ] + + operations = [ + migrations.AddField( + model_name='mealtype', + name='default', + field=models.BooleanField(blank=True, default=False), + ), + ] diff --git a/cookbook/migrations/0156_searchpreference_trigram_threshold.py b/cookbook/migrations/0156_searchpreference_trigram_threshold.py new file mode 100644 index 00000000..23d925ea --- /dev/null +++ b/cookbook/migrations/0156_searchpreference_trigram_threshold.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.7 on 2021-09-28 16:45 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cookbook', '0155_mealtype_default'), + ] + + operations = [ + migrations.AddField( + model_name='searchpreference', + name='trigram_threshold', + field=models.DecimalField(decimal_places=2, default=0.1, max_digits=3), + ), + ] diff --git a/cookbook/migrations/0157_alter_searchpreference_trigram.py b/cookbook/migrations/0157_alter_searchpreference_trigram.py new file mode 100644 index 00000000..7f5f5531 --- /dev/null +++ b/cookbook/migrations/0157_alter_searchpreference_trigram.py @@ -0,0 +1,33 @@ +# Generated by Django 3.2.7 on 2021-09-29 06:37 +from django_scopes import scopes_disabled + +from django.db import migrations, models +from cookbook.models import nameSearchField + + +def add_default_trigram(apps, schema_editor): + with scopes_disabled(): + SearchFields = apps.get_model('cookbook', 'SearchFields') + SearchPreference = apps.get_model('cookbook', 'SearchPreference') + + name_field = SearchFields.objects.get(name='Name') + + for p in SearchPreference.objects.all(): + if not p.trigram.all() and p.search == 'plain': + p.trigram.add(name_field) + p.save() + + +class Migration(migrations.Migration): + dependencies = [ + ('cookbook', '0156_searchpreference_trigram_threshold'), + ] + + operations = [ + migrations.AlterField( + model_name='searchpreference', + name='trigram', + field=models.ManyToManyField(blank=True, default=nameSearchField, related_name='trigram_fields', to='cookbook.SearchFields'), + ), + migrations.RunPython(add_default_trigram), + ] diff --git a/cookbook/migrations/0158_userpreference_use_kj.py b/cookbook/migrations/0158_userpreference_use_kj.py new file mode 100644 index 00000000..bd2a27d7 --- /dev/null +++ b/cookbook/migrations/0158_userpreference_use_kj.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.7 on 2021-10-25 05:21 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cookbook', '0157_alter_searchpreference_trigram'), + ] + + operations = [ + migrations.AddField( + model_name='userpreference', + name='use_kj', + field=models.BooleanField(default=False), + ), + ] diff --git a/cookbook/migrations/0159_add_shoppinglistentry_fields.py b/cookbook/migrations/0159_add_shoppinglistentry_fields.py new file mode 100644 index 00000000..9246c9b0 --- /dev/null +++ b/cookbook/migrations/0159_add_shoppinglistentry_fields.py @@ -0,0 +1,149 @@ +# Generated by Django 3.2.7 on 2021-10-01 20:52 + +import django.db.models.deletion +import django.utils.timezone +from django.conf import settings +from django.db import migrations, models +from django_scopes import scopes_disabled + +from cookbook.models import PermissionModelMixin, ShoppingListEntry + + +def copy_values_to_sle(apps, schema_editor): + with scopes_disabled(): + entries = ShoppingListEntry.objects.all() + for entry in entries: + if entry.shoppinglist_set.first(): + entry.created_by = entry.shoppinglist_set.first().created_by + entry.space = entry.shoppinglist_set.first().space + if entries: + ShoppingListEntry.objects.bulk_update(entries, ["created_by", "space", ]) + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('cookbook', '0158_userpreference_use_kj'), + ] + + operations = [ + migrations.AddField( + model_name='shoppinglistentry', + name='completed_at', + field=models.DateTimeField(blank=True, null=True), + ), + migrations.AddField( + model_name='shoppinglistentry', + name='created_at', + field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now), + preserve_default=False, + ), + migrations.AddField( + model_name='shoppinglistentry', + name='created_by', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='auth.user'), + preserve_default=False, + ), + migrations.AddField( + model_name='userpreference', + name='shopping_share', + field=models.ManyToManyField(blank=True, related_name='shopping_share', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='shoppinglistentry', + name='space', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='cookbook.space'), + preserve_default=False, + ), + migrations.AddField( + model_name='shoppinglistrecipe', + name='mealplan', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='cookbook.mealplan'), + ), + migrations.AddField( + model_name='shoppinglistrecipe', + name='name', + field=models.CharField(blank=True, default='', max_length=32), + ), + migrations.AddField( + model_name='shoppinglistentry', + name='ingredient', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='cookbook.ingredient'), + ), + migrations.AlterField( + model_name='shoppinglistentry', + name='unit', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='cookbook.unit'), + ), + migrations.AddField( + model_name='userpreference', + name='mealplan_autoadd_shopping', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='userpreference', + name='mealplan_autoexclude_onhand', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='shoppinglistentry', + name='list_recipe', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='entries', to='cookbook.shoppinglistrecipe'), + ), + migrations.CreateModel( + name='FoodInheritField', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('field', models.CharField(max_length=32, unique=True)), + ('name', models.CharField(max_length=64, unique=True)), + ], + bases=(models.Model, PermissionModelMixin), + ), + migrations.AddField( + model_name='userpreference', + name='mealplan_autoinclude_related', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='food', + name='inherit_fields', + field=models.ManyToManyField(blank=True, to='cookbook.FoodInheritField'), + ), + migrations.AddField( + model_name='space', + name='food_inherit', + field=models.ManyToManyField(blank=True, to='cookbook.FoodInheritField'), + ), + migrations.AddField( + model_name='shoppinglistentry', + name='delay_until', + field=models.DateTimeField(blank=True, null=True), + ), + migrations.AddField( + model_name='userpreference', + name='default_delay', + field=models.DecimalField(decimal_places=4, default=4, max_digits=8), + ), + migrations.AddField( + model_name='userpreference', + name='filter_to_supermarket', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='userpreference', + name='shopping_recent_days', + field=models.PositiveIntegerField(default=7), + ), + migrations.RenameField( + model_name='food', + old_name='ignore_shopping', + new_name='food_onhand', + ), + migrations.AddField( + model_name='space', + name='show_facet_count', + field=models.BooleanField(default=False), + ), + migrations.RunPython(copy_values_to_sle), + ] diff --git a/cookbook/migrations/0160_delete_shoppinglist_orphans.py b/cookbook/migrations/0160_delete_shoppinglist_orphans.py new file mode 100644 index 00000000..26e08656 --- /dev/null +++ b/cookbook/migrations/0160_delete_shoppinglist_orphans.py @@ -0,0 +1,50 @@ +# Generated by Django 3.2.7 on 2021-10-01 22:34 + +import datetime +from datetime import timedelta + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models +from django.utils import timezone +from django.utils.timezone import utc +from django_scopes import scopes_disabled + +from cookbook.models import FoodInheritField, ShoppingListEntry + + +def delete_orphaned_sle(apps, schema_editor): + with scopes_disabled(): + # shopping list entry is orphaned - delete it + ShoppingListEntry.objects.filter(shoppinglist=None).delete() + + +def create_inheritfields(apps, schema_editor): + FoodInheritField.objects.create(name='Supermarket Category', field='supermarket_category') + FoodInheritField.objects.create(name='On Hand', field='food_onhand') + FoodInheritField.objects.create(name='Diet', field='diet') + FoodInheritField.objects.create(name='Substitute', field='substitute') + FoodInheritField.objects.create(name='Substitute Children', field='substitute_children') + FoodInheritField.objects.create(name='Substitute Siblings', field='substitute_siblings') + + +def set_completed_at(apps, schema_editor): + today_start = timezone.now().replace(hour=0, minute=0, second=0) + # arbitrary - keeping all of the closed shopping list items out of the 'recent' view + month_ago = today_start - timedelta(days=30) + with scopes_disabled(): + ShoppingListEntry.objects.filter(checked=True).update(completed_at=month_ago) + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('cookbook', '0159_add_shoppinglistentry_fields'), + ] + + operations = [ + migrations.RunPython(delete_orphaned_sle), + migrations.RunPython(create_inheritfields), + migrations.RunPython(set_completed_at), + ] diff --git a/cookbook/migrations/0161_alter_shoppinglistentry_food.py b/cookbook/migrations/0161_alter_shoppinglistentry_food.py new file mode 100644 index 00000000..ab565354 --- /dev/null +++ b/cookbook/migrations/0161_alter_shoppinglistentry_food.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.8 on 2021-11-03 23:19 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('cookbook', '0160_delete_shoppinglist_orphans'), + ] + + operations = [ + migrations.AlterField( + model_name='shoppinglistentry', + name='food', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='shopping_entries', to='cookbook.food'), + ), + ] diff --git a/cookbook/migrations/0162_userpreference_csv_delim.py b/cookbook/migrations/0162_userpreference_csv_delim.py new file mode 100644 index 00000000..b7e4e548 --- /dev/null +++ b/cookbook/migrations/0162_userpreference_csv_delim.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.9 on 2021-11-30 22:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cookbook', '0161_alter_shoppinglistentry_food'), + ] + + operations = [ + migrations.AddField( + model_name='userpreference', + name='csv_delim', + field=models.CharField(default=',', max_length=2), + ), + migrations.AddField( + model_name='userpreference', + name='csv_prefix', + field=models.CharField(blank=True, max_length=10), + ), + ] diff --git a/cookbook/migrations/0163_auto_20220105_0758.py b/cookbook/migrations/0163_auto_20220105_0758.py new file mode 100644 index 00000000..b7d67cd1 --- /dev/null +++ b/cookbook/migrations/0163_auto_20220105_0758.py @@ -0,0 +1,41 @@ +# Generated by Django 3.2.10 on 2022-01-05 13:58 + +from django.conf import settings +from django.db import migrations, models + +from cookbook.models import FoodInheritField + + +def rename_inherit_field(apps, schema_editor): + x = FoodInheritField.objects.filter(name='On Hand', field='food_onhand').first() + if x: + x.name = "Ignore Shopping" + x.field = "ignore_shopping" + x.save() + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('cookbook', '0162_userpreference_csv_delim'), + ] + + operations = [ + migrations.AddField( + model_name='food', + name='onhand_users', + field=models.ManyToManyField(blank=True, to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='userpreference', + name='shopping_add_onhand', + field=models.BooleanField(default=True), + ), + migrations.RenameField( + model_name='food', + old_name='food_onhand', + new_name='ignore_shopping', + ), + migrations.RunPython(rename_inherit_field), + ] diff --git a/cookbook/migrations/0164_space_show_facet_count.py b/cookbook/migrations/0164_space_show_facet_count.py new file mode 100644 index 00000000..4c8ecc9c --- /dev/null +++ b/cookbook/migrations/0164_space_show_facet_count.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.11 on 2022-01-17 22:23 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cookbook', '0163_auto_20220105_0758'), + ] + + operations = [ + # migrations.AddField( + # model_name='space', + # name='show_facet_count', + # field=models.BooleanField(default=False), + # ), + # removed due to quick fix in 0159 migration to maintain correct order + ] diff --git a/cookbook/migrations/0165_remove_step_type.py b/cookbook/migrations/0165_remove_step_type.py new file mode 100644 index 00000000..3eca515f --- /dev/null +++ b/cookbook/migrations/0165_remove_step_type.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.11 on 2022-01-18 19:19 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('cookbook', '0164_space_show_facet_count'), + ] + + operations = [ + migrations.RemoveField( + model_name='step', + name='type', + ), + ] diff --git a/cookbook/migrations/0166_alter_userpreference_shopping_add_onhand.py b/cookbook/migrations/0166_alter_userpreference_shopping_add_onhand.py new file mode 100644 index 00000000..2ae2352c --- /dev/null +++ b/cookbook/migrations/0166_alter_userpreference_shopping_add_onhand.py @@ -0,0 +1,26 @@ +# Generated by Django 3.2.11 on 2022-01-20 14:39 + +from django.db import migrations, models +from django_scopes import scopes_disabled + + +def add_default_trigram(apps, schema_editor): + with scopes_disabled(): + UserPreference = apps.get_model('cookbook', 'UserPreference') + + UserPreference.objects.all().update(shopping_add_onhand=False) + + +class Migration(migrations.Migration): + dependencies = [ + ('cookbook', '0165_remove_step_type'), + ] + + operations = [ + migrations.AlterField( + model_name='userpreference', + name='shopping_add_onhand', + field=models.BooleanField(default=False), + ), + migrations.RunPython(add_default_trigram), + ] diff --git a/cookbook/migrations/0167_userpreference_left_handed.py b/cookbook/migrations/0167_userpreference_left_handed.py new file mode 100644 index 00000000..23fb0f4a --- /dev/null +++ b/cookbook/migrations/0167_userpreference_left_handed.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.11 on 2022-01-20 22:31 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cookbook', '0166_alter_userpreference_shopping_add_onhand'), + ] + + operations = [ + migrations.AddField( + model_name='userpreference', + name='left_handed', + field=models.BooleanField(default=False), + ), + ] diff --git a/cookbook/migrations/0168_add_unit_searchfields.py b/cookbook/migrations/0168_add_unit_searchfields.py new file mode 100644 index 00000000..d6ba5ee6 --- /dev/null +++ b/cookbook/migrations/0168_add_unit_searchfields.py @@ -0,0 +1,20 @@ +from django.db import migrations + +from cookbook.models import SearchFields + + +def create_searchfields(apps, schema_editor): + SearchFields.objects.create(name='Units', field='steps__ingredients__unit__name') + + +class Migration(migrations.Migration): + + dependencies = [ + ('cookbook', '0167_userpreference_left_handed'), + ] + + operations = [ + migrations.RunPython( + create_searchfields + ), + ] diff --git a/cookbook/migrations/0169_exportlog.py b/cookbook/migrations/0169_exportlog.py new file mode 100644 index 00000000..0fa6c20e --- /dev/null +++ b/cookbook/migrations/0169_exportlog.py @@ -0,0 +1,34 @@ +# Generated by Django 3.2.11 on 2022-02-03 15:03 + +import cookbook.models +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('cookbook', '0168_add_unit_searchfields'), + ] + + operations = [ + migrations.CreateModel( + name='ExportLog', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('type', models.CharField(max_length=32)), + ('running', models.BooleanField(default=True)), + ('msg', models.TextField(default='')), + ('total_recipes', models.IntegerField(default=0)), + ('exported_recipes', models.IntegerField(default=0)), + ('cache_duration', models.IntegerField(default=0)), + ('possibly_not_expired', models.BooleanField(default=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('space', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cookbook.space')), + ], + bases=(models.Model, cookbook.models.PermissionModelMixin), + ), + ] diff --git a/cookbook/models.py b/cookbook/models.py index 09dcfa4d..3d2eb4e6 100644 --- a/cookbook/models.py +++ b/cookbook/models.py @@ -2,24 +2,30 @@ import operator import pathlib import re import uuid +from collections import OrderedDict from datetime import date, timedelta +from decimal import Decimal from annoying.fields import AutoOneToOneField from django.contrib import auth from django.contrib.auth.models import Group, User from django.contrib.postgres.indexes import GinIndex from django.contrib.postgres.search import SearchVectorField -from django.core.files.uploadedfile import UploadedFile, InMemoryUploadedFile +from django.core.files.uploadedfile import InMemoryUploadedFile, UploadedFile from django.core.validators import MinLengthValidator -from django.db import models -from django.db.models import Index +from django.db import IntegrityError, models +from django.db.models import Index, ProtectedError, Q, Subquery +from django.db.models.fields.related import ManyToManyField +from django.db.models.functions import Substr +from django.db.transaction import atomic from django.utils import timezone from django.utils.translation import gettext as _ -from treebeard.mp_tree import MP_Node, MP_NodeManager -from django_scopes import ScopedManager, scopes_disabled from django_prometheus.models import ExportModelOperationsMixin -from recipes.settings import (COMMENT_PREF_DEFAULT, FRACTION_PREF_DEFAULT, - STICKY_NAV_PREF_DEFAULT) +from django_scopes import ScopedManager, scopes_disabled +from treebeard.mp_tree import MP_Node, MP_NodeManager + +from recipes.settings import (COMMENT_PREF_DEFAULT, FRACTION_PREF_DEFAULT, KJ_PREF_DEFAULT, + SORT_TREE_BY_NAME, STICKY_NAV_PREF_DEFAULT) def get_user_name(self): @@ -29,7 +35,20 @@ def get_user_name(self): return self.username +def get_shopping_share(self): + # get list of users that shared shopping list with user. Django ORM forbids this type of query, so raw is required + return User.objects.raw(' '.join([ + 'SELECT auth_user.id FROM auth_user', + 'INNER JOIN cookbook_userpreference', + 'ON (auth_user.id = cookbook_userpreference.user_id)', + 'INNER JOIN cookbook_userpreference_shopping_share', + 'ON (cookbook_userpreference.user_id = cookbook_userpreference_shopping_share.userpreference_id)', + 'WHERE cookbook_userpreference_shopping_share.user_id ={}'.format(self.id) + ])) + + auth.models.User.add_to_class('get_user_name', get_user_name) +auth.models.User.add_to_class('get_shopping_share', get_shopping_share) def get_model_name(model): @@ -37,16 +56,144 @@ def get_model_name(model): class TreeManager(MP_NodeManager): - def get_or_create(self, **kwargs): - # model.Manager get_or_create() is not compatible with MP_Tree + def create(self, *args, **kwargs): + return self.get_or_create(*args, **kwargs)[0] + + # model.Manager get_or_create() is not compatible with MP_Tree + def get_or_create(self, *args, **kwargs): kwargs['name'] = kwargs['name'].strip() - q = self.filter(name__iexact=kwargs['name'], space=kwargs['space']) - if len(q) != 0: - return q[0], False - else: + try: + return self.get(name__exact=kwargs['name'], space=kwargs['space']), False + except self.model.DoesNotExist: with scopes_disabled(): - node = self.model.add_root(**kwargs) - return node, True + try: + defaults = kwargs.pop('defaults', None) + if defaults: + kwargs = {**kwargs, **defaults} + # ManyToMany fields can't be set this way, so pop them out to save for later + fields = [field.name for field in self.model._meta.get_fields() if issubclass(type(field), ManyToManyField)] + many_to_many = {field: kwargs.pop(field) for field in list(kwargs) if field in fields} + obj = self.model.add_root(**kwargs) + for field in many_to_many: + field_model = getattr(obj, field).model + for related_obj in many_to_many[field]: + if isinstance(related_obj, User): + getattr(obj, field).add(field_model.objects.get(id=related_obj.id)) + else: + getattr(obj, field).add(field_model.objects.get(**dict(related_obj))) + return obj, True + except IntegrityError as e: + if 'Key (path)' in e.args[0]: + self.model.fix_tree(fix_paths=True) + return self.model.add_root(**kwargs), True + + +class TreeModel(MP_Node): + _full_name_separator = ' > ' + + def __str__(self): + if self.icon: + return f"{self.icon} {self.name}" + else: + return f"{self.name}" + + # MP_Tree move uses raw SQL to execute move, override behavior to force a save triggering post_save signal + def move(self, *args, **kwargs): + super().move(*args, **kwargs) + # treebeard bypasses ORM, need to retrieve the object again to avoid writing previous state back to disk + obj = self.__class__.objects.get(id=self.id) + obj.save() + + @property + def parent(self): + parent = self.get_parent() + if parent: + return self.get_parent().id + return None + + @property + def full_name(self): + """ + Returns a string representation of a tree node and it's ancestors, + e.g. 'Cuisine > Asian > Chinese > Catonese'. + """ + names = [node.name for node in self.get_ancestors_and_self()] + return self._full_name_separator.join(names) + + def get_ancestors_and_self(self): + """ + Gets ancestors and includes itself. Use treebeard's get_ancestors + if you don't want to include the node itself. It's a separate + function as it's commonly used in templates. + """ + if self.is_root(): + return [self] + return list(self.get_ancestors()) + [self] + + def get_descendants_and_self(self): + """ + Gets descendants and includes itself. Use treebeard's get_descendants + if you don't want to include the node itself. It's a separate + function as it's commonly used in templates. + """ + return self.get_tree(self) + + def has_children(self): + return self.get_num_children() > 0 + + def get_num_children(self): + return self.get_children().count() + + # use self.objects.get_or_create() instead + @classmethod + def add_root(self, **kwargs): + with scopes_disabled(): + return super().add_root(**kwargs) + + # i'm 99% sure there is a more idiomatic way to do this subclassing MP_NodeQuerySet + @staticmethod + def include_descendants(queryset=None, filter=None): + """ + :param queryset: Model Queryset to add descendants + :param filter: Filter (exclude) the descendants nodes with the provided Q filter + """ + descendants = Q() + # TODO filter the queryset nodes to exclude descendants of objects in the queryset + nodes = queryset.values('path', 'depth') + for node in nodes: + descendants |= Q(path__startswith=node['path'], depth__gt=node['depth']) + + return queryset.model.objects.filter(Q(id__in=queryset.values_list('id')) | descendants) + + def exclude_descendants(queryset=None, filter=None): + """ + :param queryset: Model Queryset to add descendants + :param filter: Filter (include) the descendants nodes with the provided Q filter + """ + descendants = Q() + # TODO filter the queryset nodes to exclude descendants of objects in the queryset + nodes = queryset.values('path', 'depth') + for node in nodes: + descendants |= Q(path__startswith=node['path'], depth__gt=node['depth']) + + return queryset.model.objects.filter(id__in=queryset.values_list('id')).exclude(descendants) + + def include_ancestors(queryset=None): + """ + :param queryset: Model Queryset to add ancestors + :param filter: Filter (include) the ancestors nodes with the provided Q filter + """ + + queryset = queryset.annotate(root=Substr('path', 1, queryset.model.steplen)) + nodes = list(set(queryset.values_list('root', 'depth'))) + + ancestors = Q() + for node in nodes: + ancestors |= Q(path__startswith=node[0], depth__lt=node[1]) + return queryset.model.objects.filter(Q(id__in=queryset.values_list('id')) | ancestors) + + class Meta: + abstract = True class PermissionModelMixin: @@ -78,6 +225,18 @@ class PermissionModelMixin: raise NotImplementedError('get space for method not implemented and standard fields not available') +class FoodInheritField(models.Model, PermissionModelMixin): + field = models.CharField(max_length=32, unique=True) + name = models.CharField(max_length=64, unique=True) + + def __str__(self): + return _(self.name) + + @staticmethod + def get_name(self): + return _(self.name) + + class Space(ExportModelOperationsMixin('space'), models.Model): name = models.CharField(max_length=128, default='Default') created_by = models.ForeignKey(User, on_delete=models.PROTECT, null=True) @@ -88,6 +247,8 @@ class Space(ExportModelOperationsMixin('space'), models.Model): max_users = models.IntegerField(default=0) allow_sharing = models.BooleanField(default=True) demo = models.BooleanField(default=False) + food_inherit = models.ManyToManyField(FoodInheritField, blank=True) + show_facet_count = models.BooleanField(default=False) def __str__(self): return self.name @@ -155,6 +316,7 @@ class UserPreference(models.Model, PermissionModelMixin): ) default_unit = models.CharField(max_length=32, default='g') use_fractions = models.BooleanField(default=FRACTION_PREF_DEFAULT) + use_kj = models.BooleanField(default=KJ_PREF_DEFAULT) default_page = models.CharField( choices=PAGES, max_length=64, default=SEARCH ) @@ -165,10 +327,23 @@ class UserPreference(models.Model, PermissionModelMixin): plan_share = models.ManyToManyField( User, blank=True, related_name='plan_share_default' ) + shopping_share = models.ManyToManyField( + User, blank=True, related_name='shopping_share' + ) ingredient_decimals = models.IntegerField(default=2) comments = models.BooleanField(default=COMMENT_PREF_DEFAULT) shopping_auto_sync = models.IntegerField(default=5) sticky_navbar = models.BooleanField(default=STICKY_NAV_PREF_DEFAULT) + mealplan_autoadd_shopping = models.BooleanField(default=False) + mealplan_autoexclude_onhand = models.BooleanField(default=True) + mealplan_autoinclude_related = models.BooleanField(default=True) + shopping_add_onhand = models.BooleanField(default=False) + filter_to_supermarket = models.BooleanField(default=False) + left_handed = models.BooleanField(default=False) + default_delay = models.DecimalField(default=4, max_digits=8, decimal_places=4) + shopping_recent_days = models.PositiveIntegerField(default=7) + csv_delim = models.CharField(max_length=2, default=",") + csv_prefix = models.CharField(max_length=10, blank=True,) created_at = models.DateTimeField(auto_now_add=True) space = models.ForeignKey(Space, on_delete=models.CASCADE, null=True) @@ -277,72 +452,18 @@ class SyncLog(models.Model, PermissionModelMixin): return f"{self.created_at}:{self.sync} - {self.status}" -class Keyword(ExportModelOperationsMixin('keyword'), MP_Node, PermissionModelMixin): - # TODO add find and fix problem functions - node_order_by = ['name'] +class Keyword(ExportModelOperationsMixin('keyword'), TreeModel, PermissionModelMixin): + if SORT_TREE_BY_NAME: + node_order_by = ['name'] name = models.CharField(max_length=64) icon = models.CharField(max_length=16, blank=True, null=True) description = models.TextField(default="", blank=True) - created_at = models.DateTimeField(auto_now_add=True) - updated_at = models.DateTimeField(auto_now=True) + created_at = models.DateTimeField(auto_now_add=True) # TODO deprecate + updated_at = models.DateTimeField(auto_now=True) # TODO deprecate space = models.ForeignKey(Space, on_delete=models.CASCADE) objects = ScopedManager(space='space', _manager_class=TreeManager) - _full_name_separator = ' > ' - - def __str__(self): - if self.icon: - return f"{self.icon} {self.name}" - else: - return f"{self.name}" - - @property - def parent(self): - parent = self.get_parent() - if parent: - return self.get_parent().id - return None - - @property - def full_name(self): - """ - Returns a string representation of the keyword and it's ancestors, - e.g. 'Cuisine > Asian > Chinese > Catonese'. - """ - names = [keyword.name for keyword in self.get_ancestors_and_self()] - return self._full_name_separator.join(names) - - def get_ancestors_and_self(self): - """ - Gets ancestors and includes itself. Use treebeard's get_ancestors - if you don't want to include the keyword itself. It's a separate - function as it's commonly used in templates. - """ - if self.is_root(): - return [self] - return list(self.get_ancestors()) + [self] - - def get_descendants_and_self(self): - """ - Gets descendants and includes itself. Use treebeard's get_descendants - if you don't want to include the keyword itself. It's a separate - function as it's commonly used in templates. - """ - return self.get_tree(self) - - def has_children(self): - return self.get_num_children() > 0 - - def get_num_children(self): - return self.get_children().count() - - # use self.objects.get_or_create() instead - @classmethod - def add_root(self, **kwargs): - with scopes_disabled(): - return super().add_root(**kwargs) - class Meta: constraints = [ models.UniqueConstraint(fields=['space', 'name'], name='kw_unique_name_per_space') @@ -366,28 +487,75 @@ class Unit(ExportModelOperationsMixin('unit'), models.Model, PermissionModelMixi ] -class Food(ExportModelOperationsMixin('food'), models.Model, PermissionModelMixin): +class Food(ExportModelOperationsMixin('food'), TreeModel, PermissionModelMixin): + # exclude fields not implemented yet + inheritable_fields = FoodInheritField.objects.exclude(field__in=['diet', 'substitute', 'substitute_children', 'substitute_siblings']) + + # WARNING: Food inheritance relies on post_save signals, avoid using UPDATE to update Food objects unless you intend to bypass those signals + if SORT_TREE_BY_NAME: + node_order_by = ['name'] name = models.CharField(max_length=128, validators=[MinLengthValidator(1)]) recipe = models.ForeignKey('Recipe', null=True, blank=True, on_delete=models.SET_NULL) - supermarket_category = models.ForeignKey(SupermarketCategory, null=True, blank=True, on_delete=models.SET_NULL) - ignore_shopping = models.BooleanField(default=False) + supermarket_category = models.ForeignKey(SupermarketCategory, null=True, blank=True, on_delete=models.SET_NULL) # inherited field + ignore_shopping = models.BooleanField(default=False) # inherited field + onhand_users = models.ManyToManyField(User, blank=True) description = models.TextField(default='', blank=True) + inherit_fields = models.ManyToManyField(FoodInheritField, blank=True) space = models.ForeignKey(Space, on_delete=models.CASCADE) - objects = ScopedManager(space='space') + objects = ScopedManager(space='space', _manager_class=TreeManager) def __str__(self): return self.name + def delete(self): + if self.ingredient_set.all().exclude(step=None).count() > 0: + raise ProtectedError(self.name + _(" is part of a recipe step and cannot be deleted"), self.ingredient_set.all().exclude(step=None)) + else: + return super().delete() + + @staticmethod + def reset_inheritance(space=None): + # resets inherited fields to the space defaults and updates all inherited fields to root object values + inherit = space.food_inherit.all() + + # remove all inherited fields from food + Through = Food.objects.filter(space=space).first().inherit_fields.through + Through.objects.all().delete() + # food is going to inherit attributes + if space.food_inherit.all().count() > 0: + # ManyToMany cannot be updated through an UPDATE operation + for i in inherit: + Through.objects.bulk_create([ + Through(food_id=x, foodinheritfield_id=i.id) + for x in Food.objects.filter(space=space).values_list('id', flat=True) + ]) + + inherit = inherit.values_list('field', flat=True) + if 'ignore_shopping' in inherit: + # get food at root that have children that need updated + Food.include_descendants(queryset=Food.objects.filter(depth=1, numchild__gt=0, space=space, ignore_shopping=True)).update(ignore_shopping=True) + Food.include_descendants(queryset=Food.objects.filter(depth=1, numchild__gt=0, space=space, ignore_shopping=False)).update(ignore_shopping=False) + if 'supermarket_category' in inherit: + # when supermarket_category is null or blank assuming it is not set and not intended to be blank for all descedants + # find top node that has category set + category_roots = Food.exclude_descendants(queryset=Food.objects.filter(supermarket_category__isnull=False, numchild__gt=0, space=space)) + for root in category_roots: + root.get_descendants().update(supermarket_category=root.supermarket_category) + class Meta: constraints = [ models.UniqueConstraint(fields=['space', 'name'], name='f_unique_name_per_space') ] - indexes = (Index(fields=['id', 'name']),) + indexes = ( + Index(fields=['id']), + Index(fields=['name']), + ) class Ingredient(ExportModelOperationsMixin('ingredient'), models.Model, PermissionModelMixin): - food = models.ForeignKey(Food, on_delete=models.PROTECT, null=True, blank=True) + # a pre-delete signal on Food checks if the Ingredient is part of a Step, if it is raises a ProtectedError instead of cascading the delete + food = models.ForeignKey(Food, on_delete=models.CASCADE, null=True, blank=True) unit = models.ForeignKey(Unit, on_delete=models.PROTECT, null=True, blank=True) amount = models.DecimalField(default=0, decimal_places=16, max_digits=32) note = models.CharField(max_length=256, null=True, blank=True) @@ -403,21 +571,13 @@ class Ingredient(ExportModelOperationsMixin('ingredient'), models.Model, Permiss class Meta: ordering = ['order', 'pk'] - indexes = (Index(fields=['id', 'food', 'unit']),) + indexes = ( + Index(fields=['id']), + ) class Step(ExportModelOperationsMixin('step'), models.Model, PermissionModelMixin): - TEXT = 'TEXT' - TIME = 'TIME' - FILE = 'FILE' - RECIPE = 'RECIPE' - name = models.CharField(max_length=128, default='', blank=True) - type = models.CharField( - choices=((TEXT, _('Text')), (TIME, _('Time')), (FILE, _('File')), (RECIPE, _('Recipe')),), - default=TEXT, - max_length=16 - ) instruction = models.TextField(blank=True) ingredients = models.ManyToManyField(Ingredient, blank=True) time = models.IntegerField(default=0, blank=True) @@ -434,6 +594,9 @@ class Step(ExportModelOperationsMixin('step'), models.Model, PermissionModelMixi from cookbook.helper.template_helper import render_instructions return render_instructions(self) + def __str__(self): + return f'{self.pk} {self.name}' + class Meta: ordering = ['order', 'pk'] indexes = (GinIndex(fields=["search_vector"]),) @@ -446,9 +609,7 @@ class NutritionInformation(models.Model, PermissionModelMixin): ) proteins = models.DecimalField(default=0, decimal_places=16, max_digits=32) calories = models.DecimalField(default=0, decimal_places=16, max_digits=32) - source = models.CharField( - max_length=512, default="", null=True, blank=True - ) + source = models.CharField(max_length=512, default="", null=True, blank=True) space = models.ForeignKey(Space, on_delete=models.CASCADE) objects = ScopedManager(space='space') @@ -457,6 +618,15 @@ class NutritionInformation(models.Model, PermissionModelMixin): return f'Nutrition {self.pk}' +# class NutritionType(models.Model, PermissionModelMixin): +# name = models.CharField(max_length=128) +# icon = models.CharField(max_length=16, blank=True, null=True) +# description = models.CharField(max_length=512, blank=True, null=True) +# +# space = models.ForeignKey(Space, on_delete=models.CASCADE) +# objects = ScopedManager(space='space') + + class Recipe(ExportModelOperationsMixin('recipe'), models.Model, PermissionModelMixin): name = models.CharField(max_length=128) description = models.CharField(max_length=512, blank=True, null=True) @@ -491,8 +661,28 @@ class Recipe(ExportModelOperationsMixin('recipe'), models.Model, PermissionModel def __str__(self): return self.name + def get_related_recipes(self, levels=1): + # recipes for step recipe + step_recipes = Q(id__in=self.steps.exclude(step_recipe=None).values_list('step_recipe')) + # recipes for foods + food_recipes = Q(id__in=Food.objects.filter(ingredient__step__recipe=self).exclude(recipe=None).values_list('recipe')) + related_recipes = Recipe.objects.filter(step_recipes | food_recipes) + if levels == 1: + return related_recipes + + # this can loop over multiple levels if you update the value of related_recipes at each step (maybe an array?) + # for now keeping it at 2 levels max, should be sufficient in 99.9% of scenarios + sub_step_recipes = Q(id__in=Step.objects.filter(recipe__in=related_recipes.values_list('steps')).exclude(step_recipe=None).values_list('step_recipe')) + sub_food_recipes = Q(id__in=Food.objects.filter(ingredient__step__recipe__in=related_recipes).exclude(recipe=None).values_list('recipe')) + return Recipe.objects.filter(Q(id__in=related_recipes.values_list('id')) | sub_step_recipes | sub_food_recipes) + class Meta(): - indexes = (GinIndex(fields=["name_search_vector", "desc_search_vector"]), Index(fields=['id', 'name', 'description']),) + indexes = ( + GinIndex(fields=["name_search_vector"]), + GinIndex(fields=["desc_search_vector"]), + Index(fields=['id']), + Index(fields=['name']), + ) class Comment(ExportModelOperationsMixin('comment'), models.Model, PermissionModelMixin): @@ -543,7 +733,7 @@ class RecipeBook(ExportModelOperationsMixin('book'), models.Model, PermissionMod return self.name class Meta(): - indexes = (Index(fields=['name', 'description']),) + indexes = (Index(fields=['name']),) class RecipeBookEntry(ExportModelOperationsMixin('book_entry'), models.Model, PermissionModelMixin): @@ -574,6 +764,9 @@ class RecipeBookEntry(ExportModelOperationsMixin('book_entry'), models.Model, Pe class MealType(models.Model, PermissionModelMixin): name = models.CharField(max_length=128) order = models.IntegerField(default=0) + icon = models.CharField(max_length=16, blank=True, null=True) + color = models.CharField(max_length=7, blank=True, null=True) + default = models.BooleanField(default=False, blank=True) created_by = models.ForeignKey(User, on_delete=models.CASCADE) space = models.ForeignKey(Space, on_delete=models.CASCADE) @@ -609,8 +802,10 @@ class MealPlan(ExportModelOperationsMixin('meal_plan'), models.Model, Permission class ShoppingListRecipe(ExportModelOperationsMixin('shopping_list_recipe'), models.Model, PermissionModelMixin): - recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE, null=True, blank=True) + name = models.CharField(max_length=32, blank=True, default='') + recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE, null=True, blank=True) # TODO make required after old shoppinglist deprecated servings = models.DecimalField(default=1, max_digits=8, decimal_places=4) + mealplan = models.ForeignKey(MealPlan, on_delete=models.CASCADE, null=True, blank=True) objects = ScopedManager(space='recipe__space') @@ -626,20 +821,26 @@ class ShoppingListRecipe(ExportModelOperationsMixin('shopping_list_recipe'), mod def get_owner(self): try: - return self.shoppinglist_set.first().created_by + return getattr(self.entries.first(), 'created_by', None) or getattr(self.shoppinglist_set.first(), 'created_by', None) except AttributeError: return None class ShoppingListEntry(ExportModelOperationsMixin('shopping_list_entry'), models.Model, PermissionModelMixin): - list_recipe = models.ForeignKey(ShoppingListRecipe, on_delete=models.CASCADE, null=True, blank=True) - food = models.ForeignKey(Food, on_delete=models.CASCADE) - unit = models.ForeignKey(Unit, on_delete=models.CASCADE, null=True, blank=True) + list_recipe = models.ForeignKey(ShoppingListRecipe, on_delete=models.CASCADE, null=True, blank=True, related_name='entries') + food = models.ForeignKey(Food, on_delete=models.CASCADE, related_name='shopping_entries') + unit = models.ForeignKey(Unit, on_delete=models.SET_NULL, null=True, blank=True) + ingredient = models.ForeignKey(Ingredient, on_delete=models.CASCADE, null=True, blank=True) amount = models.DecimalField(default=0, decimal_places=16, max_digits=32) order = models.IntegerField(default=0) checked = models.BooleanField(default=False) + created_by = models.ForeignKey(User, on_delete=models.CASCADE) + created_at = models.DateTimeField(auto_now_add=True) + completed_at = models.DateTimeField(null=True, blank=True) + delay_until = models.DateTimeField(null=True, blank=True) - objects = ScopedManager(space='shoppinglist__space') + space = models.ForeignKey(Space, on_delete=models.CASCADE) + objects = ScopedManager(space='space') @staticmethod def get_space_key(): @@ -652,11 +853,14 @@ class ShoppingListEntry(ExportModelOperationsMixin('shopping_list_entry'), model return f'Shopping list entry {self.id}' def get_shared(self): - return self.shoppinglist_set.first().shared.all() + try: + return self.shoppinglist_set.first().shared.all() + except AttributeError: + return self.created_by.userpreference.shopping_share.all() def get_owner(self): try: - return self.shoppinglist_set.first().created_by + return self.created_by or self.shoppinglist_set.first().created_by except AttributeError: return None @@ -678,6 +882,12 @@ class ShoppingList(ExportModelOperationsMixin('shopping_list'), models.Model, Pe def __str__(self): return f'Shopping list {self.id}' + def get_shared(self): + try: + return self.shared.all() or self.created_by.userpreference.shopping_share.all() + except AttributeError: + return [] + class ShareLink(ExportModelOperationsMixin('share_link'), models.Model, PermissionModelMixin): recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE) @@ -744,7 +954,14 @@ class CookLog(ExportModelOperationsMixin('cook_log'), models.Model, PermissionMo return self.recipe.name class Meta(): - indexes = (Index(fields=['id', 'recipe', '-created_at', 'rating', 'created_by']),) + indexes = ( + Index(fields=['id']), + Index(fields=['recipe']), + Index(fields=['-created_at']), + Index(fields=['rating']), + Index(fields=['created_by']), + Index(fields=['created_by', 'rating']), + ) class ViewLog(ExportModelOperationsMixin('view_log'), models.Model, PermissionModelMixin): @@ -759,7 +976,12 @@ class ViewLog(ExportModelOperationsMixin('view_log'), models.Model, PermissionMo return self.recipe.name class Meta(): - indexes = (Index(fields=['recipe', '-created_at', 'created_by']),) + indexes = ( + Index(fields=['recipe']), + Index(fields=['-created_at']), + Index(fields=['created_by']), + Index(fields=['recipe', '-created_at', 'created_by']), + ) class ImportLog(models.Model, PermissionModelMixin): @@ -780,6 +1002,25 @@ class ImportLog(models.Model, PermissionModelMixin): def __str__(self): return f"{self.created_at}:{self.type}" +class ExportLog(models.Model, PermissionModelMixin): + type = models.CharField(max_length=32) + running = models.BooleanField(default=True) + msg = models.TextField(default="") + + total_recipes = models.IntegerField(default=0) + exported_recipes = models.IntegerField(default=0) + cache_duration = models.IntegerField(default=0) + possibly_not_expired = models.BooleanField(default=True) + + created_at = models.DateTimeField(auto_now_add=True) + created_by = models.ForeignKey(User, on_delete=models.CASCADE) + + objects = ScopedManager(space='space') + space = models.ForeignKey(Space, on_delete=models.CASCADE) + + def __str__(self): + return f"{self.created_at}:{self.type}" + class BookmarkletImport(ExportModelOperationsMixin('bookmarklet_import'), models.Model, PermissionModelMixin): html = models.TextField() @@ -806,7 +1047,7 @@ class SearchFields(models.Model, PermissionModelMixin): def allSearchFields(): - return SearchFields.objects.values_list('id') + return list(SearchFields.objects.values_list('id', flat=True)) def nameSearchField(): @@ -834,8 +1075,9 @@ class SearchPreference(models.Model, PermissionModelMixin): unaccent = models.ManyToManyField(SearchFields, related_name="unaccent_fields", blank=True, default=allSearchFields) icontains = models.ManyToManyField(SearchFields, related_name="icontains_fields", blank=True, default=nameSearchField) istartswith = models.ManyToManyField(SearchFields, related_name="istartswith_fields", blank=True) - trigram = models.ManyToManyField(SearchFields, related_name="trigram_fields", blank=True) + trigram = models.ManyToManyField(SearchFields, related_name="trigram_fields", blank=True, default=nameSearchField) fulltext = models.ManyToManyField(SearchFields, related_name="fulltext_fields", blank=True) + trigram_threshold = models.DecimalField(default=0.1, decimal_places=2, max_digits=3) class UserFile(ExportModelOperationsMixin('user_files'), models.Model, PermissionModelMixin): @@ -853,3 +1095,27 @@ class UserFile(ExportModelOperationsMixin('user_files'), models.Model, Permissio self.file.name = f'{uuid.uuid4()}' + pathlib.Path(self.file.name).suffix self.file_size_kb = round(self.file.size / 1000) super(UserFile, self).save(*args, **kwargs) + + +class Automation(ExportModelOperationsMixin('automations'), models.Model, PermissionModelMixin): + FOOD_ALIAS = 'FOOD_ALIAS' + UNIT_ALIAS = 'UNIT_ALIAS' + KEYWORD_ALIAS = 'KEYWORD_ALIAS' + + type = models.CharField(max_length=128, + choices=((FOOD_ALIAS, _('Food Alias')), (UNIT_ALIAS, _('Unit Alias')), (KEYWORD_ALIAS, _('Keyword Alias')),)) + name = models.CharField(max_length=128, default='') + description = models.TextField(blank=True, null=True) + + param_1 = models.CharField(max_length=128, blank=True, null=True) + param_2 = models.CharField(max_length=128, blank=True, null=True) + param_3 = models.CharField(max_length=128, blank=True, null=True) + + disabled = models.BooleanField(default=False) + + updated_at = models.DateTimeField(auto_now=True) + created_at = models.DateTimeField(auto_now_add=True) + created_by = models.ForeignKey(User, on_delete=models.CASCADE) + + objects = ScopedManager(space='space') + space = models.ForeignKey(Space, on_delete=models.CASCADE) diff --git a/cookbook/provider/nextcloud.py b/cookbook/provider/nextcloud.py index d67c0244..b1d31919 100644 --- a/cookbook/provider/nextcloud.py +++ b/cookbook/provider/nextcloud.py @@ -29,7 +29,11 @@ class Nextcloud(Provider): client = Nextcloud.get_client(monitor.storage) files = client.list(monitor.path) - files.pop(0) # remove first element because its the folder itself + + try: + files.pop(0) # remove first element because its the folder itself + except IndexError: + pass # folder is empty, no recipes will be imported import_count = 0 for file in files: diff --git a/cookbook/schemas.py b/cookbook/schemas.py index 6f5dab70..36ce6655 100644 --- a/cookbook/schemas.py +++ b/cookbook/schemas.py @@ -2,68 +2,33 @@ from rest_framework.schemas.openapi import AutoSchema from rest_framework.schemas.utils import is_list_view -# TODO move to separate class to cleanup -class RecipeSchema(AutoSchema): +class QueryParam(object): + def __init__(self, name, description=None, qtype='string', required=False): + self.name = name + self.description = description + self.qtype = qtype + self.required = required + + def __str__(self): + return f'{self.name}, {self.qtype}, {self.description}' + + +class QueryParamAutoSchema(AutoSchema): def get_path_parameters(self, path, method): if not is_list_view(path, method, self.view): - return super(RecipeSchema, self).get_path_parameters(path, method) - + return super().get_path_parameters(path, method) parameters = super().get_path_parameters(path, method) - parameters.append({ - "name": 'query', "in": "query", "required": False, - "description": 'Query string matched (fuzzy) against recipe name. In the future also fulltext search.', - 'schema': {'type': 'string', }, - }) - parameters.append({ - "name": 'keywords', "in": "query", "required": False, - "description": 'Id of keyword a recipe should have. For multiple repeat parameter.', - 'schema': {'type': 'string', }, - }) - parameters.append({ - "name": 'foods', "in": "query", "required": False, - "description": 'Id of food a recipe should have. For multiple repeat parameter.', - 'schema': {'type': 'string', }, - }) - parameters.append({ - "name": 'books', "in": "query", "required": False, - "description": 'Id of book a recipe should have. For multiple repeat parameter.', - 'schema': {'type': 'string', }, - }) - parameters.append({ - "name": 'keywords_or', "in": "query", "required": False, - "description": 'If recipe should have all (AND) or any (OR) of the provided keywords.', - 'schema': {'type': 'string', }, - }) - parameters.append({ - "name": 'foods_or', "in": "query", "required": False, - "description": 'If recipe should have all (AND) or any (OR) any of the provided foods.', - 'schema': {'type': 'string', }, - }) - parameters.append({ - "name": 'books_or', "in": "query", "required": False, - "description": 'If recipe should be in all (AND) or any (OR) any of the provided books.', - 'schema': {'type': 'string', }, - }) - parameters.append({ - "name": 'internal', "in": "query", "required": False, - "description": 'true or false. If only internal recipes should be returned or not.', - 'schema': {'type': 'string', }, - }) - parameters.append({ - "name": 'random', "in": "query", "required": False, - "description": 'true or false. returns the results in randomized order.', - 'schema': {'type': 'string', }, - }) - parameters.append({ - "name": 'new', "in": "query", "required": False, - "description": 'true or false. returns new results first in search results', - 'schema': {'type': 'string', }, - }) + for q in self.view.query_params: + parameters.append({ + "name": q.name, "in": "query", "required": q.required, + "description": q.description, + 'schema': {'type': q.qtype, }, + }) + return parameters class TreeSchema(AutoSchema): - def get_path_parameters(self, path, method): if not is_list_view(path, method, self.view): return super(TreeSchema, self).get_path_parameters(path, method) @@ -77,7 +42,8 @@ class TreeSchema(AutoSchema): }) parameters.append({ "name": 'root', "in": "query", "required": False, - "description": 'Return first level children of {obj} with ID [int]. Integer 0 will return root {obj}s.'.format(obj=api_name), + "description": 'Return first level children of {obj} with ID [int]. Integer 0 will return root {obj}s.'.format( + obj=api_name), 'schema': {'type': 'int', }, }) parameters.append({ @@ -85,5 +51,33 @@ class TreeSchema(AutoSchema): "description": 'Return all self and children of {} with ID [int].'.format(api_name), 'schema': {'type': 'int', }, }) - return parameters + + +class FilterSchema(AutoSchema): + def get_path_parameters(self, path, method): + if not is_list_view(path, method, self.view): + return super(FilterSchema, self).get_path_parameters(path, method) + + api_name = path.split('/')[2] + parameters = super().get_path_parameters(path, method) + parameters.append({ + "name": 'query', "in": "query", "required": False, + "description": 'Query string matched against {} name.'.format(api_name), + 'schema': {'type': 'string', }, + }) + return parameters + + +# class QueryOnlySchema(AutoSchema): +# def get_path_parameters(self, path, method): +# if not is_list_view(path, method, self.view): +# return super(QueryOnlySchema, self).get_path_parameters(path, method) + +# parameters = super().get_path_parameters(path, method) +# parameters.append({ +# "name": 'query', "in": "query", "required": False, +# "description": 'Query string matched (fuzzy) against object name.', +# 'schema': {'type': 'string', }, +# }) +# return parameters diff --git a/cookbook/serializer.py b/cookbook/serializer.py index b4bea6cd..0f9563f5 100644 --- a/cookbook/serializer.py +++ b/cookbook/serializer.py @@ -2,22 +2,61 @@ import random from datetime import timedelta from decimal import Decimal from gettext import gettext as _ -from django.contrib.auth.models import User -from django.db.models import QuerySet, Sum, Avg -from django.utils import timezone -from drf_writable_nested import (UniqueFieldsMixin, - WritableNestedModelSerializer) -from rest_framework import serializers -from rest_framework.exceptions import ValidationError, NotFound -from cookbook.models import (Comment, CookLog, Food, Ingredient, Keyword, - MealPlan, MealType, NutritionInformation, Recipe, - RecipeBook, RecipeBookEntry, RecipeImport, - ShareLink, ShoppingList, ShoppingListEntry, - ShoppingListRecipe, Step, Storage, Sync, SyncLog, - Unit, UserPreference, ViewLog, SupermarketCategory, Supermarket, - SupermarketCategoryRelation, ImportLog, BookmarkletImport, UserFile) +from django.contrib.auth.models import User +from django.db.models import Avg, QuerySet, Sum +from django.urls import reverse +from django.utils import timezone +from drf_writable_nested import UniqueFieldsMixin, WritableNestedModelSerializer +from rest_framework import serializers +from rest_framework.exceptions import NotFound, ValidationError +from rest_framework.fields import empty + +from cookbook.helper.HelperFunctions import str2bool +from cookbook.helper.shopping_helper import RecipeShoppingEditor +from cookbook.models import (Automation, BookmarkletImport, Comment, CookLog, ExportLog, Food, + FoodInheritField, ImportLog, Ingredient, Keyword, MealPlan, MealType, + NutritionInformation, Recipe, RecipeBook, RecipeBookEntry, + RecipeImport, ShareLink, ShoppingList, ShoppingListEntry, + ShoppingListRecipe, Step, Storage, Supermarket, SupermarketCategory, + SupermarketCategoryRelation, Sync, SyncLog, Unit, UserFile, + UserPreference, ViewLog) from cookbook.templatetags.custom_tags import markdown +from recipes.settings import MEDIA_URL + + +class ExtendedRecipeMixin(serializers.ModelSerializer): + # adds image and recipe count to serializer when query param extended=1 + # ORM path to this object from Recipe + recipe_filter = None + # list of ORM paths to any image + images = None + + image = serializers.SerializerMethodField('get_image') + numrecipe = serializers.ReadOnlyField(source='recipe_count') + + def get_fields(self, *args, **kwargs): + fields = super().get_fields(*args, **kwargs) + try: + api_serializer = self.context['view'].serializer_class + except KeyError: + api_serializer = None + # extended values are computationally expensive and not needed in normal circumstances + try: + if str2bool(self.context['request'].query_params.get('extended', False)) and self.__class__ == api_serializer: + return fields + except (AttributeError, KeyError) as e: + pass + try: + del fields['image'] + del fields['numrecipe'] + except KeyError: + pass + return fields + + def get_image(self, obj): + if obj.recipe_image: + return MEDIA_URL + obj.recipe_image class CustomDecimalField(serializers.Field): @@ -27,10 +66,9 @@ class CustomDecimalField(serializers.Field): """ def to_representation(self, value): - if isinstance(value, Decimal): - return value.normalize() - else: - return Decimal(value).normalize() + if not isinstance(value, Decimal): + value = Decimal(value) + return round(value, 2).normalize() def to_internal_value(self, data): if type(data) == int or type(data) == float: @@ -44,9 +82,30 @@ class CustomDecimalField(serializers.Field): raise ValidationError('A valid number is required') +class CustomOnHandField(serializers.Field): + def get_attribute(self, instance): + return instance + + def to_representation(self, obj): + shared_users = None + if request := self.context.get('request', None): + shared_users = getattr(request, '_shared_users', None) + if shared_users is None: + try: + shared_users = [x.id for x in list(self.context['request'].user.get_shopping_share())] + [self.context['request'].user.id] + except AttributeError: # Anonymous users (using share links) don't have shared users + shared_users = [] + return obj.onhand_users.filter(id__in=shared_users).exists() + + def to_internal_value(self, data): + return data + + class SpaceFilterSerializer(serializers.ListSerializer): def to_representation(self, data): + if self.context.get('request', None) is None: + return if (type(data) == QuerySet and data.query.is_sliced): # if query is sliced it came from api request not nested serializer return super().to_representation(data) @@ -63,7 +122,7 @@ class SpacedModelSerializer(serializers.ModelSerializer): return super().create(validated_data) -class MealTypeSerializer(SpacedModelSerializer): +class MealTypeSerializer(SpacedModelSerializer, WritableNestedModelSerializer): def create(self, validated_data): validated_data['created_by'] = self.context['request'].user @@ -72,7 +131,7 @@ class MealTypeSerializer(SpacedModelSerializer): class Meta: list_serializer_class = SpaceFilterSerializer model = MealType - fields = ('id', 'name', 'order', 'created_by') + fields = ('id', 'name', 'order', 'icon', 'color', 'default', 'created_by') read_only_fields = ('created_by',) @@ -88,38 +147,68 @@ class UserNameSerializer(WritableNestedModelSerializer): fields = ('id', 'username') -class UserPreferenceSerializer(serializers.ModelSerializer): +class FoodInheritFieldSerializer(WritableNestedModelSerializer): + name = serializers.CharField(allow_null=True, allow_blank=True, required=False) + field = serializers.CharField(allow_null=True, allow_blank=True, required=False) def create(self, validated_data): - if validated_data['user'] != self.context['request'].user: + # don't allow writing to FoodInheritField via API + return FoodInheritField.objects.get(**validated_data) + + def update(self, instance, validated_data): + # don't allow writing to FoodInheritField via API + return FoodInheritField.objects.get(**validated_data) + + class Meta: + model = FoodInheritField + fields = ('id', 'name', 'field',) + read_only_fields = ['id'] + + +class UserPreferenceSerializer(WritableNestedModelSerializer): + food_inherit_default = FoodInheritFieldSerializer(source='space.food_inherit', many=True, allow_null=True, required=False, read_only=True) + plan_share = UserNameSerializer(many=True, allow_null=True, required=False, read_only=True) + shopping_share = UserNameSerializer(many=True, allow_null=True, required=False) + food_children_exist = serializers.SerializerMethodField('get_food_children_exist') + + def get_food_children_exist(self, obj): + space = getattr(self.context.get('request', None), 'space', None) + return Food.objects.filter(depth__gt=0, space=space).exists() + + def create(self, validated_data): + if not validated_data.get('user', None): + raise ValidationError(_('A user is required')) + if (validated_data['user'] != self.context['request'].user): raise NotFound() return super().create(validated_data) class Meta: model = UserPreference fields = ( - 'user', 'theme', 'nav_color', 'default_unit', 'default_page', - 'search_style', 'show_recent', 'plan_share', 'ingredient_decimals', - 'comments' + 'user', 'theme', 'nav_color', 'default_unit', 'default_page', 'use_fractions', 'use_kj', 'search_style', 'show_recent', 'plan_share', + 'ingredient_decimals', 'comments', 'shopping_auto_sync', 'mealplan_autoadd_shopping', 'food_inherit_default', 'default_delay', + 'mealplan_autoinclude_related', 'mealplan_autoexclude_onhand', 'shopping_share', 'shopping_recent_days', 'csv_delim', 'csv_prefix', + 'filter_to_supermarket', 'shopping_add_onhand', 'left_handed', 'food_children_exist' ) class UserFileSerializer(serializers.ModelSerializer): def check_file_limit(self, validated_data): - if self.context['request'].space.max_file_storage_mb == -1: - raise ValidationError(_('File uploads are not enabled for this Space.')) + if 'file' in validated_data: + if self.context['request'].space.max_file_storage_mb == -1: + raise ValidationError(_('File uploads are not enabled for this Space.')) - try: - current_file_size_mb = \ - UserFile.objects.filter(space=self.context['request'].space).aggregate(Sum('file_size_kb'))[ - 'file_size_kb__sum'] / 1000 - except TypeError: - current_file_size_mb = 0 + try: + current_file_size_mb = \ + UserFile.objects.filter(space=self.context['request'].space).aggregate(Sum('file_size_kb'))[ + 'file_size_kb__sum'] / 1000 + except TypeError: + current_file_size_mb = 0 - if (validated_data['file'].size / 1000 / 1000 + current_file_size_mb - 5) > self.context[ - 'request'].space.max_file_storage_mb != 0: - raise ValidationError(_('You have reached your file upload limit.')) + if ((validated_data['file'].size / 1000 / 1000 + current_file_size_mb - 5) + > self.context['request'].space.max_file_storage_mb != 0): + raise ValidationError(_('You have reached your file upload limit.')) def create(self, validated_data): self.check_file_limit(validated_data) @@ -203,27 +292,13 @@ class KeywordLabelSerializer(serializers.ModelSerializer): read_only_fields = ('id', 'label') -class KeywordSerializer(UniqueFieldsMixin, serializers.ModelSerializer): +class KeywordSerializer(UniqueFieldsMixin, ExtendedRecipeMixin): label = serializers.SerializerMethodField('get_label') - image = serializers.SerializerMethodField('get_image') - numrecipe = serializers.SerializerMethodField('count_recipes') + recipe_filter = 'keywords' def get_label(self, obj): return str(obj) - def get_image(self, obj): - recipes = obj.recipe_set.all().filter(space=obj.space).exclude(image__isnull=True).exclude(image__exact='') - if len(recipes) == 0: - recipes = Recipe.objects.filter(keywords__in=obj.get_tree(), space=obj.space).exclude( - image__isnull=True).exclude(image__exact='') # if no recipes found - check whole tree - if len(recipes) != 0: - return random.choice(recipes).image.url - else: - return None - - def count_recipes(self, obj): - return obj.recipe_set.filter(space=self.context['request'].space).all().count() - def create(self, validated_data): # since multi select tags dont have id's # duplicate names might be routed to create @@ -233,19 +308,20 @@ class KeywordSerializer(UniqueFieldsMixin, serializers.ModelSerializer): return obj class Meta: - # list_serializer_class = SpaceFilterSerializer model = Keyword fields = ( 'id', 'name', 'icon', 'label', 'description', 'image', 'parent', 'numchild', 'numrecipe', 'created_at', - 'updated_at') - read_only_fields = ('id', 'numchild', 'parent', 'image') + 'updated_at', 'full_name') + read_only_fields = ('id', 'label', 'numchild', 'parent', 'image') -class UnitSerializer(UniqueFieldsMixin, serializers.ModelSerializer): +class UnitSerializer(UniqueFieldsMixin, ExtendedRecipeMixin): + recipe_filter = 'steps__ingredients__unit' def create(self, validated_data): - obj, created = Unit.objects.get_or_create(name=validated_data['name'].strip(), - space=self.context['request'].space) + validated_data['name'] = validated_data['name'].strip() + validated_data['space'] = self.context['request'].space + obj, created = Unit.objects.get_or_create(**validated_data) return obj def update(self, instance, validated_data): @@ -254,15 +330,16 @@ class UnitSerializer(UniqueFieldsMixin, serializers.ModelSerializer): class Meta: model = Unit - fields = ('id', 'name', 'description') - read_only_fields = ('id',) + fields = ('id', 'name', 'description', 'numrecipe', 'image') + read_only_fields = ('id', 'numrecipe', 'image') class SupermarketCategorySerializer(UniqueFieldsMixin, WritableNestedModelSerializer): def create(self, validated_data): - obj, created = SupermarketCategory.objects.get_or_create(name=validated_data['name'], - space=self.context['request'].space) + validated_data['name'] = validated_data['name'].strip() + validated_data['space'] = self.context['request'].space + obj, created = SupermarketCategory.objects.get_or_create(**validated_data) return obj def update(self, instance, validated_data): @@ -270,7 +347,7 @@ class SupermarketCategorySerializer(UniqueFieldsMixin, WritableNestedModelSerial class Meta: model = SupermarketCategory - fields = ('id', 'name') + fields = ('id', 'name', 'description') class SupermarketCategoryRelationSerializer(WritableNestedModelSerializer): @@ -286,29 +363,80 @@ class SupermarketSerializer(UniqueFieldsMixin, SpacedModelSerializer): class Meta: model = Supermarket - fields = ('id', 'name', 'category_to_supermarket') + fields = ('id', 'name', 'description', 'category_to_supermarket') -class FoodSerializer(UniqueFieldsMixin, WritableNestedModelSerializer): +class RecipeSimpleSerializer(serializers.ModelSerializer): + url = serializers.SerializerMethodField('get_url') + + def get_url(self, obj): + return reverse('view_recipe', args=[obj.id]) + + class Meta: + model = Recipe + fields = ('id', 'name', 'url') + read_only_fields = ['id', 'name', 'url'] + + +class FoodSerializer(UniqueFieldsMixin, WritableNestedModelSerializer, ExtendedRecipeMixin): supermarket_category = SupermarketCategorySerializer(allow_null=True, required=False) + recipe = RecipeSimpleSerializer(allow_null=True, required=False) + # shopping = serializers.SerializerMethodField('get_shopping_status') + shopping = serializers.ReadOnlyField(source='shopping_status') + inherit_fields = FoodInheritFieldSerializer(many=True, allow_null=True, required=False) + food_onhand = CustomOnHandField(required=False, allow_null=True) + + recipe_filter = 'steps__ingredients__food' + images = ['recipe__image'] + + # def get_shopping_status(self, obj): + # return ShoppingListEntry.objects.filter(space=obj.space, food=obj, checked=False).count() > 0 def create(self, validated_data): validated_data['name'] = validated_data['name'].strip() validated_data['space'] = self.context['request'].space - supermarket = validated_data.pop('supermarket_category') + # 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']: + validated_data['supermarket_category'], sc_created = SupermarketCategory.objects.get_or_create( + name=validated_data.pop('supermarket_category')['name'], + space=self.context['request'].space) + onhand = validated_data.pop('food_onhand', None) + + # assuming if on hand for user also onhand for shopping_share users + if not onhand is None: + shared_users = [user := self.context['request'].user] + list(user.userpreference.shopping_share.all()) + if self.instance: + onhand_users = self.instance.onhand_users.all() + else: + onhand_users = [] + if onhand: + validated_data['onhand_users'] = list(onhand_users) + shared_users + else: + validated_data['onhand_users'] = list(set(onhand_users) - set(shared_users)) + obj, created = Food.objects.get_or_create(**validated_data) - if supermarket: - obj.supermarket_category, created = SupermarketCategory.objects.get_or_create(name=supermarket['name'], space=self.context['request'].space) - obj.save() return obj def update(self, instance, validated_data): - validated_data['name'] = validated_data['name'].strip() + if name := validated_data.get('name', None): + validated_data['name'] = name.strip() + # assuming if on hand for user also onhand for shopping_share users + onhand = validated_data.get('food_onhand', None) + if not onhand is None: + shared_users = [user := self.context['request'].user] + list(user.userpreference.shopping_share.all()) + if onhand: + validated_data['onhand_users'] = list(self.instance.onhand_users.all()) + shared_users + else: + validated_data['onhand_users'] = list(set(self.instance.onhand_users.all()) - set(shared_users)) return super(FoodSerializer, self).update(instance, validated_data) class Meta: model = Food - fields = ('id', 'name', 'recipe', 'ignore_shopping', 'supermarket_category') + fields = ( + 'id', 'name', 'description', 'shopping', 'recipe', 'food_onhand', 'supermarket_category', + 'image', 'parent', 'numchild', 'numrecipe', 'inherit_fields', 'full_name', 'ignore_shopping' + ) + read_only_fields = ('id', 'numchild', 'parent', 'image', 'numrecipe') class IngredientSerializer(WritableNestedModelSerializer): @@ -328,12 +456,13 @@ class IngredientSerializer(WritableNestedModelSerializer): ) -class StepSerializer(WritableNestedModelSerializer): +class StepSerializer(WritableNestedModelSerializer, ExtendedRecipeMixin): ingredients = IngredientSerializer(many=True) ingredients_markdown = serializers.SerializerMethodField('get_ingredients_markdown') ingredients_vue = serializers.SerializerMethodField('get_ingredients_vue') file = UserFileViewSerializer(allow_null=True, required=False) step_recipe_data = serializers.SerializerMethodField('get_step_recipe_data') + recipe_filter = 'steps' def create(self, validated_data): validated_data['space'] = self.context['request'].space @@ -345,17 +474,20 @@ class StepSerializer(WritableNestedModelSerializer): def get_ingredients_markdown(self, obj): return obj.get_instruction_render() + def get_step_recipes(self, obj): + return list(obj.recipe_set.values_list('id', flat=True).all()) + def get_step_recipe_data(self, obj): # check if root type is recipe to prevent infinite recursion # can be improved later to allow multi level embedding if obj.step_recipe and type(self.parent.root) == RecipeSerializer: - return StepRecipeSerializer(obj.step_recipe).data + return StepRecipeSerializer(obj.step_recipe, context={'request': self.context['request']}).data class Meta: model = Step fields = ( - 'id', 'name', 'type', 'instruction', 'ingredients', 'ingredients_markdown', - 'ingredients_vue', 'time', 'order', 'show_as_header', 'file', 'step_recipe', 'step_recipe_data' + 'id', 'name', 'instruction', 'ingredients', 'ingredients_markdown', + 'ingredients_vue', 'time', 'order', 'show_as_header', 'file', 'step_recipe', 'step_recipe_data', 'numrecipe' ) @@ -370,6 +502,10 @@ class StepRecipeSerializer(WritableNestedModelSerializer): class NutritionInformationSerializer(serializers.ModelSerializer): + carbohydrates = CustomDecimalField() + fats = CustomDecimalField() + proteins = CustomDecimalField() + calories = CustomDecimalField() def create(self, validated_data): validated_data['space'] = self.context['request'].space @@ -393,7 +529,7 @@ class RecipeBaseSerializer(WritableNestedModelSerializer): def get_recipe_last_cooked(self, obj): try: - last = obj.cooklog_set.filter(created_by=self.context['request'].user).last() + last = obj.cooklog_set.filter(created_by=self.context['request'].user).order_by('created_at').last() if last: return last.created_at except TypeError: @@ -402,7 +538,7 @@ class RecipeBaseSerializer(WritableNestedModelSerializer): # TODO make days of new recipe a setting def is_recipe_new(self, obj): - if obj.created_at > (timezone.now() - timedelta(days=7)): + if getattr(obj, 'new_recipe', None) or obj.created_at > (timezone.now() - timedelta(days=7)): return True else: return False @@ -413,6 +549,7 @@ class RecipeOverviewSerializer(RecipeBaseSerializer): rating = serializers.SerializerMethodField('get_recipe_rating') last_cooked = serializers.SerializerMethodField('get_recipe_last_cooked') new = serializers.SerializerMethodField('is_recipe_new') + recent = serializers.ReadOnlyField() def create(self, validated_data): pass @@ -425,7 +562,7 @@ class RecipeOverviewSerializer(RecipeBaseSerializer): fields = ( 'id', 'name', 'description', 'image', 'keywords', 'working_time', 'waiting_time', 'created_by', 'created_at', 'updated_at', - 'internal', 'servings', 'servings_text', 'rating', 'last_cooked', 'new' + 'internal', 'servings', 'servings_text', 'rating', 'last_cooked', 'new', 'recent' ) read_only_fields = ['image', 'created_by', 'created_at'] @@ -470,7 +607,8 @@ class CommentSerializer(serializers.ModelSerializer): fields = '__all__' -class RecipeBookSerializer(SpacedModelSerializer): +class RecipeBookSerializer(SpacedModelSerializer, WritableNestedModelSerializer): + shared = UserNameSerializer(many=True) def create(self, validated_data): validated_data['created_by'] = self.context['request'].user @@ -508,55 +646,137 @@ class RecipeBookEntrySerializer(serializers.ModelSerializer): class MealPlanSerializer(SpacedModelSerializer, WritableNestedModelSerializer): recipe = RecipeOverviewSerializer(required=False, allow_null=True) recipe_name = serializers.ReadOnlyField(source='recipe.name') - meal_type_name = serializers.ReadOnlyField(source='meal_type.name') + meal_type = MealTypeSerializer() + meal_type_name = serializers.ReadOnlyField(source='meal_type.name') # TODO deprecate once old meal plan was removed note_markdown = serializers.SerializerMethodField('get_note_markdown') servings = CustomDecimalField() + shared = UserNameSerializer(many=True, required=False, allow_null=True) + shopping = serializers.SerializerMethodField('in_shopping') def get_note_markdown(self, obj): return markdown(obj.note) + def in_shopping(self, obj): + return ShoppingListRecipe.objects.filter(mealplan=obj.id).exists() + def create(self, validated_data): validated_data['created_by'] = self.context['request'].user - return super().create(validated_data) + mealplan = super().create(validated_data) + if self.context['request'].data.get('addshopping', False): + SLR = RecipeShoppingEditor(user=validated_data['created_by'], space=validated_data['space']) + SLR.create(mealplan=mealplan, servings=validated_data['servings']) + return mealplan class Meta: model = MealPlan fields = ( 'id', 'title', 'recipe', 'servings', 'note', 'note_markdown', 'date', 'meal_type', 'created_by', 'shared', 'recipe_name', - 'meal_type_name' + 'meal_type_name', 'shopping' ) read_only_fields = ('created_by',) class ShoppingListRecipeSerializer(serializers.ModelSerializer): + name = serializers.SerializerMethodField('get_name') # should this be done at the front end? recipe_name = serializers.ReadOnlyField(source='recipe.name') + mealplan_note = serializers.ReadOnlyField(source='mealplan.note') servings = CustomDecimalField() + def get_name(self, obj): + if not isinstance(value := obj.servings, Decimal): + value = Decimal(value) + 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})' + + def update(self, instance, validated_data): + # TODO remove once old shopping list + if 'servings' in validated_data and self.context.get('view', None).__class__.__name__ != 'ShoppingListViewSet': + SLR = RecipeShoppingEditor(user=self.context['request'].user, space=self.context['request'].space) + SLR.edit_servings(servings=validated_data['servings'], id=instance.id) + return super().update(instance, validated_data) + class Meta: model = ShoppingListRecipe - fields = ('id', 'recipe', 'recipe_name', 'servings') + fields = ('id', 'recipe_name', 'name', 'recipe', 'mealplan', 'servings', 'mealplan_note') read_only_fields = ('id',) class ShoppingListEntrySerializer(WritableNestedModelSerializer): food = FoodSerializer(allow_null=True) unit = UnitSerializer(allow_null=True, required=False) + ingredient_note = serializers.ReadOnlyField(source='ingredient.note') + recipe_mealplan = ShoppingListRecipeSerializer(source='list_recipe', read_only=True) amount = CustomDecimalField() + created_by = UserNameSerializer(read_only=True) + completed_at = serializers.DateTimeField(allow_null=True, required=False) + + def get_fields(self, *args, **kwargs): + fields = super().get_fields(*args, **kwargs) + + # autosync values are only needed for frequent 'checked' value updating + if self.context['request'] and bool(int(self.context['request'].query_params.get('autosync', False))): + for f in list(set(fields) - set(['id', 'checked'])): + del fields[f] + return fields + + def run_validation(self, data): + if self.root.instance.__class__.__name__ == 'ShoppingListEntry': + if ( + data.get('checked', False) + and self.root.instance + and not self.root.instance.checked + ): + # if checked flips from false to true set completed datetime + data['completed_at'] = timezone.now() + + elif not data.get('checked', False): + # if not checked set completed to None + data['completed_at'] = None + else: + # otherwise don't write anything + if 'completed_at' in data: + del data['completed_at'] + + return super().run_validation(data) + + def create(self, validated_data): + validated_data['space'] = self.context['request'].space + validated_data['created_by'] = self.context['request'].user + return super().create(validated_data) + + def update(self, instance, validated_data): + user = self.context['request'].user + # update the onhand for food if shopping_add_onhand is True + if user.userpreference.shopping_add_onhand: + if checked := validated_data.get('checked', None): + instance.food.onhand_users.add(*user.userpreference.shopping_share.all(), user) + elif checked == False: + instance.food.onhand_users.remove(*user.userpreference.shopping_share.all(), user) + return super().update(instance, validated_data) class Meta: model = ShoppingListEntry fields = ( - 'id', 'list_recipe', 'food', 'unit', 'amount', 'order', 'checked' + 'id', 'list_recipe', 'food', 'unit', 'ingredient', 'ingredient_note', 'amount', 'order', 'checked', 'recipe_mealplan', + 'created_by', 'created_at', 'completed_at', 'delay_until' ) + read_only_fields = ('id', 'created_by', 'created_at',) +# TODO deprecate class ShoppingListEntryCheckedSerializer(serializers.ModelSerializer): class Meta: model = ShoppingListEntry fields = ('id', 'checked') +# TODO deprecate class ShoppingListSerializer(WritableNestedModelSerializer): recipes = ShoppingListRecipeSerializer(many=True, allow_null=True) entries = ShoppingListEntrySerializer(many=True, allow_null=True) @@ -577,6 +797,7 @@ class ShoppingListSerializer(WritableNestedModelSerializer): read_only_fields = ('id', 'created_by',) +# TODO deprecate class ShoppingListAutoSyncSerializer(WritableNestedModelSerializer): entries = ShoppingListEntryCheckedSerializer(many=True, allow_null=True) @@ -631,8 +852,35 @@ class ImportLogSerializer(serializers.ModelSerializer): read_only_fields = ('created_by',) +class ExportLogSerializer(serializers.ModelSerializer): + + def create(self, validated_data): + validated_data['created_by'] = self.context['request'].user + validated_data['space'] = self.context['request'].space + return super().create(validated_data) + + class Meta: + model = ExportLog + fields = ('id', 'type', 'msg', 'running', 'total_recipes', 'exported_recipes', 'cache_duration', 'possibly_not_expired', 'created_by', 'created_at') + read_only_fields = ('created_by',) + + +class AutomationSerializer(serializers.ModelSerializer): + + def create(self, validated_data): + validated_data['created_by'] = self.context['request'].user + validated_data['space'] = self.context['request'].space + return super().create(validated_data) + + class Meta: + model = Automation + fields = ( + 'id', 'type', 'name', 'description', 'param_1', 'param_2', 'param_3', 'disabled', 'created_by',) + read_only_fields = ('created_by',) + + # CORS, REST and Scopes aren't currently working -# Scopes are evaluating before REST has authenticated the user assiging a None space +# Scopes are evaluating before REST has authenticated the user assigning a None space # I've made the change below to fix the bookmarklet, other serializers likely need a similar/better fix class BookmarkletImportSerializer(serializers.ModelSerializer): def create(self, validated_data): @@ -677,7 +925,7 @@ class FoodExportSerializer(FoodSerializer): class Meta: model = Food - fields = ('name', 'ignore_shopping', 'supermarket_category') + fields = ('name', 'ignore_shopping', 'supermarket_category',) class IngredientExportSerializer(WritableNestedModelSerializer): @@ -703,7 +951,7 @@ class StepExportSerializer(WritableNestedModelSerializer): class Meta: model = Step - fields = ('name', 'type', 'instruction', 'ingredients', 'time', 'order', 'show_as_header') + fields = ('name', 'instruction', 'ingredients', 'time', 'order', 'show_as_header') class RecipeExportSerializer(WritableNestedModelSerializer): @@ -722,3 +970,24 @@ class RecipeExportSerializer(WritableNestedModelSerializer): validated_data['created_by'] = self.context['request'].user validated_data['space'] = self.context['request'].space return super().create(validated_data) + + +class RecipeShoppingUpdateSerializer(serializers.ModelSerializer): + list_recipe = serializers.IntegerField(write_only=True, allow_null=True, required=False, help_text=_("Existing shopping list to update")) + ingredients = serializers.IntegerField(write_only=True, allow_null=True, required=False, help_text=_( + "List of ingredient IDs from the recipe to add, if not provided all ingredients will be added.")) + servings = serializers.IntegerField(default=1, write_only=True, allow_null=True, required=False, help_text=_("Providing a list_recipe ID and servings of 0 will delete that shopping list.")) + + class Meta: + model = Recipe + fields = ['id', 'list_recipe', 'ingredients', 'servings', ] + + +class FoodShoppingUpdateSerializer(serializers.ModelSerializer): + amount = serializers.IntegerField(write_only=True, allow_null=True, required=False, help_text=_("Amount of food to add to the shopping list")) + unit = serializers.IntegerField(write_only=True, allow_null=True, required=False, help_text=_("ID of unit to use for the shopping list")) + delete = serializers.ChoiceField(choices=['true'], write_only=True, allow_null=True, allow_blank=True, help_text=_("When set to true will delete all food from active shopping lists.")) + + class Meta: + model = Recipe + fields = ['id', 'amount', 'unit', 'delete', ] diff --git a/cookbook/signals.py b/cookbook/signals.py index dc820c11..17a3da86 100644 --- a/cookbook/signals.py +++ b/cookbook/signals.py @@ -1,47 +1,135 @@ +from decimal import Decimal +from functools import wraps + +from django.conf import settings from django.contrib.postgres.search import SearchVector from django.db.models.signals import post_save from django.dispatch import receiver from django.utils import translation +from django_scopes import scope -from cookbook.models import Recipe, Step +from cookbook.helper.shopping_helper import RecipeShoppingEditor from cookbook.managers import DICTIONARY +from cookbook.models import (Food, FoodInheritField, Ingredient, MealPlan, Recipe, + ShoppingListEntry, Step) + +SQLITE = True +if settings.DATABASES['default']['ENGINE'] in ['django.db.backends.postgresql_psycopg2', + 'django.db.backends.postgresql']: + SQLITE = False + +# wraps a signal with the ability to set 'skip_signal' to avoid creating recursive signals + + +def skip_signal(signal_func): + @wraps(signal_func) + def _decorator(sender, instance, **kwargs): + if not instance: + return None + if hasattr(instance, 'skip_signal'): + return None + return signal_func(sender, instance, **kwargs) + return _decorator -# TODO there is probably a way to generalize this @receiver(post_save, sender=Recipe) +@skip_signal def update_recipe_search_vector(sender, instance=None, created=False, **kwargs): - if not instance: + if SQLITE: return - - # needed to ensure search vector update doesn't trigger recursion - if hasattr(instance, '_dirty'): - return - language = DICTIONARY.get(translation.get_language(), 'simple') instance.name_search_vector = SearchVector('name__unaccent', weight='A', config=language) instance.desc_search_vector = SearchVector('description__unaccent', weight='C', config=language) - try: - instance._dirty = True + instance.skip_signal = True instance.save() finally: - del instance._dirty + del instance.skip_signal @receiver(post_save, sender=Step) +@skip_signal def update_step_search_vector(sender, instance=None, created=False, **kwargs): + if SQLITE: + return + language = DICTIONARY.get(translation.get_language(), 'simple') + instance.search_vector = SearchVector('instruction__unaccent', weight='B', config=language) + try: + instance.skip_signal = True + instance.save() + finally: + del instance.skip_signal + + +@receiver(post_save, sender=Food) +@skip_signal +def update_food_inheritance(sender, instance=None, created=False, **kwargs): if not instance: return - # needed to ensure search vector update doesn't trigger recursion - if hasattr(instance, '_dirty'): + inherit = instance.inherit_fields.all() + # nothing to apply from parent and nothing to apply to children + if (not instance.parent or inherit.count() == 0) and instance.numchild == 0: return - language = DICTIONARY.get(translation.get_language(), 'simple') - instance.search_vector = SearchVector('instruction__unaccent', weight='B', config=language) + inherit = inherit.values_list('field', flat=True) + # apply changes from parent to instance for each inherited field + if instance.parent and inherit.count() > 0: + parent = instance.get_parent() + if 'ignore_shopping' in inherit: + instance.ignore_shopping = parent.ignore_shopping + # if supermarket_category is not set, do not cascade - if this becomes non-intuitive can change + if 'supermarket_category' in inherit and parent.supermarket_category: + instance.supermarket_category = parent.supermarket_category + try: + instance.skip_signal = True + instance.save() + finally: + del instance.skip_signal - try: - instance._dirty = True - instance.save() - finally: - del instance._dirty + # TODO figure out how to generalize this + # apply changes to direct children - depend on save signals for those objects to cascade inheritance down + _save = [] + for child in instance.get_children().filter(inherit_fields__field='ignore_shopping'): + child.ignore_shopping = instance.ignore_shopping + _save.append(child) + # don't cascade empty supermarket category + if instance.supermarket_category: + # apply changes to direct children - depend on save signals for those objects to cascade inheritance down + for child in instance.get_children().filter(inherit_fields__field='supermarket_category'): + child.supermarket_category = instance.supermarket_category + _save.append(child) + for child in set(_save): + child.save() + + +@receiver(post_save, sender=MealPlan) +def auto_add_shopping(sender, instance=None, created=False, weak=False, **kwargs): + if not instance: + return + user = instance.get_owner() + with scope(space=instance.space): + slr_exists = instance.shoppinglistrecipe_set.exists() + + if not created and slr_exists: + for x in instance.shoppinglistrecipe_set.all(): + # assuming that permissions checks for the MealPlan have happened upstream + if instance.servings != x.servings: + SLR = RecipeShoppingEditor(id=x.id, user=user, space=instance.space) + SLR.edit_servings(servings=instance.servings) + # list_recipe = list_from_recipe(list_recipe=x, servings=instance.servings, space=instance.space) + elif not user.userpreference.mealplan_autoadd_shopping or not instance.recipe: + return + + if created: + # if creating a mealplan - perform shopping list activities + # kwargs = { + # 'mealplan': instance, + # 'space': instance.space, + # 'created_by': user, + # 'servings': instance.servings + # } + SLR = RecipeShoppingEditor(user=user, space=instance.space) + SLR.create(mealplan=instance, servings=instance.servings) + + # list_recipe = list_from_recipe(**kwargs) diff --git a/cookbook/static/css/app.min.css b/cookbook/static/css/app.min.css index 272dac27..a100e2c2 100644 --- a/cookbook/static/css/app.min.css +++ b/cookbook/static/css/app.min.css @@ -1126,4 +1126,24 @@ .btn-apple .badge { color: #000; background-color: #fff; +} + +@media (min-width: 992px) { + .dropdown-menu-center { + right: auto; + left: 65%; + -webkit-transform: translate(-65%, 0); + -o-transform: translate(-65%, 0); + transform: translate(-65%, 0); + } + .dropdown-menu-center-large { + min-width: 28rem; + } +} + +@media print{ + #switcher{ + display: none; + } + } \ No newline at end of file diff --git a/cookbook/static/custom/js/form_emoji.js b/cookbook/static/custom/js/form_emoji.js deleted file mode 100644 index 8b2fd287..00000000 --- a/cookbook/static/custom/js/form_emoji.js +++ /dev/null @@ -1,3 +0,0 @@ -$(document).ready(function () { - $('.emojiwidget').emojioneArea(); -}); \ No newline at end of file diff --git a/cookbook/static/django_js_reverse/reverse.js b/cookbook/static/django_js_reverse/reverse.js index 105335cb..437faa00 100644 --- a/cookbook/static/django_js_reverse/reverse.js +++ b/cookbook/static/django_js_reverse/reverse.js @@ -1,14 +1,14 @@ -this.Urls=(function(){"use strict";var data={"urls":[["account_change_password",[["accounts/password/change/",[]]]],["account_confirm_email",[["accounts/confirm-email/%(key)s/",["key"]]]],["account_email",[["accounts/email/",[]]]],["account_email_verification_sent",[["accounts/confirm-email/",[]]]],["account_inactive",[["accounts/inactive/",[]]]],["account_login",[["accounts/login/",[]]]],["account_logout",[["accounts/logout/",[]]]],["account_reset_password",[["accounts/password/reset/",[]]]],["account_reset_password_done",[["accounts/password/reset/done/",[]]]],["account_reset_password_from_key",[["accounts/password/reset/key/%(uidb36)s-%(key)s/",["uidb36","key"]]]],["account_reset_password_from_key_done",[["accounts/password/reset/key/done/",[]]]],["account_set_password",[["accounts/password/set/",[]]]],["account_signup",[["accounts/signup/",[]]]],["admin:account_emailaddress_add",[["admin/account/emailaddress/add/",[]]]],["admin:account_emailaddress_autocomplete",[["admin/account/emailaddress/autocomplete/",[]]]],["admin:account_emailaddress_change",[["admin/account/emailaddress/%(object_id)s/change/",["object_id"]]]],["admin:account_emailaddress_changelist",[["admin/account/emailaddress/",[]]]],["admin:account_emailaddress_delete",[["admin/account/emailaddress/%(object_id)s/delete/",["object_id"]]]],["admin:account_emailaddress_history",[["admin/account/emailaddress/%(object_id)s/history/",["object_id"]]]],["admin:app_list",[["admin/%(app_label)s/",["app_label"]]]],["admin:auth_group_add",[["admin/auth/group/add/",[]]]],["admin:auth_group_autocomplete",[["admin/auth/group/autocomplete/",[]]]],["admin:auth_group_change",[["admin/auth/group/%(object_id)s/change/",["object_id"]]]],["admin:auth_group_changelist",[["admin/auth/group/",[]]]],["admin:auth_group_delete",[["admin/auth/group/%(object_id)s/delete/",["object_id"]]]],["admin:auth_group_history",[["admin/auth/group/%(object_id)s/history/",["object_id"]]]],["admin:auth_user_add",[["admin/auth/user/add/",[]]]],["admin:auth_user_autocomplete",[["admin/auth/user/autocomplete/",[]]]],["admin:auth_user_change",[["admin/auth/user/%(object_id)s/change/",["object_id"]]]],["admin:auth_user_changelist",[["admin/auth/user/",[]]]],["admin:auth_user_delete",[["admin/auth/user/%(object_id)s/delete/",["object_id"]]]],["admin:auth_user_history",[["admin/auth/user/%(object_id)s/history/",["object_id"]]]],["admin:auth_user_password_change",[["admin/auth/user/%(id)s/password/",["id"]]]],["admin:authtoken_tokenproxy_add",[["admin/authtoken/tokenproxy/add/",[]]]],["admin:authtoken_tokenproxy_autocomplete",[["admin/authtoken/tokenproxy/autocomplete/",[]]]],["admin:authtoken_tokenproxy_change",[["admin/authtoken/tokenproxy/%(object_id)s/change/",["object_id"]]]],["admin:authtoken_tokenproxy_changelist",[["admin/authtoken/tokenproxy/",[]]]],["admin:authtoken_tokenproxy_delete",[["admin/authtoken/tokenproxy/%(object_id)s/delete/",["object_id"]]]],["admin:authtoken_tokenproxy_history",[["admin/authtoken/tokenproxy/%(object_id)s/history/",["object_id"]]]],["admin:cookbook_comment_add",[["admin/cookbook/comment/add/",[]]]],["admin:cookbook_comment_autocomplete",[["admin/cookbook/comment/autocomplete/",[]]]],["admin:cookbook_comment_change",[["admin/cookbook/comment/%(object_id)s/change/",["object_id"]]]],["admin:cookbook_comment_changelist",[["admin/cookbook/comment/",[]]]],["admin:cookbook_comment_delete",[["admin/cookbook/comment/%(object_id)s/delete/",["object_id"]]]],["admin:cookbook_comment_history",[["admin/cookbook/comment/%(object_id)s/history/",["object_id"]]]],["admin:cookbook_cooklog_add",[["admin/cookbook/cooklog/add/",[]]]],["admin:cookbook_cooklog_autocomplete",[["admin/cookbook/cooklog/autocomplete/",[]]]],["admin:cookbook_cooklog_change",[["admin/cookbook/cooklog/%(object_id)s/change/",["object_id"]]]],["admin:cookbook_cooklog_changelist",[["admin/cookbook/cooklog/",[]]]],["admin:cookbook_cooklog_delete",[["admin/cookbook/cooklog/%(object_id)s/delete/",["object_id"]]]],["admin:cookbook_cooklog_history",[["admin/cookbook/cooklog/%(object_id)s/history/",["object_id"]]]],["admin:cookbook_food_add",[["admin/cookbook/food/add/",[]]]],["admin:cookbook_food_autocomplete",[["admin/cookbook/food/autocomplete/",[]]]],["admin:cookbook_food_change",[["admin/cookbook/food/%(object_id)s/change/",["object_id"]]]],["admin:cookbook_food_changelist",[["admin/cookbook/food/",[]]]],["admin:cookbook_food_delete",[["admin/cookbook/food/%(object_id)s/delete/",["object_id"]]]],["admin:cookbook_food_history",[["admin/cookbook/food/%(object_id)s/history/",["object_id"]]]],["admin:cookbook_ingredient_add",[["admin/cookbook/ingredient/add/",[]]]],["admin:cookbook_ingredient_autocomplete",[["admin/cookbook/ingredient/autocomplete/",[]]]],["admin:cookbook_ingredient_change",[["admin/cookbook/ingredient/%(object_id)s/change/",["object_id"]]]],["admin:cookbook_ingredient_changelist",[["admin/cookbook/ingredient/",[]]]],["admin:cookbook_ingredient_delete",[["admin/cookbook/ingredient/%(object_id)s/delete/",["object_id"]]]],["admin:cookbook_ingredient_history",[["admin/cookbook/ingredient/%(object_id)s/history/",["object_id"]]]],["admin:cookbook_invitelink_add",[["admin/cookbook/invitelink/add/",[]]]],["admin:cookbook_invitelink_autocomplete",[["admin/cookbook/invitelink/autocomplete/",[]]]],["admin:cookbook_invitelink_change",[["admin/cookbook/invitelink/%(object_id)s/change/",["object_id"]]]],["admin:cookbook_invitelink_changelist",[["admin/cookbook/invitelink/",[]]]],["admin:cookbook_invitelink_delete",[["admin/cookbook/invitelink/%(object_id)s/delete/",["object_id"]]]],["admin:cookbook_invitelink_history",[["admin/cookbook/invitelink/%(object_id)s/history/",["object_id"]]]],["admin:cookbook_keyword_add",[["admin/cookbook/keyword/add/",[]]]],["admin:cookbook_keyword_autocomplete",[["admin/cookbook/keyword/autocomplete/",[]]]],["admin:cookbook_keyword_change",[["admin/cookbook/keyword/%(object_id)s/change/",["object_id"]]]],["admin:cookbook_keyword_changelist",[["admin/cookbook/keyword/",[]]]],["admin:cookbook_keyword_delete",[["admin/cookbook/keyword/%(object_id)s/delete/",["object_id"]]]],["admin:cookbook_keyword_history",[["admin/cookbook/keyword/%(object_id)s/history/",["object_id"]]]],["admin:cookbook_mealplan_add",[["admin/cookbook/mealplan/add/",[]]]],["admin:cookbook_mealplan_autocomplete",[["admin/cookbook/mealplan/autocomplete/",[]]]],["admin:cookbook_mealplan_change",[["admin/cookbook/mealplan/%(object_id)s/change/",["object_id"]]]],["admin:cookbook_mealplan_changelist",[["admin/cookbook/mealplan/",[]]]],["admin:cookbook_mealplan_delete",[["admin/cookbook/mealplan/%(object_id)s/delete/",["object_id"]]]],["admin:cookbook_mealplan_history",[["admin/cookbook/mealplan/%(object_id)s/history/",["object_id"]]]],["admin:cookbook_mealtype_add",[["admin/cookbook/mealtype/add/",[]]]],["admin:cookbook_mealtype_autocomplete",[["admin/cookbook/mealtype/autocomplete/",[]]]],["admin:cookbook_mealtype_change",[["admin/cookbook/mealtype/%(object_id)s/change/",["object_id"]]]],["admin:cookbook_mealtype_changelist",[["admin/cookbook/mealtype/",[]]]],["admin:cookbook_mealtype_delete",[["admin/cookbook/mealtype/%(object_id)s/delete/",["object_id"]]]],["admin:cookbook_mealtype_history",[["admin/cookbook/mealtype/%(object_id)s/history/",["object_id"]]]],["admin:cookbook_nutritioninformation_add",[["admin/cookbook/nutritioninformation/add/",[]]]],["admin:cookbook_nutritioninformation_autocomplete",[["admin/cookbook/nutritioninformation/autocomplete/",[]]]],["admin:cookbook_nutritioninformation_change",[["admin/cookbook/nutritioninformation/%(object_id)s/change/",["object_id"]]]],["admin:cookbook_nutritioninformation_changelist",[["admin/cookbook/nutritioninformation/",[]]]],["admin:cookbook_nutritioninformation_delete",[["admin/cookbook/nutritioninformation/%(object_id)s/delete/",["object_id"]]]],["admin:cookbook_nutritioninformation_history",[["admin/cookbook/nutritioninformation/%(object_id)s/history/",["object_id"]]]],["admin:cookbook_recipe_add",[["admin/cookbook/recipe/add/",[]]]],["admin:cookbook_recipe_autocomplete",[["admin/cookbook/recipe/autocomplete/",[]]]],["admin:cookbook_recipe_change",[["admin/cookbook/recipe/%(object_id)s/change/",["object_id"]]]],["admin:cookbook_recipe_changelist",[["admin/cookbook/recipe/",[]]]],["admin:cookbook_recipe_delete",[["admin/cookbook/recipe/%(object_id)s/delete/",["object_id"]]]],["admin:cookbook_recipe_history",[["admin/cookbook/recipe/%(object_id)s/history/",["object_id"]]]],["admin:cookbook_recipebook_add",[["admin/cookbook/recipebook/add/",[]]]],["admin:cookbook_recipebook_autocomplete",[["admin/cookbook/recipebook/autocomplete/",[]]]],["admin:cookbook_recipebook_change",[["admin/cookbook/recipebook/%(object_id)s/change/",["object_id"]]]],["admin:cookbook_recipebook_changelist",[["admin/cookbook/recipebook/",[]]]],["admin:cookbook_recipebook_delete",[["admin/cookbook/recipebook/%(object_id)s/delete/",["object_id"]]]],["admin:cookbook_recipebook_history",[["admin/cookbook/recipebook/%(object_id)s/history/",["object_id"]]]],["admin:cookbook_recipebookentry_add",[["admin/cookbook/recipebookentry/add/",[]]]],["admin:cookbook_recipebookentry_autocomplete",[["admin/cookbook/recipebookentry/autocomplete/",[]]]],["admin:cookbook_recipebookentry_change",[["admin/cookbook/recipebookentry/%(object_id)s/change/",["object_id"]]]],["admin:cookbook_recipebookentry_changelist",[["admin/cookbook/recipebookentry/",[]]]],["admin:cookbook_recipebookentry_delete",[["admin/cookbook/recipebookentry/%(object_id)s/delete/",["object_id"]]]],["admin:cookbook_recipebookentry_history",[["admin/cookbook/recipebookentry/%(object_id)s/history/",["object_id"]]]],["admin:cookbook_recipeimport_add",[["admin/cookbook/recipeimport/add/",[]]]],["admin:cookbook_recipeimport_autocomplete",[["admin/cookbook/recipeimport/autocomplete/",[]]]],["admin:cookbook_recipeimport_change",[["admin/cookbook/recipeimport/%(object_id)s/change/",["object_id"]]]],["admin:cookbook_recipeimport_changelist",[["admin/cookbook/recipeimport/",[]]]],["admin:cookbook_recipeimport_delete",[["admin/cookbook/recipeimport/%(object_id)s/delete/",["object_id"]]]],["admin:cookbook_recipeimport_history",[["admin/cookbook/recipeimport/%(object_id)s/history/",["object_id"]]]],["admin:cookbook_sharelink_add",[["admin/cookbook/sharelink/add/",[]]]],["admin:cookbook_sharelink_autocomplete",[["admin/cookbook/sharelink/autocomplete/",[]]]],["admin:cookbook_sharelink_change",[["admin/cookbook/sharelink/%(object_id)s/change/",["object_id"]]]],["admin:cookbook_sharelink_changelist",[["admin/cookbook/sharelink/",[]]]],["admin:cookbook_sharelink_delete",[["admin/cookbook/sharelink/%(object_id)s/delete/",["object_id"]]]],["admin:cookbook_sharelink_history",[["admin/cookbook/sharelink/%(object_id)s/history/",["object_id"]]]],["admin:cookbook_shoppinglist_add",[["admin/cookbook/shoppinglist/add/",[]]]],["admin:cookbook_shoppinglist_autocomplete",[["admin/cookbook/shoppinglist/autocomplete/",[]]]],["admin:cookbook_shoppinglist_change",[["admin/cookbook/shoppinglist/%(object_id)s/change/",["object_id"]]]],["admin:cookbook_shoppinglist_changelist",[["admin/cookbook/shoppinglist/",[]]]],["admin:cookbook_shoppinglist_delete",[["admin/cookbook/shoppinglist/%(object_id)s/delete/",["object_id"]]]],["admin:cookbook_shoppinglist_history",[["admin/cookbook/shoppinglist/%(object_id)s/history/",["object_id"]]]],["admin:cookbook_shoppinglistentry_add",[["admin/cookbook/shoppinglistentry/add/",[]]]],["admin:cookbook_shoppinglistentry_autocomplete",[["admin/cookbook/shoppinglistentry/autocomplete/",[]]]],["admin:cookbook_shoppinglistentry_change",[["admin/cookbook/shoppinglistentry/%(object_id)s/change/",["object_id"]]]],["admin:cookbook_shoppinglistentry_changelist",[["admin/cookbook/shoppinglistentry/",[]]]],["admin:cookbook_shoppinglistentry_delete",[["admin/cookbook/shoppinglistentry/%(object_id)s/delete/",["object_id"]]]],["admin:cookbook_shoppinglistentry_history",[["admin/cookbook/shoppinglistentry/%(object_id)s/history/",["object_id"]]]],["admin:cookbook_shoppinglistrecipe_add",[["admin/cookbook/shoppinglistrecipe/add/",[]]]],["admin:cookbook_shoppinglistrecipe_autocomplete",[["admin/cookbook/shoppinglistrecipe/autocomplete/",[]]]],["admin:cookbook_shoppinglistrecipe_change",[["admin/cookbook/shoppinglistrecipe/%(object_id)s/change/",["object_id"]]]],["admin:cookbook_shoppinglistrecipe_changelist",[["admin/cookbook/shoppinglistrecipe/",[]]]],["admin:cookbook_shoppinglistrecipe_delete",[["admin/cookbook/shoppinglistrecipe/%(object_id)s/delete/",["object_id"]]]],["admin:cookbook_shoppinglistrecipe_history",[["admin/cookbook/shoppinglistrecipe/%(object_id)s/history/",["object_id"]]]],["admin:cookbook_space_add",[["admin/cookbook/space/add/",[]]]],["admin:cookbook_space_autocomplete",[["admin/cookbook/space/autocomplete/",[]]]],["admin:cookbook_space_change",[["admin/cookbook/space/%(object_id)s/change/",["object_id"]]]],["admin:cookbook_space_changelist",[["admin/cookbook/space/",[]]]],["admin:cookbook_space_delete",[["admin/cookbook/space/%(object_id)s/delete/",["object_id"]]]],["admin:cookbook_space_history",[["admin/cookbook/space/%(object_id)s/history/",["object_id"]]]],["admin:cookbook_step_add",[["admin/cookbook/step/add/",[]]]],["admin:cookbook_step_autocomplete",[["admin/cookbook/step/autocomplete/",[]]]],["admin:cookbook_step_change",[["admin/cookbook/step/%(object_id)s/change/",["object_id"]]]],["admin:cookbook_step_changelist",[["admin/cookbook/step/",[]]]],["admin:cookbook_step_delete",[["admin/cookbook/step/%(object_id)s/delete/",["object_id"]]]],["admin:cookbook_step_history",[["admin/cookbook/step/%(object_id)s/history/",["object_id"]]]],["admin:cookbook_storage_add",[["admin/cookbook/storage/add/",[]]]],["admin:cookbook_storage_autocomplete",[["admin/cookbook/storage/autocomplete/",[]]]],["admin:cookbook_storage_change",[["admin/cookbook/storage/%(object_id)s/change/",["object_id"]]]],["admin:cookbook_storage_changelist",[["admin/cookbook/storage/",[]]]],["admin:cookbook_storage_delete",[["admin/cookbook/storage/%(object_id)s/delete/",["object_id"]]]],["admin:cookbook_storage_history",[["admin/cookbook/storage/%(object_id)s/history/",["object_id"]]]],["admin:cookbook_supermarket_add",[["admin/cookbook/supermarket/add/",[]]]],["admin:cookbook_supermarket_autocomplete",[["admin/cookbook/supermarket/autocomplete/",[]]]],["admin:cookbook_supermarket_change",[["admin/cookbook/supermarket/%(object_id)s/change/",["object_id"]]]],["admin:cookbook_supermarket_changelist",[["admin/cookbook/supermarket/",[]]]],["admin:cookbook_supermarket_delete",[["admin/cookbook/supermarket/%(object_id)s/delete/",["object_id"]]]],["admin:cookbook_supermarket_history",[["admin/cookbook/supermarket/%(object_id)s/history/",["object_id"]]]],["admin:cookbook_supermarketcategory_add",[["admin/cookbook/supermarketcategory/add/",[]]]],["admin:cookbook_supermarketcategory_autocomplete",[["admin/cookbook/supermarketcategory/autocomplete/",[]]]],["admin:cookbook_supermarketcategory_change",[["admin/cookbook/supermarketcategory/%(object_id)s/change/",["object_id"]]]],["admin:cookbook_supermarketcategory_changelist",[["admin/cookbook/supermarketcategory/",[]]]],["admin:cookbook_supermarketcategory_delete",[["admin/cookbook/supermarketcategory/%(object_id)s/delete/",["object_id"]]]],["admin:cookbook_supermarketcategory_history",[["admin/cookbook/supermarketcategory/%(object_id)s/history/",["object_id"]]]],["admin:cookbook_sync_add",[["admin/cookbook/sync/add/",[]]]],["admin:cookbook_sync_autocomplete",[["admin/cookbook/sync/autocomplete/",[]]]],["admin:cookbook_sync_change",[["admin/cookbook/sync/%(object_id)s/change/",["object_id"]]]],["admin:cookbook_sync_changelist",[["admin/cookbook/sync/",[]]]],["admin:cookbook_sync_delete",[["admin/cookbook/sync/%(object_id)s/delete/",["object_id"]]]],["admin:cookbook_sync_history",[["admin/cookbook/sync/%(object_id)s/history/",["object_id"]]]],["admin:cookbook_synclog_add",[["admin/cookbook/synclog/add/",[]]]],["admin:cookbook_synclog_autocomplete",[["admin/cookbook/synclog/autocomplete/",[]]]],["admin:cookbook_synclog_change",[["admin/cookbook/synclog/%(object_id)s/change/",["object_id"]]]],["admin:cookbook_synclog_changelist",[["admin/cookbook/synclog/",[]]]],["admin:cookbook_synclog_delete",[["admin/cookbook/synclog/%(object_id)s/delete/",["object_id"]]]],["admin:cookbook_synclog_history",[["admin/cookbook/synclog/%(object_id)s/history/",["object_id"]]]],["admin:cookbook_unit_add",[["admin/cookbook/unit/add/",[]]]],["admin:cookbook_unit_autocomplete",[["admin/cookbook/unit/autocomplete/",[]]]],["admin:cookbook_unit_change",[["admin/cookbook/unit/%(object_id)s/change/",["object_id"]]]],["admin:cookbook_unit_changelist",[["admin/cookbook/unit/",[]]]],["admin:cookbook_unit_delete",[["admin/cookbook/unit/%(object_id)s/delete/",["object_id"]]]],["admin:cookbook_unit_history",[["admin/cookbook/unit/%(object_id)s/history/",["object_id"]]]],["admin:cookbook_userpreference_add",[["admin/cookbook/userpreference/add/",[]]]],["admin:cookbook_userpreference_autocomplete",[["admin/cookbook/userpreference/autocomplete/",[]]]],["admin:cookbook_userpreference_change",[["admin/cookbook/userpreference/%(object_id)s/change/",["object_id"]]]],["admin:cookbook_userpreference_changelist",[["admin/cookbook/userpreference/",[]]]],["admin:cookbook_userpreference_delete",[["admin/cookbook/userpreference/%(object_id)s/delete/",["object_id"]]]],["admin:cookbook_userpreference_history",[["admin/cookbook/userpreference/%(object_id)s/history/",["object_id"]]]],["admin:cookbook_viewlog_add",[["admin/cookbook/viewlog/add/",[]]]],["admin:cookbook_viewlog_autocomplete",[["admin/cookbook/viewlog/autocomplete/",[]]]],["admin:cookbook_viewlog_change",[["admin/cookbook/viewlog/%(object_id)s/change/",["object_id"]]]],["admin:cookbook_viewlog_changelist",[["admin/cookbook/viewlog/",[]]]],["admin:cookbook_viewlog_delete",[["admin/cookbook/viewlog/%(object_id)s/delete/",["object_id"]]]],["admin:cookbook_viewlog_history",[["admin/cookbook/viewlog/%(object_id)s/history/",["object_id"]]]],["admin:index",[["admin/",[]]]],["admin:javascript-catalog",[["admin/cookbook/keyword/jsi18n/",[]]]],["admin:jsi18n",[["admin/jsi18n/",[]]]],["admin:login",[["admin/login/",[]]]],["admin:logout",[["admin/logout/",[]]]],["admin:password_change",[["admin/password_change/",[]]]],["admin:password_change_done",[["admin/password_change/done/",[]]]],["admin:sites_site_add",[["admin/sites/site/add/",[]]]],["admin:sites_site_autocomplete",[["admin/sites/site/autocomplete/",[]]]],["admin:sites_site_change",[["admin/sites/site/%(object_id)s/change/",["object_id"]]]],["admin:sites_site_changelist",[["admin/sites/site/",[]]]],["admin:sites_site_delete",[["admin/sites/site/%(object_id)s/delete/",["object_id"]]]],["admin:sites_site_history",[["admin/sites/site/%(object_id)s/history/",["object_id"]]]],["admin:socialaccount_socialaccount_add",[["admin/socialaccount/socialaccount/add/",[]]]],["admin:socialaccount_socialaccount_autocomplete",[["admin/socialaccount/socialaccount/autocomplete/",[]]]],["admin:socialaccount_socialaccount_change",[["admin/socialaccount/socialaccount/%(object_id)s/change/",["object_id"]]]],["admin:socialaccount_socialaccount_changelist",[["admin/socialaccount/socialaccount/",[]]]],["admin:socialaccount_socialaccount_delete",[["admin/socialaccount/socialaccount/%(object_id)s/delete/",["object_id"]]]],["admin:socialaccount_socialaccount_history",[["admin/socialaccount/socialaccount/%(object_id)s/history/",["object_id"]]]],["admin:socialaccount_socialapp_add",[["admin/socialaccount/socialapp/add/",[]]]],["admin:socialaccount_socialapp_autocomplete",[["admin/socialaccount/socialapp/autocomplete/",[]]]],["admin:socialaccount_socialapp_change",[["admin/socialaccount/socialapp/%(object_id)s/change/",["object_id"]]]],["admin:socialaccount_socialapp_changelist",[["admin/socialaccount/socialapp/",[]]]],["admin:socialaccount_socialapp_delete",[["admin/socialaccount/socialapp/%(object_id)s/delete/",["object_id"]]]],["admin:socialaccount_socialapp_history",[["admin/socialaccount/socialapp/%(object_id)s/history/",["object_id"]]]],["admin:socialaccount_socialtoken_add",[["admin/socialaccount/socialtoken/add/",[]]]],["admin:socialaccount_socialtoken_autocomplete",[["admin/socialaccount/socialtoken/autocomplete/",[]]]],["admin:socialaccount_socialtoken_change",[["admin/socialaccount/socialtoken/%(object_id)s/change/",["object_id"]]]],["admin:socialaccount_socialtoken_changelist",[["admin/socialaccount/socialtoken/",[]]]],["admin:socialaccount_socialtoken_delete",[["admin/socialaccount/socialtoken/%(object_id)s/delete/",["object_id"]]]],["admin:socialaccount_socialtoken_history",[["admin/socialaccount/socialtoken/%(object_id)s/history/",["object_id"]]]],["admin:view_on_site",[["admin/r/%(content_type_id)s/%(object_id)s/",["content_type_id","object_id"]]]],["api:api-root",[["api/.%(format)s",["format"]],["api/",[]]]],["api:cooklog-detail",[["api/cook-log/%(pk)s.%(format)s",["pk","format"]],["api/cook-log/%(pk)s/",["pk"]]]],["api:cooklog-list",[["api/cook-log.%(format)s",["format"]],["api/cook-log/",[]]]],["api:food-detail",[["api/food/%(pk)s.%(format)s",["pk","format"]],["api/food/%(pk)s/",["pk"]]]],["api:food-list",[["api/food.%(format)s",["format"]],["api/food/",[]]]],["api:ingredient-detail",[["api/ingredient/%(pk)s.%(format)s",["pk","format"]],["api/ingredient/%(pk)s/",["pk"]]]],["api:ingredient-list",[["api/ingredient.%(format)s",["format"]],["api/ingredient/",[]]]],["api:keyword-detail",[["api/keyword/%(pk)s.%(format)s",["pk","format"]],["api/keyword/%(pk)s/",["pk"]]]],["api:keyword-list",[["api/keyword.%(format)s",["format"]],["api/keyword/",[]]]],["api:mealplan-detail",[["api/meal-plan/%(pk)s.%(format)s",["pk","format"]],["api/meal-plan/%(pk)s/",["pk"]]]],["api:mealplan-list",[["api/meal-plan.%(format)s",["format"]],["api/meal-plan/",[]]]],["api:mealtype-detail",[["api/meal-type/%(pk)s.%(format)s",["pk","format"]],["api/meal-type/%(pk)s/",["pk"]]]],["api:mealtype-list",[["api/meal-type.%(format)s",["format"]],["api/meal-type/",[]]]],["api:recipe-detail",[["api/recipe/%(pk)s.%(format)s",["pk","format"]],["api/recipe/%(pk)s/",["pk"]]]],["api:recipe-image",[["api/recipe/%(pk)s/image.%(format)s",["pk","format"]],["api/recipe/%(pk)s/image/",["pk"]]]],["api:recipe-list",[["api/recipe.%(format)s",["format"]],["api/recipe/",[]]]],["api:recipebook-detail",[["api/recipe-book/%(pk)s.%(format)s",["pk","format"]],["api/recipe-book/%(pk)s/",["pk"]]]],["api:recipebook-list",[["api/recipe-book.%(format)s",["format"]],["api/recipe-book/",[]]]],["api:recipebookentry-detail",[["api/recipe-book-entry/%(pk)s.%(format)s",["pk","format"]],["api/recipe-book-entry/%(pk)s/",["pk"]]]],["api:recipebookentry-list",[["api/recipe-book-entry.%(format)s",["format"]],["api/recipe-book-entry/",[]]]],["api:shoppinglist-detail",[["api/shopping-list/%(pk)s.%(format)s",["pk","format"]],["api/shopping-list/%(pk)s/",["pk"]]]],["api:shoppinglist-list",[["api/shopping-list.%(format)s",["format"]],["api/shopping-list/",[]]]],["api:shoppinglistentry-detail",[["api/shopping-list-entry/%(pk)s.%(format)s",["pk","format"]],["api/shopping-list-entry/%(pk)s/",["pk"]]]],["api:shoppinglistentry-list",[["api/shopping-list-entry.%(format)s",["format"]],["api/shopping-list-entry/",[]]]],["api:shoppinglistrecipe-detail",[["api/shopping-list-recipe/%(pk)s.%(format)s",["pk","format"]],["api/shopping-list-recipe/%(pk)s/",["pk"]]]],["api:shoppinglistrecipe-list",[["api/shopping-list-recipe.%(format)s",["format"]],["api/shopping-list-recipe/",[]]]],["api:step-detail",[["api/step/%(pk)s.%(format)s",["pk","format"]],["api/step/%(pk)s/",["pk"]]]],["api:step-list",[["api/step.%(format)s",["format"]],["api/step/",[]]]],["api:storage-detail",[["api/storage/%(pk)s.%(format)s",["pk","format"]],["api/storage/%(pk)s/",["pk"]]]],["api:storage-list",[["api/storage.%(format)s",["format"]],["api/storage/",[]]]],["api:supermarket-detail",[["api/supermarket/%(pk)s.%(format)s",["pk","format"]],["api/supermarket/%(pk)s/",["pk"]]]],["api:supermarket-list",[["api/supermarket.%(format)s",["format"]],["api/supermarket/",[]]]],["api:sync-detail",[["api/sync/%(pk)s.%(format)s",["pk","format"]],["api/sync/%(pk)s/",["pk"]]]],["api:sync-list",[["api/sync.%(format)s",["format"]],["api/sync/",[]]]],["api:synclog-detail",[["api/sync-log/%(pk)s.%(format)s",["pk","format"]],["api/sync-log/%(pk)s/",["pk"]]]],["api:synclog-list",[["api/sync-log.%(format)s",["format"]],["api/sync-log/",[]]]],["api:unit-detail",[["api/unit/%(pk)s.%(format)s",["pk","format"]],["api/unit/%(pk)s/",["pk"]]]],["api:unit-list",[["api/unit.%(format)s",["format"]],["api/unit/",[]]]],["api:username-detail",[["api/user-name/%(pk)s.%(format)s",["pk","format"]],["api/user-name/%(pk)s/",["pk"]]]],["api:username-list",[["api/user-name.%(format)s",["format"]],["api/user-name/",[]]]],["api:userpreference-detail",[["api/user-preference/%(pk)s.%(format)s",["pk","format"]],["api/user-preference/%(pk)s/",["pk"]]]],["api:userpreference-list",[["api/user-preference.%(format)s",["format"]],["api/user-preference/",[]]]],["api:viewlog-detail",[["api/view-log/%(pk)s.%(format)s",["pk","format"]],["api/view-log/%(pk)s/",["pk"]]]],["api:viewlog-list",[["api/view-log.%(format)s",["format"]],["api/view-log/",[]]]],["api_backup",[["api/backup/",[]]]],["api_get_external_file_link",[["api/get_external_file_link/%(recipe_id)s/",["recipe_id"]]]],["api_get_plan_ical",[["api/plan-ical/%(from_date)s/%(to_date)s/",["from_date","to_date"]]]],["api_get_recipe_file",[["api/get_recipe_file/%(recipe_id)s/",["recipe_id"]]]],["api_ingredient_from_string",[["api/ingredient-from-string/",[]]]],["api_log_cooking",[["api/log_cooking/%(recipe_id)s/",["recipe_id"]]]],["api_recipe_from_url",[["api/recipe-from-url/",[]]]],["api_sync",[["api/sync_all/",[]]]],["dal_food",[["dal/food/",[]]]],["dal_keyword",[["dal/keyword/",[]]]],["dal_unit",[["dal/unit/",[]]]],["data_batch_edit",[["data/batch/edit",[]]]],["data_batch_import",[["data/batch/import",[]]]],["data_import_url",[["data/import/url",[]]]],["data_stats",[["data/statistics",[]]]],["data_sync",[["data/sync",[]]]],["data_sync_wait",[["data/sync/wait",[]]]],["delete_comment",[["delete/comment/%(pk)s/",["pk"]]]],["delete_invite_link",[["delete/invite-link/%(pk)s/",["pk"]]]],["delete_keyword",[["delete/keyword/%(pk)s/",["pk"]]]],["delete_meal_plan",[["delete/meal-plan/%(pk)s/",["pk"]]]],["delete_recipe",[["delete/recipe/%(pk)s/",["pk"]]]],["delete_recipe_book",[["delete/recipe-book/%(pk)s/",["pk"]]]],["delete_recipe_book_entry",[["delete/recipe-book-entry/%(pk)s/",["pk"]]]],["delete_recipe_import",[["delete/recipe-import/%(pk)s/",["pk"]]]],["delete_recipe_source",[["delete/recipe-source/%(pk)s/",["pk"]]]],["delete_storage",[["delete/storage/%(pk)s/",["pk"]]]],["delete_sync",[["delete/sync/%(pk)s/",["pk"]]]],["docs_api",[["docs/api/",[]]]],["docs_markdown",[["docs/markdown/",[]]]],["edit_comment",[["edit/comment/%(pk)s/",["pk"]]]],["edit_convert_recipe",[["edit/recipe/convert/%(pk)s/",["pk"]]]],["edit_external_recipe",[["edit/recipe/external/%(pk)s/",["pk"]]]],["edit_food",[["edit/food/%(pk)s/",["pk"]],["edit/ingredient/",[]]]],["edit_internal_recipe",[["edit/recipe/internal/%(pk)s/",["pk"]]]],["edit_keyword",[["edit/keyword/%(pk)s/",["pk"]]]],["edit_meal_plan",[["edit/meal-plan/%(pk)s/",["pk"]]]],["edit_recipe",[["edit/recipe/%(pk)s/",["pk"]]]],["edit_recipe_book",[["edit/recipe-book/%(pk)s/",["pk"]]]],["edit_storage",[["edit/storage/%(pk)s/",["pk"]]]],["edit_sync",[["edit/sync/%(pk)s/",["pk"]]]],["index",[["",[]]]],["javascript-catalog",[["jsi18n/",[]]]],["js_reverse",[["jsreverse.json",[]]]],["list_food",[["list/food/",[]]]],["list_invite_link",[["list/invite-link/",[]]]],["list_keyword",[["list/keyword/",[]]]],["list_recipe_import",[["list/recipe-import/",[]]]],["list_shopping_list",[["list/shopping-list/",[]]]],["list_storage",[["list/storage/",[]]]],["list_sync_log",[["list/sync-log/",[]]]],["move_keyword",[["move/keyword/%(child)s/%(parent)s",["child","parent"]]]],["new_invite_link",[["new/invite-link/",[]]]],["new_keyword",[["new/keyword/",[]]]],["new_meal_plan",[["new/meal-plan/",[]]]],["new_recipe",[["new/recipe/",[]]]],["new_recipe_book",[["new/recipe-book/",[]]]],["new_recipe_import",[["new/recipe-import/%(import_id)s/",["import_id"]]]],["new_share_link",[["new/share-link/%(pk)s/",["pk"]]]],["new_storage",[["new/storage/",[]]]],["openapi-schema",[["openapi",[]]]],["rest_framework:login",[["api-auth/login/",[]]]],["rest_framework:logout",[["api-auth/logout/",[]]]],["service_worker",[["service-worker.js",[]]]],["set_language",[["i18n/setlang/",[]]]],["socialaccount_connections",[["accounts/social/connections/",[]]]],["socialaccount_login_cancelled",[["accounts/social/login/cancelled/",[]]]],["socialaccount_login_error",[["accounts/social/login/error/",[]]]],["socialaccount_signup",[["accounts/social/signup/",[]]]],["view_books",[["books/",[]]]],["view_export",[["export/",[]]]],["view_history",[["history/",[]]]],["view_import",[["import/",[]]]],["view_no_group",[["no-group",[]]]],["view_offline",[["offline/",[]]]],["view_plan",[["plan/",[]]]],["view_plan_entry",[["plan/entry/%(pk)s",["pk"]]]],["view_recipe",[["view/recipe/%(pk)s/%(share)s",["pk","share"]],["view/recipe/%(pk)s",["pk"]]]],["view_search",[["search/",[]]]],["view_settings",[["settings/",[]]]],["view_setup",[["setup/",[]]]],["view_shopping",[["shopping/%(pk)s",["pk"]],["shopping/",[]]]],["view_shopping_latest",[["shopping/latest/",[]]]],["view_signup",[["signup/%(token)s",["token"]]]],["view_system",[["system/",[]]]],["view_test",[["test/",[]]]],["view_test2",[["test2/",[]]]],["web_manifest",[["manifest.json",[]]]]],"prefix":"/"};function factory(d){var url_patterns=d.urls;var url_prefix=d.prefix;var Urls={};var self_url_patterns={};var _get_url=function(url_pattern){return function(){var _arguments,index,url,url_arg,url_args,_i,_len,_ref,_ref_list,match_ref,provided_keys,build_kwargs;_arguments=arguments;_ref_list=self_url_patterns[url_pattern];if(arguments.length==1&&typeof(arguments[0])=="object"){var provided_keys_list=Object.keys(arguments[0]);provided_keys={};for(_i=0;_i .emojionearea-editor { - height: 32px; - min-height: 20px; - overflow: hidden; - white-space: nowrap; - position: absolute; - top: 0; - left: 12px; - right: 24px; - padding: 6px 0; } - .emojionearea.emojionearea-inline > .emojionearea-button { - top: 4px; } -.emojionearea .emojionearea-button { - z-index: 5; - position: absolute; - right: 3px; - top: 3px; - width: 24px; - height: 24px; - opacity: 0.6; - cursor: pointer; - -moz-transition: opacity 300ms ease-in-out; - -o-transition: opacity 300ms ease-in-out; - -webkit-transition: opacity 300ms ease-in-out; - transition: opacity 300ms ease-in-out; } - .emojionearea .emojionearea-button:hover { - opacity: 1; } - .emojionearea .emojionearea-button > div { - display: block; - width: 24px; - height: 24px; - position: absolute; - -moz-transition: all 400ms ease-in-out; - -o-transition: all 400ms ease-in-out; - -webkit-transition: all 400ms ease-in-out; - transition: all 400ms ease-in-out; } - .emojionearea .emojionearea-button > div.emojionearea-button-open { - background-position: 0 -24px; - filter: progid:DXImageTransform.Microsoft.Alpha(enabled=false); - opacity: 1; } - .emojionearea .emojionearea-button > div.emojionearea-button-close { - background-position: 0 0; - -webkit-transform: rotate(-45deg); - -o-transform: rotate(-45deg); - transform: rotate(-45deg); - filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); - opacity: 0; } - .emojionearea .emojionearea-button.active > div.emojionearea-button-open { - -webkit-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); - filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); - opacity: 0; } - .emojionearea .emojionearea-button.active > div.emojionearea-button-close { - -webkit-transform: rotate(0deg); - -o-transform: rotate(0deg); - transform: rotate(0deg); - filter: progid:DXImageTransform.Microsoft.Alpha(enabled=false); - opacity: 1; } -.emojionearea .emojionearea-picker { - background: #FFFFFF; - position: absolute; - -moz-box-shadow: 0 1px 5px rgba(0, 0, 0, 0.32); - -webkit-box-shadow: 0 1px 5px rgba(0, 0, 0, 0.32); - box-shadow: 0 1px 5px rgba(0, 0, 0, 0.32); - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - border-radius: 5px; - height: 276px; - width: 316px; - top: -15px; - right: -15px; - z-index: 90; - -moz-transition: all 0.25s ease-in-out; - -o-transition: all 0.25s ease-in-out; - -webkit-transition: all 0.25s ease-in-out; - transition: all 0.25s ease-in-out; - filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); - opacity: 0; - -moz-user-select: -moz-none; - -ms-user-select: none; - -webkit-user-select: none; - user-select: none; } - .emojionearea .emojionearea-picker.hidden { - display: none; } - .emojionearea .emojionearea-picker .emojionearea-wrapper { - position: relative; - height: 276px; - width: 316px; } - .emojionearea .emojionearea-picker .emojionearea-wrapper:after { - content: ""; - display: block; - position: absolute; - background-repeat: no-repeat; - z-index: 91; } - .emojionearea .emojionearea-picker .emojionearea-filters { - width: 100%; - position: absolute; - z-index: 95; } - .emojionearea .emojionearea-picker .emojionearea-filters { - background: #F5F7F9; - padding: 0 0 0 7px; - height: 40px; } - .emojionearea .emojionearea-picker .emojionearea-filters .emojionearea-filter { - display: block; - float: left; - height: 40px; - width: 32px; - filter: inherit; - padding: 7px 1px 0; - cursor: pointer; - -webkit-filter: grayscale(1); - filter: grayscale(1); } - .emojionearea .emojionearea-picker .emojionearea-filters .emojionearea-filter.active { - background: #fff; } - .emojionearea .emojionearea-picker .emojionearea-filters .emojionearea-filter.active, .emojionearea .emojionearea-picker .emojionearea-filters .emojionearea-filter:hover { - -webkit-filter: grayscale(0); - filter: grayscale(0); } - .emojionearea .emojionearea-picker .emojionearea-filters .emojionearea-filter > i { - width: 24px; - height: 24px; - top: 0; } - .emojionearea .emojionearea-picker .emojionearea-filters .emojionearea-filter > img { - width: 24px; - height: 24px; - margin: 0 3px; } - .emojionearea .emojionearea-picker .emojionearea-search-panel { - height: 30px; - position: absolute; - z-index: 95; - top: 40px; - left: 0; - right: 0; - padding: 5px 0 5px 8px; } - .emojionearea .emojionearea-picker .emojionearea-search-panel .emojionearea-tones { - float: right; - margin-right: 10px; - margin-top: -1px; } - .emojionearea .emojionearea-picker .emojionearea-tones-panel .emojionearea-tones { - position: absolute; - top: 4px; - left: 171px; } - .emojionearea .emojionearea-picker .emojionearea-search { - float: left; - padding: 0; - height: 20px; - width: 160px; } - .emojionearea .emojionearea-picker .emojionearea-search > input { - outline: none; - width: 160px; - min-width: 160px; - height: 20px; } - .emojionearea .emojionearea-picker .emojionearea-tones { - padding: 0; - width: 120px; - height: 20px; } - .emojionearea .emojionearea-picker .emojionearea-tones > .btn-tone { - display: inline-block; - padding: 0; - border: 0; - vertical-align: middle; - outline: none; - background: transparent; - cursor: pointer; - position: relative; } - .emojionearea .emojionearea-picker .emojionearea-tones > .btn-tone.btn-tone-0, .emojionearea .emojionearea-picker .emojionearea-tones > .btn-tone.btn-tone-0:after { - background-color: #ffcf3e; } - .emojionearea .emojionearea-picker .emojionearea-tones > .btn-tone.btn-tone-1, .emojionearea .emojionearea-picker .emojionearea-tones > .btn-tone.btn-tone-1:after { - background-color: #fae3c5; } - .emojionearea .emojionearea-picker .emojionearea-tones > .btn-tone.btn-tone-2, .emojionearea .emojionearea-picker .emojionearea-tones > .btn-tone.btn-tone-2:after { - background-color: #e2cfa5; } - .emojionearea .emojionearea-picker .emojionearea-tones > .btn-tone.btn-tone-3, .emojionearea .emojionearea-picker .emojionearea-tones > .btn-tone.btn-tone-3:after { - background-color: #daa478; } - .emojionearea .emojionearea-picker .emojionearea-tones > .btn-tone.btn-tone-4, .emojionearea .emojionearea-picker .emojionearea-tones > .btn-tone.btn-tone-4:after { - background-color: #a78058; } - .emojionearea .emojionearea-picker .emojionearea-tones > .btn-tone.btn-tone-5, .emojionearea .emojionearea-picker .emojionearea-tones > .btn-tone.btn-tone-5:after { - background-color: #5e4d43; } - .emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-bullet > .btn-tone, .emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-square > .btn-tone { - width: 20px; - height: 20px; - margin: 0; - background-color: transparent; } - .emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-bullet > .btn-tone:after, .emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-square > .btn-tone:after { - content: ""; - position: absolute; - display: block; - top: 4px; - left: 4px; - width: 12px; - height: 12px; } - .emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-bullet > .btn-tone.active:after, .emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-square > .btn-tone.active:after { - top: 0; - left: 0; - width: 20px; - height: 20px; } - .emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-radio > .btn-tone, .emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-checkbox > .btn-tone { - width: 16px; - height: 16px; - margin: 0px 2px; } - .emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-radio > .btn-tone.active:after, .emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-checkbox > .btn-tone.active:after { - content: ""; - position: absolute; - display: block; - background-color: transparent; - border: 2px solid #fff; - width: 8px; - height: 8px; - top: 2px; - left: 2px; - box-sizing: initial; } - .emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-bullet > .btn-tone, .emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-bullet > .btn-tone:after, .emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-radio > .btn-tone, .emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-radio > .btn-tone:after { - -moz-border-radius: 100%; - -webkit-border-radius: 100%; - border-radius: 100%; } - .emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-square > .btn-tone, .emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-square > .btn-tone:after, .emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-checkbox > .btn-tone, .emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-checkbox > .btn-tone:after { - -moz-border-radius: 1px; - -webkit-border-radius: 1px; - border-radius: 1px; } - .emojionearea .emojionearea-picker .emojionearea-scroll-area { - height: 236px; } - .emojionearea .emojionearea-picker .emojionearea-search-panel + .emojionearea-scroll-area { - height: 206px; } - .emojionearea .emojionearea-picker .emojionearea-scroll-area { - overflow: auto; - overflow-x: hidden; - width: 100%; - position: absolute; - padding: 0 0 5px; } - .emojionearea .emojionearea-picker .emojionearea-scroll-area .emojionearea-emojis-list { - z-index: 1; } - .emojionearea .emojionearea-picker .emojionearea-scroll-area .emojionearea-category-title { - display: block; - font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif; - font-size: 13px; - font-weight: normal; - color: #b2b2b2; - background: #FFFFFF; - line-height: 20px; - margin: 0; - padding: 7px 0 5px 6px; } - .emojionearea .emojionearea-picker .emojionearea-scroll-area .emojionearea-category-title:after, .emojionearea .emojionearea-picker .emojionearea-scroll-area .emojionearea-category-title:before { - content: " "; - display: block; - clear: both; } - .emojionearea .emojionearea-picker .emojionearea-scroll-area .emojionearea-category-block { - padding: 0 0 0 7px; } - .emojionearea .emojionearea-picker .emojionearea-scroll-area .emojionearea-category-block > .emojionearea-category { - padding: 0 !important; } - .emojionearea .emojionearea-picker .emojionearea-scroll-area .emojionearea-category-block > .emojionearea-category:after, .emojionearea .emojionearea-picker .emojionearea-scroll-area .emojionearea-category-block > .emojionearea-category:before { - content: " "; - display: block; - clear: both; } - .emojionearea .emojionearea-picker .emojionearea-scroll-area .emojionearea-category-block:after, .emojionearea .emojionearea-picker .emojionearea-scroll-area .emojionearea-category-block:before { - content: " "; - display: block; - clear: both; } - .emojionearea .emojionearea-picker .emojionearea-scroll-area [class*=emojione-] { - -moz-box-sizing: content-box; - -webkit-box-sizing: content-box; - box-sizing: content-box; - margin: 0; - width: 24px; - height: 24px; - top: 0; } - .emojionearea .emojionearea-picker .emojionearea-scroll-area .emojibtn { - -moz-box-sizing: content-box; - -webkit-box-sizing: content-box; - box-sizing: content-box; - width: 24px; - height: 24px; - float: left; - display: block; - margin: 1px; - padding: 3px; } - .emojionearea .emojionearea-picker .emojionearea-scroll-area .emojibtn:hover { - -moz-border-radius: 4px; - -webkit-border-radius: 4px; - border-radius: 4px; - background-color: #e4e4e4; - cursor: pointer; } - .emojionearea .emojionearea-picker .emojionearea-scroll-area .emojibtn i, .emojionearea .emojionearea-picker .emojionearea-scroll-area .emojibtn img { - float: left; - display: block; - width: 24px; - height: 24px; } - .emojionearea .emojionearea-picker .emojionearea-scroll-area .emojibtn img.lazy-emoji { - filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); - opacity: 0; } - .emojionearea .emojionearea-picker.emojionearea-filters-position-top .emojionearea-filters { - top: 0; - -moz-border-radius-topleft: 5px; - -webkit-border-top-left-radius: 5px; - border-top-left-radius: 5px; - -moz-border-radius-topright: 5px; - -webkit-border-top-right-radius: 5px; - border-top-right-radius: 5px; } - .emojionearea .emojionearea-picker.emojionearea-filters-position-top.emojionearea-search-position-top .emojionearea-scroll-area { - bottom: 0; } - .emojionearea .emojionearea-picker.emojionearea-filters-position-top.emojionearea-search-position-bottom .emojionearea-scroll-area { - top: 40px; } - .emojionearea .emojionearea-picker.emojionearea-filters-position-top.emojionearea-search-position-bottom .emojionearea-search-panel { - top: initial; - bottom: 0; } - .emojionearea .emojionearea-picker.emojionearea-filters-position-bottom .emojionearea-filters { - bottom: 0; - -moz-border-radius-bottomleft: 5px; - -webkit-border-bottom-left-radius: 5px; - border-bottom-left-radius: 5px; - -moz-border-radius-bottomright: 5px; - -webkit-border-bottom-right-radius: 5px; - border-bottom-right-radius: 5px; } - .emojionearea .emojionearea-picker.emojionearea-filters-position-bottom.emojionearea-search-position-bottom .emojionearea-scroll-area { - top: 0; } - .emojionearea .emojionearea-picker.emojionearea-filters-position-bottom.emojionearea-search-position-bottom .emojionearea-search-panel { - top: initial; - bottom: 40px; } - .emojionearea .emojionearea-picker.emojionearea-filters-position-bottom.emojionearea-search-position-top .emojionearea-scroll-area { - top: initial; - bottom: 40px; } - .emojionearea .emojionearea-picker.emojionearea-filters-position-bottom.emojionearea-search-position-top .emojionearea-search-panel { - top: 0; } - .emojionearea .emojionearea-picker.emojionearea-picker-position-top { - margin-top: -286px; - right: -14px; } - .emojionearea .emojionearea-picker.emojionearea-picker-position-top .emojionearea-wrapper:after { - width: 19px; - height: 10px; - background-position: -2px -49px; - bottom: -10px; - right: 20px; } - .emojionearea .emojionearea-picker.emojionearea-picker-position-top.emojionearea-filters-position-bottom .emojionearea-wrapper:after { - background-position: -2px -80px; } - .emojionearea .emojionearea-picker.emojionearea-picker-position-left, .emojionearea .emojionearea-picker.emojionearea-picker-position-right { - margin-right: -326px; - top: -8px; } - .emojionearea .emojionearea-picker.emojionearea-picker-position-left .emojionearea-wrapper:after, .emojionearea .emojionearea-picker.emojionearea-picker-position-right .emojionearea-wrapper:after { - width: 10px; - height: 19px; - background-position: 0px -60px; - top: 13px; - left: -10px; } - .emojionearea .emojionearea-picker.emojionearea-picker-position-left.emojionearea-filters-position-bottom .emojionearea-wrapper:after, .emojionearea .emojionearea-picker.emojionearea-picker-position-right.emojionearea-filters-position-bottom .emojionearea-wrapper:after { - background-position: right -60px; } - .emojionearea .emojionearea-picker.emojionearea-picker-position-bottom { - margin-top: 10px; - right: -14px; - top: 47px; } - .emojionearea .emojionearea-picker.emojionearea-picker-position-bottom .emojionearea-wrapper:after { - width: 19px; - height: 10px; - background-position: -2px -100px; - top: -10px; - right: 20px; } - .emojionearea .emojionearea-picker.emojionearea-picker-position-bottom.emojionearea-filters-position-bottom .emojionearea-wrapper:after { - background-position: -2px -90px; } -.emojionearea .emojionearea-button.active + .emojionearea-picker { - filter: progid:DXImageTransform.Microsoft.Alpha(enabled=false); - opacity: 1; } -.emojionearea .emojionearea-button.active + .emojionearea-picker-position-top { - margin-top: -269px; } -.emojionearea .emojionearea-button.active + .emojionearea-picker-position-left, -.emojionearea .emojionearea-button.active + .emojionearea-picker-position-right { - margin-right: -309px; } -.emojionearea .emojionearea-button.active + .emojionearea-picker-position-bottom { - margin-top: -7px; } -.emojionearea.emojionearea-standalone { - display: inline-block; - width: auto; - box-shadow: none; } - .emojionearea.emojionearea-standalone .emojionearea-editor { - min-height: 33px; - position: relative; - padding: 6px 42px 6px 6px; } - .emojionearea.emojionearea-standalone .emojionearea-editor::before { - content: ""; - position: absolute; - top: 4px; - left: 50%; - bottom: 4px; - border-left: 1px solid #e6e6e6; } - .emojionearea.emojionearea-standalone .emojionearea-editor.has-placeholder { - background-repeat: no-repeat; - background-position: 20px 4px; } - .emojionearea.emojionearea-standalone .emojionearea-editor.has-placeholder .emojioneemoji { - opacity: 0.4; } - .emojionearea.emojionearea-standalone .emojionearea-button { - top: 0; - right: 0; - bottom: 0; - left: 0; - width: auto; - height: auto; } - .emojionearea.emojionearea-standalone .emojionearea-button > div { - right: 6px; - top: 5px; } - .emojionearea.emojionearea-standalone .emojionearea-picker.emojionearea-picker-position-bottom .emojionearea-wrapper:after, .emojionearea.emojionearea-standalone .emojionearea-picker.emojionearea-picker-position-top .emojionearea-wrapper:after { - right: 23px; } - .emojionearea.emojionearea-standalone .emojionearea-picker.emojionearea-picker-position-left .emojionearea-wrapper:after, .emojionearea.emojionearea-standalone .emojionearea-picker.emojionearea-picker-position-right .emojionearea-wrapper:after { - top: 15px; } - -.emojionearea .emojionearea-button > div, .emojionearea .emojionearea-picker .emojionearea-wrapper:after { - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAABuCAYAAADMB4ipAAAHfElEQVRo3u1XS1NT2Rb+9uOcQF4YlAJzLymFUHaLrdxKULvEUNpdTnRqD532f+AHMLMc94gqR1Zbt8rBnUh3YXipPGKwRDoWgXvrYiFUlEdIkPPYZ/dAkwox5yQCVt/bzRrBPnt9e+211/etFeDQDu3ArL+/X37OeqmRWoH7+vpItfWawStF1tfXR+zW9xW5ne0p8loOcAKuCdwpRft60C8a+X5zTvebCqcAvmidf1GGHtqhHdpf1qqKzsrKipyensbi4iKWl5cBAMFgEG1tbYhGo2hpadlbmxseHpaDg4MAgI6ODng8HgBAPp/H/Pw8AODatWvo7e2tvUHrui7v3r2L+fl5XL58GVeuXIHH49m1N5/Py0ePHmF0dBQdHR24desWVFXdtYdXAn/48CHm5+dx8+ZNRKPRigEUDpuenpb3799H4YaOnWh5eVmOj48jFoshGo0STdPkwMCAXF5elqV7BgYGpKZpMhqNklgshrGxMbx580Y6gicSCTDGEIvFAADpdBqpVArJZLK4J5lMIpVKIZ1OAwBisRgYY0gkEs6Rp1IphMNh+Hw+AgCGYQAANE0r7in8Xfjm8/lIOBzGq1evnMHX19fR1NRU/D8UCoFzjnA4XFwLh8PgnCMUChXXmpqakM1mUfVBS62xsZHk83lZWi1nz579ZA0AhBDO4A0NDchkMsWSJIRAURRiVy26rktVVUkmk0EgEHAGP3XqFKamppDP56Vpmrhz5w5u374t/X4/OP+w3TRNZLNZ6LoO0zSRz+dlf38/Ll686Jzz8+fPQwiBeDwOt9tNrl+/jkwmU6yaQpVkMhncuHEDbrebxONxCCEQiUScIw8Gg+TBgwdyZGQEyWRSdnV1kVQqJYeGhrC6ugrGGEKhEHp7e3Hy5EmSTCblvXv30NPTg2AwSA6M/vF4HCMjI7b0/yzh8vv9AIBsNrt34aokuQsLC7skt729varkHtqftUFf++FHsrq0QN3eBvp68Tfvf9Mv12oFCYU7G//e9nVuO7dpNbe2W4M//yQr0p8yRvyBo1Zr++lwLcCt7afD/sBRizJGavrB1dDYYh47Htrq+Kb7jBNwxzfdZ44dD201NLaYVUkU7ozQpuAJBkARwnRZpunN5zaa5hJjiXLH05GeiMd7JEM5zzHGNQBGZvk/Iv0yYVWMvK0zKk1Dl6ahW5RQobjqdjy+wEZn9PKF0n2d0csXPL7AhuKq26GECtPQLdPQZVtn1LlB69p7yRVVSEiDEGJwRd12e4+8PR3piRQidnuPvOWKuk0IMSSkwRVV6Np7WVVbSqvGsgSnlKkAFNPQXdrOtuKqcxtcUTUAhmUJnVJmlleJo3CVHmAaOlPUOmYJkxFKibQsSRkXhr4juKIKO2BHVSwcoLrqCVdUYho6K3YYRRWmoUtdey/tgKtK7rUffiQAsLq08MnbNLe2WwBgB/zHzueFyD8nwlIfbvdx8eU0WV1aKD1cVAMs9+F2j9gUPEEKemEJIe3AnXy4XfkBoNKSZHNthWfX31EA69VKttyHVyIOY1wRwmS6tqNsrr31vXo5k/bUu4gT2cp9lhbm0rzCJpeUUrE0vS63+c7/6uXMbDUWl/ssLczNFrVFddUT09AZpUy1LKvO0DVfPrfR9HxqfNbuEe185l9MFX3o6tIC5YpKFLWOfdQQ93Zu49j0+FDCDtjOp1yaOQCYhs4Y40wI05XfWj8yPT40Ua2ey33mEmMTtp2IUEq0nW3FKeJPGPjRp1Iz2QUuLUu66txG9NLVSK3gBZ+C1lcE54oqKOOCK6rm8QU2unu+u1ANuNynvFsBAG1ubbdMQ5eGviMAFDuP0w3sfMpvQEtb24fOQncU1bXl8R7JnOu+ZNv97XxKJwY6+PNPsrm13drObVqUMlMIU5OWpVHOc96Go5lTnV2fzC/VfAozD7HTCa6olBBa1Imlhbmq2lLuQ5xaW6nCPfnln0Yt7bDUhzhps8cfKH5//uTXmvS81OeLdqI/ZoROzSZrHqG/OvOPzxuhK5VgJTvV2bW3EdqJRABwrvvS/kfoSkoZvXT1YEbociHr7vnuYEfogpBFL109HKH/h0fomnXg3Lff79r7/MmvVbWG7gX4QObzc99+Tz7mHKah05KcW6ahQ9feS6cbMCdgt7eBWJagjCuUAC5tZzuouuo0Spm0hElc9R4cbf4bVl8v1p6WUmCuqEwIs34ruxaeeTy4uJVd67As08UVlVmWoG5vA7FLG3WMmHEupVTyW+vh2cn4DADMTsaTuc21LiGEhzHOnQ6gNtMrJSBMCKHkNt999WLi0S7hejEZH81n174WpukiIMw0dKq66p3Bw50RwhUVXFGJKUy28Xal48VkfKrSlWenhsc23q2cEB9SR7iiItwZIbbgHn8AlDFCCMW7laXjqZnHjkNpaubJzNuVpWZCKChjxOMPVH/QlaW0f/G3ZLqWWl6ce/bvlddp7yFD/w8Z+njoX1+GoZMjgzMAMDkyeLAMnRh+uKveJ0YGD4ahEyODFRk6OfrL/hj67GnckaHPng7vjaGzyYmaGDr77KktQ38H8tqx8Wja+WIAAAAASUVORK5CYII=') !important; } - -.emojionearea.emojionearea-standalone .emojionearea-editor.has-placeholder { - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMAQMAAABsu86kAAAABlBMVEUAAAC/v79T5hyIAAAAAXRSTlMAQObYZgAAABNJREFUCNdjYGNgQEb/P4AQqiAASiUEG6Vit44AAAAASUVORK5CYII=') !important; } - -/*# sourceMappingURL=emojionearea.css.map */ diff --git a/cookbook/static/emojionearea/emojionearea.js b/cookbook/static/emojionearea/emojionearea.js deleted file mode 100644 index db2cc8e7..00000000 --- a/cookbook/static/emojionearea/emojionearea.js +++ /dev/null @@ -1,1743 +0,0 @@ -/*! - * EmojioneArea v3.4.1 - * https://github.com/mervick/emojionearea - * Copyright Andrey Izman and other contributors - * Released under the MIT license - * Date: 2018-04-27T09:03Z - */ -window = ( typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {} ); -document = window.document || {}; - -; ( function ( factory, global ) { - if ( typeof require === "function" && typeof exports === "object" && typeof module === "object" ) { - - // CommonJS - factory( require( "jquery" ) ); - } else if ( typeof define === "function" && define.amd ) { - - // AMD - define( [ "jquery" ], factory ); - } else { - - // Normal script tag - factory( global.jQuery ); - } -}( function ( $ ) { - "use strict"; - - var unique = 0; - var eventStorage = {}; - var possibleEvents = {}; - var emojione = window.emojione; - var readyCallbacks = []; - function emojioneReady (fn) { - if (emojione) { - fn(); - } else { - readyCallbacks.push(fn); - } - }; - var blankImg = 'data:image/gif;base64,R0lGODlhAQABAJH/AP///wAAAMDAwAAAACH5BAEAAAIALAAAAAABAAEAAAICVAEAOw=='; - var slice = [].slice; - var css_class = "emojionearea"; - var emojioneSupportMode = 0; - var invisibleChar = '​'; - function trigger(self, event, args) { - var result = true, j = 1; - if (event) { - event = event.toLowerCase(); - do { - var _event = j==1 ? '@' + event : event; - if (eventStorage[self.id][_event] && eventStorage[self.id][_event].length) { - $.each(eventStorage[self.id][_event], function (i, fn) { - return result = fn.apply(self, args|| []) !== false; - }); - } - } while (result && !!j--); - } - return result; - } - function attach(self, element, events, target) { - target = target || function (event, callerEvent) { return $(callerEvent.currentTarget) }; - $.each(events, function(event, link) { - event = $.isArray(events) ? link : event; - (possibleEvents[self.id][link] || (possibleEvents[self.id][link] = [])) - .push([element, event, target]); - }); - } - function getTemplate(template, unicode, shortname) { - var imageType = emojione.imageType, imagePath; - if (imageType=='svg'){ - imagePath = emojione.imagePathSVG; - } else { - imagePath = emojione.imagePathPNG; - } - var friendlyName = ''; - if (shortname) { - friendlyName = shortname.substr(1, shortname.length - 2).replace(/_/g, ' ').replace(/\w\S*/g, function(txt) { return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();}); - } - var fname = ''; - if (unicode.uc_base && emojioneSupportMode > 4) { - fname = unicode.uc_base; - unicode = unicode.uc_output.toUpperCase(); - } else { - fname = unicode; - } - template = template.replace('{name}', shortname || '') - .replace('{friendlyName}', friendlyName) - .replace('{img}', imagePath + (emojioneSupportMode < 2 ? fname.toUpperCase() : fname) + '.' + imageType) - .replace('{uni}', unicode); - - if(shortname) { - template = template.replace('{alt}', emojione.shortnameToUnicode(shortname)); - } else { - template = template.replace('{alt}', emojione.convert(unicode)); - } - - return template; - }; - function shortnameTo(str, template, clear) { - return str.replace(/:?\+?[\w_\-]+:?/g, function(shortname) { - shortname = ":" + shortname.replace(/:$/,'').replace(/^:/,'') + ":"; - var unicode = emojione.emojioneList[shortname]; - if (unicode) { - if (emojioneSupportMode > 4) { - return getTemplate(template, unicode, shortname); - } else { - if (emojioneSupportMode > 3) unicode = unicode.unicode; - return getTemplate(template, unicode[unicode.length-1], shortname); - } - } - return clear ? '' : shortname; - }); - }; - function pasteHtmlAtCaret(html) { - var sel, range; - if (window.getSelection) { - sel = window.getSelection(); - if (sel.getRangeAt && sel.rangeCount) { - range = sel.getRangeAt(0); - range.deleteContents(); - var el = document.createElement("div"); - el.innerHTML = html; - var frag = document.createDocumentFragment(), node, lastNode; - while ( (node = el.firstChild) ) { - lastNode = frag.appendChild(node); - } - range.insertNode(frag); - if (lastNode) { - range = range.cloneRange(); - range.setStartAfter(lastNode); - range.collapse(true); - sel.removeAllRanges(); - sel.addRange(range); - } - } - } else if (document.selection && document.selection.type != "Control") { - document.selection.createRange().pasteHTML(html); - } - } - function getEmojioneVersion() { - return window.emojioneVersion || '3.1.2'; - }; - function isObject(variable) { - return typeof variable === 'object'; - }; - function detectVersion(emojione) { - var version; - if (emojione.cacheBustParam) { - version = emojione.cacheBustParam; - if (!isObject(emojione['jsEscapeMap'])) return '1.5.2'; - if (version === "?v=1.2.4") return '2.0.0'; - if (version === "?v=2.0.1") return '2.1.0'; // v2.0.1 || v2.1.0 - if (version === "?v=2.1.1") return '2.1.1'; - if (version === "?v=2.1.2") return '2.1.2'; - if (version === "?v=2.1.3") return '2.1.3'; - if (version === "?v=2.1.4") return '2.1.4'; - if (version === "?v=2.2.7") return '2.2.7'; - return '2.2.7'; - } else { - return emojione.emojiVersion; - } - }; - function getSupportMode(version) { - switch (version) { - case '1.5.2': return 0; - case '2.0.0': return 1; - case '2.1.0': - case '2.1.1': return 2; - case '2.1.2': return 3; - case '2.1.3': - case '2.1.4': - case '2.2.7': return 4; - case '3.0.1': - case '3.0.2': - case '3.0.3': - case '3.0': return 5; - case '3.1.0': - case '3.1.1': - case '3.1.2': - case '3.1': - default: return 6; - } - }; - function getDefaultOptions () { - if ($.fn.emojioneArea && $.fn.emojioneArea.defaults) { - return $.fn.emojioneArea.defaults; - } - - var defaultOptions = { - attributes: { - dir : "ltr", - spellcheck : false, - autocomplete : "off", - autocorrect : "off", - autocapitalize : "off", - }, - search : true, - placeholder : null, - emojiPlaceholder : ":smiley:", - searchPlaceholder : "SEARCH", - container : null, - hideSource : true, - shortnames : true, - sprite : true, - pickerPosition : "top", // top | bottom | right - filtersPosition : "top", // top | bottom - searchPosition : "top", // top | bottom - hidePickerOnBlur : true, - buttonTitle : "Use the TAB key to insert emoji faster", - tones : true, - tonesStyle : "bullet", // bullet | radio | square | checkbox - inline : null, // null - auto - saveEmojisAs : "unicode", // unicode | shortname | image - shortcuts : true, - autocomplete : true, - autocompleteTones : false, - standalone : false, - useInternalCDN : true, // Use the self loading mechanism - imageType : "png", // Default image type used by internal CDN - recentEmojis : true, - textcomplete: { - maxCount : 15, - placement : null // null - default | top | absleft | absright - } - }; - - var supportMode = !emojione ? getSupportMode(getEmojioneVersion()) : getSupportMode(detectVersion(emojione)); - - if (supportMode > 4) { - defaultOptions.filters = { - tones: { - title: "Diversity", - emoji: "open_hands raised_hands palms_up_together clap pray thumbsup thumbsdown punch fist left_facing_fist right_facing_fist " + - "fingers_crossed v metal love_you_gesture ok_hand point_left point_right point_up_2 point_down point_up raised_hand " + - "raised_back_of_hand hand_splayed vulcan wave call_me muscle middle_finger writing_hand selfie nail_care ear " + - "nose baby boy girl man woman blond-haired_woman blond-haired_man older_man older_woman " + - "man_with_chinese_cap woman_wearing_turban man_wearing_turban woman_police_officer " + - "man_police_officer woman_construction_worker man_construction_worker " + - "woman_guard man_guard woman_detective man_detective woman_health_worker man_health_worker " + - "woman_farmer man_farmer woman_cook man_cook woman_student man_student woman_singer man_singer woman_teacher " + - "man_teacher woman_factory_worker man_factory_worker woman_technologist man_technologist woman_office_worker " + - "man_office_worker woman_mechanic man_mechanic woman_scientist man_scientist woman_artist man_artist " + - "woman_firefighter man_firefighter woman_pilot man_pilot woman_astronaut man_astronaut woman_judge " + - "man_judge mrs_claus santa princess prince bride_with_veil man_in_tuxedo angel pregnant_woman " + - "breast_feeding woman_bowing man_bowing man_tipping_hand woman_tipping_hand " + - "man_gesturing_no woman_gesturing_no man_gesturing_ok woman_gesturing_ok " + - "man_raising_hand woman_raising_hand woman_facepalming man_facepalming " + - "woman_shrugging man_shrugging man_pouting woman_pouting " + - "man_frowning woman_frowning man_getting_haircut woman_getting_haircut " + - "man_getting_face_massage woman_getting_face_massage man_in_business_suit_levitating dancer man_dancing " + - "woman_walking man_walking woman_running man_running adult child older_adult " + - "bearded_person woman_with_headscarf woman_mage man_mage " + - "woman_fairy man_fairy woman_vampire man_vampire mermaid merman woman_elf man_elf " + - "snowboarder woman_lifting_weights man_lifting_weights woman_cartwheeling " + - "man_cartwheeling woman_bouncing_ball man_bouncing_ball " + - "woman_playing_handball man_playing_handball woman_golfing man_golfing " + - "woman_surfing man_surfing woman_swimming man_swimming woman_playing_water_polo " + - "man_playing_water_polo woman_rowing_boat man_rowing_boat " + - "horse_racing woman_biking man_biking woman_mountain_biking " + - "man_mountain_biking woman_juggling man_juggling " + - "woman_in_steamy_room man_in_steamy_room woman_climbing " + - "man_climbing woman_in_lotus_position man_in_lotus_position bath person_in_bed" - }, - - recent: { - icon: "clock3", - title: "Recent", - emoji: "" - }, - - smileys_people: { - icon: "yum", - title: "Smileys & People", - emoji: "grinning smiley smile grin laughing sweat_smile joy rofl relaxed blush innocent slight_smile upside_down " + - "wink relieved crazy_face star_struck heart_eyes kissing_heart kissing kissing_smiling_eyes kissing_closed_eyes yum " + - "stuck_out_tongue_winking_eye stuck_out_tongue_closed_eyes stuck_out_tongue money_mouth hugging nerd sunglasses " + - "cowboy smirk unamused disappointed pensive worried face_with_raised_eyebrow face_with_monocle confused slight_frown " + - "frowning2 persevere confounded tired_face weary triumph angry rage face_with_symbols_over_mouth " + - "no_mouth neutral_face expressionless hushed frowning anguished open_mouth astonished dizzy_face exploding_head flushed scream " + - "fearful cold_sweat cry disappointed_relieved drooling_face sob sweat sleepy sleeping rolling_eyes thinking " + - "shushing_face face_with_hand_over_mouth lying_face grimacing zipper_mouth face_vomiting nauseated_face sneezing_face mask thermometer_face " + - "head_bandage smiling_imp imp japanese_ogre japanese_goblin poop ghost skull skull_crossbones alien space_invader " + - "robot jack_o_lantern clown smiley_cat smile_cat joy_cat heart_eyes_cat smirk_cat kissing_cat scream_cat crying_cat_face " + - "pouting_cat open_hands raised_hands palms_up_together clap pray handshake thumbsup thumbsdown punch fist left_facing_fist " + - "right_facing_fist fingers_crossed v metal love_you_gesture ok_hand point_left point_right point_up_2 point_down point_up " + - "raised_hand raised_back_of_hand hand_splayed vulcan wave call_me muscle middle_finger writing_hand selfie " + - "nail_care ring lipstick kiss lips tongue ear nose footprints eye eyes speaking_head bust_in_silhouette " + - "busts_in_silhouette baby boy girl man woman blond-haired_woman blond_haired_man older_man older_woman " + - "man_with_chinese_cap woman_wearing_turban man_wearing_turban woman_police_officer police_officer " + - "woman_construction_worker construction_worker woman_guard guard woman_detective detective woman_health_worker " + - "man_health_worker woman_farmer man_farmer woman_cook man_cook woman_student man_student woman_singer man_singer " + - "woman_teacher man_teacher woman_factory_worker man_factory_worker woman_technologist man_technologist " + - "woman_office_worker man_office_worker woman_mechanic man_mechanic woman_scientist man_scientist woman_artist " + - "man_artist woman_firefighter man_firefighter woman_pilot man_pilot woman_astronaut man_astronaut woman_judge " + - "man_judge mrs_claus santa princess prince bride_with_veil man_in_tuxedo angel pregnant_woman breast_feeding woman_bowing " + - "man_bowing woman_tipping_hand man_tipping_hand woman_gesturing_no man_gesturing_no woman_gesturing_ok " + - "man_gesturing_ok woman_raising_hand man_raising_hand woman_facepalming man_facepalming woman_shrugging " + - "man_shrugging woman_pouting man_pouting woman_frowning man_frowning woman_getting_haircut man_getting_haircut " + - "woman_getting_face_massage man_getting_face_massage man_in_business_suit_levitating dancer man_dancing women_with_bunny_ears_partying " + - "men_with_bunny_ears_partying woman_walking man_walking woman_running man_running couple two_women_holding_hands " + - "two_men_holding_hands couple_with_heart couple_ww couple_mm couplekiss kiss_ww kiss_mm family family_mwg family_mwgb " + - "family_mwbb family_mwgg family_wwb family_wwg family_wwgb family_wwbb family_wwgg family_mmb family_mmg family_mmgb " + - "family_mmbb family_mmgg family_woman_boy family_woman_girl family_woman_girl_boy family_woman_boy_boy " + - "family_woman_girl_girl family_man_boy family_man_girl family_man_girl_boy family_man_boy_boy family_man_girl_girl " + - "bearded_person woman_with_headscarf woman_mage man_mage woman_fairy man_fairy woman_vampire man_vampire " + - "mermaid merman woman_elf man_elf woman_genie man_genie woman_zombie man_zombie " + - "womans_clothes shirt jeans necktie dress bikini kimono high_heel sandal boot mans_shoe athletic_shoe womans_hat " + - "tophat mortar_board crown helmet_with_cross school_satchel pouch purse handbag briefcase eyeglasses dark_sunglasses " + - "closed_umbrella umbrella2 brain billed_cap scarf gloves coat socks " - }, - - animals_nature: { - icon: "hamster", - title: "Animals & Nature", - emoji: "dog cat mouse hamster rabbit fox bear panda_face koala tiger lion_face cow pig pig_nose frog monkey_face see_no_evil " + - "hear_no_evil speak_no_evil monkey chicken penguin bird baby_chick hatching_chick hatched_chick duck eagle owl bat wolf boar " + - "horse unicorn bee bug butterfly snail shell beetle ant spider spider_web turtle snake lizard scorpion crab squid octopus shrimp " + - "tropical_fish fish blowfish dolphin shark whale whale2 crocodile leopard tiger2 water_buffalo ox cow2 deer dromedary_camel camel " + - "elephant rhino gorilla racehorse pig2 goat ram sheep dog2 poodle cat2 rooster turkey dove rabbit2 mouse2 rat chipmunk dragon " + - "giraffe zebra hedgehog sauropod t_rex cricket dragon_face feet cactus christmas_tree evergreen_tree deciduous_tree palm_tree seedling herb shamrock four_leaf_clover " + - "bamboo tanabata_tree leaves fallen_leaf maple_leaf mushroom ear_of_rice bouquet tulip rose wilted_rose sunflower blossom " + - "cherry_blossom hibiscus earth_americas earth_africa earth_asia full_moon waning_gibbous_moon last_quarter_moon " + - "waning_crescent_moon new_moon waxing_crescent_moon first_quarter_moon waxing_gibbous_moon new_moon_with_face " + - "full_moon_with_face sun_with_face first_quarter_moon_with_face last_quarter_moon_with_face crescent_moon dizzy star star2 " + - "sparkles zap fire boom comet sunny white_sun_small_cloud partly_sunny white_sun_cloud white_sun_rain_cloud rainbow cloud " + - "cloud_rain thunder_cloud_rain cloud_lightning cloud_snow snowman2 snowman snowflake wind_blowing_face dash cloud_tornado " + - "fog ocean droplet sweat_drops umbrella " - }, - - food_drink: { - icon: "pizza", - title: "Food & Drink", - emoji: "green_apple apple pear tangerine lemon banana watermelon grapes strawberry melon cherries peach pineapple kiwi " + - "avocado tomato eggplant cucumber carrot corn hot_pepper potato sweet_potato chestnut peanuts honey_pot croissant " + - "bread french_bread cheese egg cooking bacon pancakes fried_shrimp poultry_leg meat_on_bone pizza hotdog hamburger " + - "fries stuffed_flatbread taco burrito salad shallow_pan_of_food spaghetti ramen stew fish_cake sushi bento curry " + - "rice_ball rice rice_cracker oden dango shaved_ice ice_cream icecream cake birthday custard lollipop candy " + - "chocolate_bar popcorn doughnut cookie milk baby_bottle coffee tea sake beer beers champagne_glass wine_glass " + - "tumbler_glass cocktail tropical_drink champagne spoon fork_and_knife fork_knife_plate dumpling fortune_cookie " + - "takeout_box chopsticks bowl_with_spoon cup_with_straw coconut broccoli pie pretzel cut_of_meat sandwich canned_food" - }, - - activity: { - icon: "basketball", - title: "Activity", - emoji: "soccer basketball football baseball tennis volleyball rugby_football 8ball ping_pong badminton goal hockey field_hockey " + - "cricket_game golf bow_and_arrow fishing_pole_and_fish boxing_glove martial_arts_uniform ice_skate ski skier snowboarder " + - "woman_lifting_weights man_lifting_weights person_fencing women_wrestling men_wrestling woman_cartwheeling " + - "man_cartwheeling woman_bouncing_ball man_bouncing_ball woman_playing_handball man_playing_handball woman_golfing " + - "man_golfing woman_surfing man_surfing woman_swimming man_swimming woman_playing_water_polo " + - "man_playing_water_polo woman_rowing_boat man_rowing_boat horse_racing woman_biking man_biking woman_mountain_biking man_mountain_biking " + - "woman_in_steamy_room man_in_steamy_room woman_climbing man_climbing woman_in_lotus_position man_in_lotus_position " + - "running_shirt_with_sash medal military_medal first_place second_place " + - "third_place trophy rosette reminder_ribbon ticket tickets circus_tent woman_juggling man_juggling performing_arts art " + - "clapper microphone headphones musical_score musical_keyboard drum saxophone trumpet guitar violin game_die dart bowling " + - "video_game slot_machine sled curling_stone " - }, - - travel_places: { - icon: "rocket", - title: "Travel & Places", - emoji: "red_car taxi blue_car bus trolleybus race_car police_car ambulance fire_engine minibus truck articulated_lorry tractor " + - "scooter bike motor_scooter motorcycle rotating_light oncoming_police_car oncoming_bus oncoming_automobile oncoming_taxi " + - "aerial_tramway mountain_cableway suspension_railway railway_car train mountain_railway monorail bullettrain_side " + - "bullettrain_front light_rail steam_locomotive train2 metro tram station helicopter airplane_small airplane " + - "airplane_departure airplane_arriving rocket satellite_orbital seat canoe sailboat motorboat speedboat cruise_ship " + - "ferry ship anchor construction fuelpump busstop vertical_traffic_light traffic_light map moyai statue_of_liberty " + - "fountain tokyo_tower european_castle japanese_castle stadium ferris_wheel roller_coaster carousel_horse beach_umbrella " + - "beach island mountain mountain_snow mount_fuji volcano desert camping tent railway_track motorway construction_site " + - "factory house house_with_garden homes house_abandoned office department_store post_office european_post_office hospital " + - "bank hotel convenience_store school love_hotel wedding classical_building church mosque synagogue kaaba shinto_shrine " + - "japan rice_scene park sunrise sunrise_over_mountains stars sparkler fireworks city_sunset city_dusk cityscape " + - "night_with_stars milky_way bridge_at_night foggy flying_saucer" - }, - - objects: { - icon: "bulb", - title: "Objects", - emoji: "watch iphone calling computer keyboard desktop printer mouse_three_button trackball joystick compression minidisc " + - "floppy_disk cd dvd vhs camera camera_with_flash video_camera movie_camera projector film_frames telephone_receiver " + - "telephone pager fax tv radio microphone2 level_slider control_knobs stopwatch timer alarm_clock clock hourglass " + - "hourglass_flowing_sand satellite battery electric_plug bulb flashlight candle wastebasket oil money_with_wings " + - "dollar yen euro pound moneybag credit_card gem scales wrench hammer hammer_pick tools pick nut_and_bolt gear " + - "chains gun bomb knife dagger crossed_swords shield smoking coffin urn amphora crystal_ball prayer_beads barber " + - "alembic telescope microscope hole pill syringe thermometer toilet potable_water shower bathtub bath bellhop key " + - "key2 door couch bed sleeping_accommodation frame_photo shopping_bags shopping_cart gift balloon flags ribbon " + - "confetti_ball tada dolls izakaya_lantern wind_chime envelope envelope_with_arrow incoming_envelope e-mail " + - "love_letter inbox_tray outbox_tray package label mailbox_closed mailbox mailbox_with_mail mailbox_with_no_mail " + - "postbox postal_horn scroll page_with_curl page_facing_up bookmark_tabs bar_chart chart_with_upwards_trend " + - "chart_with_downwards_trend notepad_spiral calendar_spiral calendar date card_index card_box ballot_box " + - "file_cabinet clipboard file_folder open_file_folder dividers newspaper2 newspaper notebook " + - "notebook_with_decorative_cover ledger closed_book green_book blue_book orange_book books book bookmark link " + - "paperclip paperclips triangular_ruler straight_ruler pushpin round_pushpin scissors pen_ballpoint pen_fountain " + - "black_nib paintbrush crayon pencil pencil2 mag mag_right lock_with_ink_pen closed_lock_with_key lock unlock" - }, - - symbols: { - icon: "heartpulse", - title: "Symbols", - emoji: "heart orange_heart yellow_heart green_heart blue_heart purple_heart black_heart broken_heart heart_exclamation two_hearts " + - "revolving_hearts heartbeat heartpulse sparkling_heart cupid gift_heart heart_decoration peace cross star_and_crescent " + - "om_symbol wheel_of_dharma star_of_david six_pointed_star menorah yin_yang orthodox_cross place_of_worship ophiuchus " + - "aries taurus gemini cancer leo virgo libra scorpius sagittarius capricorn aquarius pisces id atom accept radioactive " + - "biohazard mobile_phone_off vibration_mode u6709 u7121 u7533 u55b6 u6708 eight_pointed_black_star vs white_flower " + - "ideograph_advantage secret congratulations u5408 u6e80 u5272 u7981 a b ab cl o2 sos x o octagonal_sign no_entry " + - "name_badge no_entry_sign 100 anger hotsprings no_pedestrians do_not_litter no_bicycles non-potable_water underage " + - "no_mobile_phones no_smoking exclamation grey_exclamation question grey_question bangbang interrobang low_brightness " + - "high_brightness part_alternation_mark warning children_crossing trident fleur-de-lis beginner recycle " + - "white_check_mark u6307 chart sparkle eight_spoked_asterisk negative_squared_cross_mark globe_with_meridians " + - "diamond_shape_with_a_dot_inside m cyclone zzz atm wc wheelchair parking u7a7a sa passport_control customs " + - "baggage_claim left_luggage mens womens baby_symbol restroom put_litter_in_its_place cinema signal_strength koko " + - "symbols information_source abc abcd capital_abcd ng ok up cool new free zero one two three four five six seven " + - "eight nine keycap_ten 1234 hash asterisk arrow_forward pause_button play_pause stop_button record_button eject " + - "track_next track_previous fast_forward rewind arrow_double_up arrow_double_down arrow_backward arrow_up_small " + - "arrow_down_small arrow_right arrow_left arrow_up arrow_down arrow_upper_right arrow_lower_right arrow_lower_left " + - "arrow_upper_left arrow_up_down left_right_arrow arrow_right_hook leftwards_arrow_with_hook arrow_heading_up " + - "arrow_heading_down twisted_rightwards_arrows repeat repeat_one arrows_counterclockwise arrows_clockwise " + - "musical_note notes heavy_plus_sign heavy_minus_sign heavy_division_sign heavy_multiplication_x heavy_dollar_sign " + - "currency_exchange tm copyright registered wavy_dash curly_loop loop end back on top soon heavy_check_mark " + - "ballot_box_with_check radio_button white_circle black_circle red_circle blue_circle small_red_triangle " + - "small_red_triangle_down small_orange_diamond small_blue_diamond large_orange_diamond large_blue_diamond " + - "white_square_button black_square_button black_small_square white_small_square black_medium_small_square " + - "white_medium_small_square black_medium_square white_medium_square black_large_square white_large_square speaker " + - "mute sound loud_sound bell no_bell mega loudspeaker speech_left eye_in_speech_bubble speech_balloon thought_balloon " + - "anger_right spades clubs hearts diamonds black_joker flower_playing_cards mahjong clock1 clock2 clock3 clock4 clock5 " + - "clock6 clock7 clock8 clock9 clock10 clock11 clock12 clock130 clock230 clock330 clock430 clock530 clock630 " + - "clock730 clock830 clock930 clock1030 clock1130 clock1230" - }, - - flags: { - icon: "flag_gb", - title: "Flags", - emoji: "flag_white flag_black checkered_flag triangular_flag_on_post rainbow_flag flag_af flag_ax flag_al flag_dz flag_as " + - "flag_ad flag_ao flag_ai flag_aq flag_ag flag_ar flag_am flag_aw flag_au flag_at flag_az flag_bs flag_bh flag_bd flag_bb " + - "flag_by flag_be flag_bz flag_bj flag_bm flag_bt flag_bo flag_ba flag_bw flag_br flag_io flag_vg flag_bn flag_bg flag_bf " + - "flag_bi flag_kh flag_cm flag_ca flag_ic flag_cv flag_bq flag_ky flag_cf flag_td flag_cl flag_cn flag_cx flag_cc flag_co " + - "flag_km flag_cg flag_cd flag_ck flag_cr flag_ci flag_hr flag_cu flag_cw flag_cy flag_cz flag_dk flag_dj flag_dm flag_do " + - "flag_ec flag_eg flag_sv flag_gq flag_er flag_ee flag_et flag_eu flag_fk flag_fo flag_fj flag_fi flag_fr flag_gf flag_pf " + - "flag_tf flag_ga flag_gm flag_ge flag_de flag_gh flag_gi flag_gr flag_gl flag_gd flag_gp flag_gu flag_gt flag_gg flag_gn " + - "flag_gw flag_gy flag_ht flag_hn flag_hk flag_hu flag_is flag_in flag_id flag_ir flag_iq flag_ie flag_im flag_il flag_it " + - "flag_jm flag_jp crossed_flags flag_je flag_jo flag_kz flag_ke flag_ki flag_xk flag_kw flag_kg flag_la flag_lv flag_lb " + - "flag_ls flag_lr flag_ly flag_li flag_lt flag_lu flag_mo flag_mk flag_mg flag_mw flag_my flag_mv flag_ml flag_mt flag_mh " + - "flag_mq flag_mr flag_mu flag_yt flag_mx flag_fm flag_md flag_mc flag_mn flag_me flag_ms flag_ma flag_mz flag_mm flag_na " + - "flag_nr flag_np flag_nl flag_nc flag_nz flag_ni flag_ne flag_ng flag_nu flag_nf flag_kp flag_mp flag_no flag_om flag_pk " + - "flag_pw flag_ps flag_pa flag_pg flag_py flag_pe flag_ph flag_pn flag_pl flag_pt flag_pr flag_qa flag_re flag_ro flag_ru " + - "flag_rw flag_ws flag_sm flag_st flag_sa flag_sn flag_rs flag_sc flag_sl flag_sg flag_sx flag_sk flag_si flag_gs flag_sb " + - "flag_so flag_za flag_kr flag_ss flag_es flag_lk flag_bl flag_sh flag_kn flag_lc flag_pm flag_vc flag_sd flag_sr flag_sz " + - "flag_se flag_ch flag_sy flag_tw flag_tj flag_tz flag_th flag_tl flag_tg flag_tk flag_to flag_tt flag_tn flag_tr flag_tm " + - "flag_tc flag_tv flag_vi flag_ug flag_ua flag_ae flag_gb flag_us flag_uy flag_uz flag_vu flag_va flag_ve flag_vn flag_wf " + - "flag_eh flag_ye flag_zm flag_zw flag_ac flag_ta flag_bv flag_hm flag_sj flag_um flag_ea flag_cp flag_dg flag_mf " + - "united_nations england scotland wales" - } - }; - } else { - defaultOptions.filters = { - tones: { - title: "Diversity", - emoji: "santa runner surfer swimmer lifter ear nose point_up_2 point_down point_left point_right punch " + - "wave ok_hand thumbsup thumbsdown clap open_hands boy girl man woman cop bride_with_veil person_with_blond_hair " + - "man_with_gua_pi_mao man_with_turban older_man grandma baby construction_worker princess angel " + - "information_desk_person guardsman dancer nail_care massage haircut muscle spy hand_splayed middle_finger " + - "vulcan no_good ok_woman bow raising_hand raised_hands person_frowning person_with_pouting_face pray rowboat " + - "bicyclist mountain_bicyclist walking bath metal point_up basketball_player fist raised_hand v writing_hand" - }, - - recent: { - icon: "clock3", - title: "Recent", - emoji: "" - }, - - smileys_people: { - icon: "yum", - title: "Smileys & People", - emoji: "grinning grimacing grin joy smiley smile sweat_smile laughing innocent wink blush slight_smile " + - "upside_down relaxed yum relieved heart_eyes kissing_heart kissing kissing_smiling_eyes " + - "kissing_closed_eyes stuck_out_tongue_winking_eye stuck_out_tongue_closed_eyes stuck_out_tongue " + - "money_mouth nerd sunglasses hugging smirk no_mouth neutral_face expressionless unamused rolling_eyes " + - "thinking flushed disappointed worried angry rage pensive confused slight_frown frowning2 persevere " + - "confounded tired_face weary triumph open_mouth scream fearful cold_sweat hushed frowning anguished " + - "cry disappointed_relieved sleepy sweat sob dizzy_face astonished zipper_mouth mask thermometer_face " + - "head_bandage sleeping zzz poop smiling_imp imp japanese_ogre japanese_goblin skull ghost alien robot " + - "smiley_cat smile_cat joy_cat heart_eyes_cat smirk_cat kissing_cat scream_cat crying_cat_face " + - "pouting_cat raised_hands clap wave thumbsup thumbsdown punch fist v ok_hand raised_hand open_hands " + - "muscle pray point_up point_up_2 point_down point_left point_right middle_finger hand_splayed metal " + - "vulcan writing_hand nail_care lips tongue ear nose eye eyes bust_in_silhouette busts_in_silhouette " + - "speaking_head baby boy girl man woman person_with_blond_hair older_man older_woman man_with_gua_pi_mao " + - "man_with_turban cop construction_worker guardsman spy santa angel princess bride_with_veil walking " + - "runner dancer dancers couple two_men_holding_hands two_women_holding_hands bow information_desk_person " + - "no_good ok_woman raising_hand person_with_pouting_face person_frowning haircut massage couple_with_heart " + - "couple_ww couple_mm couplekiss kiss_ww kiss_mm family family_mwg family_mwgb family_mwbb family_mwgg " + - "family_wwb family_wwg family_wwgb family_wwbb family_wwgg family_mmb family_mmg family_mmgb family_mmbb " + - "family_mmgg womans_clothes shirt jeans necktie dress bikini kimono lipstick kiss footprints high_heel " + - "sandal boot mans_shoe athletic_shoe womans_hat tophat helmet_with_cross mortar_board crown school_satchel " + - "pouch purse handbag briefcase eyeglasses dark_sunglasses ring closed_umbrella" - }, - - animals_nature: { - icon: "hamster", - title: "Animals & Nature", - emoji: "dog cat mouse hamster rabbit bear panda_face koala tiger lion_face cow pig pig_nose frog " + - "octopus monkey_face see_no_evil hear_no_evil speak_no_evil monkey chicken penguin bird baby_chick " + - "hatching_chick hatched_chick wolf boar horse unicorn bee bug snail beetle ant spider scorpion crab " + - "snake turtle tropical_fish fish blowfish dolphin whale whale2 crocodile leopard tiger2 water_buffalo " + - "ox cow2 dromedary_camel camel elephant goat ram sheep racehorse pig2 rat mouse2 rooster turkey dove " + - "dog2 poodle cat2 rabbit2 chipmunk feet dragon dragon_face cactus christmas_tree evergreen_tree " + - "deciduous_tree palm_tree seedling herb shamrock four_leaf_clover bamboo tanabata_tree leaves " + - "fallen_leaf maple_leaf ear_of_rice hibiscus sunflower rose tulip blossom cherry_blossom bouquet " + - "mushroom chestnut jack_o_lantern shell spider_web earth_americas earth_africa earth_asia full_moon " + - "waning_gibbous_moon last_quarter_moon waning_crescent_moon new_moon waxing_crescent_moon " + - "first_quarter_moon waxing_gibbous_moon new_moon_with_face full_moon_with_face first_quarter_moon_with_face " + - "last_quarter_moon_with_face sun_with_face crescent_moon star star2 dizzy sparkles comet sunny " + - "white_sun_small_cloud partly_sunny white_sun_cloud white_sun_rain_cloud cloud cloud_rain " + - "thunder_cloud_rain cloud_lightning zap fire boom snowflake cloud_snow snowman2 snowman wind_blowing_face " + - "dash cloud_tornado fog umbrella2 umbrella droplet sweat_drops ocean" - }, - - food_drink: { - icon: "pizza", - title: "Food & Drink", - emoji: "green_apple apple pear tangerine lemon banana watermelon grapes strawberry melon cherries peach " + - "pineapple tomato eggplant hot_pepper corn sweet_potato honey_pot bread cheese poultry_leg meat_on_bone " + - "fried_shrimp egg hamburger fries hotdog pizza spaghetti taco burrito ramen stew fish_cake sushi bento " + - "curry rice_ball rice rice_cracker oden dango shaved_ice ice_cream icecream cake birthday custard candy " + - "lollipop chocolate_bar popcorn doughnut cookie beer beers wine_glass cocktail tropical_drink champagne " + - "sake tea coffee baby_bottle fork_and_knife fork_knife_plate" - }, - - activity: { - icon: "basketball", - title: "Activity", - emoji: "soccer basketball football baseball tennis volleyball rugby_football 8ball golf golfer ping_pong " + - "badminton hockey field_hockey cricket ski skier snowboarder ice_skate bow_and_arrow fishing_pole_and_fish " + - "rowboat swimmer surfer bath basketball_player lifter bicyclist mountain_bicyclist horse_racing levitate " + - "trophy running_shirt_with_sash medal military_medal reminder_ribbon rosette ticket tickets performing_arts " + - "art circus_tent microphone headphones musical_score musical_keyboard saxophone trumpet guitar violin " + - "clapper video_game space_invader dart game_die slot_machine bowling" - }, - - travel_places: { - icon: "rocket", - title: "Travel & Places", - emoji: "red_car taxi blue_car bus trolleybus race_car police_car ambulance fire_engine minibus truck " + - "articulated_lorry tractor motorcycle bike rotating_light oncoming_police_car oncoming_bus " + - "oncoming_automobile oncoming_taxi aerial_tramway mountain_cableway suspension_railway railway_car " + - "train monorail bullettrain_side bullettrain_front light_rail mountain_railway steam_locomotive train2 " + - "metro tram station helicopter airplane_small airplane airplane_departure airplane_arriving sailboat " + - "motorboat speedboat ferry cruise_ship rocket satellite_orbital seat anchor construction fuelpump busstop " + - "vertical_traffic_light traffic_light checkered_flag ship ferris_wheel roller_coaster carousel_horse " + - "construction_site foggy tokyo_tower factory fountain rice_scene mountain mountain_snow mount_fuji volcano " + - "japan camping tent park motorway railway_track sunrise sunrise_over_mountains desert beach island " + - "city_sunset city_dusk cityscape night_with_stars bridge_at_night milky_way stars sparkler fireworks " + - "rainbow homes european_castle japanese_castle stadium statue_of_liberty house house_with_garden " + - "house_abandoned office department_store post_office european_post_office hospital bank hotel " + - "convenience_store school love_hotel wedding classical_building church mosque synagogue kaaba shinto_shrine" - }, - - objects: { - icon: "bulb", - title: "Objects", - emoji: "watch iphone calling computer keyboard desktop printer mouse_three_button trackball joystick " + - "compression minidisc floppy_disk cd dvd vhs camera camera_with_flash video_camera movie_camera projector " + - "film_frames telephone_receiver telephone pager fax tv radio microphone2 level_slider control_knobs " + - "stopwatch timer alarm_clock clock hourglass_flowing_sand hourglass satellite battery electric_plug bulb " + - "flashlight candle wastebasket oil money_with_wings dollar yen euro pound moneybag credit_card gem scales " + - "wrench hammer hammer_pick tools pick nut_and_bolt gear chains gun bomb knife dagger crossed_swords shield " + - "smoking skull_crossbones coffin urn amphora crystal_ball prayer_beads barber alembic telescope microscope " + - "hole pill syringe thermometer label bookmark toilet shower bathtub key key2 couch sleeping_accommodation " + - "bed door bellhop frame_photo map beach_umbrella moyai shopping_bags balloon flags ribbon gift confetti_ball " + - "tada dolls wind_chime crossed_flags izakaya_lantern envelope envelope_with_arrow incoming_envelope e-mail " + - "love_letter postbox mailbox_closed mailbox mailbox_with_mail mailbox_with_no_mail package postal_horn " + - "inbox_tray outbox_tray scroll page_with_curl bookmark_tabs bar_chart chart_with_upwards_trend " + - "chart_with_downwards_trend page_facing_up date calendar calendar_spiral card_index card_box ballot_box " + - "file_cabinet clipboard notepad_spiral file_folder open_file_folder dividers newspaper2 newspaper notebook " + - "closed_book green_book blue_book orange_book notebook_with_decorative_cover ledger books book link " + - "paperclip paperclips scissors triangular_ruler straight_ruler pushpin round_pushpin triangular_flag_on_post " + - "flag_white flag_black closed_lock_with_key lock unlock lock_with_ink_pen pen_ballpoint pen_fountain " + - "black_nib pencil pencil2 crayon paintbrush mag mag_right" - }, - - symbols: { - icon: "heartpulse", - title: "Symbols", - emoji: "heart yellow_heart green_heart blue_heart purple_heart broken_heart heart_exclamation two_hearts " + - "revolving_hearts heartbeat heartpulse sparkling_heart cupid gift_heart heart_decoration peace cross " + - "star_and_crescent om_symbol wheel_of_dharma star_of_david six_pointed_star menorah yin_yang orthodox_cross " + - "place_of_worship ophiuchus aries taurus gemini cancer leo virgo libra scorpius sagittarius capricorn " + - "aquarius pisces id atom u7a7a u5272 radioactive biohazard mobile_phone_off vibration_mode u6709 u7121 " + - "u7533 u55b6 u6708 eight_pointed_black_star vs accept white_flower ideograph_advantage secret congratulations " + - "u5408 u6e80 u7981 a b ab cl o2 sos no_entry name_badge no_entry_sign x o anger hotsprings no_pedestrians " + - "do_not_litter no_bicycles non-potable_water underage no_mobile_phones exclamation grey_exclamation question " + - "grey_question bangbang interrobang 100 low_brightness high_brightness trident fleur-de-lis part_alternation_mark " + - "warning children_crossing beginner recycle u6307 chart sparkle eight_spoked_asterisk negative_squared_cross_mark " + - "white_check_mark diamond_shape_with_a_dot_inside cyclone loop globe_with_meridians m atm sa passport_control " + - "customs baggage_claim left_luggage wheelchair no_smoking wc parking potable_water mens womens baby_symbol " + - "restroom put_litter_in_its_place cinema signal_strength koko ng ok up cool new free zero one two three four " + - "five six seven eight nine ten 1234 arrow_forward pause_button play_pause stop_button record_button track_next " + - "track_previous fast_forward rewind twisted_rightwards_arrows repeat repeat_one arrow_backward arrow_up_small " + - "arrow_down_small arrow_double_up arrow_double_down arrow_right arrow_left arrow_up arrow_down arrow_upper_right " + - "arrow_lower_right arrow_lower_left arrow_upper_left arrow_up_down left_right_arrow arrows_counterclockwise " + - "arrow_right_hook leftwards_arrow_with_hook arrow_heading_up arrow_heading_down hash asterisk information_source " + - "abc abcd capital_abcd symbols musical_note notes wavy_dash curly_loop heavy_check_mark arrows_clockwise " + - "heavy_plus_sign heavy_minus_sign heavy_division_sign heavy_multiplication_x heavy_dollar_sign currency_exchange " + - "copyright registered tm end back on top soon ballot_box_with_check radio_button white_circle black_circle " + - "red_circle large_blue_circle small_orange_diamond small_blue_diamond large_orange_diamond large_blue_diamond " + - "small_red_triangle black_small_square white_small_square black_large_square white_large_square small_red_triangle_down " + - "black_medium_square white_medium_square black_medium_small_square white_medium_small_square black_square_button " + - "white_square_button speaker sound loud_sound mute mega loudspeaker bell no_bell black_joker mahjong spades " + - "clubs hearts diamonds flower_playing_cards thought_balloon anger_right speech_balloon clock1 clock2 clock3 " + - "clock4 clock5 clock6 clock7 clock8 clock9 clock10 clock11 clock12 clock130 clock230 clock330 clock430 " + - "clock530 clock630 clock730 clock830 clock930 clock1030 clock1130 clock1230 eye_in_speech_bubble" - }, - - flags: { - icon: "flag_gb", - title: "Flags", - emoji: "ac af al dz ad ao ai ag ar am aw au at az bs bh bd bb by be bz bj bm bt bo ba bw br bn bg bf bi " + - "cv kh cm ca ky cf td flag_cl cn co km cg flag_cd cr hr cu cy cz dk dj dm do ec eg sv gq er ee et fk fo " + - "fj fi fr pf ga gm ge de gh gi gr gl gd gu gt gn gw gy ht hn hk hu is in flag_id ir iq ie il it ci jm jp " + - "je jo kz ke ki xk kw kg la lv lb ls lr ly li lt lu mo mk mg mw my mv ml mt mh mr mu mx fm md mc mn me " + - "ms ma mz mm na nr np nl nc nz ni ne flag_ng nu kp no om pk pw ps pa pg py pe ph pl pt pr qa ro ru rw " + - "sh kn lc vc ws sm st flag_sa sn rs sc sl sg sk si sb so za kr es lk sd sr sz se ch sy tw tj tz th tl " + - "tg to tt tn tr flag_tm flag_tm ug ua ae gb us vi uy uz vu va ve vn wf eh ye zm zw re ax ta io bq cx " + - "cc gg im yt nf pn bl pm gs tk bv hm sj um ic ea cp dg as aq vg ck cw eu gf tf gp mq mp sx ss tc " - } - }; - }; - - return defaultOptions; - }; - function getOptions(options) { - var default_options = getDefaultOptions(); - if (options && options['filters']) { - var filters = default_options.filters; - $.each(options['filters'], function(filter, data) { - if (!isObject(data) || $.isEmptyObject(data)) { - delete filters[filter]; - return; - } - $.each(data, function(key, val) { - filters[filter][key] = val; - }); - }); - options['filters'] = filters; - } - return $.extend({}, default_options, options); - }; - - var saveSelection, restoreSelection; - if (window.getSelection && document.createRange) { - saveSelection = function(el) { - var sel = window.getSelection && window.getSelection(); - if (sel && sel.rangeCount > 0) { - return sel.getRangeAt(0); - } - }; - - restoreSelection = function(el, sel) { - var range = document.createRange(); - range.setStart(sel.startContainer, sel.startOffset); - range.setEnd(sel.endContainer, sel.endOffset) - - sel = window.getSelection(); - sel.removeAllRanges(); - sel.addRange(range); - } - } else if (document.selection && document.body.createTextRange) { - saveSelection = function(el) { - return document.selection.createRange(); - }; - - restoreSelection = function(el, sel) { - var textRange = document.body.createTextRange(); - textRange.moveToElementText(el); - textRange.setStart(sel.startContanier, sel.startOffset); - textRange.setEnd(sel.endContainer, sel.endOffset); - textRange.select(); - }; - } - - - var uniRegexp; - function unicodeTo(str, template) { - return str.replace(uniRegexp, function(unicodeChar) { - var map = emojione[(emojioneSupportMode === 0 ? 'jsecapeMap' : 'jsEscapeMap')]; - if (typeof unicodeChar !== 'undefined' && unicodeChar in map) { - return getTemplate(template, map[unicodeChar], emojione.toShort(unicodeChar)); - } - return unicodeChar; - }); - } - function htmlFromText(str, self) { - str = str - .replace(/&/g, '&') - .replace(//g, '>') - .replace(/"/g, '"') - .replace(/'/g, ''') - .replace(/`/g, '`') - .replace(/(?:\r\n|\r|\n)/g, '\n') - .replace(/(\n+)/g, '
$1
') - .replace(/\n/g, '
') - .replace(/<\/div>/g, ''); - if (self.shortnames) { - str = emojione.shortnameToUnicode(str); - } - return unicodeTo(str, self.emojiTemplate) - .replace(/\t/g, '    ') - .replace(/ /g, '  '); - } - function textFromHtml(str, self) { - str = str - .replace(/ /g, '\n') - .replace(/ /g, '\t') - .replace(/]*alt="([^"]+)"[^>]*>/ig, '$1') - .replace(/\n|\r/g, '') - .replace(/]*>/ig, '\n') - .replace(/(?:<(?:div|p|ol|ul|li|pre|code|object)[^>]*>)+/ig, '
') - .replace(/(?:<\/(?:div|p|ol|ul|li|pre|code|object)>)+/ig, '
') - .replace(/\n
<\/div>/ig, '\n') - .replace(/
<\/div>\n/ig, '\n') - .replace(/(?:
)+<\/div>/ig, '\n') - .replace(/([^\n])<\/div>
/ig, '$1\n') - .replace(/(?:<\/div>)+/ig, '
') - .replace(/([^\n])<\/div>([^\n])/ig, '$1\n$2') - .replace(/<\/div>/ig, '') - .replace(/([^\n])
/ig, '$1\n') - .replace(/\n
/ig, '\n') - .replace(/
\n/ig, '\n\n') - .replace(/<(?:[^>]+)?>/g, '') - .replace(new RegExp(invisibleChar, 'g'), '') - .replace(/ /g, ' ') - .replace(/</g, '<') - .replace(/>/g, '>') - .replace(/"/g, '"') - .replace(/'/g, "'") - .replace(/`/g, '`') - .replace(/</g, '<') - .replace(/>/g, '>') - .replace(/&/g, '&'); - - switch (self.saveEmojisAs) { - case 'image': - str = unicodeTo(str, self.emojiTemplate); - break; - case 'shortname': - str = emojione.toShort(str); - } - return str; - } - function calcButtonPosition() { - var self = this, - offset = self.editor[0].offsetWidth - self.editor[0].clientWidth, - current = parseInt(self.button.css('marginRight')); - if (current !== offset) { - self.button.css({marginRight: offset}); - if (self.floatingPicker) { - self.picker.css({right: parseInt(self.picker.css('right')) - current + offset}); - } - } - } - function lazyLoading() { - var self = this; - if (!self.sprite && self.lasyEmoji[0] && self.lasyEmoji.eq(0).is(".lazy-emoji")) { - var pickerTop = self.picker.offset().top, - pickerBottom = pickerTop + self.picker.height() + 20; - - self.lasyEmoji.each(function() { - var e = $(this), top = e.offset().top; - - if (top > pickerTop && top < pickerBottom) { - e.attr("src", e.data("src")).removeClass("lazy-emoji"); - } - - if (top > pickerBottom) { - return false; - } - }); - self.lasyEmoji = self.lasyEmoji.filter(".lazy-emoji"); - } - }; - function selector (prefix, skip_dot) { - return (skip_dot ? '' : '.') + css_class + (prefix ? ("-" + prefix) : ""); - } - function div(prefix) { - var parent = $('
', isObject(prefix) ? prefix : {"class" : selector(prefix, true)}); - $.each(slice.call(arguments).slice(1), function(i, child) { - if ($.isFunction(child)) { - child = child.call(parent); - } - if (child) { - $(child).appendTo(parent); - } - }); - return parent; - } - function getRecent () { - return localStorage.getItem("recent_emojis") || ""; - } - function updateRecent(self, show) { - var emojis = getRecent(); - if (!self.recent || self.recent !== emojis || show) { - if (emojis.length) { - var skinnable = self.scrollArea.is(".skinnable"), - scrollTop, height; - - if (!skinnable) { - scrollTop = self.scrollArea.scrollTop(); - if (show) { - self.recentCategory.show(); - } - height = self.recentCategory.is(":visible") ? self.recentCategory.height() : 0; - } - - var items = shortnameTo(emojis, self.emojiBtnTemplate, true).split('|').join(''); - self.recentCategory.children(".emojibtn").remove(); - $(items).insertAfter(self.recentCategory.children(".emojionearea-category-title")); - - - self.recentCategory.children(".emojibtn").on("click", function() { - self.trigger("emojibtn.click", $(this)); - }); - - self.recentFilter.show(); - - if (!skinnable) { - self.recentCategory.show(); - - var height2 = self.recentCategory.height(); - - if (height !== height2) { - self.scrollArea.scrollTop(scrollTop + height2 - height); - } - } - } else { - if (self.recentFilter.hasClass("active")) { - self.recentFilter.removeClass("active").next().addClass("active"); - } - self.recentCategory.hide(); - self.recentFilter.hide(); - } - self.recent = emojis; - } - }; - function setRecent(self, emoji) { - var recent = getRecent(); - var emojis = recent.split("|"); - - var index = emojis.indexOf(emoji); - if (index !== -1) { - emojis.splice(index, 1); - } - emojis.unshift(emoji); - - if (emojis.length > 9) { - emojis.pop(); - } - - localStorage.setItem("recent_emojis", emojis.join("|")); - - updateRecent(self); - }; -// see https://github.com/Modernizr/Modernizr/blob/master/feature-detects/storage/localstorage.js - function supportsLocalStorage () { - var test = 'test'; - try { - localStorage.setItem(test, test); - localStorage.removeItem(test); - return true; - } catch(e) { - return false; - } - } - function init(self, source, options) { - //calcElapsedTime('init', function() { - self.options = options = getOptions(options); - self.sprite = options.sprite && emojioneSupportMode < 3; - self.inline = options.inline === null ? source.is("INPUT") : options.inline; - self.shortnames = options.shortnames; - self.saveEmojisAs = options.saveEmojisAs; - self.standalone = options.standalone; - self.emojiTemplate = '{alt}' : 'emoji" src="{img}"/>'); - self.emojiTemplateAlt = self.sprite ? '' : ''; - self.emojiBtnTemplate = '' + self.emojiTemplateAlt + ''; - self.recentEmojis = options.recentEmojis && supportsLocalStorage(); - - var pickerPosition = options.pickerPosition; - self.floatingPicker = pickerPosition === 'top' || pickerPosition === 'bottom'; - self.source = source; - - if (source.is(":disabled") || source.is(".disabled")) { - self.disable(); - } - - var sourceValFunc = source.is("TEXTAREA") || source.is("INPUT") ? "val" : "text", - editor, button, picker, filters, filtersBtns, searchPanel, emojisList, categories, categoryBlocks, scrollArea, - tones = div('tones', - options.tones ? - function() { - this.addClass(selector('tones-' + options.tonesStyle, true)); - for (var i = 0; i <= 5; i++) { - this.append($("", { - "class": "btn-tone btn-tone-" + i + (!i ? " active" : ""), - "data-skin": i, - role: "button" - })); - } - } : null - ), - app = div({ - "class" : css_class + ((self.standalone) ? " " + css_class + "-standalone " : " ") + (source.attr("class") || ""), - role: "application" - }, - editor = self.editor = div("editor").attr({ - contenteditable: (self.standalone) ? false : true, - placeholder: options.placeholder || source.data("placeholder") || source.attr("placeholder") || "", - tabindex: 0 - }), - button = self.button = div('button', - div('button-open'), - div('button-close') - ).attr('title', options.buttonTitle), - picker = self.picker = div('picker', - div('wrapper', - filters = div('filters'), - (options.search ? - searchPanel = div('search-panel', - div('search', - options.search ? - function() { - self.search = $("", { - "placeholder": options.searchPlaceholder || "", - "type": "text", - "class": "search" - }); - this.append(self.search); - } : null - ), - tones - ) : null - ), - scrollArea = div('scroll-area', - options.tones && !options.search ? div('tones-panel', - tones - ) : null, - emojisList = div('emojis-list') - ) - ) - ).addClass(selector('picker-position-' + options.pickerPosition, true)) - .addClass(selector('filters-position-' + options.filtersPosition, true)) - .addClass(selector('search-position-' + options.searchPosition, true)) - .addClass('hidden') - ); - - if (options.search) { - searchPanel.addClass(selector('with-search', true)); - } - - self.searchSel = null; - - editor.data(source.data()); - - $.each(options.attributes, function(attr, value) { - editor.attr(attr, value); - }); - - var mainBlock = div('category-block').attr({"data-tone": 0}).prependTo(emojisList); - - $.each(options.filters, function(filter, params) { - var skin = 0; - if (filter === 'recent' && !self.recentEmojis) { - return; - } - if (filter !== 'tones') { - $("", { - "class": selector("filter", true) + " " + selector("filter-" + filter, true), - "data-filter": filter, - title: params.title - }) - .wrapInner(shortnameTo(params.icon, self.emojiTemplateAlt)) - .appendTo(filters); - } else if (options.tones) { - skin = 5; - } else { - return; - } - - do { - var category, - items = params.emoji.replace(/[\s,;]+/g, '|'); - - if (skin === 0) { - category = div('category').attr({ - name: filter, - "data-tone": skin - }).appendTo(mainBlock); - } else { - category = div('category-block').attr({ - name: filter, - "data-tone": skin - }).appendTo(emojisList); - } - - if (skin > 0) { - category.hide(); - items = items.split('|').join('_tone' + skin + '|') + '_tone' + skin; - } - - if (filter === 'recent') { - items = getRecent(); - } - - items = shortnameTo(items, - self.sprite ? - '' : - '', - true).split('|').join(''); - - category.html(items); - $('
').text(params.title).prependTo(category); - } while (--skin > 0); - }); - - options.filters = null; - if (!self.sprite) { - self.lasyEmoji = emojisList.find(".lazy-emoji"); - } - - filtersBtns = filters.find(selector("filter")); - filtersBtns.eq(0).addClass("active"); - categoryBlocks = emojisList.find(selector("category-block")) - categories = emojisList.find(selector("category")) - - self.recentFilter = filtersBtns.filter('[data-filter="recent"]'); - self.recentCategory = categories.filter("[name=recent]"); - - self.scrollArea = scrollArea; - - if (options.container) { - $(options.container).wrapInner(app); - } else { - app.insertAfter(source); - } - - if (options.hideSource) { - source.hide(); - } - - self.setText(source[sourceValFunc]()); - source[sourceValFunc](self.getText()); - calcButtonPosition.apply(self); - - // if in standalone mode and no value is set, initialise with a placeholder - if (self.standalone && !self.getText().length) { - var placeholder = $(source).data("emoji-placeholder") || options.emojiPlaceholder; - self.setText(placeholder); - editor.addClass("has-placeholder"); - } - - // attach() must be called before any .on() methods !!! - // 1) attach() stores events into possibleEvents{}, - // 2) .on() calls bindEvent() and stores handlers into eventStorage{}, - // 3) bindEvent() finds events in possibleEvents{} and bind founded via jQuery.on() - // 4) attached events via jQuery.on() calls trigger() - // 5) trigger() calls handlers stored into eventStorage{} - - attach(self, emojisList.find(".emojibtn"), {click: "emojibtn.click"}); - attach(self, window, {resize: "!resize"}); - attach(self, tones.children(), {click: "tone.click"}); - attach(self, [picker, button], {mousedown: "!mousedown"}, editor); - attach(self, button, {click: "button.click"}); - attach(self, editor, {paste :"!paste"}, editor); - attach(self, editor, ["focus", "blur"], function() { return self.stayFocused ? false : editor; } ); - attach(self, picker, {mousedown: "picker.mousedown", mouseup: "picker.mouseup", click: "picker.click", - keyup: "picker.keyup", keydown: "picker.keydown", keypress: "picker.keypress"}); - attach(self, editor, ["mousedown", "mouseup", "click", "keyup", "keydown", "keypress"]); - attach(self, picker.find(".emojionearea-filter"), {click: "filter.click"}); - attach(self, source, {change: "source.change"}); - - if (options.search) { - attach(self, self.search, {keyup: "search.keypress", focus: "search.focus", blur: "search.blur"}); - } - - var noListenScroll = false; - scrollArea.on('scroll', function () { - if (!noListenScroll) { - lazyLoading.call(self); - if (scrollArea.is(":not(.skinnable)")) { - var item = categories.eq(0), scrollTop = scrollArea.offset().top; - categories.each(function (i, e) { - if ($(e).offset().top - scrollTop >= 10) { - return false; - } - item = $(e); - }); - var filter = filtersBtns.filter('[data-filter="' + item.attr("name") + '"]'); - if (filter[0] && !filter.is(".active")) { - filtersBtns.removeClass("active"); - filter.addClass("active"); - } - } - } - }); - - self.on("@filter.click", function(filter) { - var isActive = filter.is(".active"); - if (scrollArea.is(".skinnable")) { - if (isActive) return; - tones.children().eq(0).click(); - } - noListenScroll = true; - if (!isActive) { - filtersBtns.filter(".active").removeClass("active"); - filter.addClass("active"); - } - var headerOffset = categories.filter('[name="' + filter.data('filter') + '"]').offset().top, - scroll = scrollArea.scrollTop(), - offsetTop = scrollArea.offset().top; - - scrollArea.stop().animate({ - scrollTop: headerOffset + scroll - offsetTop - 2 - }, 200, 'swing', function () { - lazyLoading.call(self); - noListenScroll = false; - }); - }) - - .on("@picker.show", function() { - if (self.recentEmojis) { - updateRecent(self); - } - lazyLoading.call(self); - }) - - .on("@tone.click", function(tone) { - tones.children().removeClass("active"); - var skin = tone.addClass("active").data("skin"); - if (skin) { - scrollArea.addClass("skinnable"); - categoryBlocks.hide().filter("[data-tone=" + skin + "]").show(); - filtersBtns.removeClass("active");//.not('[data-filter="recent"]').eq(0).addClass("active"); - } else { - scrollArea.removeClass("skinnable"); - categoryBlocks.hide().filter("[data-tone=0]").show(); - filtersBtns.eq(0).click(); - } - lazyLoading.call(self); - if (options.search) { - self.trigger('search.keypress'); - } - }) - - .on("@button.click", function(button) { - if (button.is(".active")) { - self.hidePicker(); - } else { - self.showPicker(); - self.searchSel = null; - } - }) - - .on("@!paste", function(editor, event) { - - var pasteText = function(text) { - var caretID = "caret-" + (new Date()).getTime(); - var html = htmlFromText(text, self); - pasteHtmlAtCaret(html); - pasteHtmlAtCaret(''); - editor.scrollTop(editorScrollTop); - var caret = $("#" + caretID), - top = caret.offset().top - editor.offset().top, - height = editor.height(); - if (editorScrollTop + top >= height || editorScrollTop > top) { - editor.scrollTop(editorScrollTop + top - 2 * height/3); - } - caret.remove(); - self.stayFocused = false; - calcButtonPosition.apply(self); - trigger(self, 'paste', [editor, text, html]); - }; - - if (event.originalEvent.clipboardData) { - var text = event.originalEvent.clipboardData.getData('text/plain'); - pasteText(text); - - if (event.preventDefault){ - event.preventDefault(); - } else { - event.stop(); - } - - event.returnValue = false; - event.stopPropagation(); - return false; - } - - self.stayFocused = true; - // insert invisible character for fix caret position - pasteHtmlAtCaret('' + invisibleChar + ''); - - var sel = saveSelection(editor[0]), - editorScrollTop = editor.scrollTop(), - clipboard = $("
", {contenteditable: true}) - .css({position: "fixed", left: "-999px", width: "1px", height: "1px", top: "20px", overflow: "hidden"}) - .appendTo($("BODY")) - .focus(); - - window.setTimeout(function() { - editor.focus(); - restoreSelection(editor[0], sel); - var text = textFromHtml(clipboard.html().replace(/\r\n|\n|\r/g, '
'), self); - clipboard.remove(); - pasteText(text); - }, 200); - }) - - .on("@emojibtn.click", function(emojibtn) { - editor.removeClass("has-placeholder"); - - if (self.searchSel !== null) { - editor.focus(); - restoreSelection(editor[0], self.searchSel); - self.searchSel = null; - } - - if (self.standalone) { - editor.html(shortnameTo(emojibtn.data("name"), self.emojiTemplate)); - self.trigger("blur"); - } else { - saveSelection(editor[0]); - pasteHtmlAtCaret(shortnameTo(emojibtn.data("name"), self.emojiTemplate)); - } - - if (self.recentEmojis) { - setRecent(self, emojibtn.data("name")); - } - - // self.search.val('').trigger("change"); - self.trigger('search.keypress'); - }) - - .on("@!resize @keyup @emojibtn.click", calcButtonPosition) - - .on("@!mousedown", function(editor, event) { - if ($(event.target).hasClass('search')) { - // Allow search clicks - self.stayFocused = true; - if (self.searchSel === null) { - self.searchSel = saveSelection(editor[0]); - } - } else { - if (!app.is(".focused")) { - editor.trigger("focus"); - } - event.preventDefault(); - } - return false; - }) - - .on("@change", function() { - var html = self.editor.html().replace(/<\/?(?:div|span|p)[^>]*>/ig, ''); - // clear input: chrome adds
when contenteditable is empty - if (!html.length || /^]*>$/i.test(html)) { - self.editor.html(self.content = ''); - } - source[sourceValFunc](self.getText()); - }) - - .on("@source.change", function() { - self.setText(source[sourceValFunc]()); - trigger('change'); - }) - - .on("@focus", function() { - app.addClass("focused"); - }) - - .on("@blur", function() { - app.removeClass("focused"); - - if (options.hidePickerOnBlur) { - self.hidePicker(); - } - - var content = self.editor.html(); - if (self.content !== content) { - self.content = content; - trigger(self, 'change', [self.editor]); - source.trigger("blur").trigger("change"); - } else { - source.trigger("blur"); - } - - if (options.search) { - self.search.val(''); - self.trigger('search.keypress', true); - } - }); - - if (options.search) { - self.on("@search.focus", function() { - self.stayFocused = true; - self.search.addClass("focused"); - }) - - .on("@search.keypress", function(hide) { - var filterBtns = picker.find(".emojionearea-filter"); - var activeTone = (options.tones ? tones.find("i.active").data("skin") : 0); - var term = self.search.val().replace( / /g, "_" ).replace(/"/g, "\\\""); - - if (term && term.length) { - if (self.recentFilter.hasClass("active")) { - self.recentFilter.removeClass("active").next().addClass("active"); - } - - self.recentCategory.hide(); - self.recentFilter.hide(); - - categoryBlocks.each(function() { - var matchEmojis = function(category, activeTone) { - var $matched = category.find('.emojibtn[data-name*="' + term + '"]'); - if ($matched.length === 0) { - if (category.data('tone') === activeTone) { - category.hide(); - } - filterBtns.filter('[data-filter="' + category.attr('name') + '"]').hide(); - } else { - var $notMatched = category.find('.emojibtn:not([data-name*="' + term + '"])'); - $notMatched.hide(); - - $matched.show(); - - if (category.data('tone') === activeTone) { - category.show(); - } - - filterBtns.filter('[data-filter="' + category.attr('name') + '"]').show(); - } - } - - var $block = $(this); - if ($block.data('tone') === 0) { - categories.filter(':not([name="recent"])').each(function() { - matchEmojis($(this), 0); - }) - } else { - matchEmojis($block, activeTone); - } - }); - if (!noListenScroll) { - scrollArea.trigger('scroll'); - } else { - lazyLoading.call(self); - } - } else { - updateRecent(self, true); - categoryBlocks.filter('[data-tone="' + tones.find("i.active").data("skin") + '"]:not([name="recent"])').show(); - $('.emojibtn', categoryBlocks).show(); - filterBtns.show(); - lazyLoading.call(self); - } - }) - - .on("@search.blur", function() { - self.stayFocused = false; - self.search.removeClass("focused"); - self.trigger("blur"); - }); - } - - if (options.shortcuts) { - self.on("@keydown", function(_, e) { - if (!e.ctrlKey) { - if (e.which == 9) { - e.preventDefault(); - button.click(); - } - else if (e.which == 27) { - e.preventDefault(); - if (button.is(".active")) { - self.hidePicker(); - } - } - } - }); - } - - if (isObject(options.events) && !$.isEmptyObject(options.events)) { - $.each(options.events, function(event, handler) { - self.on(event.replace(/_/g, '.'), handler); - }); - } - - if (options.autocomplete) { - var autocomplete = function() { - var textcompleteOptions = { - maxCount: options.textcomplete.maxCount, - placement: options.textcomplete.placement - }; - - if (options.shortcuts) { - textcompleteOptions.onKeydown = function (e, commands) { - if (!e.ctrlKey && e.which == 13) { - return commands.KEY_ENTER; - } - }; - } - - var map = $.map(emojione.emojioneList, function (_, emoji) { - return !options.autocompleteTones ? /_tone[12345]/.test(emoji) ? null : emoji : emoji; - }); - map.sort(); - editor.textcomplete([ - { - id: css_class, - match: /\B(:[\-+\w]*)$/, - search: function (term, callback) { - callback($.map(map, function (emoji) { - return emoji.indexOf(term) === 0 ? emoji : null; - })); - }, - template: function (value) { - return shortnameTo(value, self.emojiTemplate) + " " + value.replace(/:/g, ''); - }, - replace: function (value) { - return shortnameTo(value, self.emojiTemplate); - }, - cache: true, - index: 1 - } - ], textcompleteOptions); - - if (options.textcomplete.placement) { - // Enable correct positioning for textcomplete - if ($(editor.data('textComplete').option.appendTo).css("position") == "static") { - $(editor.data('textComplete').option.appendTo).css("position", "relative"); - } - } - }; - - var initAutocomplete = function() { - if (self.disabled) { - var enable = function () { - self.off('enabled', enable); - autocomplete(); - }; - self.on('enabled', enable); - } else { - autocomplete(); - } - } - - if ($.fn.textcomplete) { - initAutocomplete(); - } else { - $.ajax({ - url: "https://cdn.rawgit.com/yuku-t/jquery-textcomplete/v1.3.4/dist/jquery.textcomplete.js", - dataType: "script", - cache: true, - success: initAutocomplete - }); - } - } - - if (self.inline) { - app.addClass(selector('inline', true)); - self.on("@keydown", function(_, e) { - if (e.which == 13) { - e.preventDefault(); - } - }); - } - - if (/firefox/i.test(navigator.userAgent)) { - // disabling resize images on Firefox - document.execCommand("enableObjectResizing", false, false); - } - - self.isReady = true; - self.trigger("onLoad", editor); - self.trigger("ready", editor); - //}, self.id === 1); // calcElapsedTime() - }; - var cdn = { - defaultBase: "https://cdnjs.cloudflare.com/ajax/libs/emojione/", - defaultBase3: "https://cdn.jsdelivr.net/", - base: null, - isLoading: false - }; - function loadEmojione(options) { - var emojioneVersion = getEmojioneVersion() - options = getOptions(options); - - if (!cdn.isLoading) { - if (!emojione || getSupportMode(detectVersion(emojione)) < 2) { - cdn.isLoading = true; - var emojioneJsCdnUrlBase; - if (getSupportMode(emojioneVersion) > 5) { - emojioneJsCdnUrlBase = cdn.defaultBase3 + "npm/emojione@" + emojioneVersion; - } else if (getSupportMode(emojioneVersion) > 4) { - emojioneJsCdnUrlBase = cdn.defaultBase3 + "emojione/" + emojioneVersion; - } else { - emojioneJsCdnUrlBase = cdn.defaultBase + "/" + emojioneVersion; - } - - $.ajax({ - url: emojioneJsCdnUrlBase + "/lib/js/emojione.min.js", - dataType: "script", - cache: true, - success: function () { - emojione = window.emojione; - emojioneVersion = detectVersion(emojione); - emojioneSupportMode = getSupportMode(emojioneVersion); - var sprite; - if (emojioneSupportMode > 4) { - cdn.base = cdn.defaultBase3 + "emojione/assets/" + emojioneVersion; - sprite = cdn.base + "/sprites/emojione-sprite-" + emojione.emojiSize + ".css"; - } else { - cdn.base = cdn.defaultBase + emojioneVersion + "/assets"; - sprite = cdn.base + "/sprites/emojione.sprites.css"; - } - if (options.sprite) { - if (document.createStyleSheet) { - document.createStyleSheet(sprite); - } else { - $('', {rel: 'stylesheet', href: sprite}).appendTo('head'); - } - } - while (readyCallbacks.length) { - readyCallbacks.shift().call(); - } - cdn.isLoading = false; - } - }); - } else { - emojioneVersion = detectVersion(emojione); - emojioneSupportMode = getSupportMode(emojioneVersion); - if (emojioneSupportMode > 4) { - cdn.base = cdn.defaultBase3 + "emojione/assets/" + emojioneVersion; - } else { - cdn.base = cdn.defaultBase + emojioneVersion + "/assets"; - } - } - } - - emojioneReady(function() { - var emojiSize = ""; - if (options.useInternalCDN) { - if (emojioneSupportMode > 4) emojiSize = emojione.emojiSize + "/"; - - emojione.imagePathPNG = cdn.base + "/png/" + emojiSize; - emojione.imagePathSVG = cdn.base + "/svg/" + emojiSize; - emojione.imagePathSVGSprites = cdn.base + "/sprites/emojione.sprites.svg"; - emojione.imageType = options.imageType; - } - if (getSupportMode(emojioneVersion) > 4) { - uniRegexp = emojione.regUnicode; - emojione.imageType = options.imageType || "png"; - } else { - uniRegexp = new RegExp("]*>.*?<\/object>|]*>.*?<\/span>|<(?:object|embed|svg|img|div|span|p|a)[^>]*>|(" + emojione.unicodeRegexp + ")", "gi"); - } - }); - }; - var EmojioneArea = function(element, options) { - var self = this; - loadEmojione(options); - eventStorage[self.id = ++unique] = {}; - possibleEvents[self.id] = {}; - emojioneReady(function() { - init(self, element, options); - }); - }; - function bindEvent(self, event) { - event = event.replace(/^@/, ''); - var id = self.id; - if (possibleEvents[id][event]) { - $.each(possibleEvents[id][event], function(i, ev) { - // ev[0] = element - // ev[1] = event - // ev[2] = target - $.each($.isArray(ev[0]) ? ev[0] : [ev[0]], function(i, el) { - $(el).on(ev[1], function() { - var args = slice.call(arguments), - target = $.isFunction(ev[2]) ? ev[2].apply(self, [event].concat(args)) : ev[2]; - if (target) { - trigger(self, event, [target].concat(args)); - } - }); - }); - }); - possibleEvents[id][event] = null; - } - } - - EmojioneArea.prototype.on = function(events, handler) { - if (events && $.isFunction(handler)) { - var self = this; - $.each(events.toLowerCase().split(' '), function(i, event) { - bindEvent(self, event); - (eventStorage[self.id][event] || (eventStorage[self.id][event] = [])).push(handler); - }); - } - return this; - }; - - EmojioneArea.prototype.off = function(events, handler) { - if (events) { - var id = this.id; - $.each(events.toLowerCase().replace(/_/g, '.').split(' '), function(i, event) { - if (eventStorage[id][event] && !/^@/.test(event)) { - if (handler) { - $.each(eventStorage[id][event], function(j, fn) { - if (fn === handler) { - eventStorage[id][event].splice(j, 1); - } - }); - } else { - eventStorage[id][event] = []; - } - } - }); - } - return this; - }; - - EmojioneArea.prototype.trigger = function() { - var args = slice.call(arguments), - call_args = [this].concat(args.slice(0,1)); - call_args.push(args.slice(1)); - return trigger.apply(this, call_args); - }; - - EmojioneArea.prototype.setFocus = function () { - var self = this; - emojioneReady(function () { - self.editor.focus(); - }); - return self; - }; - - EmojioneArea.prototype.setText = function (str) { - var self = this; - emojioneReady(function () { - self.editor.html(htmlFromText(str, self)); - self.content = self.editor.html(); - trigger(self, 'change', [self.editor]); - calcButtonPosition.apply(self); - }); - return self; - } - - EmojioneArea.prototype.getText = function() { - return textFromHtml(this.editor.html(), this); - } - - EmojioneArea.prototype.showPicker = function () { - var self = this; - if (self._sh_timer) { - window.clearTimeout(self._sh_timer); - } - self.picker.removeClass("hidden"); - self._sh_timer = window.setTimeout(function() { - self.button.addClass("active"); - }, 50); - trigger(self, "picker.show", [self.picker]); - return self; - } - - EmojioneArea.prototype.hidePicker = function () { - var self = this; - if (self._sh_timer) { - window.clearTimeout(self._sh_timer); - } - self.button.removeClass("active"); - self._sh_timer = window.setTimeout(function() { - self.picker.addClass("hidden"); - }, 500); - trigger(self, "picker.hide", [self.picker]); - return self; - } - - EmojioneArea.prototype.enable = function () { - var self = this; - var next = function () { - self.disabled = false; - self.editor.prop('contenteditable', true); - self.button.show(); - var editor = self[(self.standalone) ? "button" : "editor"]; - editor.parent().removeClass('emojionearea-disable'); - trigger(self, 'enabled', [editor]); - }; - self.isReady ? next() : self.on("ready", next); - return self; - } - - EmojioneArea.prototype.disable = function () { - var self = this; - self.disabled = true; - var next = function () { - self.editor.prop('contenteditable', false); - self.hidePicker(); - self.button.hide(); - var editor = self[(self.standalone) ? "button" : "editor"]; - editor.parent().addClass('emojionearea-disable'); - trigger(self, 'disabled', [editor]); - }; - self.isReady ? next() : self.on("ready", next); - return self; - } - - $.fn.emojioneArea = function(options) { - return this.each(function() { - if (!!this.emojioneArea) return this.emojioneArea; - $.data(this, 'emojioneArea', this.emojioneArea = new EmojioneArea($(this), options)); - return this.emojioneArea; - }); - }; - - $.fn.emojioneArea.defaults = getDefaultOptions(); - - $.fn.emojioneAreaText = function(options) { - options = getOptions(options); - - var self = this, pseudoSelf = { - shortnames: (options && typeof options.shortnames !== 'undefined' ? options.shortnames : true), - emojiTemplate: '{alt}' - }; - - loadEmojione(options); - emojioneReady(function() { - self.each(function() { - var $this = $(this); - if (!$this.hasClass('emojionearea-text')) { - $this.addClass('emojionearea-text').html(htmlFromText(($this.is('TEXTAREA') || $this.is('INPUT') ? $this.val() : $this.text()), pseudoSelf)); - } - return $this; - }); - }); - - return this; - }; - -}, window ) ); diff --git a/cookbook/static/emojionearea/emojionearea.min.css b/cookbook/static/emojionearea/emojionearea.min.css deleted file mode 100644 index f92213c8..00000000 --- a/cookbook/static/emojionearea/emojionearea.min.css +++ /dev/null @@ -1 +0,0 @@ -.dropdown-menu.textcomplete-dropdown[data-strategy=emojionearea]{position:absolute;z-index:1000;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;-moz-box-shadow:0 6px 12px rgba(0,0,0,.175);-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.textcomplete-dropdown[data-strategy=emojionearea] li.textcomplete-item{font-size:14px;padding:1px 3px;border:0}.dropdown-menu.textcomplete-dropdown[data-strategy=emojionearea] li.textcomplete-item a{text-decoration:none;display:block;height:100%;line-height:1.8em;padding:0 1.54em 0 .615em;color:#4f4f4f}.dropdown-menu.textcomplete-dropdown[data-strategy=emojionearea] li.textcomplete-item.active,.dropdown-menu.textcomplete-dropdown[data-strategy=emojionearea] li.textcomplete-item:hover{background-color:#e4e4e4}.dropdown-menu.textcomplete-dropdown[data-strategy=emojionearea] li.textcomplete-item.active a,.dropdown-menu.textcomplete-dropdown[data-strategy=emojionearea] li.textcomplete-item:hover a{color:#333}.dropdown-menu.textcomplete-dropdown[data-strategy=emojionearea] li.textcomplete-item .emojioneemoji{font-size:inherit;height:2ex;width:2.1ex;min-height:20px;min-width:20px;display:inline-block;margin:0 5px .2ex 0;line-height:normal;vertical-align:middle;max-width:100%;top:0}.emojionearea-text .emojioneemoji,.emojionearea-text [class*=emojione-]{font-size:inherit;height:2ex;width:2.1ex;min-height:20px;min-width:20px;display:inline-block;margin:-.2ex .15em .2ex;line-height:normal;vertical-align:middle;max-width:100%;top:0}.emojionearea,.emojionearea *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.emojionearea.emojionearea-disable{position:relative;background-color:#eee;-moz-user-select:-moz-none;-ms-user-select:none;-webkit-user-select:none;user-select:none}.emojionearea.emojionearea-disable:before{content:"";display:block;top:0;left:0;right:0;bottom:0;z-index:1;opacity:.3;position:absolute;background-color:#eee}.emojionearea,.emojionearea.form-control{display:block;position:relative!important;width:100%;height:auto;padding:0;font-size:14px;background-color:#FFF;border:1px solid #CCC;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-moz-transition:border-color .15s ease-in-out,-moz-box-shadow .15s ease-in-out;-o-transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.emojionearea.focused{border-color:#66AFE9;outline:0;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.emojionearea .emojionearea-editor{display:block;height:auto;min-height:8em;max-height:15em;overflow:auto;padding:6px 24px 6px 12px;line-height:1.42857143;font-size:inherit;color:#555;background-color:transparent;border:0;cursor:text;margin-right:1px;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.emojionearea .emojionearea-editor:empty:before{content:attr(placeholder);display:block;color:#BBB}.emojionearea .emojionearea-editor:focus{border:0;outline:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.emojionearea .emojionearea-editor .emojioneemoji,.emojionearea .emojionearea-editor [class*=emojione-]{font-size:inherit;height:2ex;width:2.1ex;min-height:20px;min-width:20px;display:inline-block;margin:-.2ex .15em .2ex;line-height:normal;vertical-align:middle;max-width:100%;top:0}.emojionearea.emojionearea-inline{height:34px}.emojionearea.emojionearea-inline>.emojionearea-editor{height:32px;min-height:20px;overflow:hidden;white-space:nowrap;position:absolute;top:0;left:12px;right:24px;padding:6px 0}.emojionearea.emojionearea-inline>.emojionearea-button{top:4px}.emojionearea .emojionearea-button{z-index:5;position:absolute;right:3px;top:3px;width:24px;height:24px;opacity:.6;cursor:pointer;-moz-transition:opacity .3s ease-in-out;-o-transition:opacity .3s ease-in-out;-webkit-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out}.emojionearea .emojionearea-button:hover{opacity:1}.emojionearea .emojionearea-button>div{display:block;width:24px;height:24px;position:absolute;-moz-transition:all .4s ease-in-out;-o-transition:all .4s ease-in-out;-webkit-transition:all .4s ease-in-out;transition:all .4s ease-in-out}.emojionearea .emojionearea-button>div.emojionearea-button-open{background-position:0 -24px;filter:alpha(enabled=false);opacity:1}.emojionearea .emojionearea-button>div.emojionearea-button-close{background-position:0 0;-webkit-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg);filter:alpha(Opacity=0);opacity:0}.emojionearea .emojionearea-button.active>div.emojionearea-button-open{-webkit-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg);filter:alpha(Opacity=0);opacity:0}.emojionearea .emojionearea-button.active>div.emojionearea-button-close{-webkit-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0);filter:alpha(enabled=false);opacity:1}.emojionearea .emojionearea-picker{background:#FFF;position:absolute;-moz-box-shadow:0 1px 5px rgba(0,0,0,.32);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.32);box-shadow:0 1px 5px rgba(0,0,0,.32);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;height:276px;width:316px;top:-15px;right:-15px;z-index:90;-moz-transition:all .25s ease-in-out;-o-transition:all .25s ease-in-out;-webkit-transition:all .25s ease-in-out;transition:all .25s ease-in-out;filter:alpha(Opacity=0);opacity:0;-moz-user-select:-moz-none;-ms-user-select:none;-webkit-user-select:none;user-select:none}.emojionearea .emojionearea-picker.hidden{display:none}.emojionearea .emojionearea-picker .emojionearea-wrapper{position:relative;height:276px;width:316px}.emojionearea .emojionearea-picker .emojionearea-wrapper:after{content:"";display:block;position:absolute;background-repeat:no-repeat;z-index:91}.emojionearea .emojionearea-picker .emojionearea-filters{width:100%;position:absolute;z-index:95;background:#F5F7F9;padding:0 0 0 7px;height:40px}.emojionearea .emojionearea-picker .emojionearea-filters .emojionearea-filter{display:block;float:left;height:40px;width:32px;padding:7px 1px 0;cursor:pointer;-webkit-filter:grayscale(1);filter:grayscale(1)}.emojionearea .emojionearea-picker .emojionearea-filters .emojionearea-filter.active{background:#fff}.emojionearea .emojionearea-picker .emojionearea-filters .emojionearea-filter.active,.emojionearea .emojionearea-picker .emojionearea-filters .emojionearea-filter:hover{-webkit-filter:grayscale(0);filter:grayscale(0)}.emojionearea .emojionearea-picker .emojionearea-filters .emojionearea-filter>i{width:24px;height:24px;top:0}.emojionearea .emojionearea-picker .emojionearea-filters .emojionearea-filter>img{width:24px;height:24px;margin:0 3px}.emojionearea .emojionearea-picker .emojionearea-search-panel{height:30px;position:absolute;z-index:95;top:40px;left:0;right:0;padding:5px 0 5px 8px}.emojionearea .emojionearea-picker .emojionearea-search-panel .emojionearea-tones{float:right;margin-right:10px;margin-top:-1px}.emojionearea .emojionearea-picker .emojionearea-tones-panel .emojionearea-tones{position:absolute;top:4px;left:171px}.emojionearea .emojionearea-picker .emojionearea-search{float:left;padding:0;height:20px;width:160px}.emojionearea .emojionearea-picker .emojionearea-search>input{outline:0;width:160px;min-width:160px;height:20px}.emojionearea .emojionearea-picker .emojionearea-tones{padding:0;width:120px;height:20px}.emojionearea .emojionearea-picker .emojionearea-tones>.btn-tone{display:inline-block;padding:0;border:0;vertical-align:middle;outline:0;background:0 0;cursor:pointer;position:relative}.emojionearea .emojionearea-picker .emojionearea-tones>.btn-tone.btn-tone-0,.emojionearea .emojionearea-picker .emojionearea-tones>.btn-tone.btn-tone-0:after{background-color:#ffcf3e}.emojionearea .emojionearea-picker .emojionearea-tones>.btn-tone.btn-tone-1,.emojionearea .emojionearea-picker .emojionearea-tones>.btn-tone.btn-tone-1:after{background-color:#fae3c5}.emojionearea .emojionearea-picker .emojionearea-tones>.btn-tone.btn-tone-2,.emojionearea .emojionearea-picker .emojionearea-tones>.btn-tone.btn-tone-2:after{background-color:#e2cfa5}.emojionearea .emojionearea-picker .emojionearea-tones>.btn-tone.btn-tone-3,.emojionearea .emojionearea-picker .emojionearea-tones>.btn-tone.btn-tone-3:after{background-color:#daa478}.emojionearea .emojionearea-picker .emojionearea-tones>.btn-tone.btn-tone-4,.emojionearea .emojionearea-picker .emojionearea-tones>.btn-tone.btn-tone-4:after{background-color:#a78058}.emojionearea .emojionearea-picker .emojionearea-tones>.btn-tone.btn-tone-5,.emojionearea .emojionearea-picker .emojionearea-tones>.btn-tone.btn-tone-5:after{background-color:#5e4d43}.emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-bullet>.btn-tone,.emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-square>.btn-tone{width:20px;height:20px;margin:0;background-color:transparent}.emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-bullet>.btn-tone:after,.emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-square>.btn-tone:after{content:"";position:absolute;display:block;top:4px;left:4px;width:12px;height:12px}.emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-bullet>.btn-tone.active:after,.emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-square>.btn-tone.active:after{top:0;left:0;width:20px;height:20px}.emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-checkbox>.btn-tone,.emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-radio>.btn-tone{width:16px;height:16px;margin:0 2px}.emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-checkbox>.btn-tone.active:after,.emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-radio>.btn-tone.active:after{content:"";position:absolute;display:block;background-color:transparent;border:2px solid #fff;width:8px;height:8px;top:2px;left:2px;box-sizing:initial}.emojionearea .emojionearea-picker .emojionearea-scroll-area .emojionearea-category-block:after,.emojionearea .emojionearea-picker .emojionearea-scroll-area .emojionearea-category-block:before,.emojionearea .emojionearea-picker .emojionearea-scroll-area .emojionearea-category-block>.emojionearea-category:after,.emojionearea .emojionearea-picker .emojionearea-scroll-area .emojionearea-category-block>.emojionearea-category:before,.emojionearea .emojionearea-picker .emojionearea-scroll-area .emojionearea-category-title:after,.emojionearea .emojionearea-picker .emojionearea-scroll-area .emojionearea-category-title:before{content:" ";clear:both;display:block}.emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-bullet>.btn-tone,.emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-bullet>.btn-tone:after,.emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-radio>.btn-tone,.emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-radio>.btn-tone:after{-moz-border-radius:100%;-webkit-border-radius:100%;border-radius:100%}.emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-checkbox>.btn-tone,.emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-checkbox>.btn-tone:after,.emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-square>.btn-tone,.emojionearea .emojionearea-picker .emojionearea-tones.emojionearea-tones-square>.btn-tone:after{-moz-border-radius:1px;-webkit-border-radius:1px;border-radius:1px}.emojionearea .emojionearea-picker .emojionearea-scroll-area{height:236px;overflow:auto;overflow-x:hidden;width:100%;position:absolute;padding:0 0 5px}.emojionearea .emojionearea-picker .emojionearea-search-panel+.emojionearea-scroll-area{height:206px}.emojionearea .emojionearea-picker .emojionearea-scroll-area .emojionearea-emojis-list{z-index:1}.emojionearea .emojionearea-picker .emojionearea-scroll-area .emojionearea-category-title{display:block;font-family:Arial,'Helvetica Neue',Helvetica,sans-serif;font-size:13px;font-weight:400;color:#b2b2b2;background:#FFF;line-height:20px;margin:0;padding:7px 0 5px 6px}.emojionearea .emojionearea-picker .emojionearea-scroll-area .emojionearea-category-block{padding:0 0 0 7px}.emojionearea .emojionearea-picker .emojionearea-scroll-area .emojionearea-category-block>.emojionearea-category{padding:0!important}.emojionearea .emojionearea-picker .emojionearea-scroll-area [class*=emojione-]{-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;margin:0;width:24px;height:24px;top:0}.emojionearea .emojionearea-picker .emojionearea-scroll-area .emojibtn{-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;width:24px;height:24px;float:left;display:block;margin:1px;padding:3px}.emojionearea .emojionearea-picker .emojionearea-scroll-area .emojibtn:hover{-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;background-color:#e4e4e4;cursor:pointer}.emojionearea .emojionearea-picker .emojionearea-scroll-area .emojibtn i,.emojionearea .emojionearea-picker .emojionearea-scroll-area .emojibtn img{float:left;display:block;width:24px;height:24px}.emojionearea .emojionearea-picker .emojionearea-scroll-area .emojibtn img.lazy-emoji{filter:alpha(Opacity=0);opacity:0}.emojionearea .emojionearea-picker.emojionearea-filters-position-top .emojionearea-filters{top:0;-moz-border-radius-topleft:5px;-webkit-border-top-left-radius:5px;border-top-left-radius:5px;-moz-border-radius-topright:5px;-webkit-border-top-right-radius:5px;border-top-right-radius:5px}.emojionearea .emojionearea-picker.emojionearea-filters-position-top.emojionearea-search-position-top .emojionearea-scroll-area{bottom:0}.emojionearea .emojionearea-picker.emojionearea-filters-position-top.emojionearea-search-position-bottom .emojionearea-scroll-area{top:40px}.emojionearea .emojionearea-picker.emojionearea-filters-position-top.emojionearea-search-position-bottom .emojionearea-search-panel{top:initial;bottom:0}.emojionearea .emojionearea-picker.emojionearea-filters-position-bottom .emojionearea-filters{bottom:0;-moz-border-radius-bottomleft:5px;-webkit-border-bottom-left-radius:5px;border-bottom-left-radius:5px;-moz-border-radius-bottomright:5px;-webkit-border-bottom-right-radius:5px;border-bottom-right-radius:5px}.emojionearea .emojionearea-picker.emojionearea-filters-position-bottom.emojionearea-search-position-bottom .emojionearea-scroll-area{top:0}.emojionearea .emojionearea-picker.emojionearea-filters-position-bottom.emojionearea-search-position-bottom .emojionearea-search-panel,.emojionearea .emojionearea-picker.emojionearea-filters-position-bottom.emojionearea-search-position-top .emojionearea-scroll-area{top:initial;bottom:40px}.emojionearea .emojionearea-picker.emojionearea-filters-position-bottom.emojionearea-search-position-top .emojionearea-search-panel{top:0}.emojionearea .emojionearea-picker.emojionearea-picker-position-top{margin-top:-286px;right:-14px}.emojionearea .emojionearea-picker.emojionearea-picker-position-top .emojionearea-wrapper:after{width:19px;height:10px;background-position:-2px -49px;bottom:-10px;right:20px}.emojionearea .emojionearea-picker.emojionearea-picker-position-top.emojionearea-filters-position-bottom .emojionearea-wrapper:after{background-position:-2px -80px}.emojionearea .emojionearea-picker.emojionearea-picker-position-left,.emojionearea .emojionearea-picker.emojionearea-picker-position-right{margin-right:-326px;top:-8px}.emojionearea .emojionearea-picker.emojionearea-picker-position-left .emojionearea-wrapper:after,.emojionearea .emojionearea-picker.emojionearea-picker-position-right .emojionearea-wrapper:after{width:10px;height:19px;background-position:0 -60px;top:13px;left:-10px}.emojionearea .emojionearea-picker.emojionearea-picker-position-left.emojionearea-filters-position-bottom .emojionearea-wrapper:after,.emojionearea .emojionearea-picker.emojionearea-picker-position-right.emojionearea-filters-position-bottom .emojionearea-wrapper:after{background-position:right -60px}.emojionearea .emojionearea-picker.emojionearea-picker-position-bottom{margin-top:10px;right:-14px;top:47px}.emojionearea .emojionearea-picker.emojionearea-picker-position-bottom .emojionearea-wrapper:after{width:19px;height:10px;background-position:-2px -100px;top:-10px;right:20px}.emojionearea .emojionearea-picker.emojionearea-picker-position-bottom.emojionearea-filters-position-bottom .emojionearea-wrapper:after{background-position:-2px -90px}.emojionearea .emojionearea-button.active+.emojionearea-picker{filter:alpha(enabled=false);opacity:1}.emojionearea .emojionearea-button.active+.emojionearea-picker-position-top{margin-top:-269px}.emojionearea .emojionearea-button.active+.emojionearea-picker-position-left,.emojionearea .emojionearea-button.active+.emojionearea-picker-position-right{margin-right:-309px}.emojionearea .emojionearea-button.active+.emojionearea-picker-position-bottom{margin-top:-7px}.emojionearea.emojionearea-standalone{display:inline-block;width:auto;box-shadow:none}.emojionearea.emojionearea-standalone .emojionearea-editor{min-height:33px;position:relative;padding:6px 42px 6px 6px}.emojionearea.emojionearea-standalone .emojionearea-editor::before{content:"";position:absolute;top:4px;left:50%;bottom:4px;border-left:1px solid #e6e6e6}.emojionearea.emojionearea-standalone .emojionearea-editor.has-placeholder .emojioneemoji{opacity:.4}.emojionearea.emojionearea-standalone .emojionearea-button{top:0;right:0;bottom:0;left:0;width:auto;height:auto}.emojionearea.emojionearea-standalone .emojionearea-button>div{right:6px;top:5px}.emojionearea.emojionearea-standalone .emojionearea-picker.emojionearea-picker-position-bottom .emojionearea-wrapper:after,.emojionearea.emojionearea-standalone .emojionearea-picker.emojionearea-picker-position-top .emojionearea-wrapper:after{right:23px}.emojionearea.emojionearea-standalone .emojionearea-picker.emojionearea-picker-position-left .emojionearea-wrapper:after,.emojionearea.emojionearea-standalone .emojionearea-picker.emojionearea-picker-position-right .emojionearea-wrapper:after{top:15px}.emojionearea .emojionearea-button>div,.emojionearea .emojionearea-picker .emojionearea-wrapper:after{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAABuCAYAAADMB4ipAAAHfElEQVRo3u1XS1NT2Rb+9uOcQF4YlAJzLymFUHaLrdxKULvEUNpdTnRqD532f+AHMLMc94gqR1Zbt8rBnUh3YXipPGKwRDoWgXvrYiFUlEdIkPPYZ/dAkwox5yQCVt/bzRrBPnt9e+211/etFeDQDu3ArL+/X37OeqmRWoH7+vpItfWawStF1tfXR+zW9xW5ne0p8loOcAKuCdwpRft60C8a+X5zTvebCqcAvmidf1GGHtqhHdpf1qqKzsrKipyensbi4iKWl5cBAMFgEG1tbYhGo2hpadlbmxseHpaDg4MAgI6ODng8HgBAPp/H/Pw8AODatWvo7e2tvUHrui7v3r2L+fl5XL58GVeuXIHH49m1N5/Py0ePHmF0dBQdHR24desWVFXdtYdXAn/48CHm5+dx8+ZNRKPRigEUDpuenpb3799H4YaOnWh5eVmOj48jFoshGo0STdPkwMCAXF5elqV7BgYGpKZpMhqNklgshrGxMbx580Y6gicSCTDGEIvFAADpdBqpVArJZLK4J5lMIpVKIZ1OAwBisRgYY0gkEs6Rp1IphMNh+Hw+AgCGYQAANE0r7in8Xfjm8/lIOBzGq1evnMHX19fR1NRU/D8UCoFzjnA4XFwLh8PgnCMUChXXmpqakM1mUfVBS62xsZHk83lZWi1nz579ZA0AhBDO4A0NDchkMsWSJIRAURRiVy26rktVVUkmk0EgEHAGP3XqFKamppDP56Vpmrhz5w5u374t/X4/OP+w3TRNZLNZ6LoO0zSRz+dlf38/Ll686Jzz8+fPQwiBeDwOt9tNrl+/jkwmU6yaQpVkMhncuHEDbrebxONxCCEQiUScIw8Gg+TBgwdyZGQEyWRSdnV1kVQqJYeGhrC6ugrGGEKhEHp7e3Hy5EmSTCblvXv30NPTg2AwSA6M/vF4HCMjI7b0/yzh8vv9AIBsNrt34aokuQsLC7skt729varkHtqftUFf++FHsrq0QN3eBvp68Tfvf9Mv12oFCYU7G//e9nVuO7dpNbe2W4M//yQr0p8yRvyBo1Zr++lwLcCt7afD/sBRizJGavrB1dDYYh47Htrq+Kb7jBNwxzfdZ44dD201NLaYVUkU7ozQpuAJBkARwnRZpunN5zaa5hJjiXLH05GeiMd7JEM5zzHGNQBGZvk/Iv0yYVWMvK0zKk1Dl6ahW5RQobjqdjy+wEZn9PKF0n2d0csXPL7AhuKq26GECtPQLdPQZVtn1LlB69p7yRVVSEiDEGJwRd12e4+8PR3piRQidnuPvOWKuk0IMSSkwRVV6Np7WVVbSqvGsgSnlKkAFNPQXdrOtuKqcxtcUTUAhmUJnVJmlleJo3CVHmAaOlPUOmYJkxFKibQsSRkXhr4juKIKO2BHVSwcoLrqCVdUYho6K3YYRRWmoUtdey/tgKtK7rUffiQAsLq08MnbNLe2WwBgB/zHzueFyD8nwlIfbvdx8eU0WV1aKD1cVAMs9+F2j9gUPEEKemEJIe3AnXy4XfkBoNKSZHNthWfX31EA69VKttyHVyIOY1wRwmS6tqNsrr31vXo5k/bUu4gT2cp9lhbm0rzCJpeUUrE0vS63+c7/6uXMbDUWl/ssLczNFrVFddUT09AZpUy1LKvO0DVfPrfR9HxqfNbuEe185l9MFX3o6tIC5YpKFLWOfdQQ93Zu49j0+FDCDtjOp1yaOQCYhs4Y40wI05XfWj8yPT40Ua2ey33mEmMTtp2IUEq0nW3FKeJPGPjRp1Iz2QUuLUu66txG9NLVSK3gBZ+C1lcE54oqKOOCK6rm8QU2unu+u1ANuNynvFsBAG1ubbdMQ5eGviMAFDuP0w3sfMpvQEtb24fOQncU1bXl8R7JnOu+ZNv97XxKJwY6+PNPsrm13drObVqUMlMIU5OWpVHOc96Go5lTnV2fzC/VfAozD7HTCa6olBBa1Imlhbmq2lLuQ5xaW6nCPfnln0Yt7bDUhzhps8cfKH5//uTXmvS81OeLdqI/ZoROzSZrHqG/OvOPzxuhK5VgJTvV2bW3EdqJRABwrvvS/kfoSkoZvXT1YEbociHr7vnuYEfogpBFL109HKH/h0fomnXg3Lff79r7/MmvVbWG7gX4QObzc99+Tz7mHKah05KcW6ahQ9feS6cbMCdgt7eBWJagjCuUAC5tZzuouuo0Spm0hElc9R4cbf4bVl8v1p6WUmCuqEwIs34ruxaeeTy4uJVd67As08UVlVmWoG5vA7FLG3WMmHEupVTyW+vh2cn4DADMTsaTuc21LiGEhzHOnQ6gNtMrJSBMCKHkNt999WLi0S7hejEZH81n174WpukiIMw0dKq66p3Bw50RwhUVXFGJKUy28Xal48VkfKrSlWenhsc23q2cEB9SR7iiItwZIbbgHn8AlDFCCMW7laXjqZnHjkNpaubJzNuVpWZCKChjxOMPVH/QlaW0f/G3ZLqWWl6ce/bvlddp7yFD/w8Z+njoX1+GoZMjgzMAMDkyeLAMnRh+uKveJ0YGD4ahEyODFRk6OfrL/hj67GnckaHPng7vjaGzyYmaGDr77KktQ38H8tqx8Wja+WIAAAAASUVORK5CYII=)!important}.emojionearea.emojionearea-standalone .emojionearea-editor.has-placeholder{background-repeat:no-repeat;background-position:20px 4px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMAQMAAABsu86kAAAABlBMVEUAAAC/v79T5hyIAAAAAXRSTlMAQObYZgAAABNJREFUCNdjYGNgQEb/P4AQqiAASiUEG6Vit44AAAAASUVORK5CYII=)!important} \ No newline at end of file diff --git a/cookbook/static/emojionearea/emojionearea.min.js b/cookbook/static/emojionearea/emojionearea.min.js deleted file mode 100644 index ef0c357e..00000000 --- a/cookbook/static/emojionearea/emojionearea.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! EmojioneArea v3.4.1 | MIT license */ -window="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},document=window.document||{},function(a,b){"function"==typeof require&&"object"==typeof exports&&"object"==typeof module?a(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],a):a(b.jQuery)}(function(a){"use strict";var b=0,c={},d={},e=window.emojione,f=[];function g(a){e?a():f.push(a)}var h="data:image/gif;base64,R0lGODlhAQABAJH/AP///wAAAMDAwAAAACH5BAEAAAIALAAAAAABAAEAAAICVAEAOw==",i=[].slice,j="emojionearea",k=0,l="​";function m(b,d,e){var f=!0,g=1;if(d){d=d.toLowerCase();do{var h=1==g?"@"+d:d;c[b.id][h]&&c[b.id][h].length&&a.each(c[b.id][h],function(a,c){return f=c.apply(b,e||[])!==!1})}while(f&&g--)}return f}function n(b,c,e,f){f=f||function(b,c){return a(c.currentTarget)},a.each(e,function(g,h){g=a.isArray(e)?h:g,(d[b.id][h]||(d[b.id][h]=[])).push([c,g,f])})}function o(a,b,c){var d=e.imageType,f;f="svg"==d?e.imagePathSVG:e.imagePathPNG;var g="";c&&(g=c.substr(1,c.length-2).replace(/_/g," ").replace(/\w\S*/g,function(a){return a.charAt(0).toUpperCase()+a.substr(1).toLowerCase()}));var h="";return b.uc_base&&k>4?(h=b.uc_base,b=b.uc_output.toUpperCase()):h=b,a.replace("{name}",c||"").replace("{friendlyName}",g).replace("{img}",f+(k<2?h.toUpperCase():h)+"."+d).replace("{uni}",b).replace("{alt}",e.convert(b))}function p(a,b,c){return a.replace(/:?\+?[\w_\-]+:?/g,function(a){a=":"+a.replace(/:$/,"").replace(/^:/,"")+":";var d=e.emojioneList[a];return d?k>4?o(b,d,a):(k>3&&(d=d.unicode),o(b,d[d.length-1],a)):c?"":a})}function q(a){var b,c;if(window.getSelection){if(b=window.getSelection(),b.getRangeAt&&b.rangeCount){c=b.getRangeAt(0),c.deleteContents();var d=document.createElement("div");d.innerHTML=a;var e=document.createDocumentFragment(),f,g;while(f=d.firstChild)g=e.appendChild(f);c.insertNode(e),g&&(c=c.cloneRange(),c.setStartAfter(g),c.collapse(!0),b.removeAllRanges(),b.addRange(c))}}else document.selection&&"Control"!=document.selection.type&&document.selection.createRange().pasteHTML(a)}function r(){return window.emojioneVersion||"3.1.2"}function s(a){return"object"==typeof a}function t(a){var b;return a.cacheBustParam?(b=a.cacheBustParam,s(a.jsEscapeMap)?"?v=1.2.4"===b?"2.0.0":"?v=2.0.1"===b?"2.1.0":"?v=2.1.1"===b?"2.1.1":"?v=2.1.2"===b?"2.1.2":"?v=2.1.3"===b?"2.1.3":"?v=2.1.4"===b?"2.1.4":"2.2.7":"1.5.2"):a.emojiVersion}function u(a){switch(a){case"1.5.2":return 0;case"2.0.0":return 1;case"2.1.0":case"2.1.1":return 2;case"2.1.2":return 3;case"2.1.3":case"2.1.4":case"2.2.7":return 4;case"3.0.1":case"3.0.2":case"3.0.3":case"3.0":return 5;case"3.1.0":case"3.1.1":case"3.1.2":case"3.1":default:return 6}}function v(){if(a.fn.emojioneArea&&a.fn.emojioneArea.defaults)return a.fn.emojioneArea.defaults;var b={attributes:{dir:"ltr",spellcheck:!1,autocomplete:"off",autocorrect:"off",autocapitalize:"off"},search:!0,placeholder:null,emojiPlaceholder:":smiley:",searchPlaceholder:"SEARCH",container:null,hideSource:!0,shortnames:!0,sprite:!0,pickerPosition:"top",filtersPosition:"top",searchPosition:"top",hidePickerOnBlur:!0,buttonTitle:"Use the TAB key to insert emoji faster",tones:!0,tonesStyle:"bullet",inline:null,saveEmojisAs:"unicode",shortcuts:!0,autocomplete:!0,autocompleteTones:!1,standalone:!1,useInternalCDN:!0,imageType:"png",recentEmojis:!0,textcomplete:{maxCount:15,placement:null}},c=u(e?t(e):r());return c>4?b.filters={tones:{title:"Diversity",emoji:"open_hands raised_hands palms_up_together clap pray thumbsup thumbsdown punch fist left_facing_fist right_facing_fist fingers_crossed v metal love_you_gesture ok_hand point_left point_right point_up_2 point_down point_up raised_hand raised_back_of_hand hand_splayed vulcan wave call_me muscle middle_finger writing_hand selfie nail_care ear nose baby boy girl man woman blond-haired_woman blond-haired_man older_man older_woman man_with_chinese_cap woman_wearing_turban man_wearing_turban woman_police_officer man_police_officer woman_construction_worker man_construction_worker woman_guard man_guard woman_detective man_detective woman_health_worker man_health_worker woman_farmer man_farmer woman_cook man_cook woman_student man_student woman_singer man_singer woman_teacher man_teacher woman_factory_worker man_factory_worker woman_technologist man_technologist woman_office_worker man_office_worker woman_mechanic man_mechanic woman_scientist man_scientist woman_artist man_artist woman_firefighter man_firefighter woman_pilot man_pilot woman_astronaut man_astronaut woman_judge man_judge mrs_claus santa princess prince bride_with_veil man_in_tuxedo angel pregnant_woman breast_feeding woman_bowing man_bowing man_tipping_hand woman_tipping_hand man_gesturing_no woman_gesturing_no man_gesturing_ok woman_gesturing_ok man_raising_hand woman_raising_hand woman_facepalming man_facepalming woman_shrugging man_shrugging man_pouting woman_pouting man_frowning woman_frowning man_getting_haircut woman_getting_haircut man_getting_face_massage woman_getting_face_massage man_in_business_suit_levitating dancer man_dancing woman_walking man_walking woman_running man_running adult child older_adult bearded_person woman_with_headscarf woman_mage man_mage woman_fairy man_fairy woman_vampire man_vampire mermaid merman woman_elf man_elf snowboarder woman_lifting_weights man_lifting_weights woman_cartwheeling man_cartwheeling woman_bouncing_ball man_bouncing_ball woman_playing_handball man_playing_handball woman_golfing man_golfing woman_surfing man_surfing woman_swimming man_swimming woman_playing_water_polo man_playing_water_polo woman_rowing_boat man_rowing_boat horse_racing woman_biking man_biking woman_mountain_biking man_mountain_biking woman_juggling man_juggling woman_in_steamy_room man_in_steamy_room woman_climbing man_climbing woman_in_lotus_position man_in_lotus_position bath person_in_bed"},recent:{icon:"clock3",title:"Recent",emoji:""},smileys_people:{icon:"yum",title:"Smileys & People",emoji:"grinning smiley smile grin laughing sweat_smile joy rofl relaxed blush innocent slight_smile upside_down wink relieved crazy_face star_struck heart_eyes kissing_heart kissing kissing_smiling_eyes kissing_closed_eyes yum stuck_out_tongue_winking_eye stuck_out_tongue_closed_eyes stuck_out_tongue money_mouth hugging nerd sunglasses cowboy smirk unamused disappointed pensive worried face_with_raised_eyebrow face_with_monocle confused slight_frown frowning2 persevere confounded tired_face weary triumph angry rage face_with_symbols_over_mouth no_mouth neutral_face expressionless hushed frowning anguished open_mouth astonished dizzy_face exploding_head flushed scream fearful cold_sweat cry disappointed_relieved drooling_face sob sweat sleepy sleeping rolling_eyes thinking shushing_face face_with_hand_over_mouth lying_face grimacing zipper_mouth face_vomiting nauseated_face sneezing_face mask thermometer_face head_bandage smiling_imp imp japanese_ogre japanese_goblin poop ghost skull skull_crossbones alien space_invader robot jack_o_lantern clown smiley_cat smile_cat joy_cat heart_eyes_cat smirk_cat kissing_cat scream_cat crying_cat_face pouting_cat open_hands raised_hands palms_up_together clap pray handshake thumbsup thumbsdown punch fist left_facing_fist right_facing_fist fingers_crossed v metal love_you_gesture ok_hand point_left point_right point_up_2 point_down point_up raised_hand raised_back_of_hand hand_splayed vulcan wave call_me muscle middle_finger writing_hand selfie nail_care ring lipstick kiss lips tongue ear nose footprints eye eyes speaking_head bust_in_silhouette busts_in_silhouette baby boy girl man woman blond-haired_woman blond_haired_man older_man older_woman man_with_chinese_cap woman_wearing_turban man_wearing_turban woman_police_officer police_officer woman_construction_worker construction_worker woman_guard guard woman_detective detective woman_health_worker man_health_worker woman_farmer man_farmer woman_cook man_cook woman_student man_student woman_singer man_singer woman_teacher man_teacher woman_factory_worker man_factory_worker woman_technologist man_technologist woman_office_worker man_office_worker woman_mechanic man_mechanic woman_scientist man_scientist woman_artist man_artist woman_firefighter man_firefighter woman_pilot man_pilot woman_astronaut man_astronaut woman_judge man_judge mrs_claus santa princess prince bride_with_veil man_in_tuxedo angel pregnant_woman breast_feeding woman_bowing man_bowing woman_tipping_hand man_tipping_hand woman_gesturing_no man_gesturing_no woman_gesturing_ok man_gesturing_ok woman_raising_hand man_raising_hand woman_facepalming man_facepalming woman_shrugging man_shrugging woman_pouting man_pouting woman_frowning man_frowning woman_getting_haircut man_getting_haircut woman_getting_face_massage man_getting_face_massage man_in_business_suit_levitating dancer man_dancing women_with_bunny_ears_partying men_with_bunny_ears_partying woman_walking man_walking woman_running man_running couple two_women_holding_hands two_men_holding_hands couple_with_heart couple_ww couple_mm couplekiss kiss_ww kiss_mm family family_mwg family_mwgb family_mwbb family_mwgg family_wwb family_wwg family_wwgb family_wwbb family_wwgg family_mmb family_mmg family_mmgb family_mmbb family_mmgg family_woman_boy family_woman_girl family_woman_girl_boy family_woman_boy_boy family_woman_girl_girl family_man_boy family_man_girl family_man_girl_boy family_man_boy_boy family_man_girl_girl bearded_person woman_with_headscarf woman_mage man_mage woman_fairy man_fairy woman_vampire man_vampire mermaid merman woman_elf man_elf woman_genie man_genie woman_zombie man_zombie womans_clothes shirt jeans necktie dress bikini kimono high_heel sandal boot mans_shoe athletic_shoe womans_hat tophat mortar_board crown helmet_with_cross school_satchel pouch purse handbag briefcase eyeglasses dark_sunglasses closed_umbrella umbrella2 brain billed_cap scarf gloves coat socks "},animals_nature:{icon:"hamster",title:"Animals & Nature",emoji:"dog cat mouse hamster rabbit fox bear panda_face koala tiger lion_face cow pig pig_nose frog monkey_face see_no_evil hear_no_evil speak_no_evil monkey chicken penguin bird baby_chick hatching_chick hatched_chick duck eagle owl bat wolf boar horse unicorn bee bug butterfly snail shell beetle ant spider spider_web turtle snake lizard scorpion crab squid octopus shrimp tropical_fish fish blowfish dolphin shark whale whale2 crocodile leopard tiger2 water_buffalo ox cow2 deer dromedary_camel camel elephant rhino gorilla racehorse pig2 goat ram sheep dog2 poodle cat2 rooster turkey dove rabbit2 mouse2 rat chipmunk dragon giraffe zebra hedgehog sauropod t_rex cricket dragon_face feet cactus christmas_tree evergreen_tree deciduous_tree palm_tree seedling herb shamrock four_leaf_clover bamboo tanabata_tree leaves fallen_leaf maple_leaf mushroom ear_of_rice bouquet tulip rose wilted_rose sunflower blossom cherry_blossom hibiscus earth_americas earth_africa earth_asia full_moon waning_gibbous_moon last_quarter_moon waning_crescent_moon new_moon waxing_crescent_moon first_quarter_moon waxing_gibbous_moon new_moon_with_face full_moon_with_face sun_with_face first_quarter_moon_with_face last_quarter_moon_with_face crescent_moon dizzy star star2 sparkles zap fire boom comet sunny white_sun_small_cloud partly_sunny white_sun_cloud white_sun_rain_cloud rainbow cloud cloud_rain thunder_cloud_rain cloud_lightning cloud_snow snowman2 snowman snowflake wind_blowing_face dash cloud_tornado fog ocean droplet sweat_drops umbrella "},food_drink:{icon:"pizza",title:"Food & Drink",emoji:"green_apple apple pear tangerine lemon banana watermelon grapes strawberry melon cherries peach pineapple kiwi avocado tomato eggplant cucumber carrot corn hot_pepper potato sweet_potato chestnut peanuts honey_pot croissant bread french_bread cheese egg cooking bacon pancakes fried_shrimp poultry_leg meat_on_bone pizza hotdog hamburger fries stuffed_flatbread taco burrito salad shallow_pan_of_food spaghetti ramen stew fish_cake sushi bento curry rice_ball rice rice_cracker oden dango shaved_ice ice_cream icecream cake birthday custard lollipop candy chocolate_bar popcorn doughnut cookie milk baby_bottle coffee tea sake beer beers champagne_glass wine_glass tumbler_glass cocktail tropical_drink champagne spoon fork_and_knife fork_knife_plate dumpling fortune_cookie takeout_box chopsticks bowl_with_spoon cup_with_straw coconut broccoli pie pretzel cut_of_meat sandwich canned_food"},activity:{icon:"basketball",title:"Activity",emoji:"soccer basketball football baseball tennis volleyball rugby_football 8ball ping_pong badminton goal hockey field_hockey cricket_game golf bow_and_arrow fishing_pole_and_fish boxing_glove martial_arts_uniform ice_skate ski skier snowboarder woman_lifting_weights man_lifting_weights person_fencing women_wrestling men_wrestling woman_cartwheeling man_cartwheeling woman_bouncing_ball man_bouncing_ball woman_playing_handball man_playing_handball woman_golfing man_golfing woman_surfing man_surfing woman_swimming man_swimming woman_playing_water_polo man_playing_water_polo woman_rowing_boat man_rowing_boat horse_racing woman_biking man_biking woman_mountain_biking man_mountain_biking woman_in_steamy_room man_in_steamy_room woman_climbing man_climbing woman_in_lotus_position man_in_lotus_position running_shirt_with_sash medal military_medal first_place second_place third_place trophy rosette reminder_ribbon ticket tickets circus_tent woman_juggling man_juggling performing_arts art clapper microphone headphones musical_score musical_keyboard drum saxophone trumpet guitar violin game_die dart bowling video_game slot_machine sled curling_stone "},travel_places:{icon:"rocket",title:"Travel & Places",emoji:"red_car taxi blue_car bus trolleybus race_car police_car ambulance fire_engine minibus truck articulated_lorry tractor scooter bike motor_scooter motorcycle rotating_light oncoming_police_car oncoming_bus oncoming_automobile oncoming_taxi aerial_tramway mountain_cableway suspension_railway railway_car train mountain_railway monorail bullettrain_side bullettrain_front light_rail steam_locomotive train2 metro tram station helicopter airplane_small airplane airplane_departure airplane_arriving rocket satellite_orbital seat canoe sailboat motorboat speedboat cruise_ship ferry ship anchor construction fuelpump busstop vertical_traffic_light traffic_light map moyai statue_of_liberty fountain tokyo_tower european_castle japanese_castle stadium ferris_wheel roller_coaster carousel_horse beach_umbrella beach island mountain mountain_snow mount_fuji volcano desert camping tent railway_track motorway construction_site factory house house_with_garden homes house_abandoned office department_store post_office european_post_office hospital bank hotel convenience_store school love_hotel wedding classical_building church mosque synagogue kaaba shinto_shrine japan rice_scene park sunrise sunrise_over_mountains stars sparkler fireworks city_sunset city_dusk cityscape night_with_stars milky_way bridge_at_night foggy flying_saucer"},objects:{icon:"bulb",title:"Objects",emoji:"watch iphone calling computer keyboard desktop printer mouse_three_button trackball joystick compression minidisc floppy_disk cd dvd vhs camera camera_with_flash video_camera movie_camera projector film_frames telephone_receiver telephone pager fax tv radio microphone2 level_slider control_knobs stopwatch timer alarm_clock clock hourglass hourglass_flowing_sand satellite battery electric_plug bulb flashlight candle wastebasket oil money_with_wings dollar yen euro pound moneybag credit_card gem scales wrench hammer hammer_pick tools pick nut_and_bolt gear chains gun bomb knife dagger crossed_swords shield smoking coffin urn amphora crystal_ball prayer_beads barber alembic telescope microscope hole pill syringe thermometer toilet potable_water shower bathtub bath bellhop key key2 door couch bed sleeping_accommodation frame_photo shopping_bags shopping_cart gift balloon flags ribbon confetti_ball tada dolls izakaya_lantern wind_chime envelope envelope_with_arrow incoming_envelope e-mail love_letter inbox_tray outbox_tray package label mailbox_closed mailbox mailbox_with_mail mailbox_with_no_mail postbox postal_horn scroll page_with_curl page_facing_up bookmark_tabs bar_chart chart_with_upwards_trend chart_with_downwards_trend notepad_spiral calendar_spiral calendar date card_index card_box ballot_box file_cabinet clipboard file_folder open_file_folder dividers newspaper2 newspaper notebook notebook_with_decorative_cover ledger closed_book green_book blue_book orange_book books book bookmark link paperclip paperclips triangular_ruler straight_ruler pushpin round_pushpin scissors pen_ballpoint pen_fountain black_nib paintbrush crayon pencil pencil2 mag mag_right lock_with_ink_pen closed_lock_with_key lock unlock"},symbols:{icon:"heartpulse",title:"Symbols",emoji:"heart orange_heart yellow_heart green_heart blue_heart purple_heart black_heart broken_heart heart_exclamation two_hearts revolving_hearts heartbeat heartpulse sparkling_heart cupid gift_heart heart_decoration peace cross star_and_crescent om_symbol wheel_of_dharma star_of_david six_pointed_star menorah yin_yang orthodox_cross place_of_worship ophiuchus aries taurus gemini cancer leo virgo libra scorpius sagittarius capricorn aquarius pisces id atom accept radioactive biohazard mobile_phone_off vibration_mode u6709 u7121 u7533 u55b6 u6708 eight_pointed_black_star vs white_flower ideograph_advantage secret congratulations u5408 u6e80 u5272 u7981 a b ab cl o2 sos x o octagonal_sign no_entry name_badge no_entry_sign 100 anger hotsprings no_pedestrians do_not_litter no_bicycles non-potable_water underage no_mobile_phones no_smoking exclamation grey_exclamation question grey_question bangbang interrobang low_brightness high_brightness part_alternation_mark warning children_crossing trident fleur-de-lis beginner recycle white_check_mark u6307 chart sparkle eight_spoked_asterisk negative_squared_cross_mark globe_with_meridians diamond_shape_with_a_dot_inside m cyclone zzz atm wc wheelchair parking u7a7a sa passport_control customs baggage_claim left_luggage mens womens baby_symbol restroom put_litter_in_its_place cinema signal_strength koko symbols information_source abc abcd capital_abcd ng ok up cool new free zero one two three four five six seven eight nine keycap_ten 1234 hash asterisk arrow_forward pause_button play_pause stop_button record_button eject track_next track_previous fast_forward rewind arrow_double_up arrow_double_down arrow_backward arrow_up_small arrow_down_small arrow_right arrow_left arrow_up arrow_down arrow_upper_right arrow_lower_right arrow_lower_left arrow_upper_left arrow_up_down left_right_arrow arrow_right_hook leftwards_arrow_with_hook arrow_heading_up arrow_heading_down twisted_rightwards_arrows repeat repeat_one arrows_counterclockwise arrows_clockwise musical_note notes heavy_plus_sign heavy_minus_sign heavy_division_sign heavy_multiplication_x heavy_dollar_sign currency_exchange tm copyright registered wavy_dash curly_loop loop end back on top soon heavy_check_mark ballot_box_with_check radio_button white_circle black_circle red_circle blue_circle small_red_triangle small_red_triangle_down small_orange_diamond small_blue_diamond large_orange_diamond large_blue_diamond white_square_button black_square_button black_small_square white_small_square black_medium_small_square white_medium_small_square black_medium_square white_medium_square black_large_square white_large_square speaker mute sound loud_sound bell no_bell mega loudspeaker speech_left eye_in_speech_bubble speech_balloon thought_balloon anger_right spades clubs hearts diamonds black_joker flower_playing_cards mahjong clock1 clock2 clock3 clock4 clock5 clock6 clock7 clock8 clock9 clock10 clock11 clock12 clock130 clock230 clock330 clock430 clock530 clock630 clock730 clock830 clock930 clock1030 clock1130 clock1230"},flags:{icon:"flag_gb",title:"Flags",emoji:"flag_white flag_black checkered_flag triangular_flag_on_post rainbow_flag flag_af flag_ax flag_al flag_dz flag_as flag_ad flag_ao flag_ai flag_aq flag_ag flag_ar flag_am flag_aw flag_au flag_at flag_az flag_bs flag_bh flag_bd flag_bb flag_by flag_be flag_bz flag_bj flag_bm flag_bt flag_bo flag_ba flag_bw flag_br flag_io flag_vg flag_bn flag_bg flag_bf flag_bi flag_kh flag_cm flag_ca flag_ic flag_cv flag_bq flag_ky flag_cf flag_td flag_cl flag_cn flag_cx flag_cc flag_co flag_km flag_cg flag_cd flag_ck flag_cr flag_ci flag_hr flag_cu flag_cw flag_cy flag_cz flag_dk flag_dj flag_dm flag_do flag_ec flag_eg flag_sv flag_gq flag_er flag_ee flag_et flag_eu flag_fk flag_fo flag_fj flag_fi flag_fr flag_gf flag_pf flag_tf flag_ga flag_gm flag_ge flag_de flag_gh flag_gi flag_gr flag_gl flag_gd flag_gp flag_gu flag_gt flag_gg flag_gn flag_gw flag_gy flag_ht flag_hn flag_hk flag_hu flag_is flag_in flag_id flag_ir flag_iq flag_ie flag_im flag_il flag_it flag_jm flag_jp crossed_flags flag_je flag_jo flag_kz flag_ke flag_ki flag_xk flag_kw flag_kg flag_la flag_lv flag_lb flag_ls flag_lr flag_ly flag_li flag_lt flag_lu flag_mo flag_mk flag_mg flag_mw flag_my flag_mv flag_ml flag_mt flag_mh flag_mq flag_mr flag_mu flag_yt flag_mx flag_fm flag_md flag_mc flag_mn flag_me flag_ms flag_ma flag_mz flag_mm flag_na flag_nr flag_np flag_nl flag_nc flag_nz flag_ni flag_ne flag_ng flag_nu flag_nf flag_kp flag_mp flag_no flag_om flag_pk flag_pw flag_ps flag_pa flag_pg flag_py flag_pe flag_ph flag_pn flag_pl flag_pt flag_pr flag_qa flag_re flag_ro flag_ru flag_rw flag_ws flag_sm flag_st flag_sa flag_sn flag_rs flag_sc flag_sl flag_sg flag_sx flag_sk flag_si flag_gs flag_sb flag_so flag_za flag_kr flag_ss flag_es flag_lk flag_bl flag_sh flag_kn flag_lc flag_pm flag_vc flag_sd flag_sr flag_sz flag_se flag_ch flag_sy flag_tw flag_tj flag_tz flag_th flag_tl flag_tg flag_tk flag_to flag_tt flag_tn flag_tr flag_tm flag_tc flag_tv flag_vi flag_ug flag_ua flag_ae flag_gb flag_us flag_uy flag_uz flag_vu flag_va flag_ve flag_vn flag_wf flag_eh flag_ye flag_zm flag_zw flag_ac flag_ta flag_bv flag_hm flag_sj flag_um flag_ea flag_cp flag_dg flag_mf united_nations england scotland wales"}}:b.filters={tones:{title:"Diversity",emoji:"santa runner surfer swimmer lifter ear nose point_up_2 point_down point_left point_right punch wave ok_hand thumbsup thumbsdown clap open_hands boy girl man woman cop bride_with_veil person_with_blond_hair man_with_gua_pi_mao man_with_turban older_man grandma baby construction_worker princess angel information_desk_person guardsman dancer nail_care massage haircut muscle spy hand_splayed middle_finger vulcan no_good ok_woman bow raising_hand raised_hands person_frowning person_with_pouting_face pray rowboat bicyclist mountain_bicyclist walking bath metal point_up basketball_player fist raised_hand v writing_hand"},recent:{icon:"clock3",title:"Recent",emoji:""},smileys_people:{icon:"yum",title:"Smileys & People",emoji:"grinning grimacing grin joy smiley smile sweat_smile laughing innocent wink blush slight_smile upside_down relaxed yum relieved heart_eyes kissing_heart kissing kissing_smiling_eyes kissing_closed_eyes stuck_out_tongue_winking_eye stuck_out_tongue_closed_eyes stuck_out_tongue money_mouth nerd sunglasses hugging smirk no_mouth neutral_face expressionless unamused rolling_eyes thinking flushed disappointed worried angry rage pensive confused slight_frown frowning2 persevere confounded tired_face weary triumph open_mouth scream fearful cold_sweat hushed frowning anguished cry disappointed_relieved sleepy sweat sob dizzy_face astonished zipper_mouth mask thermometer_face head_bandage sleeping zzz poop smiling_imp imp japanese_ogre japanese_goblin skull ghost alien robot smiley_cat smile_cat joy_cat heart_eyes_cat smirk_cat kissing_cat scream_cat crying_cat_face pouting_cat raised_hands clap wave thumbsup thumbsdown punch fist v ok_hand raised_hand open_hands muscle pray point_up point_up_2 point_down point_left point_right middle_finger hand_splayed metal vulcan writing_hand nail_care lips tongue ear nose eye eyes bust_in_silhouette busts_in_silhouette speaking_head baby boy girl man woman person_with_blond_hair older_man older_woman man_with_gua_pi_mao man_with_turban cop construction_worker guardsman spy santa angel princess bride_with_veil walking runner dancer dancers couple two_men_holding_hands two_women_holding_hands bow information_desk_person no_good ok_woman raising_hand person_with_pouting_face person_frowning haircut massage couple_with_heart couple_ww couple_mm couplekiss kiss_ww kiss_mm family family_mwg family_mwgb family_mwbb family_mwgg family_wwb family_wwg family_wwgb family_wwbb family_wwgg family_mmb family_mmg family_mmgb family_mmbb family_mmgg womans_clothes shirt jeans necktie dress bikini kimono lipstick kiss footprints high_heel sandal boot mans_shoe athletic_shoe womans_hat tophat helmet_with_cross mortar_board crown school_satchel pouch purse handbag briefcase eyeglasses dark_sunglasses ring closed_umbrella"},animals_nature:{icon:"hamster",title:"Animals & Nature",emoji:"dog cat mouse hamster rabbit bear panda_face koala tiger lion_face cow pig pig_nose frog octopus monkey_face see_no_evil hear_no_evil speak_no_evil monkey chicken penguin bird baby_chick hatching_chick hatched_chick wolf boar horse unicorn bee bug snail beetle ant spider scorpion crab snake turtle tropical_fish fish blowfish dolphin whale whale2 crocodile leopard tiger2 water_buffalo ox cow2 dromedary_camel camel elephant goat ram sheep racehorse pig2 rat mouse2 rooster turkey dove dog2 poodle cat2 rabbit2 chipmunk feet dragon dragon_face cactus christmas_tree evergreen_tree deciduous_tree palm_tree seedling herb shamrock four_leaf_clover bamboo tanabata_tree leaves fallen_leaf maple_leaf ear_of_rice hibiscus sunflower rose tulip blossom cherry_blossom bouquet mushroom chestnut jack_o_lantern shell spider_web earth_americas earth_africa earth_asia full_moon waning_gibbous_moon last_quarter_moon waning_crescent_moon new_moon waxing_crescent_moon first_quarter_moon waxing_gibbous_moon new_moon_with_face full_moon_with_face first_quarter_moon_with_face last_quarter_moon_with_face sun_with_face crescent_moon star star2 dizzy sparkles comet sunny white_sun_small_cloud partly_sunny white_sun_cloud white_sun_rain_cloud cloud cloud_rain thunder_cloud_rain cloud_lightning zap fire boom snowflake cloud_snow snowman2 snowman wind_blowing_face dash cloud_tornado fog umbrella2 umbrella droplet sweat_drops ocean"},food_drink:{icon:"pizza",title:"Food & Drink",emoji:"green_apple apple pear tangerine lemon banana watermelon grapes strawberry melon cherries peach pineapple tomato eggplant hot_pepper corn sweet_potato honey_pot bread cheese poultry_leg meat_on_bone fried_shrimp egg hamburger fries hotdog pizza spaghetti taco burrito ramen stew fish_cake sushi bento curry rice_ball rice rice_cracker oden dango shaved_ice ice_cream icecream cake birthday custard candy lollipop chocolate_bar popcorn doughnut cookie beer beers wine_glass cocktail tropical_drink champagne sake tea coffee baby_bottle fork_and_knife fork_knife_plate"},activity:{icon:"basketball",title:"Activity",emoji:"soccer basketball football baseball tennis volleyball rugby_football 8ball golf golfer ping_pong badminton hockey field_hockey cricket ski skier snowboarder ice_skate bow_and_arrow fishing_pole_and_fish rowboat swimmer surfer bath basketball_player lifter bicyclist mountain_bicyclist horse_racing levitate trophy running_shirt_with_sash medal military_medal reminder_ribbon rosette ticket tickets performing_arts art circus_tent microphone headphones musical_score musical_keyboard saxophone trumpet guitar violin clapper video_game space_invader dart game_die slot_machine bowling"},travel_places:{icon:"rocket",title:"Travel & Places",emoji:"red_car taxi blue_car bus trolleybus race_car police_car ambulance fire_engine minibus truck articulated_lorry tractor motorcycle bike rotating_light oncoming_police_car oncoming_bus oncoming_automobile oncoming_taxi aerial_tramway mountain_cableway suspension_railway railway_car train monorail bullettrain_side bullettrain_front light_rail mountain_railway steam_locomotive train2 metro tram station helicopter airplane_small airplane airplane_departure airplane_arriving sailboat motorboat speedboat ferry cruise_ship rocket satellite_orbital seat anchor construction fuelpump busstop vertical_traffic_light traffic_light checkered_flag ship ferris_wheel roller_coaster carousel_horse construction_site foggy tokyo_tower factory fountain rice_scene mountain mountain_snow mount_fuji volcano japan camping tent park motorway railway_track sunrise sunrise_over_mountains desert beach island city_sunset city_dusk cityscape night_with_stars bridge_at_night milky_way stars sparkler fireworks rainbow homes european_castle japanese_castle stadium statue_of_liberty house house_with_garden house_abandoned office department_store post_office european_post_office hospital bank hotel convenience_store school love_hotel wedding classical_building church mosque synagogue kaaba shinto_shrine"},objects:{icon:"bulb",title:"Objects",emoji:"watch iphone calling computer keyboard desktop printer mouse_three_button trackball joystick compression minidisc floppy_disk cd dvd vhs camera camera_with_flash video_camera movie_camera projector film_frames telephone_receiver telephone pager fax tv radio microphone2 level_slider control_knobs stopwatch timer alarm_clock clock hourglass_flowing_sand hourglass satellite battery electric_plug bulb flashlight candle wastebasket oil money_with_wings dollar yen euro pound moneybag credit_card gem scales wrench hammer hammer_pick tools pick nut_and_bolt gear chains gun bomb knife dagger crossed_swords shield smoking skull_crossbones coffin urn amphora crystal_ball prayer_beads barber alembic telescope microscope hole pill syringe thermometer label bookmark toilet shower bathtub key key2 couch sleeping_accommodation bed door bellhop frame_photo map beach_umbrella moyai shopping_bags balloon flags ribbon gift confetti_ball tada dolls wind_chime crossed_flags izakaya_lantern envelope envelope_with_arrow incoming_envelope e-mail love_letter postbox mailbox_closed mailbox mailbox_with_mail mailbox_with_no_mail package postal_horn inbox_tray outbox_tray scroll page_with_curl bookmark_tabs bar_chart chart_with_upwards_trend chart_with_downwards_trend page_facing_up date calendar calendar_spiral card_index card_box ballot_box file_cabinet clipboard notepad_spiral file_folder open_file_folder dividers newspaper2 newspaper notebook closed_book green_book blue_book orange_book notebook_with_decorative_cover ledger books book link paperclip paperclips scissors triangular_ruler straight_ruler pushpin round_pushpin triangular_flag_on_post flag_white flag_black closed_lock_with_key lock unlock lock_with_ink_pen pen_ballpoint pen_fountain black_nib pencil pencil2 crayon paintbrush mag mag_right"},symbols:{icon:"heartpulse",title:"Symbols",emoji:"heart yellow_heart green_heart blue_heart purple_heart broken_heart heart_exclamation two_hearts revolving_hearts heartbeat heartpulse sparkling_heart cupid gift_heart heart_decoration peace cross star_and_crescent om_symbol wheel_of_dharma star_of_david six_pointed_star menorah yin_yang orthodox_cross place_of_worship ophiuchus aries taurus gemini cancer leo virgo libra scorpius sagittarius capricorn aquarius pisces id atom u7a7a u5272 radioactive biohazard mobile_phone_off vibration_mode u6709 u7121 u7533 u55b6 u6708 eight_pointed_black_star vs accept white_flower ideograph_advantage secret congratulations u5408 u6e80 u7981 a b ab cl o2 sos no_entry name_badge no_entry_sign x o anger hotsprings no_pedestrians do_not_litter no_bicycles non-potable_water underage no_mobile_phones exclamation grey_exclamation question grey_question bangbang interrobang 100 low_brightness high_brightness trident fleur-de-lis part_alternation_mark warning children_crossing beginner recycle u6307 chart sparkle eight_spoked_asterisk negative_squared_cross_mark white_check_mark diamond_shape_with_a_dot_inside cyclone loop globe_with_meridians m atm sa passport_control customs baggage_claim left_luggage wheelchair no_smoking wc parking potable_water mens womens baby_symbol restroom put_litter_in_its_place cinema signal_strength koko ng ok up cool new free zero one two three four five six seven eight nine ten 1234 arrow_forward pause_button play_pause stop_button record_button track_next track_previous fast_forward rewind twisted_rightwards_arrows repeat repeat_one arrow_backward arrow_up_small arrow_down_small arrow_double_up arrow_double_down arrow_right arrow_left arrow_up arrow_down arrow_upper_right arrow_lower_right arrow_lower_left arrow_upper_left arrow_up_down left_right_arrow arrows_counterclockwise arrow_right_hook leftwards_arrow_with_hook arrow_heading_up arrow_heading_down hash asterisk information_source abc abcd capital_abcd symbols musical_note notes wavy_dash curly_loop heavy_check_mark arrows_clockwise heavy_plus_sign heavy_minus_sign heavy_division_sign heavy_multiplication_x heavy_dollar_sign currency_exchange copyright registered tm end back on top soon ballot_box_with_check radio_button white_circle black_circle red_circle large_blue_circle small_orange_diamond small_blue_diamond large_orange_diamond large_blue_diamond small_red_triangle black_small_square white_small_square black_large_square white_large_square small_red_triangle_down black_medium_square white_medium_square black_medium_small_square white_medium_small_square black_square_button white_square_button speaker sound loud_sound mute mega loudspeaker bell no_bell black_joker mahjong spades clubs hearts diamonds flower_playing_cards thought_balloon anger_right speech_balloon clock1 clock2 clock3 clock4 clock5 clock6 clock7 clock8 clock9 clock10 clock11 clock12 clock130 clock230 clock330 clock430 clock530 clock630 clock730 clock830 clock930 clock1030 clock1130 clock1230 eye_in_speech_bubble" -},flags:{icon:"flag_gb",title:"Flags",emoji:"ac af al dz ad ao ai ag ar am aw au at az bs bh bd bb by be bz bj bm bt bo ba bw br bn bg bf bi cv kh cm ca ky cf td flag_cl cn co km cg flag_cd cr hr cu cy cz dk dj dm do ec eg sv gq er ee et fk fo fj fi fr pf ga gm ge de gh gi gr gl gd gu gt gn gw gy ht hn hk hu is in flag_id ir iq ie il it ci jm jp je jo kz ke ki xk kw kg la lv lb ls lr ly li lt lu mo mk mg mw my mv ml mt mh mr mu mx fm md mc mn me ms ma mz mm na nr np nl nc nz ni ne flag_ng nu kp no om pk pw ps pa pg py pe ph pl pt pr qa ro ru rw sh kn lc vc ws sm st flag_sa sn rs sc sl sg sk si sb so za kr es lk sd sr sz se ch sy tw tj tz th tl tg to tt tn tr flag_tm flag_tm ug ua ae gb us vi uy uz vu va ve vn wf eh ye zm zw re ax ta io bq cx cc gg im yt nf pn bl pm gs tk bv hm sj um ic ea cp dg as aq vg ck cw eu gf tf gp mq mp sx ss tc "}},b}function w(b){var c=v();if(b&&b.filters){var d=c.filters;a.each(b.filters,function(b,c){return!s(c)||a.isEmptyObject(c)?void delete d[b]:void a.each(c,function(a,c){d[b][a]=c})}),b.filters=d}return a.extend({},c,b)}var x,y;window.getSelection&&document.createRange?(x=function(a){var b=window.getSelection&&window.getSelection();if(b&&b.rangeCount>0)return b.getRangeAt(0)},y=function(a,b){var c=document.createRange();c.setStart(b.startContainer,b.startOffset),c.setEnd(b.endContainer,b.endOffset),b=window.getSelection(),b.removeAllRanges(),b.addRange(c)}):document.selection&&document.body.createTextRange&&(x=function(a){return document.selection.createRange()},y=function(a,b){var c=document.body.createTextRange();c.moveToElementText(a),c.setStart(b.startContanier,b.startOffset),c.setEnd(b.endContainer,b.endOffset),c.select()});var z;function A(a,b){return a.replace(z,function(a){var c=e[0===k?"jsecapeMap":"jsEscapeMap"];return"undefined"!=typeof a&&a in c?o(b,c[a]):a})}function B(a,b){return a=a.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'").replace(/`/g,"`").replace(/(?:\r\n|\r|\n)/g,"\n").replace(/(\n+)/g,"
$1
").replace(/\n/g,"
").replace(/<\/div>/g,"
"),b.shortnames&&(a=e.shortnameToUnicode(a)),A(a,b.emojiTemplate).replace(/\t/g,"    ").replace(/ /g,"  ")}function C(a,b){switch(a=a.replace(/ /g,"\n").replace(/ /g,"\t").replace(/]*alt="([^"]+)"[^>]*>/gi,"$1").replace(/\n|\r/g,"").replace(/]*>/gi,"\n").replace(/(?:<(?:div|p|ol|ul|li|pre|code|object)[^>]*>)+/gi,"
").replace(/(?:<\/(?:div|p|ol|ul|li|pre|code|object)>)+/gi,"
").replace(/\n
<\/div>/gi,"\n").replace(/
<\/div>\n/gi,"\n").replace(/(?:
)+<\/div>/gi,"\n").replace(/([^\n])<\/div>
/gi,"$1\n").replace(/(?:<\/div>)+/gi,"
").replace(/([^\n])<\/div>([^\n])/gi,"$1\n$2").replace(/<\/div>/gi,"").replace(/([^\n])
/gi,"$1\n").replace(/\n
/gi,"\n").replace(/
\n/gi,"\n\n").replace(/<(?:[^>]+)?>/g,"").replace(new RegExp(l,"g"),"").replace(/ /g," ").replace(/</g,"<").replace(/>/g,">").replace(/"/g,'"').replace(/'/g,"'").replace(/`/g,"`").replace(/</g,"<").replace(/>/g,">").replace(/&/g,"&"),b.saveEmojisAs){case"image":a=A(a,b.emojiTemplate);break;case"shortname":a=e.toShort(a)}return a}function D(){var a=this,b=a.editor[0].offsetWidth-a.editor[0].clientWidth,c=parseInt(a.button.css("marginRight"));c!==b&&(a.button.css({marginRight:b}),a.floatingPicker&&a.picker.css({right:parseInt(a.picker.css("right"))-c+b}))}function E(){var b=this;if(!b.sprite&&b.lasyEmoji[0]&&b.lasyEmoji.eq(0).is(".lazy-emoji")){var c=b.picker.offset().top,d=c+b.picker.height()+20;b.lasyEmoji.each(function(){var b=a(this),e=b.offset().top;if(e>c&&ed)return!1}),b.lasyEmoji=b.lasyEmoji.filter(".lazy-emoji")}}function F(a,b){return(b?"":".")+j+(a?"-"+a:"")}function G(b){var c=a("
",s(b)?b:{"class":F(b,!0)});return a.each(i.call(arguments).slice(1),function(b,d){a.isFunction(d)&&(d=d.call(c)),d&&a(d).appendTo(c)}),c}function H(){return localStorage.getItem("recent_emojis")||""}function I(b,c){var d=H();if(!b.recent||b.recent!==d||c){if(d.length){var e=b.scrollArea.is(".skinnable"),f,g;e||(f=b.scrollArea.scrollTop(),c&&b.recentCategory.show(),g=b.recentCategory.is(":visible")?b.recentCategory.height():0);var h=p(d,b.emojiBtnTemplate,!0).split("|").join("");if(b.recentCategory.children(".emojibtn").remove(),a(h).insertAfter(b.recentCategory.children(".emojionearea-category-title")),b.recentCategory.children(".emojibtn").on("click",function(){b.trigger("emojibtn.click",a(this))}),b.recentFilter.show(),!e){b.recentCategory.show();var i=b.recentCategory.height();g!==i&&b.scrollArea.scrollTop(f+i-g)}}else b.recentFilter.hasClass("active")&&b.recentFilter.removeClass("active").next().addClass("active"),b.recentCategory.hide(),b.recentFilter.hide();b.recent=d}}function J(a,b){var c=H(),d=c.split("|"),e=d.indexOf(b);e!==-1&&d.splice(e,1),d.unshift(b),d.length>9&&d.pop(),localStorage.setItem("recent_emojis",d.join("|")),I(a)}function K(){var a="test";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(b){return!1}}function L(b,c,d){b.options=d=w(d),b.sprite=d.sprite&&k<3,b.inline=null===d.inline?c.is("INPUT"):d.inline,b.shortnames=d.shortnames,b.saveEmojisAs=d.saveEmojisAs,b.standalone=d.standalone,b.emojiTemplate='{alt}':'emoji" src="{img}"/>'),b.emojiTemplateAlt=b.sprite?'':'',b.emojiBtnTemplate=''+b.emojiTemplateAlt+"",b.recentEmojis=d.recentEmojis&&K();var f=d.pickerPosition;b.floatingPicker="top"===f||"bottom"===f,b.source=c,(c.is(":disabled")||c.is(".disabled"))&&b.disable();var g=c.is("TEXTAREA")||c.is("INPUT")?"val":"text",i,o,r,t,u,v,z,A,L,M,N=G("tones",d.tones?function(){this.addClass(F("tones-"+d.tonesStyle,!0));for(var b=0;b<=5;b++)this.append(a("",{"class":"btn-tone btn-tone-"+b+(b?"":" active"),"data-skin":b,role:"button"}))}:null),O=G({"class":j+(b.standalone?" "+j+"-standalone ":" ")+(c.attr("class")||""),role:"application"},i=b.editor=G("editor").attr({contenteditable:!b.standalone,placeholder:d.placeholder||c.data("placeholder")||c.attr("placeholder")||"",tabindex:0}),o=b.button=G("button",G("button-open"),G("button-close")).attr("title",d.buttonTitle),r=b.picker=G("picker",G("wrapper",t=G("filters"),d.search?v=G("search-panel",G("search",d.search?function(){b.search=a("",{placeholder:d.searchPlaceholder||"",type:"text","class":"search"}),this.append(b.search)}:null),N):null,M=G("scroll-area",d.tones&&!d.search?G("tones-panel",N):null,z=G("emojis-list")))).addClass(F("picker-position-"+d.pickerPosition,!0)).addClass(F("filters-position-"+d.filtersPosition,!0)).addClass(F("search-position-"+d.searchPosition,!0)).addClass("hidden"));d.search&&v.addClass(F("with-search",!0)),b.searchSel=null,i.data(c.data()),a.each(d.attributes,function(a,b){i.attr(a,b)});var P=G("category-block").attr({"data-tone":0}).prependTo(z);if(a.each(d.filters,function(c,e){var f=0;if("recent"!==c||b.recentEmojis){if("tones"!==c)a("",{"class":F("filter",!0)+" "+F("filter-"+c,!0),"data-filter":c,title:e.title}).wrapInner(p(e.icon,b.emojiTemplateAlt)).appendTo(t);else{if(!d.tones)return;f=5}do{var g,h=e.emoji.replace(/[\s,;]+/g,"|");g=0===f?G("category").attr({name:c,"data-tone":f}).appendTo(P):G("category-block").attr({name:c,"data-tone":f}).appendTo(z),f>0&&(g.hide(),h=h.split("|").join("_tone"+f+"|")+"_tone"+f),"recent"===c&&(h=H()),h=p(h,b.sprite?'':'',!0).split("|").join(""),g.html(h),a('
').text(e.title).prependTo(g)}while(--f>0)}}),d.filters=null,b.sprite||(b.lasyEmoji=z.find(".lazy-emoji")),u=t.find(F("filter")),u.eq(0).addClass("active"),L=z.find(F("category-block")),A=z.find(F("category")),b.recentFilter=u.filter('[data-filter="recent"]'),b.recentCategory=A.filter("[name=recent]"),b.scrollArea=M,d.container?a(d.container).wrapInner(O):O.insertAfter(c),d.hideSource&&c.hide(),b.setText(c[g]()),c[g](b.getText()),D.apply(b),b.standalone&&!b.getText().length){var Q=a(c).data("emoji-placeholder")||d.emojiPlaceholder;b.setText(Q),i.addClass("has-placeholder")}n(b,z.find(".emojibtn"),{click:"emojibtn.click"}),n(b,window,{resize:"!resize"}),n(b,N.children(),{click:"tone.click"}),n(b,[r,o],{mousedown:"!mousedown"},i),n(b,o,{click:"button.click"}),n(b,i,{paste:"!paste"},i),n(b,i,["focus","blur"],function(){return!b.stayFocused&&i}),n(b,r,{mousedown:"picker.mousedown",mouseup:"picker.mouseup",click:"picker.click",keyup:"picker.keyup",keydown:"picker.keydown",keypress:"picker.keypress"}),n(b,i,["mousedown","mouseup","click","keyup","keydown","keypress"]),n(b,r.find(".emojionearea-filter"),{click:"filter.click"}),n(b,c,{change:"source.change"}),d.search&&n(b,b.search,{keyup:"search.keypress",focus:"search.focus",blur:"search.blur"});var R=!1;if(M.on("scroll",function(){if(!R&&(E.call(b),M.is(":not(.skinnable)"))){var c=A.eq(0),d=M.offset().top;A.each(function(b,e){return!(a(e).offset().top-d>=10)&&void(c=a(e))});var e=u.filter('[data-filter="'+c.attr("name")+'"]');e[0]&&!e.is(".active")&&(u.removeClass("active"),e.addClass("active"))}}),b.on("@filter.click",function(a){var c=a.is(".active");if(M.is(".skinnable")){if(c)return;N.children().eq(0).click()}R=!0,c||(u.filter(".active").removeClass("active"),a.addClass("active"));var d=A.filter('[name="'+a.data("filter")+'"]').offset().top,e=M.scrollTop(),f=M.offset().top;M.stop().animate({scrollTop:d+e-f-2},200,"swing",function(){E.call(b),R=!1})}).on("@picker.show",function(){b.recentEmojis&&I(b),E.call(b)}).on("@tone.click",function(a){N.children().removeClass("active");var c=a.addClass("active").data("skin");c?(M.addClass("skinnable"),L.hide().filter("[data-tone="+c+"]").show(),u.removeClass("active")):(M.removeClass("skinnable"),L.hide().filter("[data-tone=0]").show(),u.eq(0).click()),E.call(b),d.search&&b.trigger("search.keypress")}).on("@button.click",function(a){a.is(".active")?b.hidePicker():(b.showPicker(),b.searchSel=null)}).on("@!paste",function(c,d){var e=function(d){var e="caret-"+(new Date).getTime(),f=B(d,b);q(f),q(''),c.scrollTop(h);var g=a("#"+e),i=g.offset().top-c.offset().top,j=c.height();(h+i>=j||h>i)&&c.scrollTop(h+i-2*j/3),g.remove(),b.stayFocused=!1,D.apply(b),m(b,"paste",[c,d,f])};if(d.originalEvent.clipboardData){var f=d.originalEvent.clipboardData.getData("text/plain");return e(f),d.preventDefault?d.preventDefault():d.stop(),d.returnValue=!1,d.stopPropagation(),!1}b.stayFocused=!0,q(""+l+"");var g=x(c[0]),h=c.scrollTop(),i=a("
",{contenteditable:!0}).css({position:"fixed",left:"-999px",width:"1px",height:"1px",top:"20px",overflow:"hidden"}).appendTo(a("BODY")).focus();window.setTimeout(function(){c.focus(),y(c[0],g);var a=C(i.html().replace(/\r\n|\n|\r/g,"
"),b);i.remove(),e(a)},200)}).on("@emojibtn.click",function(a){i.removeClass("has-placeholder"),null!==b.searchSel&&(i.focus(),y(i[0],b.searchSel),b.searchSel=null),b.standalone?(i.html(p(a.data("name"),b.emojiTemplate)),b.trigger("blur")):(x(i[0]),q(p(a.data("name"),b.emojiTemplate))),b.recentEmojis&&J(b,a.data("name")),b.trigger("search.keypress")}).on("@!resize @keyup @emojibtn.click",D).on("@!mousedown",function(c,d){return a(d.target).hasClass("search")?(b.stayFocused=!0,null===b.searchSel&&(b.searchSel=x(c[0]))):(O.is(".focused")||c.trigger("focus"),d.preventDefault()),!1}).on("@change",function(){var a=b.editor.html().replace(/<\/?(?:div|span|p)[^>]*>/gi,"");a.length&&!/^]*>$/i.test(a)||b.editor.html(b.content=""),c[g](b.getText())}).on("@source.change",function(){b.setText(c[g]()),m("change")}).on("@focus",function(){O.addClass("focused")}).on("@blur",function(){O.removeClass("focused"),d.hidePickerOnBlur&&b.hidePicker();var a=b.editor.html();b.content!==a?(b.content=a,m(b,"change",[b.editor]),c.trigger("blur").trigger("change")):c.trigger("blur"),d.search&&(b.search.val(""),b.trigger("search.keypress",!0))}),d.search&&b.on("@search.focus",function(){b.stayFocused=!0,b.search.addClass("focused")}).on("@search.keypress",function(c){var e=r.find(".emojionearea-filter"),f=d.tones?N.find("i.active").data("skin"):0,g=b.search.val().replace(/ /g,"_").replace(/"/g,'\\"');g&&g.length?(b.recentFilter.hasClass("active")&&b.recentFilter.removeClass("active").next().addClass("active"),b.recentCategory.hide(),b.recentFilter.hide(),L.each(function(){var b=function(a,b){var c=a.find('.emojibtn[data-name*="'+g+'"]');if(0===c.length)a.data("tone")===b&&a.hide(),e.filter('[data-filter="'+a.attr("name")+'"]').hide();else{var d=a.find('.emojibtn:not([data-name*="'+g+'"])');d.hide(),c.show(),a.data("tone")===b&&a.show(),e.filter('[data-filter="'+a.attr("name")+'"]').show()}},c=a(this);0===c.data("tone")?A.filter(':not([name="recent"])').each(function(){b(a(this),0)}):b(c,f)}),R?E.call(b):M.trigger("scroll")):(I(b,!0),L.filter('[data-tone="'+N.find("i.active").data("skin")+'"]:not([name="recent"])').show(),a(".emojibtn",L).show(),e.show(),E.call(b))}).on("@search.blur",function(){b.stayFocused=!1,b.search.removeClass("focused"),b.trigger("blur")}),d.shortcuts&&b.on("@keydown",function(a,c){c.ctrlKey||(9==c.which?(c.preventDefault(),o.click()):27==c.which&&(c.preventDefault(),o.is(".active")&&b.hidePicker()))}),s(d.events)&&!a.isEmptyObject(d.events)&&a.each(d.events,function(a,c){b.on(a.replace(/_/g,"."),c)}),d.autocomplete){var S=function(){var c={maxCount:d.textcomplete.maxCount,placement:d.textcomplete.placement};d.shortcuts&&(c.onKeydown=function(a,b){if(!a.ctrlKey&&13==a.which)return b.KEY_ENTER});var f=a.map(e.emojioneList,function(a,b){return d.autocompleteTones?b:/_tone[12345]/.test(b)?null:b});f.sort(),i.textcomplete([{id:j,match:/\B(:[\-+\w]*)$/,search:function(b,c){c(a.map(f,function(a){return 0===a.indexOf(b)?a:null}))},template:function(a){return p(a,b.emojiTemplate)+" "+a.replace(/:/g,"")},replace:function(a){return p(a,b.emojiTemplate)},cache:!0,index:1}],c),d.textcomplete.placement&&"static"==a(i.data("textComplete").option.appendTo).css("position")&&a(i.data("textComplete").option.appendTo).css("position","relative")},T=function(){if(b.disabled){var a=function(){b.off("enabled",a),S()};b.on("enabled",a)}else S()};a.fn.textcomplete?T():a.ajax({url:"https://cdn.rawgit.com/yuku-t/jquery-textcomplete/v1.3.4/dist/jquery.textcomplete.js",dataType:"script",cache:!0,success:T})}b.inline&&(O.addClass(F("inline",!0)),b.on("@keydown",function(a,b){13==b.which&&b.preventDefault()})),/firefox/i.test(navigator.userAgent)&&document.execCommand("enableObjectResizing",!1,!1),b.isReady=!0,b.trigger("onLoad",i),b.trigger("ready",i)}var M={defaultBase:"https://cdnjs.cloudflare.com/ajax/libs/emojione/",defaultBase3:"https://cdn.jsdelivr.net/",base:null,isLoading:!1};function N(b){var c=r();if(b=w(b),!M.isLoading)if(!e||u(t(e))<2){M.isLoading=!0;var d;d=u(c)>5?M.defaultBase3+"npm/emojione@"+c:u(c)>4?M.defaultBase3+"emojione/"+c:M.defaultBase+"/"+c,a.ajax({url:d+"/lib/js/emojione.min.js",dataType:"script",cache:!0,success:function(){e=window.emojione,c=t(e),k=u(c);var d;k>4?(M.base=M.defaultBase3+"emojione/assets/"+c,d=M.base+"/sprites/emojione-sprite-"+e.emojiSize+".css"):(M.base=M.defaultBase+c+"/assets",d=M.base+"/sprites/emojione.sprites.css"),b.sprite&&(document.createStyleSheet?document.createStyleSheet(d):a("",{rel:"stylesheet",href:d}).appendTo("head"));while(f.length)f.shift().call();M.isLoading=!1}})}else c=t(e),k=u(c),k>4?M.base=M.defaultBase3+"emojione/assets/"+c:M.base=M.defaultBase+c+"/assets";g(function(){var a="";b.useInternalCDN&&(k>4&&(a=e.emojiSize+"/"),e.imagePathPNG=M.base+"/png/"+a,e.imagePathSVG=M.base+"/svg/"+a,e.imagePathSVGSprites=M.base+"/sprites/emojione.sprites.svg",e.imageType=b.imageType),u(c)>4?(z=e.regUnicode,e.imageType=b.imageType||"png"):z=new RegExp("]*>.*?|]*>.*?|<(?:object|embed|svg|img|div|span|p|a)[^>]*>|("+e.unicodeRegexp+")","gi")})}var O=function(a,e){var f=this;N(e),c[f.id=++b]={},d[f.id]={},g(function(){L(f,a,e)})};function P(b,c){c=c.replace(/^@/,"");var e=b.id;d[e][c]&&(a.each(d[e][c],function(d,e){a.each(a.isArray(e[0])?e[0]:[e[0]],function(d,f){a(f).on(e[1],function(){var d=i.call(arguments),f=a.isFunction(e[2])?e[2].apply(b,[c].concat(d)):e[2];f&&m(b,c,[f].concat(d))})})}),d[e][c]=null)}O.prototype.on=function(b,d){if(b&&a.isFunction(d)){var e=this;a.each(b.toLowerCase().split(" "),function(a,b){P(e,b),(c[e.id][b]||(c[e.id][b]=[])).push(d)})}return this},O.prototype.off=function(b,d){if(b){var e=this.id;a.each(b.toLowerCase().replace(/_/g,".").split(" "),function(b,f){c[e][f]&&!/^@/.test(f)&&(d?a.each(c[e][f],function(a,b){b===d&&(c[e][f]=c[e][f].splice(a,1))}):c[e][f]=[])})}return this},O.prototype.trigger=function(){var a=i.call(arguments),b=[this].concat(a.slice(0,1));return b.push(a.slice(1)),m.apply(this,b)},O.prototype.setFocus=function(){var a=this;return g(function(){a.editor.focus()}),a},O.prototype.setText=function(a){var b=this;return g(function(){b.editor.html(B(a,b)),b.content=b.editor.html(),m(b,"change",[b.editor]),D.apply(b)}),b},O.prototype.getText=function(){return C(this.editor.html(),this)},O.prototype.showPicker=function(){var a=this;return a._sh_timer&&window.clearTimeout(a._sh_timer),a.picker.removeClass("hidden"),a._sh_timer=window.setTimeout(function(){a.button.addClass("active")},50),m(a,"picker.show",[a.picker]),a},O.prototype.hidePicker=function(){var a=this;return a._sh_timer&&window.clearTimeout(a._sh_timer),a.button.removeClass("active"),a._sh_timer=window.setTimeout(function(){a.picker.addClass("hidden")},500),m(a,"picker.hide",[a.picker]),a},O.prototype.enable=function(){var a=this,b=function(){a.disabled=!1,a.editor.prop("contenteditable",!0),a.button.show();var b=a[a.standalone?"button":"editor"];b.parent().removeClass("emojionearea-disable"),m(a,"enabled",[b])};return a.isReady?b():a.on("ready",b),a},O.prototype.disable=function(){var a=this;a.disabled=!0;var b=function(){a.editor.prop("contenteditable",!1),a.hidePicker(),a.button.hide();var b=a[a.standalone?"button":"editor"];b.parent().addClass("emojionearea-disable"),m(a,"disabled",[b])};return a.isReady?b():a.on("ready",b),a},a.fn.emojioneArea=function(b){return this.each(function(){return this.emojioneArea?this.emojioneArea:(a.data(this,"emojioneArea",this.emojioneArea=new O(a(this),b)),this.emojioneArea)})},a.fn.emojioneArea.defaults=v(),a.fn.emojioneAreaText=function(b){b=w(b);var c=this,d={shortnames:!b||"undefined"==typeof b.shortnames||b.shortnames,emojiTemplate:'{alt}'};return N(b),g(function(){c.each(function(){var b=a(this);return b.hasClass("emojionearea-text")||b.addClass("emojionearea-text").html(B(b.is("TEXTAREA")||b.is("INPUT")?b.val():b.text(),d)),b})}),this}},window); -//# sourceMappingURL=emojionearea.min.map \ No newline at end of file diff --git a/cookbook/static/tabulator/tabulator.min.js b/cookbook/static/tabulator/tabulator.min.js deleted file mode 100644 index 2b316d84..00000000 --- a/cookbook/static/tabulator/tabulator.min.js +++ /dev/null @@ -1,12 +0,0 @@ -/* Tabulator v4.6.0 (c) Oliver Folkerd */ -var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};!function(e,t){"object"===("undefined"==typeof exports?"undefined":_typeof(exports))&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Tabulator=t()}(this,function(){"use strict";Array.prototype.findIndex||Object.defineProperty(Array.prototype,"findIndex",{value:function(e){if(null==this)throw new TypeError('"this" is null or not defined');var t=Object(this),o=t.length>>>0;if("function"!=typeof e)throw new TypeError("predicate must be a function");for(var i=arguments[1],n=0;n>>0;if("function"!=typeof e)throw new TypeError("predicate must be a function");for(var i=arguments[1],n=0;no?(t=e-o,this.element.style.marginLeft=-t+"px"):this.element.style.marginLeft=0,this.scrollLeft=e,this.table.modExists("frozenColumns")&&this.table.modules.frozenColumns.scrollHorizontal()},t.prototype.generateColumnsFromRowData=function(e){var t,o,i=[];if(e&&e.length){t=e[0];for(var n in t){var s={field:n,title:n},r=t[n];switch(void 0===r?"undefined":_typeof(r)){case"undefined":o="string";break;case"boolean":o="boolean";break;case"object":o=Array.isArray(r)?"array":"string";break;default:o=isNaN(r)||""===r?r.match(/((^[0-9]+[a-z]+)|(^[a-z]+[0-9]+))+$/i)?"alphanum":"string":"number"}s.sorter=o,i.push(s)}this.table.options.columns=i,this.setColumns(this.table.options.columns)}},t.prototype.setColumns=function(e,t){for(var o=this;o.headersElement.firstChild;)o.headersElement.removeChild(o.headersElement.firstChild);o.columns=[],o.columnsByIndex=[],o.columnsByField={},o.table.modExists("frozenColumns")&&o.table.modules.frozenColumns.reset(),e.forEach(function(e,t){o._addColumn(e)}),o._reIndexColumns(),o.table.options.responsiveLayout&&o.table.modExists("responsiveLayout",!0)&&o.table.modules.responsiveLayout.initialize(),o.redraw(!0)},t.prototype._addColumn=function(e,t,o){var n=new i(e,this),s=n.getElement(),r=o?this.findColumnIndex(o):o;if(o&&r>-1){var a=this.columns.indexOf(o.getTopColumn()),l=o.getElement();t?(this.columns.splice(a,0,n),l.parentNode.insertBefore(s,l)):(this.columns.splice(a+1,0,n),l.parentNode.insertBefore(s,l.nextSibling))}else t?(this.columns.unshift(n),this.headersElement.insertBefore(n.getElement(),this.headersElement.firstChild)):(this.columns.push(n),this.headersElement.appendChild(n.getElement())),n.columnRendered();return n},t.prototype.registerColumnField=function(e){e.definition.field&&(this.columnsByField[e.definition.field]=e)},t.prototype.registerColumnPosition=function(e){this.columnsByIndex.push(e)},t.prototype._reIndexColumns=function(){this.columnsByIndex=[],this.columns.forEach(function(e){e.reRegisterPosition()})},t.prototype._verticalAlignHeaders=function(){var e=this,t=0;e.columns.forEach(function(e){var o;e.clearVerticalAlign(),(o=e.getHeight())>t&&(t=o)}),e.columns.forEach(function(o){o.verticalAlign(e.table.options.columnHeaderVertAlign,t)}),e.rowManager.adjustTableSize()},t.prototype.findColumn=function(e){var t=this;if("object"!=(void 0===e?"undefined":_typeof(e)))return this.columnsByField[e]||!1;if(e instanceof i)return e;if(e instanceof o)return e._getSelf()||!1;if("undefined"!=typeof HTMLElement&&e instanceof HTMLElement){return t.columns.find(function(t){return t.element===e})||!1}return!1},t.prototype.getColumnByField=function(e){return this.columnsByField[e]},t.prototype.getColumnsByFieldRoot=function(e){var t=this,o=[];return Object.keys(this.columnsByField).forEach(function(i){i.split(".")[0]===e&&o.push(t.columnsByField[i])}),o},t.prototype.getColumnByIndex=function(e){return this.columnsByIndex[e]},t.prototype.getFirstVisibileColumn=function(e){var e=this.columnsByIndex.findIndex(function(e){return e.visible});return e>-1&&this.columnsByIndex[e]},t.prototype.getColumns=function(){return this.columns},t.prototype.findColumnIndex=function(e){return this.columnsByIndex.findIndex(function(t){return e===t})},t.prototype.getRealColumns=function(){return this.columnsByIndex},t.prototype.traverse=function(e){this.columnsByIndex.forEach(function(t,o){e(t,o)})},t.prototype.getDefinitions=function(e){var t=this,o=[];return t.columnsByIndex.forEach(function(t){(!e||e&&t.visible)&&o.push(t.getDefinition())}),o},t.prototype.getDefinitionTree=function(){var e=this,t=[];return e.columns.forEach(function(e){t.push(e.getDefinition(!0))}),t},t.prototype.getComponents=function(e){var t=this,o=[];return(e?t.columns:t.columnsByIndex).forEach(function(e){o.push(e.getComponent())}),o},t.prototype.getWidth=function(){var e=0;return this.columnsByIndex.forEach(function(t){t.visible&&(e+=t.getWidth())}),e},t.prototype.moveColumn=function(e,t,o){this.moveColumnActual(e,t,o),this.table.options.responsiveLayout&&this.table.modExists("responsiveLayout",!0)&&this.table.modules.responsiveLayout.initialize(),this.table.modExists("columnCalcs")&&this.table.modules.columnCalcs.recalc(this.table.rowManager.activeRows),t.element.parentNode.insertBefore(e.element,t.element),o&&t.element.parentNode.insertBefore(t.element,e.element),this._verticalAlignHeaders(),this.table.rowManager.reinitialize()},t.prototype.moveColumnActual=function(e,t,o){e.parent.isGroup?this._moveColumnInArray(e.parent.columns,e,t,o):this._moveColumnInArray(this.columns,e,t,o),this._moveColumnInArray(this.columnsByIndex,e,t,o,!0),this.table.options.responsiveLayout&&this.table.modExists("responsiveLayout",!0)&&this.table.modules.responsiveLayout.initialize(),this.table.options.columnMoved&&this.table.options.columnMoved.call(this.table,e.getComponent(),this.table.columnManager.getComponents()),this.table.options.persistence&&this.table.modExists("persistence",!0)&&this.table.modules.persistence.config.columns&&this.table.modules.persistence.save("columns")},t.prototype._moveColumnInArray=function(e,t,o,i,n){var s,r=e.indexOf(t);r>-1&&(e.splice(r,1),s=e.indexOf(o),s>-1?i&&(s+=1):s=r,e.splice(s,0,t),n&&this.table.rowManager.rows.forEach(function(e){if(e.cells.length){var t=e.cells.splice(r,1)[0];e.cells.splice(s,0,t)}}))},t.prototype.scrollToColumn=function(e,t,o){var i=this,n=0,s=0,r=0,a=e.getElement();return new Promise(function(l,c){if(void 0===t&&(t=i.table.options.scrollToColumnPosition),void 0===o&&(o=i.table.options.scrollToColumnIfVisible),e.visible){switch(t){case"middle":case"center":r=-i.element.clientWidth/2;break;case"right":r=a.clientWidth-i.headersElement.clientWidth}if(!o&&(s=a.offsetLeft)>0&&s+a.offsetWidthe.rowManager.element.clientHeight&&(t-=e.rowManager.element.offsetWidth-e.rowManager.element.clientWidth),this.columnsByIndex.forEach(function(i){var n,s,r;i.visible&&(n=i.definition.width||0,s=void 0===i.minWidth?e.table.options.columnMinWidth:parseInt(i.minWidth),r="string"==typeof n?n.indexOf("%")>-1?t/100*parseInt(n):parseInt(n):n,o+=r>s?r:s)}),o},t.prototype.addColumn=function(e,t,o){var i=this;return new Promise(function(n,s){var r=i._addColumn(e,t,o);i._reIndexColumns(),i.table.options.responsiveLayout&&i.table.modExists("responsiveLayout",!0)&&i.table.modules.responsiveLayout.initialize(),i.table.modExists("columnCalcs")&&i.table.modules.columnCalcs.recalc(i.table.rowManager.activeRows),i.redraw(),"fitColumns"!=i.table.modules.layout.getMode()&&r.reinitializeWidth(),i._verticalAlignHeaders(),i.table.rowManager.reinitialize(),n(r)})},t.prototype.deregisterColumn=function(e){var t,o=e.getField();o&&delete this.columnsByField[o],t=this.columnsByIndex.indexOf(e),t>-1&&this.columnsByIndex.splice(t,1),t=this.columns.indexOf(e),t>-1&&this.columns.splice(t,1),this.table.options.responsiveLayout&&this.table.modExists("responsiveLayout",!0)&&this.table.modules.responsiveLayout.initialize(),this.redraw()},t.prototype.redraw=function(e){e&&(u.prototype.helpers.elVisible(this.element)&&this._verticalAlignHeaders(),this.table.rowManager.resetScroll(),this.table.rowManager.reinitialize()),["fitColumns","fitDataStretch"].indexOf(this.table.modules.layout.getMode())>-1?this.table.modules.layout.layout():e?this.table.modules.layout.layout():this.table.options.responsiveLayout&&this.table.modExists("responsiveLayout",!0)&&this.table.modules.responsiveLayout.update(),this.table.modExists("frozenColumns")&&this.table.modules.frozenColumns.layout(),this.table.modExists("columnCalcs")&&this.table.modules.columnCalcs.recalc(this.table.rowManager.activeRows),e&&(this.table.options.persistence&&this.table.modExists("persistence",!0)&&this.table.modules.persistence.config.columns&&this.table.modules.persistence.save("columns"),this.table.modExists("columnCalcs")&&this.table.modules.columnCalcs.redraw()),this.table.footerManager.redraw()};var o=function(e){this._column=e,this.type="ColumnComponent"};o.prototype.getElement=function(){return this._column.getElement()},o.prototype.getDefinition=function(){return this._column.getDefinition()},o.prototype.getField=function(){return this._column.getField()},o.prototype.getCells=function(){var e=[];return this._column.cells.forEach(function(t){e.push(t.getComponent())}),e},o.prototype.getVisibility=function(){return this._column.visible},o.prototype.show=function(){this._column.isGroup?this._column.columns.forEach(function(e){e.show()}):this._column.show()},o.prototype.hide=function(){this._column.isGroup?this._column.columns.forEach(function(e){e.hide()}):this._column.hide()},o.prototype.toggle=function(){this._column.visible?this.hide():this.show()},o.prototype.delete=function(){return this._column.delete()},o.prototype.getSubColumns=function(){var e=[];return this._column.columns.length&&this._column.columns.forEach(function(t){e.push(t.getComponent())}),e},o.prototype.getParentColumn=function(){return this._column.parent instanceof i&&this._column.parent.getComponent()},o.prototype._getSelf=function(){return this._column},o.prototype.scrollTo=function(){return this._column.table.columnManager.scrollToColumn(this._column)},o.prototype.getTable=function(){return this._column.table},o.prototype.headerFilterFocus=function(){this._column.table.modExists("filter",!0)&&this._column.table.modules.filter.setHeaderFilterFocus(this._column)},o.prototype.reloadHeaderFilter=function(){this._column.table.modExists("filter",!0)&&this._column.table.modules.filter.reloadHeaderFilter(this._column)},o.prototype.getHeaderFilterValue=function(){this._column.table.modExists("filter",!0)&&this._column.table.modules.filter.getHeaderFilterValue(this._column)},o.prototype.setHeaderFilterValue=function(e){this._column.table.modExists("filter",!0)&&this._column.table.modules.filter.setHeaderFilterValue(this._column,e)},o.prototype.move=function(e,t){var o=this._column.table.columnManager.findColumn(e);o?this._column.table.columnManager.moveColumn(this._column,o,t):console.warn("Move Error - No matching column found:",o)},o.prototype.getNextColumn=function(){var e=this._column.nextColumn();return!!e&&e.getComponent()},o.prototype.getPrevColumn=function(){var e=this._column.prevColumn();return!!e&&e.getComponent()},o.prototype.updateDefinition=function(e){return this._column.updateDefinition(e)};var i=function e(t,o){var i=this;this.table=o.table,this.definition=t,this.parent=o,this.type="column",this.columns=[],this.cells=[],this.element=this.createElement(),this.contentElement=!1,this.titleElement=!1,this.groupElement=this.createGroupElement(),this.isGroup=!1,this.tooltip=!1,this.hozAlign="",this.vertAlign="",this.field="",this.fieldStructure="",this.getFieldValue="",this.setFieldValue="",this.titleFormatterRendered=!1,this.setField(this.definition.field),this.table.options.invalidOptionWarnings&&this.checkDefinition(),this.modules={},this.cellEvents={cellClick:!1,cellDblClick:!1,cellContext:!1,cellTap:!1,cellDblTap:!1,cellTapHold:!1,cellMouseEnter:!1,cellMouseLeave:!1,cellMouseOver:!1,cellMouseOut:!1,cellMouseMove:!1},this.width=null,this.widthStyled="",this.minWidth=null,this.minWidthStyled="",this.widthFixed=!1,this.visible=!0,this._mapDepricatedFunctionality(),t.columns?(this.isGroup=!0,t.columns.forEach(function(t,o){var n=new e(t,i);i.attachColumn(n)}),i.checkColumnVisibility()):o.registerColumnField(this),t.rowHandle&&!1!==this.table.options.movableRows&&this.table.modExists("moveRow")&&this.table.modules.moveRow.setHandle(!0),this._buildHeader(),this.bindModuleColumns()};i.prototype.createElement=function(){var e=document.createElement("div");return e.classList.add("tabulator-col"),e.setAttribute("role","columnheader"),e.setAttribute("aria-sort","none"),e},i.prototype.createGroupElement=function(){var e=document.createElement("div");return e.classList.add("tabulator-col-group-cols"),e},i.prototype.checkDefinition=function(){var e=this;Object.keys(this.definition).forEach(function(t){-1===e.defaultOptionList.indexOf(t)&&console.warn("Invalid column definition option in '"+(e.field||e.definition.title)+"' column:",t)})},i.prototype.setField=function(e){this.field=e,this.fieldStructure=e?this.table.options.nestedFieldSeparator?e.split(this.table.options.nestedFieldSeparator):[e]:[],this.getFieldValue=this.fieldStructure.length>1?this._getNestedData:this._getFlatData,this.setFieldValue=this.fieldStructure.length>1?this._setNestedData:this._setFlatData},i.prototype.registerColumnPosition=function(e){this.parent.registerColumnPosition(e)},i.prototype.registerColumnField=function(e){this.parent.registerColumnField(e)},i.prototype.reRegisterPosition=function(){this.isGroup?this.columns.forEach(function(e){e.reRegisterPosition()}):this.registerColumnPosition(this)},i.prototype._mapDepricatedFunctionality=function(){void 0!==this.definition.hideInHtml&&(this.definition.htmlOutput=!this.definition.hideInHtml,console.warn("hideInHtml column definition property is deprecated, you should now use htmlOutput")),void 0!==this.definition.align&&(this.definition.hozAlign=this.definition.align,console.warn("align column definition property is deprecated, you should now use hozAlign"))},i.prototype.setTooltip=function(){var e=this,t=e.definition,o=t.headerTooltip||!1===t.tooltip?t.headerTooltip:e.table.options.tooltipsHeader;o?!0===o?t.field?e.table.modules.localize.bind("columns|"+t.field,function(o){e.element.setAttribute("title",o||t.title)}):e.element.setAttribute("title",t.title):("function"==typeof o&&!1===(o=o(e.getComponent()))&&(o=""),e.element.setAttribute("title",o)):e.element.setAttribute("title","")},i.prototype._buildHeader=function(){for(var e=this,t=e.definition;e.element.firstChild;)e.element.removeChild(e.element.firstChild);t.headerVertical&&(e.element.classList.add("tabulator-col-vertical"),"flip"===t.headerVertical&&e.element.classList.add("tabulator-col-vertical-flip")),e.contentElement=e._bindEvents(),e.contentElement=e._buildColumnHeaderContent(),e.element.appendChild(e.contentElement),e.isGroup?e._buildGroupHeader():e._buildColumnHeader(),e.setTooltip(),e.table.options.resizableColumns&&e.table.modExists("resizeColumns")&&e.table.modules.resizeColumns.initializeColumn("header",e,e.element),t.headerFilter&&e.table.modExists("filter")&&e.table.modExists("edit")&&(void 0!==t.headerFilterPlaceholder&&t.field&&e.table.modules.localize.setHeaderFilterColumnPlaceholder(t.field,t.headerFilterPlaceholder),e.table.modules.filter.initializeColumn(e)),e.table.modExists("frozenColumns")&&e.table.modules.frozenColumns.initializeColumn(e),e.table.options.movableColumns&&!e.isGroup&&e.table.modExists("moveColumn")&&e.table.modules.moveColumn.initializeColumn(e),(t.topCalc||t.bottomCalc)&&e.table.modExists("columnCalcs")&&e.table.modules.columnCalcs.initializeColumn(e),e.table.modExists("persistence")&&e.table.modules.persistence.config.columns&&e.table.modules.persistence.initializeColumn(e),e.element.addEventListener("mouseenter",function(t){e.setTooltip()})},i.prototype._bindEvents=function(){var e,t,o,i=this,n=i.definition;"function"==typeof n.headerClick&&i.element.addEventListener("click",function(e){n.headerClick(e,i.getComponent())}),"function"==typeof n.headerDblClick&&i.element.addEventListener("dblclick",function(e){n.headerDblClick(e,i.getComponent())}),"function"==typeof n.headerContext&&i.element.addEventListener("contextmenu",function(e){n.headerContext(e,i.getComponent())}),"function"==typeof n.headerTap&&(o=!1,i.element.addEventListener("touchstart",function(e){o=!0},{passive:!0}),i.element.addEventListener("touchend",function(e){o&&n.headerTap(e,i.getComponent()),o=!1})),"function"==typeof n.headerDblTap&&(e=null,i.element.addEventListener("touchend",function(t){e?(clearTimeout(e),e=null,n.headerDblTap(t,i.getComponent())):e=setTimeout(function(){clearTimeout(e),e=null},300)})),"function"==typeof n.headerTapHold&&(t=null,i.element.addEventListener("touchstart",function(e){clearTimeout(t),t=setTimeout(function(){clearTimeout(t),t=null,o=!1,n.headerTapHold(e,i.getComponent())},1e3)},{passive:!0}),i.element.addEventListener("touchend",function(e){clearTimeout(t),t=null})),"function"==typeof n.cellClick&&(i.cellEvents.cellClick=n.cellClick),"function"==typeof n.cellDblClick&&(i.cellEvents.cellDblClick=n.cellDblClick),"function"==typeof n.cellContext&&(i.cellEvents.cellContext=n.cellContext),"function"==typeof n.cellMouseEnter&&(i.cellEvents.cellMouseEnter=n.cellMouseEnter),"function"==typeof n.cellMouseLeave&&(i.cellEvents.cellMouseLeave=n.cellMouseLeave),"function"==typeof n.cellMouseOver&&(i.cellEvents.cellMouseOver=n.cellMouseOver),"function"==typeof n.cellMouseOut&&(i.cellEvents.cellMouseOut=n.cellMouseOut),"function"==typeof n.cellMouseMove&&(i.cellEvents.cellMouseMove=n.cellMouseMove),"function"==typeof n.cellTap&&(i.cellEvents.cellTap=n.cellTap),"function"==typeof n.cellDblTap&&(i.cellEvents.cellDblTap=n.cellDblTap),"function"==typeof n.cellTapHold&&(i.cellEvents.cellTapHold=n.cellTapHold),"function"==typeof n.cellEdited&&(i.cellEvents.cellEdited=n.cellEdited),"function"==typeof n.cellEditing&&(i.cellEvents.cellEditing=n.cellEditing),"function"==typeof n.cellEditCancelled&&(i.cellEvents.cellEditCancelled=n.cellEditCancelled)},i.prototype._buildColumnHeader=function(){var e=this,t=e.definition,o=e.table;if(o.modExists("sort")&&o.modules.sort.initializeColumn(e,e.contentElement),(t.headerContextMenu||t.headerMenu)&&o.modExists("menu")&&o.modules.menu.initializeColumnHeader(e),o.modExists("format")&&o.modules.format.initializeColumn(e),void 0!==t.editor&&o.modExists("edit")&&o.modules.edit.initializeColumn(e),void 0!==t.validator&&o.modExists("validate")&&o.modules.validate.initializeColumn(e),o.modExists("mutator")&&o.modules.mutator.initializeColumn(e),o.modExists("accessor")&&o.modules.accessor.initializeColumn(e),_typeof(o.options.responsiveLayout)&&o.modExists("responsiveLayout")&&o.modules.responsiveLayout.initializeColumn(e),void 0!==t.visible&&(t.visible?e.show(!0):e.hide(!0)),t.cssClass){t.cssClass.split(" ").forEach(function(t){e.element.classList.add(t)})}t.field&&this.element.setAttribute("tabulator-field",t.field),e.setMinWidth(void 0===t.minWidth?e.table.options.columnMinWidth:parseInt(t.minWidth)),e.reinitializeWidth(),e.tooltip=e.definition.tooltip||!1===e.definition.tooltip?e.definition.tooltip:e.table.options.tooltips,e.hozAlign=void 0===e.definition.hozAlign?e.table.options.cellHozAlign:e.definition.hozAlign,e.vertAlign=void 0===e.definition.vertAlign?e.table.options.cellVertAlign:e.definition.vertAlign},i.prototype._buildColumnHeaderContent=function(){var e=(self.definition,self.table,document.createElement("div"));return e.classList.add("tabulator-col-content"),this.titleElement=this._buildColumnHeaderTitle(),e.appendChild(this.titleElement),e},i.prototype._buildColumnHeaderTitle=function(){var e=this,t=e.definition,o=e.table,i=document.createElement("div");if(i.classList.add("tabulator-col-title"),t.editableTitle){var n=document.createElement("input");n.classList.add("tabulator-title-editor"),n.addEventListener("click",function(e){e.stopPropagation(),n.focus()}),n.addEventListener("change",function(){t.title=n.value,o.options.columnTitleChanged.call(e.table,e.getComponent())}),i.appendChild(n),t.field?o.modules.localize.bind("columns|"+t.field,function(e){n.value=e||t.title||" "}):n.value=t.title||" "}else t.field?o.modules.localize.bind("columns|"+t.field,function(o){e._formatColumnHeaderTitle(i,o||t.title||" ")}):e._formatColumnHeaderTitle(i,t.title||" ");return i},i.prototype._formatColumnHeaderTitle=function(e,t){var o,i,n,s,r,a=this;if(this.definition.titleFormatter&&this.table.modExists("format"))switch(o=this.table.modules.format.getFormatter(this.definition.titleFormatter),r=function(e){a.titleFormatterRendered=e},s={getValue:function(){return t},getElement:function(){return e}},n=this.definition.titleFormatterParams||{},n="function"==typeof n?n():n,i=o.call(this.table.modules.format,s,n,r),void 0===i?"undefined":_typeof(i)){case"object":i instanceof Node?e.appendChild(i):(e.innerHTML="",console.warn("Format Error - Title formatter has returned a type of object, the only valid formatter object return is an instance of Node, the formatter returned:",i));break;case"undefined":case"null":e.innerHTML="";break;default:e.innerHTML=i}else e.innerHTML=t},i.prototype._buildGroupHeader=function(){var e=this;if(this.element.classList.add("tabulator-col-group"),this.element.setAttribute("role","columngroup"),this.element.setAttribute("aria-title",this.definition.title),this.definition.cssClass){this.definition.cssClass.split(" ").forEach(function(t){e.element.classList.add(t)})}this.element.appendChild(this.groupElement)},i.prototype._getFlatData=function(e){return e[this.field]},i.prototype._getNestedData=function(e){for(var t,o=e,i=this.fieldStructure,n=i.length,s=0;s-1&&this._nextVisibleColumn(e+1)},i.prototype._nextVisibleColumn=function(e){var t=this.table.columnManager.getColumnByIndex(e);return!t||t.visible?t:this._nextVisibleColumn(e+1)},i.prototype.prevColumn=function(){var e=this.table.columnManager.findColumnIndex(this);return e>-1&&this._prevVisibleColumn(e-1)},i.prototype._prevVisibleColumn=function(e){var t=this.table.columnManager.getColumnByIndex(e);return!t||t.visible?t:this._prevVisibleColumn(e-1)},i.prototype.reinitializeWidth=function(e){this.widthFixed=!1,void 0===this.definition.width||e||this.setWidth(this.definition.width),this.table.modExists("filter")&&this.table.modules.filter.hideHeaderFilterElements(),this.fitToData(),this.table.modExists("filter")&&this.table.modules.filter.showHeaderFilterElements()},i.prototype.fitToData=function(){var e=this;this.widthFixed||(this.element.style.width="",e.cells.forEach(function(e){e.clearWidth()}));var t=this.element.offsetWidth;e.width&&this.widthFixed||(e.cells.forEach(function(e){var o=e.getWidth();o>t&&(t=o)}),t&&e.setWidthActual(t+1))},i.prototype.updateDefinition=function(e){var t=this;return new Promise(function(o,i){var n;t.isGroup?(console.warn("Column Update Error - The updateDefintion function is only available on columns, not column groups"),i("Column Update Error - The updateDefintion function is only available on columns, not column groups")):(n=Object.assign({},t.getDefinition()),n=Object.assign(n,e),t.table.columnManager.addColumn(n,!1,t).then(function(e){n.field==t.field&&(t.field=!1),t.delete().then(function(){o(e.getComponent())}).catch(function(e){i(e)})}).catch(function(e){i(e)}))})},i.prototype.deleteCell=function(e){var t=this.cells.indexOf(e);t>-1&&this.cells.splice(t,1)}, -i.prototype.defaultOptionList=["title","field","columns","visible","align","hozAlign","vertAlign","width","minWidth","widthGrow","widthShrink","resizable","frozen","responsive","tooltip","cssClass","rowHandle","hideInHtml","print","htmlOutput","sorter","sorterParams","formatter","formatterParams","variableHeight","editable","editor","editorParams","validator","mutator","mutatorParams","mutatorData","mutatorDataParams","mutatorEdit","mutatorEditParams","mutatorClipboard","mutatorClipboardParams","accessor","accessorParams","accessorData","accessorDataParams","accessorDownload","accessorDownloadParams","accessorClipboard","accessorClipboardParams","accessorPrint","accessorPrintParams","accessorHtmlOutput","accessorHtmlOutputParams","clipboard","download","downloadTitle","topCalc","topCalcParams","topCalcFormatter","topCalcFormatterParams","bottomCalc","bottomCalcParams","bottomCalcFormatter","bottomCalcFormatterParams","cellClick","cellDblClick","cellContext","cellTap","cellDblTap","cellTapHold","cellMouseEnter","cellMouseLeave","cellMouseOver","cellMouseOut","cellMouseMove","cellEditing","cellEdited","cellEditCancelled","headerSort","headerSortStartingDir","headerSortTristate","headerClick","headerDblClick","headerContext","headerTap","headerDblTap","headerTapHold","headerTooltip","headerVertical","editableTitle","titleFormatter","titleFormatterParams","headerFilter","headerFilterPlaceholder","headerFilterParams","headerFilterEmptyCheck","headerFilterFunc","headerFilterFuncParams","headerFilterLiveFilter","print","headerContextMenu","headerMenu","contextMenu","formatterPrint","formatterPrintParams","formatterClipboard","formatterClipboardParams","formatterHtmlOutput","formatterHtmlOutputParams"],i.prototype.getComponent=function(){return new o(this)};var n=function(e){this.table=e,this.element=this.createHolderElement(),this.tableElement=this.createTableElement(),this.heightFixer=this.createTableElement(),this.columnManager=null,this.height=0,this.firstRender=!1,this.renderMode="virtual",this.fixedHeight=!1,this.rows=[],this.activeRows=[],this.activeRowsCount=0,this.displayRows=[],this.displayRowsCount=0,this.scrollTop=0,this.scrollLeft=0,this.vDomRowHeight=20,this.vDomTop=0,this.vDomBottom=0,this.vDomScrollPosTop=0,this.vDomScrollPosBottom=0,this.vDomTopPad=0,this.vDomBottomPad=0,this.vDomMaxRenderChain=90,this.vDomWindowBuffer=0,this.vDomWindowMinTotalRows=20,this.vDomWindowMinMarginRows=5,this.vDomTopNewRows=[],this.vDomBottomNewRows=[],this.rowNumColumn=!1,this.redrawBlock=!1,this.redrawBlockRestoreConfig=!1,this.redrawBlockRederInPosition=!1};n.prototype.createHolderElement=function(){var e=document.createElement("div");return e.classList.add("tabulator-tableHolder"),e.setAttribute("tabindex",0),e},n.prototype.createTableElement=function(){var e=document.createElement("div");return e.classList.add("tabulator-table"),e},n.prototype.getElement=function(){return this.element},n.prototype.getTableElement=function(){return this.tableElement},n.prototype.getRowPosition=function(e,t){return t?this.activeRows.indexOf(e):this.rows.indexOf(e)},n.prototype.setColumnManager=function(e){this.columnManager=e},n.prototype.initialize=function(){var e=this;e.setRenderMode(),e.element.appendChild(e.tableElement),e.firstRender=!0,e.element.addEventListener("scroll",function(){var t=e.element.scrollLeft;e.scrollLeft!=t&&(e.columnManager.scrollHorizontal(t),e.table.options.groupBy&&e.table.modules.groupRows.scrollHeaders(t),e.table.modExists("columnCalcs")&&e.table.modules.columnCalcs.scrollHorizontal(t),e.table.options.scrollHorizontal(t)),e.scrollLeft=t}),"virtual"===this.renderMode&&e.element.addEventListener("scroll",function(){var t=e.element.scrollTop,o=e.scrollTop>t;e.scrollTop!=t?(e.scrollTop=t,e.scrollVertical(o),"scroll"==e.table.options.ajaxProgressiveLoad&&e.table.modules.ajax.nextPage(e.element.scrollHeight-e.element.clientHeight-t),e.table.options.scrollVertical(t)):e.scrollTop=t})},n.prototype.findRow=function(e){var t=this;if("object"!=(void 0===e?"undefined":_typeof(e))){if(void 0===e||null===e)return!1;return t.rows.find(function(o){return o.data[t.table.options.index]==e})||!1}if(e instanceof r)return e;if(e instanceof s)return e._getSelf()||!1;if("undefined"!=typeof HTMLElement&&e instanceof HTMLElement){return t.rows.find(function(t){return t.element===e})||!1}return!1},n.prototype.getRowFromDataObject=function(e){return this.rows.find(function(t){return t.data===e})||!1},n.prototype.getRowFromPosition=function(e,t){return t?this.activeRows[e]:this.rows[e]},n.prototype.scrollToRow=function(e,t,o){var i,n=this,s=this.getDisplayRows().indexOf(e),r=e.getElement(),a=0;return new Promise(function(e,l){if(s>-1){if(void 0===t&&(t=n.table.options.scrollToRowPosition),void 0===o&&(o=n.table.options.scrollToRowIfVisible),"nearest"===t)switch(n.renderMode){case"classic":i=u.prototype.helpers.elOffset(r).top,t=Math.abs(n.element.scrollTop-i)>Math.abs(n.element.scrollTop+n.element.clientHeight-i)?"bottom":"top";break;case"virtual":t=Math.abs(n.vDomTop-s)>Math.abs(n.vDomBottom-s)?"bottom":"top"}if(!o&&u.prototype.helpers.elVisible(r)&&(a=u.prototype.helpers.elOffset(r).top-u.prototype.helpers.elOffset(n.element).top)>0&&a-1&&this.activeRows.splice(i,1),o>-1&&this.rows.splice(o,1),this.setActiveRows(this.activeRows),this.displayRowIterator(function(t){var o=t.indexOf(e);o>-1&&t.splice(o,1)}),t||this.reRenderInPosition(),this.regenerateRowNumbers(),this.table.options.rowDeleted.call(this.table,e.getComponent()),this.table.options.dataEdited.call(this.table,this.getData()),this.table.options.groupBy&&this.table.modExists("groupRows")?this.table.modules.groupRows.updateGroupRows(!0):this.table.options.pagination&&this.table.modExists("page")?this.refreshActiveData(!1,!1,!0):this.table.options.pagination&&this.table.modExists("page")&&this.refreshActiveData("page")},n.prototype.addRow=function(e,t,o,i){var n=this.addRowActual(e,t,o,i);return this.table.options.history&&this.table.modExists("history")&&this.table.modules.history.action("rowAdd",n,{data:e,pos:t,index:o}),n},n.prototype.addRows=function(e,t,o){var i=this,n=this,s=0,r=[];return new Promise(function(a,l){t=i.findAddRowPos(t),Array.isArray(e)||(e=[e]),s=e.length-1,(void 0===o&&t||void 0!==o&&!t)&&e.reverse(),e.forEach(function(e,i){var s=n.addRow(e,t,o,!0);r.push(s)}),i.table.options.groupBy&&i.table.modExists("groupRows")?i.table.modules.groupRows.updateGroupRows(!0):i.table.options.pagination&&i.table.modExists("page")?i.refreshActiveData(!1,!1,!0):i.reRenderInPosition(),i.table.modExists("columnCalcs")&&i.table.modules.columnCalcs.recalc(i.table.rowManager.activeRows),i.regenerateRowNumbers(),a(r)})},n.prototype.findAddRowPos=function(e){return void 0===e&&(e=this.table.options.addRowPos),"pos"===e&&(e=!0),"bottom"===e&&(e=!1),e},n.prototype.addRowActual=function(e,t,o,i){var n,s,a=e instanceof r?e:new r(e||{},this),l=this.findAddRowPos(t),c=-1;if(!o&&this.table.options.pagination&&"page"==this.table.options.paginationAddRow&&(s=this.getDisplayRows(),l?s.length?o=s[0]:this.activeRows.length&&(o=this.activeRows[this.activeRows.length-1],l=!1):s.length&&(o=s[s.length-1],l=!(s.length1&&(!o||o&&-1==u.indexOf(o)?l?u[0]!==a&&(o=u[0],this._moveRowInArray(a.getGroup().rows,a,o,!l)):u[u.length-1]!==a&&(o=u[u.length-1],this._moveRowInArray(a.getGroup().rows,a,o,!l)):this._moveRowInArray(a.getGroup().rows,a,o,!l))}return o&&(c=this.rows.indexOf(o)),o&&c>-1?(n=this.activeRows.indexOf(o),this.displayRowIterator(function(e){var t=e.indexOf(o);t>-1&&e.splice(l?t:t+1,0,a)}),n>-1&&this.activeRows.splice(l?n:n+1,0,a),this.rows.splice(l?c:c+1,0,a)):l?(this.displayRowIterator(function(e){e.unshift(a)}),this.activeRows.unshift(a),this.rows.unshift(a)):(this.displayRowIterator(function(e){e.push(a)}),this.activeRows.push(a),this.rows.push(a)),this.setActiveRows(this.activeRows),this.table.options.rowAdded.call(this.table,a.getComponent()),this.table.options.dataEdited.call(this.table,this.getData()),i||this.reRenderInPosition(),a},n.prototype.moveRow=function(e,t,o){this.table.options.history&&this.table.modExists("history")&&this.table.modules.history.action("rowMove",e,{posFrom:this.getRowPosition(e),posTo:this.getRowPosition(t),to:t,after:o}),this.moveRowActual(e,t,o),this.regenerateRowNumbers(),this.table.options.rowMoved.call(this.table,e.getComponent())},n.prototype.moveRowActual=function(e,t,o){var i=this;if(this._moveRowInArray(this.rows,e,t,o),this._moveRowInArray(this.activeRows,e,t,o),this.displayRowIterator(function(n){i._moveRowInArray(n,e,t,o)}),this.table.options.groupBy&&this.table.modExists("groupRows")){var n=t.getGroup(),s=e.getGroup();n===s?this._moveRowInArray(n.rows,e,t,o):(s&&s.removeRow(e),n.insertRow(e,t,o))}},n.prototype._moveRowInArray=function(e,t,o,i){var n,s,r,a;if(t!==o&&(n=e.indexOf(t),n>-1&&(e.splice(n,1),s=e.indexOf(o),s>-1?i?e.splice(s+1,0,t):e.splice(s,0,t):e.splice(n,0,t)),e===this.getDisplayRows())){r=nn?s:n+1;for(var l=r;l<=a;l++)e[l]&&this.styleRow(e[l],l)}},n.prototype.clearData=function(){this.setData([])},n.prototype.getRowIndex=function(e){return this.findRowIndex(e,this.rows)},n.prototype.getDisplayRowIndex=function(e){var t=this.getDisplayRows().indexOf(e);return t>-1&&t},n.prototype.nextDisplayRow=function(e,t){var o=this.getDisplayRowIndex(e),i=!1;return!1!==o&&o-1)&&o},n.prototype.getData=function(e,t){var o=[];return this.getRows(e).forEach(function(e){"row"==e.type&&o.push(e.getData(t||"data"))}),o},n.prototype.getComponents=function(e){var t=[];return this.getRows(e).forEach(function(e){t.push(e.getComponent())}),t},n.prototype.getDataCount=function(e){return this.getRows(e).length},n.prototype._genRemoteRequest=function(){var e=this,t=this.table,o=t.options,i={};if(t.modExists("page")){if(o.ajaxSorting){var n=this.table.modules.sort.getSort();n.forEach(function(e){delete e.column}),i[this.table.modules.page.paginationDataSentNames.sorters]=n}if(o.ajaxFiltering){var s=this.table.modules.filter.getFilters(!0,!0);i[this.table.modules.page.paginationDataSentNames.filters]=s}this.table.modules.ajax.setParams(i,!0)}t.modules.ajax.sendRequest().then(function(t){e._setDataActual(t,!0)}).catch(function(e){})},n.prototype.filterRefresh=function(){var e=this.table,t=e.options,o=this.scrollLeft;t.ajaxFiltering?"remote"==t.pagination&&e.modExists("page")?(e.modules.page.reset(!0),e.modules.page.setPage(1).then(function(){}).catch(function(){})):t.ajaxProgressiveLoad?e.modules.ajax.loadData().then(function(){}).catch(function(){}):this._genRemoteRequest():this.refreshActiveData("filter"),this.scrollHorizontal(o)},n.prototype.sorterRefresh=function(e){var t=this.table,o=this.table.options,i=this.scrollLeft;o.ajaxSorting?("remote"==o.pagination||o.progressiveLoad)&&t.modExists("page")?(t.modules.page.reset(!0),t.modules.page.setPage(1).then(function(){}).catch(function(){})):o.ajaxProgressiveLoad?t.modules.ajax.loadData().then(function(){}).catch(function(){}):this._genRemoteRequest():this.refreshActiveData(e?"filter":"sort"),this.scrollHorizontal(i)},n.prototype.scrollHorizontal=function(e){this.scrollLeft=e,this.element.scrollLeft=e,this.table.options.groupBy&&this.table.modules.groupRows.scrollHeaders(e),this.table.modExists("columnCalcs")&&this.table.modules.columnCalcs.scrollHorizontal(e)},n.prototype.refreshActiveData=function(e,t,o){var i,n=this,s=this.table,r=["all","filter","sort","display","freeze","group","tree","page"];if(this.redrawBlock)return void((!this.redrawBlockRestoreConfig||r.indexOf(e)=0))break;s=a}else if(t-r[a].getElement().offsetTop>=0)n=a;else{if(i=!0,!(o-r[a].getElement().offsetTop>=0))break;s=a}}else n=this.vDomTop,s=this.vDomBottom;return r.slice(n,s+1)},n.prototype.displayRowIterator=function(e){this.displayRows.forEach(e),this.displayRowsCount=this.displayRows[this.displayRows.length-1].length},n.prototype.getRows=function(e){var t;switch(e){case"active":t=this.activeRows;break;case"display":t=this.table.rowManager.getDisplayRows();break;case"visible":t=this.getVisibleRows(!0);break;default:t=this.rows}return t},n.prototype.reRenderInPosition=function(e){if("virtual"==this.getRenderMode())if(this.redrawBlock)e?e():this.redrawBlockRederInPosition=!0;else{for(var t=this.element.scrollTop,o=!1,i=!1,n=this.scrollLeft,s=this.getDisplayRows(),r=this.vDomTop;r<=this.vDomBottom;r++)if(s[r]){var a=t-s[r].getElement().offsetTop;if(!(!1===i||Math.abs(a)this.vDomWindowBuffer&&(this.vDomWindowBuffer=2*g),"group"!==f.type&&(d=!1),i.vDomBottom++,c++}e?(i.vDomTopPad=t?i.vDomRowHeight*this.vDomTop+o:i.scrollTop-l,i.vDomBottomPad=i.vDomBottom==i.displayRowsCount-1?0:Math.max(i.vDomScrollHeight-i.vDomTopPad-a-l,0)):(this.vDomTopPad=0,i.vDomRowHeight=Math.floor((a+l)/c),i.vDomBottomPad=i.vDomRowHeight*(i.displayRowsCount-i.vDomBottom-1),i.vDomScrollHeight=l+a+i.vDomBottomPad-i.height),n.style.paddingTop=i.vDomTopPad+"px",n.style.paddingBottom=i.vDomBottomPad+"px",t&&(this.scrollTop=i.vDomTopPad+l+o-(this.element.scrollWidth>this.element.clientWidth?this.element.offsetHeight-this.element.clientHeight:0)),this.scrollTop=Math.min(this.scrollTop,this.element.scrollHeight-this.height),this.element.scrollWidth>this.element.offsetWidth&&t&&(this.scrollTop+=this.element.offsetHeight-this.element.clientHeight),this.vDomScrollPosTop=this.scrollTop,this.vDomScrollPosBottom=this.scrollTop,s.scrollTop=this.scrollTop,n.style.minWidth=d?i.table.columnManager.getWidth()+"px":"",i.table.options.groupBy&&"fitDataFill"!=i.table.modules.layout.getMode()&&i.displayRowsCount==i.table.modules.groupRows.countGroups()&&(i.tableElement.style.minWidth=i.table.columnManager.getWidth())}else this.renderEmptyScroll();this.fixedHeight||this.adjustTableSize()},n.prototype.scrollVertical=function(e){var t=this.scrollTop-this.vDomScrollPosTop,o=this.scrollTop-this.vDomScrollPosBottom,i=2*this.vDomWindowBuffer;if(-t>i||o>i){var n=this.scrollLeft;this._virtualRenderFill(Math.floor(this.element.scrollTop/this.element.scrollHeight*this.displayRowsCount)),this.scrollHorizontal(n)}else e?(t<0&&this._addTopRow(-t),o<0&&this.vDomScrollHeight-this.scrollTop>this.vDomWindowBuffer&&this._removeBottomRow(-o)):(t>=0&&this.scrollTop>this.vDomWindowBuffer&&this._removeTopRow(t),o>=0&&this._addBottomRow(o))},n.prototype._addTopRow=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,o=this.tableElement,i=this.getDisplayRows();if(this.vDomTop){var n=this.vDomTop-1,s=i[n],r=s.getHeight()||this.vDomRowHeight;e>=r&&(this.styleRow(s,n),o.insertBefore(s.getElement(),o.firstChild),s.initialized&&s.heightInitialized||(this.vDomTopNewRows.push(s),s.heightInitialized||s.clearCellHeight()),s.initialize(),this.vDomTopPad-=r,this.vDomTopPad<0&&(this.vDomTopPad=n*this.vDomRowHeight),n||(this.vDomTopPad=0),o.style.paddingTop=this.vDomTopPad+"px",this.vDomScrollPosTop-=r,this.vDomTop--),e=-(this.scrollTop-this.vDomScrollPosTop),s.getHeight()>this.vDomWindowBuffer&&(this.vDomWindowBuffer=2*s.getHeight()),t=(i[this.vDomTop-1].getHeight()||this.vDomRowHeight)?this._addTopRow(e,t+1):this._quickNormalizeRowHeight(this.vDomTopNewRows)}},n.prototype._removeTopRow=function(e){var t=this.tableElement,o=this.getDisplayRows()[this.vDomTop],i=o.getHeight()||this.vDomRowHeight;if(e>=i){var n=o.getElement();n.parentNode.removeChild(n),this.vDomTopPad+=i,t.style.paddingTop=this.vDomTopPad+"px",this.vDomScrollPosTop+=this.vDomTop?i:i+this.vDomWindowBuffer,this.vDomTop++,e=this.scrollTop-this.vDomScrollPosTop,this._removeTopRow(e)}},n.prototype._addBottomRow=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,o=this.tableElement,i=this.getDisplayRows();if(this.vDomBottom=r&&(this.styleRow(s,n),o.appendChild(s.getElement()),s.initialized&&s.heightInitialized||(this.vDomBottomNewRows.push(s),s.heightInitialized||s.clearCellHeight()),s.initialize(),this.vDomBottomPad-=r,(this.vDomBottomPad<0||n==this.displayRowsCount-1)&&(this.vDomBottomPad=0),o.style.paddingBottom=this.vDomBottomPad+"px",this.vDomScrollPosBottom+=r,this.vDomBottom++),e=this.scrollTop-this.vDomScrollPosBottom,s.getHeight()>this.vDomWindowBuffer&&(this.vDomWindowBuffer=2*s.getHeight()),t=(i[this.vDomBottom+1].getHeight()||this.vDomRowHeight)?this._addBottomRow(e,t+1):this._quickNormalizeRowHeight(this.vDomBottomNewRows)}},n.prototype._removeBottomRow=function(e){var t=this.tableElement,o=this.getDisplayRows()[this.vDomBottom],i=o.getHeight()||this.vDomRowHeight;if(e>=i){var n=o.getElement();n.parentNode&&n.parentNode.removeChild(n),this.vDomBottomPad+=i,this.vDomBottomPad<0&&(this.vDomBottomPad=0),t.style.paddingBottom=this.vDomBottomPad+"px",this.vDomScrollPosBottom-=i,this.vDomBottom--,e=-(this.scrollTop-this.vDomScrollPosBottom),this._removeBottomRow(e)}},n.prototype._quickNormalizeRowHeight=function(e){e.forEach(function(e){e.calcHeight()}),e.forEach(function(e){e.setCellHeight()}),e.length=0},n.prototype.normalizeHeight=function(){this.activeRows.forEach(function(e){e.normalizeHeight()})},n.prototype.adjustTableSize=function(){var e,t=this.element.clientHeight;if("virtual"===this.renderMode){var o=this.columnManager.getElement().offsetHeight+(this.table.footerManager&&!this.table.footerManager.external?this.table.footerManager.getElement().offsetHeight:0);this.fixedHeight?(this.element.style.minHeight="calc(100% - "+o+"px)",this.element.style.height="calc(100% - "+o+"px)",this.element.style.maxHeight="calc(100% - "+o+"px)"):(this.element.style.height="",this.element.style.height=this.table.element.clientHeight-o+"px",this.element.scrollTop=this.scrollTop),this.height=this.element.clientHeight,this.vDomWindowBuffer=this.table.options.virtualDomBuffer||this.height,this.fixedHeight||t==this.element.clientHeight||((e=this.table.modExists("resizeTable"))&&!this.table.modules.resizeTable.autoResize||!e)&&this.redraw()}},n.prototype.reinitialize=function(){this.rows.forEach(function(e){e.reinitialize()})},n.prototype.blockRedraw=function(){this.redrawBlock=!0,this.redrawBlockRestoreConfig=!1},n.prototype.restoreRedraw=function(){this.redrawBlock=!1,this.redrawBlockRestoreConfig?(this.refreshActiveData(this.redrawBlockRestoreConfig.stage,this.redrawBlockRestoreConfig.skipStage,this.redrawBlockRestoreConfig.renderInPosition),this.redrawBlockRestoreConfig=!1):this.redrawBlockRederInPosition&&this.reRenderInPosition(),this.redrawBlockRederInPosition=!1},n.prototype.redraw=function(e){var t=this.scrollLeft;this.adjustTableSize(),this.table.tableWidth=this.table.element.clientWidth,e?this.renderTable():("classic"==this.renderMode?this.table.options.groupBy?this.refreshActiveData("group",!1,!1):this._simpleRender():(this.reRenderInPosition(),this.scrollHorizontal(t)),this.displayRowsCount||this.table.options.placeholder&&this.getElement().appendChild(this.table.options.placeholder))},n.prototype.resetScroll=function(){if(this.element.scrollLeft=0,this.element.scrollTop=0,"ie"===this.table.browser){var e=document.createEvent("Event");e.initEvent("scroll",!1,!0),this.element.dispatchEvent(e)}else this.element.dispatchEvent(new Event("scroll"))};var s=function(e){this._row=e};s.prototype.getData=function(e){return this._row.getData(e)},s.prototype.getElement=function(){return this._row.getElement()},s.prototype.getCells=function(){var e=[];return this._row.getCells().forEach(function(t){e.push(t.getComponent())}),e},s.prototype.getCell=function(e){var t=this._row.getCell(e);return!!t&&t.getComponent()},s.prototype.getIndex=function(){return this._row.getData("data")[this._row.table.options.index]},s.prototype.getPosition=function(e){return this._row.table.rowManager.getRowPosition(this._row,e)},s.prototype.delete=function(){return this._row.delete()},s.prototype.scrollTo=function(){return this._row.table.rowManager.scrollToRow(this._row)},s.prototype.pageTo=function(){if(this._row.table.modExists("page",!0))return this._row.table.modules.page.setPageToRow(this._row)},s.prototype.move=function(e,t){this._row.moveToRow(e,t)},s.prototype.update=function(e){return this._row.updateData(e)},s.prototype.normalizeHeight=function(){this._row.normalizeHeight(!0)},s.prototype.select=function(){this._row.table.modules.selectRow.selectRows(this._row)},s.prototype.deselect=function(){this._row.table.modules.selectRow.deselectRows(this._row)},s.prototype.toggleSelect=function(){this._row.table.modules.selectRow.toggleRow(this._row)},s.prototype.isSelected=function(){return this._row.table.modules.selectRow.isRowSelected(this._row)},s.prototype._getSelf=function(){return this._row},s.prototype.freeze=function(){this._row.table.modExists("frozenRows",!0)&&this._row.table.modules.frozenRows.freezeRow(this._row)},s.prototype.unfreeze=function(){this._row.table.modExists("frozenRows",!0)&&this._row.table.modules.frozenRows.unfreezeRow(this._row)},s.prototype.treeCollapse=function(){this._row.table.modExists("dataTree",!0)&&this._row.table.modules.dataTree.collapseRow(this._row)},s.prototype.treeExpand=function(){this._row.table.modExists("dataTree",!0)&&this._row.table.modules.dataTree.expandRow(this._row)},s.prototype.treeToggle=function(){this._row.table.modExists("dataTree",!0)&&this._row.table.modules.dataTree.toggleRow(this._row)},s.prototype.getTreeParent=function(){return!!this._row.table.modExists("dataTree",!0)&&this._row.table.modules.dataTree.getTreeParent(this._row)},s.prototype.getTreeChildren=function(){return!!this._row.table.modExists("dataTree",!0)&&this._row.table.modules.dataTree.getTreeChildren(this._row)},s.prototype.reformat=function(){ -return this._row.reinitialize()},s.prototype.getGroup=function(){return this._row.getGroup().getComponent()},s.prototype.getTable=function(){return this._row.table},s.prototype.getNextRow=function(){var e=this._row.nextRow();return e?e.getComponent():e},s.prototype.getPrevRow=function(){var e=this._row.prevRow();return e?e.getComponent():e};var r=function(e,t){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"row";this.table=t.table,this.parent=t,this.data={},this.type=o,this.element=this.createElement(),this.modules={},this.cells=[],this.height=0,this.heightStyled="",this.manualHeight=!1,this.outerHeight=0,this.initialized=!1,this.heightInitialized=!1,this.setData(e),this.generateElement()};r.prototype.createElement=function(){var e=document.createElement("div");return e.classList.add("tabulator-row"),e.setAttribute("role","row"),e},r.prototype.getElement=function(){return this.element},r.prototype.detachElement=function(){this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)},r.prototype.generateElement=function(){var e,t,o,i=this;!1!==i.table.options.selectable&&i.table.modExists("selectRow")&&i.table.modules.selectRow.initializeRow(this),!1!==i.table.options.movableRows&&i.table.modExists("moveRow")&&i.table.modules.moveRow.initializeRow(this),!1!==i.table.options.dataTree&&i.table.modExists("dataTree")&&i.table.modules.dataTree.initializeRow(this),"collapse"===i.table.options.responsiveLayout&&i.table.modExists("responsiveLayout")&&i.table.modules.responsiveLayout.initializeRow(this),i.table.options.rowContextMenu&&this.table.modExists("menu")&&i.table.modules.menu.initializeRow(this),i.table.options.rowClick&&i.element.addEventListener("click",function(e){i.table.options.rowClick(e,i.getComponent())}),i.table.options.rowDblClick&&i.element.addEventListener("dblclick",function(e){i.table.options.rowDblClick(e,i.getComponent())}),i.table.options.rowContext&&i.element.addEventListener("contextmenu",function(e){i.table.options.rowContext(e,i.getComponent())}),i.table.options.rowMouseEnter&&i.element.addEventListener("mouseenter",function(e){i.table.options.rowMouseEnter(e,i.getComponent())}),i.table.options.rowMouseLeave&&i.element.addEventListener("mouseleave",function(e){i.table.options.rowMouseLeave(e,i.getComponent())}),i.table.options.rowMouseOver&&i.element.addEventListener("mouseover",function(e){i.table.options.rowMouseOver(e,i.getComponent())}),i.table.options.rowMouseOut&&i.element.addEventListener("mouseout",function(e){i.table.options.rowMouseOut(e,i.getComponent())}),i.table.options.rowMouseMove&&i.element.addEventListener("mousemove",function(e){i.table.options.rowMouseMove(e,i.getComponent())}),i.table.options.rowTap&&(o=!1,i.element.addEventListener("touchstart",function(e){o=!0},{passive:!0}),i.element.addEventListener("touchend",function(e){o&&i.table.options.rowTap(e,i.getComponent()),o=!1})),i.table.options.rowDblTap&&(e=null,i.element.addEventListener("touchend",function(t){e?(clearTimeout(e),e=null,i.table.options.rowDblTap(t,i.getComponent())):e=setTimeout(function(){clearTimeout(e),e=null},300)})),i.table.options.rowTapHold&&(t=null,i.element.addEventListener("touchstart",function(e){clearTimeout(t),t=setTimeout(function(){clearTimeout(t),t=null,o=!1,i.table.options.rowTapHold(e,i.getComponent())},1e3)},{passive:!0}),i.element.addEventListener("touchend",function(e){clearTimeout(t),t=null}))},r.prototype.generateCells=function(){this.cells=this.table.columnManager.generateCells(this)},r.prototype.initialize=function(e){var t=this;if(!t.initialized||e){for(t.deleteCells();t.element.firstChild;)t.element.removeChild(t.element.firstChild);this.table.modExists("frozenColumns")&&this.table.modules.frozenColumns.layoutRow(this),this.generateCells(),t.cells.forEach(function(e){t.element.appendChild(e.getElement()),e.cellRendered()}),e&&t.normalizeHeight(),t.table.options.dataTree&&t.table.modExists("dataTree")&&t.table.modules.dataTree.layoutRow(this),"collapse"===t.table.options.responsiveLayout&&t.table.modExists("responsiveLayout")&&t.table.modules.responsiveLayout.layoutRow(this),t.table.options.rowFormatter&&t.table.options.rowFormatter(t.getComponent()),t.table.options.resizableRows&&t.table.modExists("resizeRows")&&t.table.modules.resizeRows.initializeRow(t),t.initialized=!0}},r.prototype.reinitializeHeight=function(){this.heightInitialized=!1,null!==this.element.offsetParent&&this.normalizeHeight(!0)},r.prototype.reinitialize=function(){this.initialized=!1,this.heightInitialized=!1,this.manualHeight||(this.height=0,this.heightStyled=""),null!==this.element.offsetParent&&this.initialize(!0)},r.prototype.calcHeight=function(e){var t=0,o=this.table.options.resizableRows?this.element.clientHeight:0;this.cells.forEach(function(e){var o=e.getHeight();o>t&&(t=o)}),this.height=e?Math.max(t,o):this.manualHeight?this.height:Math.max(t,o),this.heightStyled=this.height?this.height+"px":"",this.outerHeight=this.element.offsetHeight},r.prototype.setCellHeight=function(){this.cells.forEach(function(e){e.setHeight()}),this.heightInitialized=!0},r.prototype.clearCellHeight=function(){this.cells.forEach(function(e){e.clearHeight()})},r.prototype.normalizeHeight=function(e){e&&this.clearCellHeight(),this.calcHeight(e),this.setCellHeight()},r.prototype.setHeight=function(e,t){(this.height!=e||t)&&(this.manualHeight=!0,this.height=e,this.heightStyled=e?e+"px":"",this.setCellHeight(),this.outerHeight=this.element.offsetHeight)},r.prototype.getHeight=function(){return this.outerHeight},r.prototype.getWidth=function(){return this.element.offsetWidth},r.prototype.deleteCell=function(e){var t=this.cells.indexOf(e);t>-1&&this.cells.splice(t,1)},r.prototype.setData=function(e){this.table.modExists("mutator")&&(e=this.table.modules.mutator.transformRow(e,"data")),this.data=e,this.table.options.reactiveData&&this.table.modExists("reactiveData",!0)&&this.table.modules.reactiveData.watchRow(this)},r.prototype.updateData=function(e){var t,o=this,i=u.prototype.helpers.elVisible(this.element),n={};return new Promise(function(s,r){"string"==typeof e&&(e=JSON.parse(e)),o.table.options.reactiveData&&o.table.modExists("reactiveData",!0)&&o.table.modules.reactiveData.block(),o.table.modExists("mutator")?(n=Object.assign(n,o.data),n=Object.assign(n,e),t=o.table.modules.mutator.transformRow(n,"data",e)):t=e;for(var a in t)o.data[a]=t[a];o.table.options.reactiveData&&o.table.modExists("reactiveData",!0)&&o.table.modules.reactiveData.unblock();for(var a in e){o.table.columnManager.getColumnsByFieldRoot(a).forEach(function(e){var n=o.getCell(e.getField());if(n){var s=e.getFieldValue(t);n.getValue()!=s&&(n.setValueProcessData(s),i&&n.cellRendered())}})}i?(o.normalizeHeight(),o.table.options.rowFormatter&&o.table.options.rowFormatter(o.getComponent())):(o.initialized=!1,o.height=0,o.heightStyled=""),!1!==o.table.options.dataTree&&o.table.modExists("dataTree")&&o.table.modules.dataTree.redrawNeeded(e)&&(o.table.modules.dataTree.initializeRow(o),o.table.modules.dataTree.layoutRow(o),o.table.rowManager.refreshActiveData("tree",!1,!0)),o.table.options.rowUpdated.call(o.table,o.getComponent()),s()})},r.prototype.getData=function(e){var t=this;return e?t.table.modExists("accessor")?t.table.modules.accessor.transformRow(t.data,e):void 0:this.data},r.prototype.getCell=function(e){return e=this.table.columnManager.findColumn(e),this.cells.find(function(t){return t.column===e})},r.prototype.getCellIndex=function(e){return this.cells.findIndex(function(t){return t===e})},r.prototype.findNextEditableCell=function(e){var t=!1;if(e0)for(var o=e-1;o>=0;o--){var i=this.cells[o],n=!0;if(i.column.modules.edit&&u.prototype.helpers.elVisible(i.getElement())&&("function"==typeof i.column.modules.edit.check&&(n=i.column.modules.edit.check(i.getComponent())),n)){t=i;break}}return t},r.prototype.getCells=function(){return this.cells},r.prototype.nextRow=function(){return this.table.rowManager.nextDisplayRow(this,!0)||!1},r.prototype.prevRow=function(){return this.table.rowManager.prevDisplayRow(this,!0)||!1},r.prototype.moveToRow=function(e,t){var o=this.table.rowManager.findRow(e);o?(this.table.rowManager.moveRowActual(this,o,!t),this.table.rowManager.refreshActiveData("display",!1,!0)):console.warn("Move Error - No matching row found:",e)},r.prototype.delete=function(){var e=this;return new Promise(function(t,o){var i,n;e.table.options.history&&e.table.modExists("history")&&(e.table.options.groupBy&&e.table.modExists("groupRows")?(n=e.getGroup().rows,(i=n.indexOf(e))&&(i=n[i-1])):(i=e.table.rowManager.getRowIndex(e))&&(i=e.table.rowManager.rows[i-1]),e.table.modules.history.action("rowDelete",e,{data:e.getData(),pos:!i,index:i})),e.deleteActual(),t()})},r.prototype.deleteActual=function(e){this.table.rowManager.getRowIndex(this);this.table.modExists("selectRow")&&this.table.modules.selectRow._deselectRow(this,!0),this.table.options.reactiveData&&this.table.modExists("reactiveData",!0),this.modules.group&&this.modules.group.removeRow(this),this.table.rowManager.deleteRow(this,e),this.deleteCells(),this.initialized=!1,this.heightInitialized=!1,this.table.modExists("columnCalcs")&&(this.table.options.groupBy&&this.table.modExists("groupRows")?this.table.modules.columnCalcs.recalcRowGroup(this):this.table.modules.columnCalcs.recalc(this.table.rowManager.activeRows))},r.prototype.deleteCells=function(){for(var e=this.cells.length,t=0;t-1?(this.browser="ie",this.browserSlow=!0):e.indexOf("Edge")>-1?(this.browser="edge",this.browserSlow=!0):e.indexOf("Firefox")>-1?(this.browser="firefox",this.browserSlow=!1):(this.browser="other",this.browserSlow=!1),this.browserMobile=/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(e)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(e.substr(0,4))},u.prototype.blockRedraw=function(){return this.rowManager.blockRedraw()},u.prototype.restoreRedraw=function(){return this.rowManager.restoreRedraw()},u.prototype.setDataFromLocalFile=function(e){var t=this;return new Promise(function(o,i){var n=document.createElement("input");n.type="file",n.accept=e||".json,application/json",n.addEventListener("change",function(e){var s,r=n.files[0],a=new FileReader;a.readAsText(r),a.onload=function(e){try{s=JSON.parse(a.result)}catch(e){return console.warn("File Load Error - File contents is invalid JSON",e),void i(e)}t._setData(s).then(function(e){o(e)}).catch(function(e){o(e)})},a.onerror=function(e){console.warn("File Load Error - Unable to read file"),i()}}),n.click()})},u.prototype.setData=function(e,t,o){return this.modExists("ajax")&&this.modules.ajax.blockActiveRequest(),this._setData(e,t,o,!1,!0)},u.prototype._setData=function(e,t,o,i,n){var s=this;return"string"!=typeof e?e?s.rowManager.setData(e,i,n):s.modExists("ajax")&&(s.modules.ajax.getUrl||s.options.ajaxURLGenerator)?"remote"==s.options.pagination&&s.modExists("page",!0)?(s.modules.page.reset(!0,!0),s.modules.page.setPage(1)):s.modules.ajax.loadData(i,n):s.rowManager.setData([],i,n):0==e.indexOf("{")||0==e.indexOf("[")?s.rowManager.setData(JSON.parse(e),i,n):s.modExists("ajax",!0)?(t&&s.modules.ajax.setParams(t),o&&s.modules.ajax.setConfig(o),s.modules.ajax.setUrl(e),"remote"==s.options.pagination&&s.modExists("page",!0)?(s.modules.page.reset(!0,!0),s.modules.page.setPage(1)):s.modules.ajax.loadData(i,n)):void 0},u.prototype.clearData=function(){this.modExists("ajax")&&this.modules.ajax.blockActiveRequest(),this.rowManager.clearData()},u.prototype.getData=function(e){return!0===e&&(console.warn("passing a boolean to the getData function is deprecated, you should now pass the string 'active'"),e="active"),this.rowManager.getData(e)},u.prototype.getDataCount=function(e){return!0===e&&(console.warn("passing a boolean to the getDataCount function is deprecated, you should now pass the string 'active'"),e="active"),this.rowManager.getDataCount(e)},u.prototype.searchRows=function(e,t,o){if(this.modExists("filter",!0))return this.modules.filter.search("rows",e,t,o)},u.prototype.searchData=function(e,t,o){if(this.modExists("filter",!0))return this.modules.filter.search("data",e,t,o)},u.prototype.getHtml=function(e,t,o){if(this.modExists("export",!0))return this.modules.export.getHtml(e,t,o)},u.prototype.print=function(e,t,o){if(this.modExists("print",!0))return this.modules.print.printFullscreen(e,t,o)},u.prototype.getAjaxUrl=function(){if(this.modExists("ajax",!0))return this.modules.ajax.getUrl()},u.prototype.replaceData=function(e,t,o){return this.modExists("ajax")&&this.modules.ajax.blockActiveRequest(),this._setData(e,t,o,!0)},u.prototype.updateData=function(e){var t=this,o=this,i=0;return new Promise(function(n,s){t.modExists("ajax")&&t.modules.ajax.blockActiveRequest(),"string"==typeof e&&(e=JSON.parse(e)),e?e.forEach(function(e){var t=o.rowManager.findRow(e[o.options.index]);t&&(i++,t.updateData(e).then(function(){--i||n()}))}):(console.warn("Update Error - No data provided"),s("Update Error - No data provided"))})},u.prototype.addData=function(e,t,o){var i=this;return new Promise(function(n,s){i.modExists("ajax")&&i.modules.ajax.blockActiveRequest(),"string"==typeof e&&(e=JSON.parse(e)),e?i.rowManager.addRows(e,t,o).then(function(e){var t=[];e.forEach(function(e){t.push(e.getComponent())}),n(t)}):(console.warn("Update Error - No data provided"),s("Update Error - No data provided"))})},u.prototype.updateOrAddData=function(e){var t=this,o=this,i=[],n=0;return new Promise(function(s,r){t.modExists("ajax")&&t.modules.ajax.blockActiveRequest(),"string"==typeof e&&(e=JSON.parse(e)),e?e.forEach(function(e){var t=o.rowManager.findRow(e[o.options.index]);n++,t?t.updateData(e).then(function(){n--,i.push(t.getComponent()),n||s(i)}):o.rowManager.addRows(e).then(function(e){n--,i.push(e[0].getComponent()),n||s(i)})}):(console.warn("Update Error - No data provided"),r("Update Error - No data provided"))})},u.prototype.getRow=function(e){var t=this.rowManager.findRow(e);return t?t.getComponent():(console.warn("Find Error - No matching row found:",e),!1)},u.prototype.getRowFromPosition=function(e,t){var o=this.rowManager.getRowFromPosition(e,t);return o?o.getComponent():(console.warn("Find Error - No matching row found:",e),!1)},u.prototype.deleteRow=function(e){var t=this;return new Promise(function(o,i){function n(){++s==e.length&&r&&(a.rowManager.reRenderInPosition(),o())}var s=0,r=0,a=t;Array.isArray(e)||(e=[e]),e.forEach(function(e){var o=t.rowManager.findRow(e,!0);o?o.delete().then(function(){r++,n()}).catch(function(e){n(),i(e)}):(console.warn("Delete Error - No matching row found:",e),i("Delete Error - No matching row found"),n())})})},u.prototype.addRow=function(e,t,o){var i=this;return new Promise(function(n,s){"string"==typeof e&&(e=JSON.parse(e)),i.rowManager.addRows(e,t,o).then(function(e){i.modExists("columnCalcs")&&i.modules.columnCalcs.recalc(i.rowManager.activeRows),n(e[0].getComponent())})})},u.prototype.updateOrAddRow=function(e,t){var o=this;return new Promise(function(i,n){var s=o.rowManager.findRow(e);"string"==typeof t&&(t=JSON.parse(t)),s?s.updateData(t).then(function(){o.modExists("columnCalcs")&&o.modules.columnCalcs.recalc(o.rowManager.activeRows),i(s.getComponent())}).catch(function(e){n(e)}):s=o.rowManager.addRows(t).then(function(e){o.modExists("columnCalcs")&&o.modules.columnCalcs.recalc(o.rowManager.activeRows),i(e[0].getComponent())}).catch(function(e){n(e)})})},u.prototype.updateRow=function(e,t){var o=this;return new Promise(function(i,n){var s=o.rowManager.findRow(e);"string"==typeof t&&(t=JSON.parse(t)),s?s.updateData(t).then(function(){i(s.getComponent())}).catch(function(e){n(e)}):(console.warn("Update Error - No matching row found:",e),n("Update Error - No matching row found"))})},u.prototype.scrollToRow=function(e,t,o){var i=this;return new Promise(function(n,s){var r=i.rowManager.findRow(e);r?i.rowManager.scrollToRow(r,t,o).then(function(){n()}).catch(function(e){s(e)}):(console.warn("Scroll Error - No matching row found:",e),s("Scroll Error - No matching row found"))})},u.prototype.moveRow=function(e,t,o){var i=this.rowManager.findRow(e);i?i.moveToRow(t,o):console.warn("Move Error - No matching row found:",e)},u.prototype.getRows=function(e){return!0===e&&(console.warn("passing a boolean to the getRows function is deprecated, you should now pass the string 'active'"),e="active"),this.rowManager.getComponents(e)},u.prototype.getRowPosition=function(e,t){var o=this.rowManager.findRow(e);return o?this.rowManager.getRowPosition(o,t):(console.warn("Position Error - No matching row found:",e),!1)},u.prototype.copyToClipboard=function(e){this.modExists("clipboard",!0)&&this.modules.clipboard.copy(e)},u.prototype.setColumns=function(e){this.columnManager.setColumns(e)},u.prototype.getColumns=function(e){return this.columnManager.getComponents(e)},u.prototype.getColumn=function(e){var t=this.columnManager.findColumn(e);return t?t.getComponent():(console.warn("Find Error - No matching column found:",e),!1)},u.prototype.getColumnDefinitions=function(){return this.columnManager.getDefinitionTree()},u.prototype.getColumnLayout=function(){if(this.modExists("persistence",!0))return this.modules.persistence.parseColumns(this.columnManager.getColumns())},u.prototype.setColumnLayout=function(e){return!!this.modExists("persistence",!0)&&(this.columnManager.setColumns(this.modules.persistence.mergeDefinition(this.options.columns,e)),!0)},u.prototype.showColumn=function(e){var t=this.columnManager.findColumn(e);if(!t)return console.warn("Column Show Error - No matching column found:",e),!1;t.show(),this.options.responsiveLayout&&this.modExists("responsiveLayout",!0)&&this.modules.responsiveLayout.update()},u.prototype.hideColumn=function(e){var t=this.columnManager.findColumn(e);if(!t)return console.warn("Column Hide Error - No matching column found:",e),!1;t.hide(),this.options.responsiveLayout&&this.modExists("responsiveLayout",!0)&&this.modules.responsiveLayout.update()},u.prototype.toggleColumn=function(e){var t=this.columnManager.findColumn(e);if(!t)return console.warn("Column Visibility Toggle Error - No matching column found:",e),!1;t.visible?t.hide():t.show()},u.prototype.addColumn=function(e,t,o){var i=this;return new Promise(function(n,s){var r=i.columnManager.findColumn(o);i.columnManager.addColumn(e,t,r).then(function(e){n(e.getComponent())}).catch(function(e){s(e)})})},u.prototype.deleteColumn=function(e){var t=this;return new Promise(function(o,i){var n=t.columnManager.findColumn(e);n?n.delete().then(function(){o()}).catch(function(e){i(e)}):(console.warn("Column Delete Error - No matching column found:",e),i())})},u.prototype.updateColumnDefinition=function(e,t){var o=this;return new Promise(function(i,n){var s=o.columnManager.findColumn(e);s?s.updateDefinition(t).then(function(e){i(e)}).catch(function(e){n(e)}):(console.warn("Column Update Error - No matching column found:",e),n())})},u.prototype.moveColumn=function(e,t,o){var i=this.columnManager.findColumn(e),n=this.columnManager.findColumn(t);i?n?this.columnManager.moveColumn(i,n,o):console.warn("Move Error - No matching column found:",n):console.warn("Move Error - No matching column found:",e)},u.prototype.scrollToColumn=function(e,t,o){var i=this;return new Promise(function(n,s){var r=i.columnManager.findColumn(e);r?i.columnManager.scrollToColumn(r,t,o).then(function(){n()}).catch(function(e){s(e)}):(console.warn("Scroll Error - No matching column found:",e),s("Scroll Error - No matching column found"))})},u.prototype.setLocale=function(e){this.modules.localize.setLocale(e)},u.prototype.getLocale=function(){return this.modules.localize.getLocale()},u.prototype.getLang=function(e){return this.modules.localize.getLang(e)},u.prototype.redraw=function(e){this.columnManager.redraw(e),this.rowManager.redraw(e)},u.prototype.setHeight=function(e){"classic"!==this.rowManager.renderMode?(this.options.height=isNaN(e)?e:e+"px",this.element.style.height=this.options.height,this.rowManager.setRenderMode(),this.rowManager.redraw()):console.warn("setHeight function is not available in classic render mode")},u.prototype.setSort=function(e,t){this.modExists("sort",!0)&&(this.modules.sort.setSort(e,t),this.rowManager.sorterRefresh())},u.prototype.getSorters=function(){if(this.modExists("sort",!0))return this.modules.sort.getSort()},u.prototype.clearSort=function(){this.modExists("sort",!0)&&(this.modules.sort.clear(),this.rowManager.sorterRefresh())},u.prototype.setFilter=function(e,t,o){this.modExists("filter",!0)&&(this.modules.filter.setFilter(e,t,o),this.rowManager.filterRefresh())},u.prototype.addFilter=function(e,t,o){this.modExists("filter",!0)&&(this.modules.filter.addFilter(e,t,o),this.rowManager.filterRefresh())},u.prototype.getFilters=function(e){if(this.modExists("filter",!0))return this.modules.filter.getFilters(e)},u.prototype.setHeaderFilterFocus=function(e){if(this.modExists("filter",!0)){var t=this.columnManager.findColumn(e);if(!t)return console.warn("Column Filter Focus Error - No matching column found:",e),!1;this.modules.filter.setHeaderFilterFocus(t)}},u.prototype.getHeaderFilterValue=function(e){if(this.modExists("filter",!0)){var t=this.columnManager.findColumn(e);if(t)return this.modules.filter.getHeaderFilterValue(t);console.warn("Column Filter Error - No matching column found:",e)}},u.prototype.setHeaderFilterValue=function(e,t){if(this.modExists("filter",!0)){var o=this.columnManager.findColumn(e);if(!o)return console.warn("Column Filter Error - No matching column found:",e),!1;this.modules.filter.setHeaderFilterValue(o,t)}},u.prototype.getHeaderFilters=function(){if(this.modExists("filter",!0))return this.modules.filter.getHeaderFilters()},u.prototype.removeFilter=function(e,t,o){this.modExists("filter",!0)&&(this.modules.filter.removeFilter(e,t,o),this.rowManager.filterRefresh())},u.prototype.clearFilter=function(e){this.modExists("filter",!0)&&(this.modules.filter.clearFilter(e),this.rowManager.filterRefresh())},u.prototype.clearHeaderFilter=function(){this.modExists("filter",!0)&&(this.modules.filter.clearHeaderFilter(),this.rowManager.filterRefresh())},u.prototype.selectRow=function(e){this.modExists("selectRow",!0)&&(!0===e&&(console.warn("passing a boolean to the selectRowselectRow function is deprecated, you should now pass the string 'active'"),e="active"),this.modules.selectRow.selectRows(e))},u.prototype.deselectRow=function(e){this.modExists("selectRow",!0)&&this.modules.selectRow.deselectRows(e)},u.prototype.toggleSelectRow=function(e){this.modExists("selectRow",!0)&&this.modules.selectRow.toggleRow(e)},u.prototype.getSelectedRows=function(){if(this.modExists("selectRow",!0))return this.modules.selectRow.getSelectedRows()},u.prototype.getSelectedData=function(){if(this.modExists("selectRow",!0))return this.modules.selectRow.getSelectedData()},u.prototype.setMaxPage=function(e){if(!this.options.pagination||!this.modExists("page"))return!1;this.modules.page.setMaxPage(e)},u.prototype.setPage=function(e){return this.options.pagination&&this.modExists("page")?this.modules.page.setPage(e):new Promise(function(e,t){t()})},u.prototype.setPageToRow=function(e){var t=this;return new Promise(function(o,i){t.options.pagination&&t.modExists("page")?(e=t.rowManager.findRow(e),e?t.modules.page.setPageToRow(e).then(function(){o()}).catch(function(){i()}):i()):i()})},u.prototype.setPageSize=function(e){if(!this.options.pagination||!this.modExists("page"))return!1;this.modules.page.setPageSize(e),this.modules.page.setPage(1).then(function(){}).catch(function(){})},u.prototype.getPageSize=function(){if(this.options.pagination&&this.modExists("page",!0))return this.modules.page.getPageSize()},u.prototype.previousPage=function(){if(!this.options.pagination||!this.modExists("page"))return!1;this.modules.page.previousPage()},u.prototype.nextPage=function(){if(!this.options.pagination||!this.modExists("page"))return!1;this.modules.page.nextPage()},u.prototype.getPage=function(){return!(!this.options.pagination||!this.modExists("page"))&&this.modules.page.getPage()},u.prototype.getPageMax=function(){return!(!this.options.pagination||!this.modExists("page"))&&this.modules.page.getPageMax()},u.prototype.setGroupBy=function(e){if(!this.modExists("groupRows",!0))return!1;this.options.groupBy=e,this.modules.groupRows.initialize(),this.rowManager.refreshActiveData("display"),this.options.persistence&&this.modExists("persistence",!0)&&this.modules.persistence.config.group&&this.modules.persistence.save("group")},u.prototype.setGroupStartOpen=function(e){if(!this.modExists("groupRows",!0))return!1;this.options.groupStartOpen=e,this.modules.groupRows.initialize(),this.options.groupBy?(this.rowManager.refreshActiveData("group"),this.options.persistence&&this.modExists("persistence",!0)&&this.modules.persistence.config.group&&this.modules.persistence.save("group")):console.warn("Grouping Update - cant refresh view, no groups have been set")},u.prototype.setGroupHeader=function(e){if(!this.modExists("groupRows",!0))return!1;this.options.groupHeader=e,this.modules.groupRows.initialize(),this.options.groupBy?(this.rowManager.refreshActiveData("group"),this.options.persistence&&this.modExists("persistence",!0)&&this.modules.persistence.config.group&&this.modules.persistence.save("group")):console.warn("Grouping Update - cant refresh view, no groups have been set")},u.prototype.getGroups=function(e){return!!this.modExists("groupRows",!0)&&this.modules.groupRows.getGroups(!0)},u.prototype.getGroupedData=function(){if(this.modExists("groupRows",!0))return this.options.groupBy?this.modules.groupRows.getGroupedData():this.getData()},u.prototype.getCalcResults=function(){return!!this.modExists("columnCalcs",!0)&&this.modules.columnCalcs.getResults()},u.prototype.recalc=function(){this.modExists("columnCalcs",!0)&&this.modules.columnCalcs.recalcAll(this.rowManager.activeRows)},u.prototype.navigatePrev=function(){var e=!1;return!(!this.modExists("edit",!0)||!(e=this.modules.edit.currentCell))&&e.nav().prev()},u.prototype.navigateNext=function(){var e=!1;return!(!this.modExists("edit",!0)||!(e=this.modules.edit.currentCell))&&e.nav().next()},u.prototype.navigateLeft=function(){var t=!1;return!(!this.modExists("edit",!0)||!(t=this.modules.edit.currentCell))&&(e.preventDefault(),t.nav().left())},u.prototype.navigateRight=function(){var t=!1;return!(!this.modExists("edit",!0)||!(t=this.modules.edit.currentCell))&&(e.preventDefault(),t.nav().right())},u.prototype.navigateUp=function(){var t=!1;return!(!this.modExists("edit",!0)||!(t=this.modules.edit.currentCell))&&(e.preventDefault(),t.nav().up())},u.prototype.navigateDown=function(){var t=!1;return!(!this.modExists("edit",!0)||!(t=this.modules.edit.currentCell))&&(e.preventDefault(),t.nav().down())},u.prototype.undo=function(){return!(!this.options.history||!this.modExists("history",!0))&&this.modules.history.undo()},u.prototype.redo=function(){return!(!this.options.history||!this.modExists("history",!0))&&this.modules.history.redo()},u.prototype.getHistoryUndoSize=function(){return!(!this.options.history||!this.modExists("history",!0))&&this.modules.history.getHistoryUndoSize()},u.prototype.getHistoryRedoSize=function(){return!(!this.options.history||!this.modExists("history",!0))&&this.modules.history.getHistoryRedoSize()},u.prototype.download=function(e,t,o,i){this.modExists("download",!0)&&this.modules.download.download(e,t,o,i)},u.prototype.downloadToTab=function(e,t,o,i){this.modExists("download",!0)&&this.modules.download.download(e,t,o,i,!0)},u.prototype.tableComms=function(e,t,o,i){this.modules.comms.receive(e,t,o,i)},u.prototype.moduleBindings={},u.prototype.extendModule=function(e,t,o){if(u.prototype.moduleBindings[e]){var i=u.prototype.moduleBindings[e].prototype[t];if(i)if("object"==(void 0===o?"undefined":_typeof(o)))for(var n in o)i[n]=o[n];else console.warn("Module Error - Invalid value type, it must be an object");else console.warn("Module Error - property does not exist:",t)}else console.warn("Module Error - module does not exist:",e)},u.prototype.registerModule=function(e,t){u.prototype.moduleBindings[e]=t},u.prototype.bindModules=function(){this.modules={};for(var e in u.prototype.moduleBindings)this.modules[e]=new u.prototype.moduleBindings[e](this)},u.prototype.modExists=function(e,t){return!!this.modules[e]||(t&&console.error("Tabulator Module Not Installed: "+e),!1)},u.prototype.helpers={elVisible:function(e){return!(e.offsetWidth<=0&&e.offsetHeight<=0)},elOffset:function(e){var t=e.getBoundingClientRect();return{top:t.top+window.pageYOffset-document.documentElement.clientTop,left:t.left+window.pageXOffset-document.documentElement.clientLeft}},deepClone:function(e){var t=Array.isArray(e)?[]:{};for(var o in e)null!=e[o]&&"object"===_typeof(e[o])?e[o]instanceof Date?t[o]=new Date(e[o]):t[o]=this.deepClone(e[o]):t[o]=e[o];return t}},u.prototype.comms={tables:[],register:function(e){u.prototype.comms.tables.push(e)},deregister:function(e){var t=u.prototype.comms.tables.indexOf(e);t>-1&&u.prototype.comms.tables.splice(t,1)},lookupTable:function(e,t){var o,i,n=[];if("string"==typeof e){if(o=document.querySelectorAll(e),o.length)for(var s=0;s0?s.setWidth(n):s.reinitializeWidth()):this.table.options.responsiveLayout&&this.table.modExists("responsiveLayout",!0)&&this.table.modules.responsiveLayout.update()},fitColumns:function(e){function t(e){return"string"==typeof e?e.indexOf("%")>-1?n/100*parseInt(e):parseInt(e):e}function o(e,i,n,s){function r(e){return n*(e.column.definition.widthGrow||1)}function a(e){return t(e.width)-n*(e.column.definition.widthShrink||0)}var l=[],c=0,u=0,d=0,h=0,p=0,m=[];return e.forEach(function(e,t){var o=s?a(e):r(e);e.column.minWidth>=o?l.push(e):(m.push(e),p+=s?e.column.definition.widthShrink||1:e.column.definition.widthGrow||1)}),l.length?(l.forEach(function(e){c+=s?e.width-e.column.minWidth:e.column.minWidth,e.width=e.column.minWidth}),u=i-c,d=p?Math.floor(u/p):u,h=u-d*p,h+=o(m,u,d,s)):(h=p?i-Math.floor(i/p)*p:i,m.forEach(function(e){e.width=s?a(e):r(e)})),h}var i=this,n=i.table.element.clientWidth,s=0,r=0,a=0,l=0,c=[],u=[],d=0,h=0,p=0;this.table.options.responsiveLayout&&this.table.modExists("responsiveLayout",!0)&&this.table.modules.responsiveLayout.update(),this.table.rowManager.element.scrollHeight>this.table.rowManager.element.clientHeight&&(n-=this.table.rowManager.element.offsetWidth-this.table.rowManager.element.clientWidth),e.forEach(function(e){var o,i,n;e.visible&&(o=e.definition.width,i=parseInt(e.minWidth),o?(n=t(o),s+=n>i?n:i,e.definition.widthShrink&&(u.push({column:e,width:n>i?n:i}),d+=e.definition.widthShrink)):(c.push({column:e,width:0}),a+=e.definition.widthGrow||1))}),r=n-s,l=Math.floor(r/a);var p=o(c,r,l,!1);c.length&&p>0&&(c[c.length-1].width+=+p),c.forEach(function(e){r-=e.width}),h=Math.abs(p)+r,h>0&&d&&(p=o(u,h,Math.floor(h/d),!0)),u.length&&(u[u.length-1].width-=p),c.forEach(function(e){e.column.setWidth(e.width)}),u.forEach(function(e){e.column.setWidth(e.width)})}},u.prototype.registerModule("layout",d);var h=function(e){this.table=e,this.locale="default",this.lang=!1,this.bindings={}};h.prototype.setHeaderFilterPlaceholder=function(e){this.langs.default.headerFilters.default=e},h.prototype.setHeaderFilterColumnPlaceholder=function(e,t){this.langs.default.headerFilters.columns[e]=t,this.lang&&!this.lang.headerFilters.columns[e]&&(this.lang.headerFilters.columns[e]=t)},h.prototype.installLang=function(e,t){this.langs[e]?this._setLangProp(this.langs[e],t):this.langs[e]=t},h.prototype._setLangProp=function(e,t){for(var o in t)e[o]&&"object"==_typeof(e[o])?this._setLangProp(e[o],t[o]):e[o]=t[o]},h.prototype.setLocale=function(e){function t(e,o){for(var i in e)"object"==_typeof(e[i])?(o[i]||(o[i]={}),t(e[i],o[i])):o[i]=e[i]}var o=this;if(e=e||"default",!0===e&&navigator.language&&(e=navigator.language.toLowerCase()),e&&!o.langs[e]){var i=e.split("-")[0];o.langs[i]?(console.warn("Localization Error - Exact matching locale not found, using closest match: ",e,i),e=i):(console.warn("Localization Error - Matching locale not found, using default: ",e),e="default")}o.locale=e,o.lang=u.prototype.helpers.deepClone(o.langs.default||{}),"default"!=e&&t(o.langs[e],o.lang),o.table.options.localized.call(o.table,o.locale,o.lang),o._executeBindings()},h.prototype.getLocale=function(e){return self.locale},h.prototype.getLang=function(e){return e?this.langs[e]:this.lang},h.prototype.getText=function(e,t){var e=t?e+"|"+t:e,o=e.split("|");return this._getLangElement(o,this.locale)||""},h.prototype._getLangElement=function(e,t){var o=this,i=o.lang;return e.forEach(function(e){var t;i&&(t=i[e],i=void 0!==t&&t)}),i},h.prototype.bind=function(e,t){this.bindings[e]||(this.bindings[e]=[]),this.bindings[e].push(t),t(this.getText(e),this.lang)},h.prototype._executeBindings=function(){var e=this;for(var t in e.bindings)!function(t){e.bindings[t].forEach(function(o){o(e.getText(t),e.lang)})}(t)},h.prototype.langs={default:{groups:{item:"item",items:"items"},columns:{},ajax:{loading:"Loading",error:"Error"},pagination:{page_size:"Page Size",first:"First",first_title:"First Page",last:"Last",last_title:"Last Page",prev:"Prev",prev_title:"Prev Page",next:"Next",next_title:"Next Page"},headerFilters:{default:"filter column...",columns:{}}}},u.prototype.registerModule("localize",h);var p=function(e){this.table=e};p.prototype.getConnections=function(e){var t,o=this,i=[];return t=u.prototype.comms.lookupTable(e),t.forEach(function(e){ -o.table!==e&&i.push(e)}),i},p.prototype.send=function(e,t,o,i){var n=this,s=this.getConnections(e);s.forEach(function(e){e.tableComms(n.table.element,t,o,i)}),!s.length&&e&&console.warn("Table Connection Error - No tables matching selector found",e)},p.prototype.receive=function(e,t,o,i){if(this.table.modExists(t))return this.table.modules[t].commsReceived(e,o,i);console.warn("Inter-table Comms Error - no such module:",t)},u.prototype.registerModule("comms",p);var m=function(e){this.table=e,this.allowedTypes=["","data","download","clipboard","print","htmlOutput"]};m.prototype.initializeColumn=function(e){var t=this,o=!1,i={};this.allowedTypes.forEach(function(n){var s,r="accessor"+(n.charAt(0).toUpperCase()+n.slice(1));e.definition[r]&&(s=t.lookupAccessor(e.definition[r]))&&(o=!0,i[r]={accessor:s,params:e.definition[r+"Params"]||{}})}),o&&(e.modules.accessor=i)},m.prototype.lookupAccessor=function(e){var t=!1;switch(void 0===e?"undefined":_typeof(e)){case"string":this.accessors[e]?t=this.accessors[e]:console.warn("Accessor Error - No such accessor found, ignoring: ",e);break;case"function":t=e}return t},m.prototype.transformRow=function(e,t){var o=this,i="accessor"+(t.charAt(0).toUpperCase()+t.slice(1)),n=u.prototype.helpers.deepClone(e||{});return o.table.columnManager.traverse(function(e){var o,s,r,a;e.modules.accessor&&(s=e.modules.accessor[i]||e.modules.accessor.accessor||!1)&&"undefined"!=(o=e.getFieldValue(n))&&(a=e.getComponent(),r="function"==typeof s.params?s.params(o,n,t,a):s.params,e.setFieldValue(n,s.accessor(o,n,t,r,a)))}),n},m.prototype.accessors={},u.prototype.registerModule("accessor",m);var f=function(e){this.table=e,this.config=!1,this.url="",this.urlGenerator=!1,this.params=!1,this.loaderElement=this.createLoaderElement(),this.msgElement=this.createMsgElement(),this.loadingElement=!1,this.errorElement=!1,this.loaderPromise=!1,this.progressiveLoad=!1,this.loading=!1,this.requestOrder=0};f.prototype.initialize=function(){var e;this.loaderElement.appendChild(this.msgElement),this.table.options.ajaxLoaderLoading&&("string"==typeof this.table.options.ajaxLoaderLoading?(e=document.createElement("template"),e.innerHTML=this.table.options.ajaxLoaderLoading.trim(),this.loadingElement=e.content.firstChild):this.loadingElement=this.table.options.ajaxLoaderLoading),this.loaderPromise=this.table.options.ajaxRequestFunc||this.defaultLoaderPromise,this.urlGenerator=this.table.options.ajaxURLGenerator||this.defaultURLGenerator,this.table.options.ajaxLoaderError&&("string"==typeof this.table.options.ajaxLoaderError?(e=document.createElement("template"),e.innerHTML=this.table.options.ajaxLoaderError.trim(),this.errorElement=e.content.firstChild):this.errorElement=this.table.options.ajaxLoaderError),this.table.options.ajaxParams&&this.setParams(this.table.options.ajaxParams),this.table.options.ajaxConfig&&this.setConfig(this.table.options.ajaxConfig),this.table.options.ajaxURL&&this.setUrl(this.table.options.ajaxURL),this.table.options.ajaxProgressiveLoad&&(this.table.options.pagination?(this.progressiveLoad=!1,console.error("Progressive Load Error - Pagination and progressive load cannot be used at the same time")):this.table.modExists("page")?(this.progressiveLoad=this.table.options.ajaxProgressiveLoad,this.table.modules.page.initializeProgressive(this.progressiveLoad)):console.error("Pagination plugin is required for progressive ajax loading"))},f.prototype.createLoaderElement=function(){var e=document.createElement("div");return e.classList.add("tabulator-loader"),e},f.prototype.createMsgElement=function(){var e=document.createElement("div");return e.classList.add("tabulator-loader-msg"),e.setAttribute("role","alert"),e},f.prototype.setParams=function(e,t){if(t){this.params=this.params||{};for(var o in e)this.params[o]=e[o]}else this.params=e},f.prototype.getParams=function(){return this.params||{}},f.prototype.setConfig=function(e){if(this._loadDefaultConfig(),"string"==typeof e)this.config.method=e;else for(var t in e)this.config[t]=e[t]},f.prototype._loadDefaultConfig=function(e){var t=this;if(!t.config||e){t.config={};for(var o in t.defaultConfig)t.config[o]=t.defaultConfig[o]}},f.prototype.setUrl=function(e){this.url=e},f.prototype.getUrl=function(){return this.url},f.prototype.loadData=function(e,t){return this.progressiveLoad?this._loadDataProgressive():this._loadDataStandard(e,t)},f.prototype.nextPage=function(e){var t;this.loading||(t=this.table.options.ajaxProgressiveLoadScrollMargin||2*this.table.rowManager.getElement().clientHeight,ei||null===i)&&(i=e)}),null!==i?!1!==n?i.toFixed(n):i:""},min:function(e,t,o){var i=null,n=void 0!==o.precision&&o.precision;return e.forEach(function(e){((e=Number(e))
"),o.dataTreeExpandElement?"string"==typeof o.dataTreeExpandElement?(e=document.createElement("div"),e.innerHTML=o.dataTreeExpandElement,this.expandEl=e.firstChild):this.expandEl=o.dataTreeExpandElement:(this.expandEl=document.createElement("div"),this.expandEl.classList.add("tabulator-data-tree-control"),this.expandEl.tabIndex=0,this.expandEl.innerHTML="
"),_typeof(o.dataTreeStartExpanded)){case"boolean":this.startOpen=function(e,t){return o.dataTreeStartExpanded};break;case"function":this.startOpen=o.dataTreeStartExpanded;break;default:this.startOpen=function(e,t){return o.dataTreeStartExpanded[t]}}},v.prototype.initializeRow=function(e){var t=e.getData()[this.field],o=Array.isArray(t),i=o||!o&&"object"===(void 0===t?"undefined":_typeof(t))&&null!==t;!i&&e.modules.dataTree&&e.modules.dataTree.branchEl&&e.modules.dataTree.branchEl.parentNode.removeChild(e.modules.dataTree.branchEl),!i&&e.modules.dataTree&&e.modules.dataTree.controlEl&&e.modules.dataTree.controlEl.parentNode.removeChild(e.modules.dataTree.controlEl),e.modules.dataTree={index:0,open:!!i&&(e.modules.dataTree?e.modules.dataTree.open:this.startOpen(e.getComponent(),0)),controlEl:!(!e.modules.dataTree||!i)&&e.modules.dataTree.controlEl,branchEl:!(!e.modules.dataTree||!i)&&e.modules.dataTree.branchEl,parent:!1,children:i}},v.prototype.layoutRow=function(e){var t=this.elementField?e.getCell(this.elementField):e.getCells()[0],o=t.getElement(),i=e.modules.dataTree;i.branchEl&&(i.branchEl.parentNode.removeChild(i.branchEl),i.branchEl=!1),i.controlEl&&(i.controlEl.parentNode.removeChild(i.controlEl),i.controlEl=!1),this.generateControlElement(e,o),e.element.classList.add("tabulator-tree-level-"+i.index),i.index&&(this.branchEl?(i.branchEl=this.branchEl.cloneNode(!0),o.insertBefore(i.branchEl,o.firstChild),i.branchEl.style.marginLeft=(i.branchEl.offsetWidth+i.branchEl.style.marginRight)*(i.index-1)+i.index*this.indent+"px"):o.style.paddingLeft=parseInt(window.getComputedStyle(o,null).getPropertyValue("padding-left"))+i.index*this.indent+"px")},v.prototype.generateControlElement=function(e,t){var o=this,i=e.modules.dataTree,t=t||e.getCells()[0].getElement(),n=i.controlEl;!1!==i.children&&(i.open?(i.controlEl=this.collapseEl.cloneNode(!0),i.controlEl.addEventListener("click",function(t){t.stopPropagation(),o.collapseRow(e)})):(i.controlEl=this.expandEl.cloneNode(!0),i.controlEl.addEventListener("click",function(t){t.stopPropagation(),o.expandRow(e)})),i.controlEl.addEventListener("mousedown",function(e){e.stopPropagation()}),n&&n.parentNode===t?n.parentNode.replaceChild(i.controlEl,n):t.insertBefore(i.controlEl,t.firstChild))},v.prototype.setDisplayIndex=function(e){this.displayIndex=e},v.prototype.getDisplayIndex=function(){return this.displayIndex},v.prototype.getRows=function(e){var t=this,o=[];return e.forEach(function(e,i){var n,s;o.push(e),e instanceof r&&(n=e.modules.dataTree.children,n.index||!1===n.children||(s=t.getChildren(e),s.forEach(function(e){o.push(e)})))}),o},v.prototype.getChildren=function(e){var t=this,o=e.modules.dataTree,i=[],n=[];return!1!==o.children&&o.open&&(Array.isArray(o.children)||(o.children=this.generateChildren(e)),i=this.table.modExists("filter")?this.table.modules.filter.filter(o.children):o.children,this.table.modExists("sort")&&this.table.modules.sort.sort(i),i.forEach(function(e){n.push(e),t.getChildren(e).forEach(function(e){n.push(e)})})),n},v.prototype.generateChildren=function(e){var t=this,o=[],i=e.getData()[this.field];return Array.isArray(i)||(i=[i]),i.forEach(function(i){var n=new r(i||{},t.table.rowManager);n.modules.dataTree.index=e.modules.dataTree.index+1,n.modules.dataTree.parent=e,n.modules.dataTree.children&&(n.modules.dataTree.open=t.startOpen(n.getComponent(),n.modules.dataTree.index)),o.push(n)}),o},v.prototype.expandRow=function(e,t){var o=e.modules.dataTree;!1!==o.children&&(o.open=!0,e.reinitialize(),this.table.rowManager.refreshActiveData("tree",!1,!0),this.table.options.dataTreeRowExpanded(e.getComponent(),e.modules.dataTree.index))},v.prototype.collapseRow=function(e){var t=e.modules.dataTree;!1!==t.children&&(t.open=!1,e.reinitialize(),this.table.rowManager.refreshActiveData("tree",!1,!0),this.table.options.dataTreeRowCollapsed(e.getComponent(),e.modules.dataTree.index))},v.prototype.toggleRow=function(e){var t=e.modules.dataTree;!1!==t.children&&(t.open?this.collapseRow(e):this.expandRow(e))},v.prototype.getTreeParent=function(e){return!!e.modules.dataTree.parent&&e.modules.dataTree.parent.getComponent()},v.prototype.getFilteredTreeChildren=function(e){var t,o=e.modules.dataTree,i=[];return o.children&&(Array.isArray(o.children)||(o.children=this.generateChildren(e)),t=this.table.modExists("filter")?this.table.modules.filter.filter(o.children):o.children,t.forEach(function(e){e instanceof r&&i.push(e)})),i},v.prototype.getTreeChildren=function(e){var t=e.modules.dataTree,o=[];return t.children&&(Array.isArray(t.children)||(t.children=this.generateChildren(e)),t.children.forEach(function(e){e instanceof r&&o.push(e.getComponent())})),o},v.prototype.checkForRestyle=function(e){e.row.cells.indexOf(e)||!1!==e.row.modules.dataTree.children&&e.row.reinitialize()},v.prototype.getChildField=function(){return this.field},v.prototype.redrawNeeded=function(e){return!!this.field&&void 0!==e[this.field]||!!this.elementField&&void 0!==e[this.elementField]},u.prototype.registerModule("dataTree",v);var y=function(e){this.table=e,this.fields={},this.columnsByIndex=[],this.columnsByField={},this.config={},this.active=!1};y.prototype.download=function(e,t,o,i,n){function s(o,i){n?!0===n?r.triggerDownload(o,i,e,t,!0):n(o):r.triggerDownload(o,i,e,t)}var r=this,a=!1;this.processConfig(),this.active=i,"function"==typeof e?a=e:r.downloaders[e]?a=r.downloaders[e]:console.warn("Download Error - No such download type found: ",e),this.processColumns(),a&&a.call(this,r.processDefinitions(),r.processData(i||"active"),o||{},s,this.config)},y.prototype.processConfig=function(){var e={columnGroups:!0,rowGroups:!0,columnCalcs:!0,dataTree:!0};if(this.table.options.downloadConfig)for(var t in this.table.options.downloadConfig)e[t]=this.table.options.downloadConfig[t];e.rowGroups&&this.table.options.groupBy&&this.table.modExists("groupRows")&&(this.config.rowGroups=!0),e.columnGroups&&this.table.columnManager.columns.length!=this.table.columnManager.columnsByIndex.length&&(this.config.columnGroups=!0),e.columnCalcs&&this.table.modExists("columnCalcs")&&(this.config.columnCalcs=!0),e.dataTree&&this.table.options.dataTree&&this.table.modExists("dataTree")&&(this.config.dataTree=!0)},y.prototype.processColumns=function(){var e=this;e.columnsByIndex=[],e.columnsByField={},e.table.columnManager.columnsByIndex.forEach(function(t){t.field&&!1!==t.definition.download&&(t.visible||!t.visible&&t.definition.download)&&(e.columnsByIndex.push(t),e.columnsByField[t.field]=t)})},y.prototype.processDefinitions=function(){var e=this,t=[];return this.config.columnGroups?e.table.columnManager.columns.forEach(function(o){var i=e.processColumnGroup(o);i&&t.push(i)}):e.columnsByIndex.forEach(function(o){!1!==o.download&&t.push(e.processDefinition(o))}),t},y.prototype.processColumnGroup=function(e){var t=this,o=e.columns,i=0,n=this.processDefinition(e),s={type:"group",title:n.title,depth:1};if(o.length){if(s.subGroups=[],s.width=0,o.forEach(function(e){var o=t.processColumnGroup(e);o.depth>i&&(i=o.depth),o&&(s.width+=o.width,s.subGroups.push(o))}),s.depth+=i,!s.width)return!1}else{if(!e.field||!1===e.definition.download||!(e.visible||!e.visible&&e.definition.download))return!1;s.width=1,s.definition=n}return s},y.prototype.processDefinition=function(e){var t={};for(var o in e.definition)t[o]=e.definition[o];return void 0!==e.definition.downloadTitle&&(t.title=e.definition.downloadTitle),t},y.prototype.processData=function(e){var t=this,o=this,i=[],n=[],s=!1,r={};return this.config.rowGroups?("visible"==e?(s=o.table.rowManager.getRows(e),s.forEach(function(e){if("row"==e.type){var t=e.getGroup();-1===n.indexOf(t)&&n.push(t)}})):n=this.table.modules.groupRows.getGroups(),n.forEach(function(e){i.push(t.processGroupData(e,s))})):(this.config.dataTree&&(e=e="display"),i=o.table.rowManager.getData(e,"download")),this.config.columnCalcs&&(r=this.table.getCalcResults(),i={calcs:r,data:i}),"function"==typeof o.table.options.downloadDataFormatter&&(i=o.table.options.downloadDataFormatter(i)),i},y.prototype.processGroupData=function(e,t){var o=this,i=e.getSubGroups(),n={type:"group",key:e.key};return i.length?(n.subGroups=[],i.forEach(function(e){n.subGroups.push(o.processGroupData(e,t))})):t?(n.rows=[],e.rows.forEach(function(e){t.indexOf(e)>-1&&n.rows.push(e.getData("download"))})):n.rows=e.getData(!0,"download"),n},y.prototype.triggerDownload=function(e,t,o,i,n){var s=document.createElement("a"),r=new Blob([e],{type:t -}),i=i||"Tabulator."+("function"==typeof o?"txt":o);(r=this.table.options.downloadReady.call(this.table,e,r))&&(n?window.open(window.URL.createObjectURL(r)):navigator.msSaveOrOpenBlob?navigator.msSaveOrOpenBlob(r,i):(s.setAttribute("href",window.URL.createObjectURL(r)),s.setAttribute("download",i),s.style.display="none",document.body.appendChild(s),s.click(),document.body.removeChild(s)),this.table.options.downloadComplete&&this.table.options.downloadComplete())},y.prototype.getFieldValue=function(e,t){var o=this.columnsByField[e];return!!o&&o.getFieldValue(t)},y.prototype.commsReceived=function(e,t,o){switch(t){case"intercept":this.download(o.type,"",o.options,o.active,o.intercept)}},y.prototype.downloaders={csv:function(e,t,o,i,n){function s(e,t){e.subGroups?e.subGroups.forEach(function(e){s(e,t+1)}):(d.push('"'+String(e.title).split('"').join('""')+'"'),h.push(e.definition.field))}function r(e){e.forEach(function(e){var t=[];h.forEach(function(o){var i=u.getFieldValue(o,e);switch(void 0===i?"undefined":_typeof(i)){case"object":i=JSON.stringify(i);break;case"undefined":case"null":i="";break;default:i=i}t.push('"'+String(i).split('"').join('""')+'"')}),l.push(t.join(p))})}function a(e){e.subGroups?e.subGroups.forEach(function(e){a(e)}):r(e.rows)}var l,c,u=this,d=[],h=[],p=o&&o.delimiter?o.delimiter:",";n.columnGroups?(console.warn("Download Warning - CSV downloader cannot process column groups"),e.forEach(function(e){s(e,0)})):function(){e.forEach(function(e){d.push('"'+String(e.title).split('"').join('""')+'"'),h.push(e.field)})}(),l=[d.join(p)],n.columnCalcs&&(console.warn("Download Warning - CSV downloader cannot process column calculations"),t=t.data),n.rowGroups?(console.warn("Download Warning - CSV downloader cannot process row groups"),t.forEach(function(e){a(e)})):r(t),c=l.join("\n"),o.bom&&(c="\ufeff"+c),i(c,"text/csv")},json:function(e,t,o,i,n){var s;n.columnCalcs&&(console.warn("Download Warning - CSV downloader cannot process column calculations"),t=t.data),s=JSON.stringify(t,null,"\t"),i(s,"application/json")},pdf:function(e,t,o,i,n){function s(e,t){var o=e.width,i=1,n={content:e.title||""};if(e.subGroups?(e.subGroups.forEach(function(e){s(e,t+1)}),i=1):(h.push(e.definition.field),i=g-t),n.rowSpan=i,p[t].push(n),o--,i>1)for(var r=t+1;rg&&(g=e.depth)});for(var C=0;C1&&h[t].push({type:"hoz",start:f[t].length,end:f[t].length+e.width-1}),f[t].push(e.title),e.subGroups?e.subGroups.forEach(function(e){o(e,t+1)}):(g.push(e.definition.field),i(g.length),h[t].push({type:"vert",start:g.length-1}))}function i(){var e=0;f.forEach(function(t){var o=t.length;o>e&&(e=o)}),f.forEach(function(t){var o=t.length;if(o46){if(o>=i.length)return t.preventDefault(),t.stopPropagation(),a=!1,!1;switch(i[o]){case n:if(l.toUpperCase()==l.toLowerCase())return t.preventDefault(),t.stopPropagation(),a=!1,!1;break;case s:if(isNaN(l))return t.preventDefault(),t.stopPropagation(),a=!1,!1;break;case r:break;default:if(l!==i[o])return t.preventDefault(),t.stopPropagation(),a=!1,!1}a=!0}}),e.addEventListener("keyup",function(i){i.keyCode>46&&t.maskAutoFill&&o(e.value.length)}),e.placeholder||(e.placeholder=i),t.maskAutoFill&&o(e.value.length)},w.prototype.editors={input:function(e,t,o,i,n){function s(e){(null===r||void 0===r)&&""!==a.value||a.value!==r?o(a.value)&&(r=a.value):i()}var r=e.getValue(),a=document.createElement("input");if(a.setAttribute("type",n.search?"search":"text"),a.style.padding="4px",a.style.width="100%",a.style.boxSizing="border-box",n.elementAttributes&&"object"==_typeof(n.elementAttributes))for(var l in n.elementAttributes)"+"==l.charAt(0)?(l=l.slice(1),a.setAttribute(l,a.getAttribute(l)+n.elementAttributes["+"+l])):a.setAttribute(l,n.elementAttributes[l]);return a.value=void 0!==r?r:"",t(function(){a.focus(),a.style.height="100%"}),a.addEventListener("change",s),a.addEventListener("blur",s),a.addEventListener("keydown",function(e){switch(e.keyCode){case 13:s(e);break;case 27:i()}}),n.mask&&this.table.modules.edit.maskInput(a,n),a},textarea:function(e,t,o,i,n){function s(t){(null===r||void 0===r)&&""!==c.value||c.value!==r?(o(c.value)&&(r=c.value),setTimeout(function(){e.getRow().normalizeHeight()},300)):i()}var r=e.getValue(),a=n.verticalNavigation||"hybrid",l=String(null!==r&&void 0!==r?r:""),c=(l.match(/(?:\r\n|\r|\n)/g),document.createElement("textarea")),u=0;if(c.style.display="block",c.style.padding="2px",c.style.height="100%",c.style.width="100%",c.style.boxSizing="border-box",c.style.whiteSpace="pre-wrap",c.style.resize="none",n.elementAttributes&&"object"==_typeof(n.elementAttributes))for(var d in n.elementAttributes)"+"==d.charAt(0)?(d=d.slice(1),c.setAttribute(d,c.getAttribute(d)+n.elementAttributes["+"+d])):c.setAttribute(d,n.elementAttributes[d]);return c.value=l,t(function(){c.focus(),c.style.height="100%"}),c.addEventListener("change",s),c.addEventListener("blur",s),c.addEventListener("keyup",function(){c.style.height="";var t=c.scrollHeight;c.style.height=t+"px",t!=u&&(u=t,e.getRow().normalizeHeight())}),c.addEventListener("keydown",function(e){switch(e.keyCode){case 27:i();break;case 38:("editor"==a||"hybrid"==a&&c.selectionStart)&&(e.stopImmediatePropagation(),e.stopPropagation());break;case 40:("editor"==a||"hybrid"==a&&c.selectionStart!==c.value.length)&&(e.stopImmediatePropagation(),e.stopPropagation())}}),n.mask&&this.table.modules.edit.maskInput(c,n),c},number:function(e,t,o,i,n){function s(){var e=l.value;isNaN(e)||""===e||(e=Number(e)),e!==r?o(e)&&(r=e):i()}var r=e.getValue(),a=n.verticalNavigation||"editor",l=document.createElement("input");if(l.setAttribute("type","number"),void 0!==n.max&&l.setAttribute("max",n.max),void 0!==n.min&&l.setAttribute("min",n.min),void 0!==n.step&&l.setAttribute("step",n.step),l.style.padding="4px",l.style.width="100%",l.style.boxSizing="border-box",n.elementAttributes&&"object"==_typeof(n.elementAttributes))for(var c in n.elementAttributes)"+"==c.charAt(0)?(c=c.slice(1),l.setAttribute(c,l.getAttribute(c)+n.elementAttributes["+"+c])):l.setAttribute(c,n.elementAttributes[c]);l.value=r;var u=function(e){s()};return t(function(){l.removeEventListener("blur",u),l.focus(),l.style.height="100%",l.addEventListener("blur",u)}),l.addEventListener("keydown",function(e){switch(e.keyCode){case 13:s();break;case 27:i();break;case 38:case 40:"editor"==a&&(e.stopImmediatePropagation(),e.stopPropagation())}}),n.mask&&this.table.modules.edit.maskInput(l,n),l},range:function(e,t,o,i,n){function s(){var e=a.value;isNaN(e)||""===e||(e=Number(e)),e!=r?o(e)&&(r=e):i()}var r=e.getValue(),a=document.createElement("input");if(a.setAttribute("type","range"),void 0!==n.max&&a.setAttribute("max",n.max),void 0!==n.min&&a.setAttribute("min",n.min),void 0!==n.step&&a.setAttribute("step",n.step),a.style.padding="4px",a.style.width="100%",a.style.boxSizing="border-box",n.elementAttributes&&"object"==_typeof(n.elementAttributes))for(var l in n.elementAttributes)"+"==l.charAt(0)?(l=l.slice(1),a.setAttribute(l,a.getAttribute(l)+n.elementAttributes["+"+l])):a.setAttribute(l,n.elementAttributes[l]);return a.value=r,t(function(){a.focus(),a.style.height="100%"}),a.addEventListener("blur",function(e){s()}),a.addEventListener("keydown",function(e){switch(e.keyCode){case 13:case 9:s();break;case 27:i()}}),a},select:function(e,t,o,i,n){function s(t){var o,i={},s=f.table.getData();return o=t?f.table.columnManager.getColumnByField(t):e.getColumn()._getSelf(),o?(s.forEach(function(e){var t=o.getFieldValue(e);null!==t&&void 0!==t&&""!==t&&(i[t]=!0)}),i=n.sortValuesList?"asc"==n.sortValuesList?Object.keys(i).sort():Object.keys(i).sort().reverse():Object.keys(i)):console.warn("unable to find matching column to create select lookup list:",t),i}function r(t,o){function i(e){var e={label:n.listItemFormatter?n.listItemFormatter(e.value,e.label):e.label,value:e.value,element:!1};return e.value!==o&&(isNaN(parseFloat(e.value))||isNaN(parseFloat(e.value))||parseFloat(e.value)!==parseFloat(o))||l(e),s.push(e),r.push(e),e}var s=[],r=[];if("function"==typeof t&&(t=t(e)),Array.isArray(t))t.forEach(function(e){var t;"object"===(void 0===e?"undefined":_typeof(e))?e.options?(t={label:e.label,group:!0,element:!1},r.push(t),e.options.forEach(function(e){i(e)})):i(e):(t={label:n.listItemFormatter?n.listItemFormatter(e,e):e,value:e,element:!1},t.value!==o&&(isNaN(parseFloat(t.value))||isNaN(parseFloat(t.value))||parseFloat(t.value)!==parseFloat(o))||l(t),s.push(t),r.push(t))});else for(var c in t){var u={label:n.listItemFormatter?n.listItemFormatter(c,t[c]):t[c],value:c,element:!1};u.value!==o&&(isNaN(parseFloat(u.value))||isNaN(parseFloat(u.value))||parseFloat(u.value)!==parseFloat(o))||l(u),s.push(u),r.push(u)}C=s,x=r,a()}function a(){for(;E.firstChild;)E.removeChild(E.firstChild);x.forEach(function(e){var t=e.element;t||(e.group?(t=document.createElement("div"),t.classList.add("tabulator-edit-select-list-group"),t.tabIndex=0,t.innerHTML=""===e.label?" ":e.label):(t=document.createElement("div"),t.classList.add("tabulator-edit-select-list-item"),t.tabIndex=0,t.innerHTML=""===e.label?" ":e.label,t.addEventListener("click",function(){l(e),c()}),e===R&&t.classList.add("active")),t.addEventListener("mousedown",function(){M=!1,setTimeout(function(){M=!0},10)}),e.element=t),E.appendChild(t)})}function l(e){R&&R.element&&R.element.classList.remove("active"),R=e,w.value=" "===e.label?"":e.label,e.element&&e.element.classList.add("active")}function c(){p(),b!==R.value?(b=R.value,o(R.value)):i()}function d(){p(),i()}function h(){if(!E.parentNode){!0===n.values?r(s(),y):"string"==typeof n.values?r(s(n.values),y):r(n.values||[],y);var e=u.prototype.helpers.elOffset(g);E.style.minWidth=g.offsetWidth+"px",E.style.top=e.top+g.offsetHeight+"px",E.style.left=e.left+"px",document.body.appendChild(E)}}function p(){E.parentNode&&E.parentNode.removeChild(E),m()}function m(){f.table.rowManager.element.removeEventListener("scroll",d)}var f=this,g=e.getElement(),b=e.getValue(),v=n.verticalNavigation||"editor",y=void 0!==b||null===b?b:void 0!==n.defaultValue?n.defaultValue:"",w=document.createElement("input"),E=document.createElement("div"),C=[],x=[],R={},M=!0;if(this.table.rowManager.element.addEventListener("scroll",d),(Array.isArray(n)||!Array.isArray(n)&&"object"===(void 0===n?"undefined":_typeof(n))&&!n.values)&&(console.warn("DEPRECATION WANRING - values for the select editor must now be passed into the values property of the editorParams object, not as the editorParams object"),n={values:n}),w.setAttribute("type","text"),w.style.padding="4px",w.style.width="100%",w.style.boxSizing="border-box",w.style.cursor="default",w.readOnly=0!=this.currentCell,n.elementAttributes&&"object"==_typeof(n.elementAttributes))for(var L in n.elementAttributes)"+"==L.charAt(0)?(L=L.slice(1),w.setAttribute(L,w.getAttribute(L)+n.elementAttributes["+"+L])):w.setAttribute(L,n.elementAttributes[L]);return w.value=void 0!==b||null===b?b:"",w.addEventListener("keydown",function(e){var t;switch(e.keyCode){case 38:t=C.indexOf(R),("editor"==v||"hybrid"==v&&t)&&(e.stopImmediatePropagation(),e.stopPropagation(),e.preventDefault(),t>0&&l(C[t-1]));break;case 40:t=C.indexOf(R),("editor"==v||"hybrid"==v&&t-1||String(t.title).toLowerCase().indexOf(String(e).toLowerCase())>-1)&&r.push(t)}),d(r,t))}function a(e){var t=document.createElement("div");c(),!1!==e&&(t.classList.add("tabulator-edit-select-list-notice"),t.tabIndex=0,e instanceof Node?t.appendChild(e):t.innerHTML=e,M.appendChild(t))}function l(e,t){var o=[];if(Array.isArray(e))e.forEach(function(e){var t={title:n.listItemFormatter?n.listItemFormatter(e,e):e,value:e};o.push(t)});else for(var i in e){var s={title:n.listItemFormatter?n.listItemFormatter(i,e[i]):e[i],value:i};o.push(s)}return o}function c(){for(;M.firstChild;)M.removeChild(M.firstChild)}function d(e,t){e.length?h(e,t):n.emptyPlaceholder&&a(n.emptyPlaceholder)}function h(e,t){var o=!1;c(),L=e,L.forEach(function(e){var i=e.element;i||(i=document.createElement("div"),i.classList.add("tabulator-edit-select-list-item"),i.tabIndex=0,i.innerHTML=e.title,i.addEventListener("click",function(){f(e),p()}),i.addEventListener("mousedown",function(){T=!1,setTimeout(function(){T=!0},10)}),e.element=i,t&&e.value==E&&(R.value=e.title,e.element.classList.add("active"),o=!0),e===D&&(e.element.classList.add("active"),o=!0)),M.appendChild(i)}),o||f(!1)}function p(){g(),D?E!==D.value?(E=D.value,R.value=D.title,o(D.value)):i():n.freetext?(E=R.value,o(R.value)):n.allowEmpty&&""===R.value?(E=R.value,o(R.value)):i()}function m(){if(!M.parentNode){for(;M.firstChild;)M.removeChild(M.firstChild);var e=u.prototype.helpers.elOffset(w);M.style.minWidth=w.offsetWidth+"px",M.style.top=e.top+w.offsetHeight+"px",M.style.left=e.left+"px",document.body.appendChild(M)}}function f(e,t){D&&D.element&&D.element.classList.remove("active"),D=e,e&&e.element&&e.element.classList.add("active")}function g(){M.parentNode&&M.parentNode.removeChild(M),v()}function b(){g(),i()}function v(){y.table.rowManager.element.removeEventListener("scroll",b)}var y=this,w=e.getElement(),E=e.getValue(),C=n.verticalNavigation||"editor",x=void 0!==E||null===E?E:void 0!==n.defaultValue?n.defaultValue:"",R=document.createElement("input"),M=document.createElement("div"),L=[],D={},T=!0;if(this.table.rowManager.element.addEventListener("scroll",b),R.setAttribute("type","search"),R.style.padding="4px",R.style.width="100%",R.style.boxSizing="border-box",n.elementAttributes&&"object"==_typeof(n.elementAttributes))for(var k in n.elementAttributes)"+"==k.charAt(0)?(k=k.slice(1),R.setAttribute(k,R.getAttribute(k)+n.elementAttributes["+"+k])):R.setAttribute(k,n.elementAttributes[k]);return M.classList.add("tabulator-edit-select-list"),R.addEventListener("keydown",function(e){var t;switch(e.keyCode){case 38:t=L.indexOf(D),("editor"==C||"hybrid"==C&&t)&&(e.stopImmediatePropagation(),e.stopPropagation(),e.preventDefault(),f(t>0?L[t-1]:!1));break;case 40:t=L.indexOf(D),("editor"==C||"hybrid"==C&&t'):("ie"==a.table.browser?t.setAttribute("class","tabulator-star-inactive"):t.classList.replace("tabulator-star-active","tabulator-star-inactive"),t.innerHTML='')})}function r(e){c=e,s(e)}var a=this,l=e.getElement(),c=e.getValue(),u=l.getElementsByTagName("svg").length||5,d=l.getElementsByTagName("svg")[0]?l.getElementsByTagName("svg")[0].getAttribute("width"):14,h=[],p=document.createElement("div"),m=document.createElementNS("http://www.w3.org/2000/svg","svg");if(l.style.whiteSpace="nowrap",l.style.overflow="hidden",l.style.textOverflow="ellipsis",p.style.verticalAlign="middle",p.style.display="inline-block",p.style.padding="4px",m.setAttribute("width",d),m.setAttribute("height",d),m.setAttribute("viewBox","0 0 512 512"),m.setAttribute("xml:space","preserve"),m.style.padding="0 1px",n.elementAttributes&&"object"==_typeof(n.elementAttributes))for(var f in n.elementAttributes)"+"==f.charAt(0)?(f=f.slice(1),p.setAttribute(f,p.getAttribute(f)+n.elementAttributes["+"+f])):p.setAttribute(f,n.elementAttributes[f]);for(var g=1;g<=u;g++)!function(e){var t=document.createElement("span"),i=m.cloneNode(!0);h.push(i),t.addEventListener("mouseenter",function(t){t.stopPropagation(),t.stopImmediatePropagation(),s(e)}),t.addEventListener("mousemove",function(e){e.stopPropagation(),e.stopImmediatePropagation()}),t.addEventListener("click",function(t){t.stopPropagation(),t.stopImmediatePropagation(),o(e)}),t.appendChild(i),p.appendChild(t)}(g);return c=Math.min(parseInt(c),u),s(c),p.addEventListener("mousemove",function(e){s(0)}),p.addEventListener("click",function(e){o(0)}),l.addEventListener("blur",function(e){i()}),l.addEventListener("keydown",function(e){switch(e.keyCode){case 39:r(c+1);break;case 37:r(c-1);break;case 13:o(c);break;case 27:i()}}),p},progress:function(e,t,o,i,n){function s(){var e=d*Math.round(m.offsetWidth/(l.clientWidth/100))+u;o(e),l.setAttribute("aria-valuenow",e),l.setAttribute("aria-label",h)}var r,a,l=e.getElement(),c=void 0===n.max?l.getElementsByTagName("div")[0].getAttribute("max")||100:n.max,u=void 0===n.min?l.getElementsByTagName("div")[0].getAttribute("min")||0:n.min,d=(c-u)/100,h=e.getValue()||0,p=document.createElement("div"),m=document.createElement("div");if(p.style.position="absolute",p.style.right="0",p.style.top="0",p.style.bottom="0",p.style.width="5px",p.classList.add("tabulator-progress-handle"),m.style.display="inline-block",m.style.position="relative",m.style.height="100%",m.style.backgroundColor="#488CE9",m.style.maxWidth="100%",m.style.minWidth="0%",n.elementAttributes&&"object"==_typeof(n.elementAttributes))for(var f in n.elementAttributes)"+"==f.charAt(0)?(f=f.slice(1),m.setAttribute(f,m.getAttribute(f)+n.elementAttributes["+"+f])):m.setAttribute(f,n.elementAttributes[f]);return l.style.padding="4px 4px",h=Math.min(parseFloat(h),c),h=Math.max(parseFloat(h),u),h=Math.round((h-u)/d),m.style.width=h+"%",l.setAttribute("aria-valuemin",u),l.setAttribute("aria-valuemax",c),m.appendChild(p),p.addEventListener("mousedown",function(e){r=e.screenX,a=m.offsetWidth}),p.addEventListener("mouseover",function(){p.style.cursor="ew-resize"}),l.addEventListener("mousemove",function(e){r&&(m.style.width=a+e.screenX-r+"px")}),l.addEventListener("mouseup",function(e){r&&(e.stopPropagation(),e.stopImmediatePropagation(),r=!1,a=!1,s())}),l.addEventListener("keydown",function(e){switch(e.keyCode){case 39:m.style.width=m.clientWidth+l.clientWidth/100+"px";break;case 37:m.style.width=m.clientWidth-l.clientWidth/100+"px";break;case 13:s();break;case 27:i()}}),l.addEventListener("blur",function(){i()}),m},tickCross:function(e,t,o,i,n){function s(e){return l?e?u?c:a.checked:a.checked&&!u?(a.checked=!1,a.indeterminate=!0,u=!0,c):(u=!1,a.checked):a.checked}var r=e.getValue(),a=document.createElement("input"),l=n.tristate,c=void 0===n.indeterminateValue?null:n.indeterminateValue,u=!1;if(a.setAttribute("type","checkbox"),a.style.marginTop="5px",a.style.boxSizing="border-box",n.elementAttributes&&"object"==_typeof(n.elementAttributes))for(var d in n.elementAttributes)"+"==d.charAt(0)?(d=d.slice(1),a.setAttribute(d,a.getAttribute(d)+n.elementAttributes["+"+d])):a.setAttribute(d,n.elementAttributes[d]);return a.value=r,!l||void 0!==r&&r!==c&&""!==r||(u=!0,a.indeterminate=!0),"firefox"!=this.table.browser&&t(function(){a.focus()}),a.checked=!0===r||"true"===r||"True"===r||1===r,a.addEventListener("change",function(e){o(s())}),a.addEventListener("blur",function(e){o(s(!0))}),a.addEventListener("keydown",function(e){13==e.keyCode&&o(s()),27==e.keyCode&&i()}),a}},u.prototype.registerModule("edit",w);var E=function(e){this.table=e,this.config={},this.cloneTableStyle=!0,this.colVisProp=""};E.prototype.genereateTable=function(e,t,o,i){this.cloneTableStyle=t,this.config=e||{},this.colVisProp=i;var n=document.createElement("table");return n.classList.add("tabulator-print-table"),!1!==this.config.columnHeaders&&n.appendChild(this.generateHeaderElements()),n.appendChild(this.generateBodyElements(this.rowLookup(o))),this.mapElementStyles(this.table.element,n,["border-top","border-left","border-right","border-bottom"]),n},E.prototype.rowLookup=function(e){var t=this,o=[];if("function"==typeof e)e.call(this.table).forEach(function(e){(e=t.table.rowManager.findRow(e))&&o.push(e)});else switch(e){case!0:case"visible":o=this.table.rowManager.getVisibleRows(!0);break;case"all":o=this.table.rowManager.rows;break;case"selected":o=this.modules.selectRow.selectedRows;break;case"active":default:o=this.table.rowManager.getDisplayRows()}return Object.assign([],o)},E.prototype.generateColumnGroupHeaders=function(){var e=this,t=[];return(!1!==this.config.columnGroups?this.table.columnManager.columns:this.table.columnManager.columnsByIndex).forEach(function(o){var i=e.processColumnGroup(o);i&&t.push(i)}),t},E.prototype.processColumnGroup=function(e){var t=this,o=e.columns,i=0,n={title:e.definition.title,column:e,depth:1};if(o.length){if(n.subGroups=[],n.width=0,o.forEach(function(e){var o=t.processColumnGroup(e);o&&(n.width+=o.width,n.subGroups.push(o),o.depth>i&&(i=o.depth))}),n.depth+=i,!n.width)return!1}else{if(!this.columnVisCheck(e))return!1;n.width=1}return n},E.prototype.groupHeadersToRows=function(e){function t(e,n){ -var s=i-n;void 0===o[n]&&(o[n]=[]),e.height=e.subGroups?1:s-e.depth+1,o[n].push(e),e.subGroups&&e.subGroups.forEach(function(e){t(e,n+1)})}var o=[],i=0;return e.forEach(function(e){e.depth>i&&(i=e.depth)}),e.forEach(function(e){t(e,0)}),o},E.prototype.generateHeaderElements=function(){var e=this,t=document.createElement("thead");return this.groupHeadersToRows(this.generateColumnGroupHeaders()).forEach(function(o){var i=document.createElement("tr");e.mapElementStyles(e.table.columnManager.getHeadersElement(),t,["border-top","border-left","border-right","border-bottom","background-color","color","font-weight","font-family","font-size"]),o.forEach(function(t){var o=document.createElement("th"),n=t.column.definition.cssClass?t.column.definition.cssClass.split(" "):[];o.colSpan=t.width,o.rowSpan=t.height,o.innerHTML=t.column.definition.title,e.cloneTableStyle&&(o.style.boxSizing="border-box"),n.forEach(function(e){o.classList.add(e)}),e.mapElementStyles(t.column.getElement(),o,["text-align","border-top","border-left","border-right","border-bottom","background-color","color","font-weight","font-family","font-size"]),e.mapElementStyles(t.column.contentElement,o,["padding-top","padding-left","padding-right","padding-bottom"]),t.column.visible?e.mapElementStyles(t.column.getElement(),o,["width"]):t.column.definition.width&&(o.style.width=t.column.definition.width+"px"),t.column.parent&&e.mapElementStyles(t.column.parent.groupElement,o,["border-top"]),i.appendChild(o)}),t.appendChild(i)}),t},E.prototype.generateBodyElements=function(e){},E.prototype.generateBodyElements=function(e){var t,o,i,n,s,r,a,l,c,u,d=this;u=this.table.options["rowFormatter"+(this.colVisProp.charAt(0).toUpperCase()+this.colVisProp.slice(1))],u=null!==u?u:this.table.options.rowFormatter,this.cloneTableStyle&&window.getComputedStyle&&(t=this.table.element.querySelector(".tabulator-row-odd:not(.tabulator-group):not(.tabulator-calcs)"),o=this.table.element.querySelector(".tabulator-row-even:not(.tabulator-group):not(.tabulator-calcs)"),i=this.table.element.querySelector(".tabulator-row.tabulator-calcs"),n=this.table.element.querySelector(".tabulator-row:not(.tabulator-group):not(.tabulator-calcs)"),r=this.table.element.getElementsByClassName("tabulator-group")[0],n&&(a=n.getElementsByClassName("tabulator-cell"),s=a[0],a[a.length-1]));var h=document.createElement("tbody"),p=[];return!1!==this.config.columnCalcs&&this.table.modExists("columnCalcs")&&(this.table.modules.columnCalcs.topInitialized&&e.unshift(this.table.modules.columnCalcs.topRow),this.table.modules.columnCalcs.botInitialized&&e.push(this.table.modules.columnCalcs.botRow)),this.table.columnManager.columnsByIndex.forEach(function(e){d.columnVisCheck(e)&&p.push(e)}),this.table.options.dataTree&&!1!==this.config.dataTree&&this.table.modExists("columnCalcs")&&(c=this.table.modules.dataTree.elementField),e=e.filter(function(e){switch(e.type){case"group":return!1!==d.config.rowGroups;case"calc":return!1!==d.config.columnCalcs}return!0}),e.length>1e3&&console.warn("It may take a long time to render an HTML table with more than 1000 rows"),e.forEach(function(e,n){var a=e.getData(d.colVisProp),m=document.createElement("tr");switch(m.classList.add("tabulator-print-table-row"),e.type){case"group":var f=document.createElement("td");f.colSpan=p.length,f.innerHTML=e.key,m.classList.add("tabulator-print-table-group"),d.mapElementStyles(r,m,["border-top","border-left","border-right","border-bottom","color","font-weight","font-family","font-size","background-color"]),d.mapElementStyles(r,f,["padding-top","padding-left","padding-right","padding-bottom"]),m.appendChild(f);break;case"calc":m.classList.add("tabulator-print-table-calcs");case"row":if(d.table.options.dataTree&&!1===d.config.dataTree&&e.modules.dataTree.parent)return;if(p.forEach(function(t,o){var i=document.createElement("td"),n=t.getFieldValue(a),r={modules:{},getValue:function(){return n},getField:function(){return t.definition.field},getElement:function(){return i},getColumn:function(){return t.getComponent()},getData:function(){return a},getRow:function(){return e.getComponent()},getComponent:function(){return r},column:t};if((t.definition.cssClass?t.definition.cssClass.split(" "):[]).forEach(function(e){i.classList.add(e)}),d.table.modExists("format")&&!1!==d.config.formatCells)n=d.table.modules.format.formatExportValue(r,d.colVisProp);else switch(void 0===n?"undefined":_typeof(n)){case"object":n=JSON.stringify(n);break;case"undefined":case"null":n="";break;default:n=n}n instanceof Node?i.appendChild(n):i.innerHTML=n,s&&(d.mapElementStyles(s,i,["padding-top","padding-left","padding-right","padding-bottom","border-top","border-left","border-right","border-bottom","color","font-weight","font-family","font-size"]),t.definition.align&&(i.style.textAlign=t.definition.align)),d.table.options.dataTree&&!1!==d.config.dataTree&&(c&&c==t.field||!c&&0==o)&&(e.modules.dataTree.controlEl&&i.insertBefore(e.modules.dataTree.controlEl.cloneNode(!0),i.firstChild),e.modules.dataTree.branchEl&&i.insertBefore(e.modules.dataTree.branchEl.cloneNode(!0),i.firstChild)),m.appendChild(i),r.modules.format&&r.modules.format.renderedCallback&&r.modules.format.renderedCallback()}),l="calc"==e.type?i:n%2&&o?o:t,d.mapElementStyles(l,m,["border-top","border-left","border-right","border-bottom","color","font-weight","font-family","font-size","background-color"]),u&&!1!==d.config.formatCells){var g=e.getComponent();g.getElement=function(){return m},u(g)}}h.appendChild(m)}),h},E.prototype.columnVisCheck=function(e){return!1!==e.definition[this.colVisProp]&&(e.visible||!e.visible&&e.definition[this.colVisProp])},E.prototype.getHtml=function(e,t,o,i){var n=document.createElement("div");return n.appendChild(this.genereateTable(o||this.table.options.htmlOutputConfig,t,e,i||"htmlOutput")),n.innerHTML},E.prototype.mapElementStyles=function(e,t,o){if(this.cloneTableStyle&&e&&t){var i={"background-color":"backgroundColor",color:"fontColor",width:"width","font-weight":"fontWeight","font-family":"fontFamily","font-size":"fontSize","text-align":"textAlign","border-top":"borderTop","border-left":"borderLeft","border-right":"borderRight","border-bottom":"borderBottom","padding-top":"paddingTop","padding-left":"paddingLeft","padding-right":"paddingRight","padding-bottom":"paddingBottom"};if(window.getComputedStyle){var n=window.getComputedStyle(e);o.forEach(function(e){t.style[i[e]]=n.getPropertyValue(e)})}}},u.prototype.registerModule("export",E);var C=function(e){this.table=e,this.filterList=[],this.headerFilters={},this.headerFilterColumns=[],this.prevHeaderFilterChangeCheck="",this.prevHeaderFilterChangeCheck="{}",this.changed=!1};C.prototype.initializeColumn=function(e,t){function o(t){var o,s="input"==e.modules.filter.tagType&&"text"==e.modules.filter.attrType||"textarea"==e.modules.filter.tagType?"partial":"match",r="",a="";if(void 0===e.modules.filter.prevSuccess||e.modules.filter.prevSuccess!==t){if(e.modules.filter.prevSuccess=t,e.modules.filter.emptyFunc(t))delete i.headerFilters[n];else{switch(e.modules.filter.value=t,_typeof(e.definition.headerFilterFunc)){case"string":i.filters[e.definition.headerFilterFunc]?(r=e.definition.headerFilterFunc,o=function(o){var n=e.definition.headerFilterFuncParams||{},s=e.getFieldValue(o);return n="function"==typeof n?n(t,s,o):n,i.filters[e.definition.headerFilterFunc](t,s,o,n)}):console.warn("Header Filter Error - Matching filter function not found: ",e.definition.headerFilterFunc);break;case"function":o=function(o){var i=e.definition.headerFilterFuncParams||{},n=e.getFieldValue(o);return i="function"==typeof i?i(t,n,o):i,e.definition.headerFilterFunc(t,n,o,i)},r=o}if(!o)switch(s){case"partial":o=function(o){var i=e.getFieldValue(o);return void 0!==i&&null!==i&&String(i).toLowerCase().indexOf(String(t).toLowerCase())>-1},r="like";break;default:o=function(o){return e.getFieldValue(o)==t},r="="}i.headerFilters[n]={value:t,func:o,type:r}}a=JSON.stringify(i.headerFilters),i.prevHeaderFilterChangeCheck!==a&&(i.prevHeaderFilterChangeCheck=a,i.changed=!0,i.table.rowManager.filterRefresh())}return!0}var i=this,n=e.getField();e.modules.filter={success:o,attrType:!1,tagType:!1,emptyFunc:!1},this.generateHeaderFilterElement(e)},C.prototype.generateHeaderFilterElement=function(e,t,o){function i(){}var n,s,r,a,l,c,u,d=this,h=this,p=e.modules.filter.success,m=e.getField();if(e.modules.filter.headerElement&&e.modules.filter.headerElement.parentNode&&e.contentElement.removeChild(e.modules.filter.headerElement.parentNode),m){switch(e.modules.filter.emptyFunc=e.definition.headerFilterEmptyCheck||function(e){return!e&&"0"!==e},n=document.createElement("div"),n.classList.add("tabulator-header-filter"),_typeof(e.definition.headerFilter)){case"string":h.table.modules.edit.editors[e.definition.headerFilter]?(s=h.table.modules.edit.editors[e.definition.headerFilter],"tick"!==e.definition.headerFilter&&"tickCross"!==e.definition.headerFilter||e.definition.headerFilterEmptyCheck||(e.modules.filter.emptyFunc=function(e){return!0!==e&&!1!==e})):console.warn("Filter Error - Cannot build header filter, No such editor found: ",e.definition.editor);break;case"function":s=e.definition.headerFilter;break;case"boolean":e.modules.edit&&e.modules.edit.editor?s=e.modules.edit.editor:e.definition.formatter&&h.table.modules.edit.editors[e.definition.formatter]?(s=h.table.modules.edit.editors[e.definition.formatter],"tick"!==e.definition.formatter&&"tickCross"!==e.definition.formatter||e.definition.headerFilterEmptyCheck||(e.modules.filter.emptyFunc=function(e){return!0!==e&&!1!==e})):s=h.table.modules.edit.editors.input}if(s){if(a={getValue:function(){return void 0!==t?t:""},getField:function(){return e.definition.field},getElement:function(){return n},getColumn:function(){return e.getComponent()},getRow:function(){return{normalizeHeight:function(){}}}},u=e.definition.headerFilterParams||{},u="function"==typeof u?u.call(h.table):u,!(r=s.call(this.table.modules.edit,a,function(){},p,i,u)))return void console.warn("Filter Error - Cannot add filter to "+m+" column, editor returned a value of false");if(!(r instanceof Node))return void console.warn("Filter Error - Cannot add filter to "+m+" column, editor should return an instance of Node, the editor returned:",r);m?h.table.modules.localize.bind("headerFilters|columns|"+e.definition.field,function(e){r.setAttribute("placeholder",void 0!==e&&e?e:h.table.modules.localize.getText("headerFilters|default"))}):h.table.modules.localize.bind("headerFilters|default",function(e){r.setAttribute("placeholder",void 0!==h.column.definition.headerFilterPlaceholder&&h.column.definition.headerFilterPlaceholder?h.column.definition.headerFilterPlaceholder:e)}),r.addEventListener("click",function(e){e.stopPropagation(),r.focus()}),r.addEventListener("focus",function(e){var t=d.table.columnManager.element.scrollLeft;t!==d.table.rowManager.element.scrollLeft&&(d.table.rowManager.scrollHorizontal(t),d.table.columnManager.scrollHorizontal(t))}),l=!1,c=function(e){l&&clearTimeout(l),l=setTimeout(function(){p(r.value)},h.table.options.headerFilterLiveFilterDelay)},e.modules.filter.headerElement=r,e.modules.filter.attrType=r.hasAttribute("type")?r.getAttribute("type").toLowerCase():"",e.modules.filter.tagType=r.tagName.toLowerCase(),!1!==e.definition.headerFilterLiveFilter&&("autocomplete"!==e.definition.headerFilter&&"tickCross"!==e.definition.headerFilter&&("autocomplete"!==e.definition.editor&&"tickCross"!==e.definition.editor||!0!==e.definition.headerFilter)&&(r.addEventListener("keyup",c),r.addEventListener("search",c),"number"==e.modules.filter.attrType&&r.addEventListener("change",function(e){p(r.value)}),"text"==e.modules.filter.attrType&&"ie"!==this.table.browser&&r.setAttribute("type","search")),"input"!=e.modules.filter.tagType&&"select"!=e.modules.filter.tagType&&"textarea"!=e.modules.filter.tagType||r.addEventListener("mousedown",function(e){e.stopPropagation()})),n.appendChild(r),e.contentElement.appendChild(n),o||h.headerFilterColumns.push(e)}}else console.warn("Filter Error - Cannot add header filter, column has no field set:",e.definition.title)},C.prototype.hideHeaderFilterElements=function(){this.headerFilterColumns.forEach(function(e){e.modules.filter&&e.modules.filter.headerElement&&(e.modules.filter.headerElement.style.display="none")})},C.prototype.showHeaderFilterElements=function(){this.headerFilterColumns.forEach(function(e){e.modules.filter&&e.modules.filter.headerElement&&(e.modules.filter.headerElement.style.display="")})},C.prototype.setHeaderFilterFocus=function(e){e.modules.filter&&e.modules.filter.headerElement?e.modules.filter.headerElement.focus():console.warn("Column Filter Focus Error - No header filter set on column:",e.getField())},C.prototype.getHeaderFilterValue=function(e){if(e.modules.filter&&e.modules.filter.headerElement)return e.modules.filter.headerElement.value;console.warn("Column Filter Error - No header filter set on column:",e.getField())},C.prototype.setHeaderFilterValue=function(e,t){e&&(e.modules.filter&&e.modules.filter.headerElement?(this.generateHeaderFilterElement(e,t,!0),e.modules.filter.success(t)):console.warn("Column Filter Error - No header filter set on column:",e.getField()))},C.prototype.reloadHeaderFilter=function(e){e&&(e.modules.filter&&e.modules.filter.headerElement?this.generateHeaderFilterElement(e,e.modules.filter.value,!0):console.warn("Column Filter Error - No header filter set on column:",e.getField()))},C.prototype.hasChanged=function(){var e=this.changed;return this.changed=!1,e},C.prototype.setFilter=function(e,t,o){var i=this;i.filterList=[],Array.isArray(e)||(e=[{field:e,type:t,value:o}]),i.addFilter(e)},C.prototype.addFilter=function(e,t,o){var i=this;Array.isArray(e)||(e=[{field:e,type:t,value:o}]),e.forEach(function(e){(e=i.findFilter(e))&&(i.filterList.push(e),i.changed=!0)}),this.table.options.persistence&&this.table.modExists("persistence",!0)&&this.table.modules.persistence.config.filter&&this.table.modules.persistence.save("filter")},C.prototype.findFilter=function(e){var t,o=this;if(Array.isArray(e))return this.findSubFilters(e);var i=!1;return"function"==typeof e.field?i=function(t){return e.field(t,e.type||{})}:o.filters[e.type]?(t=o.table.columnManager.getColumnByField(e.field),i=t?function(i){return o.filters[e.type](e.value,t.getFieldValue(i))}:function(t){return o.filters[e.type](e.value,t[e.field])}):console.warn("Filter Error - No such filter type found, ignoring: ",e.type),e.func=i,!!e.func&&e},C.prototype.findSubFilters=function(e){var t=this,o=[];return e.forEach(function(e){(e=t.findFilter(e))&&o.push(e)}),!!o.length&&o},C.prototype.getFilters=function(e,t){var o=[];return e&&(o=this.getHeaderFilters()),t&&o.forEach(function(e){"function"==typeof e.type&&(e.type="function")}),o=o.concat(this.filtersToArray(this.filterList,t))},C.prototype.filtersToArray=function(e,t){var o=this,i=[];return e.forEach(function(e){var n;Array.isArray(e)?i.push(o.filtersToArray(e,t)):(n={field:e.field,type:e.type,value:e.value},t&&"function"==typeof n.type&&(n.type="function"),i.push(n))}),i},C.prototype.getHeaderFilters=function(){var e=[];for(var t in this.headerFilters)e.push({field:t,type:this.headerFilters[t].type,value:this.headerFilters[t].value});return e},C.prototype.removeFilter=function(e,t,o){var i=this;Array.isArray(e)||(e=[{field:e,type:t,value:o}]),e.forEach(function(e){var t=-1;t="object"==_typeof(e.field)?i.filterList.findIndex(function(t){return e===t}):i.filterList.findIndex(function(t){return e.field===t.field&&e.type===t.type&&e.value===t.value}),t>-1?(i.filterList.splice(t,1),i.changed=!0):console.warn("Filter Error - No matching filter type found, ignoring: ",e.type)}),this.table.options.persistence&&this.table.modExists("persistence",!0)&&this.table.modules.persistence.config.filter&&this.table.modules.persistence.save("filter")},C.prototype.clearFilter=function(e){this.filterList=[],e&&this.clearHeaderFilter(),this.changed=!0,this.table.options.persistence&&this.table.modExists("persistence",!0)&&this.table.modules.persistence.config.filter&&this.table.modules.persistence.save("filter")},C.prototype.clearHeaderFilter=function(){var e=this;this.headerFilters={},e.prevHeaderFilterChangeCheck="{}",this.headerFilterColumns.forEach(function(t){t.modules.filter.value=null,t.modules.filter.prevSuccess=void 0,e.reloadHeaderFilter(t)}),this.changed=!0},C.prototype.search=function(e,t,o,i){var n=this,s=[],r=[];return Array.isArray(t)||(t=[{field:t,type:o,value:i}]),t.forEach(function(e){(e=n.findFilter(e))&&r.push(e)}),this.table.rowManager.rows.forEach(function(t){var o=!0;r.forEach(function(e){n.filterRecurse(e,t.getData())||(o=!1)}),o&&s.push("data"===e?t.getData("data"):t.getComponent())}),s},C.prototype.filter=function(e,t){var o=this,i=[],n=[];return o.table.options.dataFiltering&&o.table.options.dataFiltering.call(o.table,o.getFilters()),o.table.options.ajaxFiltering||!o.filterList.length&&!Object.keys(o.headerFilters).length?i=e.slice(0):e.forEach(function(e){o.filterRow(e)&&i.push(e)}),o.table.options.dataFiltered&&(i.forEach(function(e){n.push(e.getComponent())}),o.table.options.dataFiltered.call(o.table,o.getFilters(),n)),i},C.prototype.filterRow=function(e,t){var o=this,i=!0,n=e.getData();o.filterList.forEach(function(e){o.filterRecurse(e,n)||(i=!1)});for(var s in o.headerFilters)o.headerFilters[s].func(n)||(i=!1);return i},C.prototype.filterRecurse=function(e,t){var o=this,i=!1;return Array.isArray(e)?e.forEach(function(e){o.filterRecurse(e,t)&&(i=!0)}):i=e.func(t),i},C.prototype.filters={"=":function(e,t,o,i){return t==e},"<":function(e,t,o,i){return t":function(e,t,o,i){return t>e},">=":function(e,t,o,i){return t>=e},"!=":function(e,t,o,i){return t!=e},regex:function(e,t,o,i){return"string"==typeof e&&(e=new RegExp(e)),e.test(t)},like:function(e,t,o,i){return null===e||void 0===e?t===e:void 0!==t&&null!==t&&String(t).toLowerCase().indexOf(e.toLowerCase())>-1},in:function(e,t,o,i){return Array.isArray(e)?e.indexOf(t)>-1:(console.warn("Filter Error - filter value is not an array:",e),!1)}},u.prototype.registerModule("filter",C);var x=function(e){this.table=e};x.prototype.initializeColumn=function(e){e.modules.format=this.lookupFormatter(e,""),void 0!==e.definition.formatterPrint&&(e.modules.format.print=this.lookupFormatter(e,"Print")),void 0!==e.definition.formatterClipboard&&(e.modules.format.clipboard=this.lookupFormatter(e,"Clipboard")),void 0!==e.definition.formatterHtmlOutput&&(e.modules.format.htmlOutput=this.lookupFormatter(e,"HtmlOutput"))},x.prototype.lookupFormatter=function(e,t){var o={params:e.definition["formatter"+t+"Params"]||{}},i=e.definition["formatter"+t];switch(void 0===i?"undefined":_typeof(i)){case"string":"tick"===i&&(i="tickCross",void 0===o.params.crossElement&&(o.params.crossElement=!1),console.warn("DEPRECATION WARNING - the tick formatter has been deprecated, please use the tickCross formatter with the crossElement param set to false")),this.formatters[i]?o.formatter=this.formatters[i]:(console.warn("Formatter Error - No such formatter found: ",i),o.formatter=this.formatters.plaintext);break;case"function":o.formatter=i;break;default:o.formatter=this.formatters.plaintext}return o},x.prototype.cellRendered=function(e){e.modules.format&&e.modules.format.renderedCallback&&e.modules.format.renderedCallback()},x.prototype.formatValue=function(e){function t(t){e.modules.format||(e.modules.format={}),e.modules.format.renderedCallback=t}var o=e.getComponent(),i="function"==typeof e.column.modules.format.params?e.column.modules.format.params(o):e.column.modules.format.params;return e.column.modules.format.formatter.call(this,o,i,t)},x.prototype.formatExportValue=function(e,t){var o,i=e.column.modules.format[t];if(i){var n=function(t){e.modules.format||(e.modules.format={}),e.modules.format.renderedCallback=t};return o="function"==typeof i.params?i.params(component):i.params,i.formatter.call(this,e.getComponent(),o,n)}return this.formatValue(e)},x.prototype.sanitizeHTML=function(e){if(e){var t={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/","`":"`","=":"="};return String(e).replace(/[&<>"'`=\/]/g,function(e){return t[e]})}return e},x.prototype.emptyToSpace=function(e){return null===e||void 0===e?" ":e},x.prototype.getFormatter=function(e){var e;switch(void 0===e?"undefined":_typeof(e)){case"string":this.formatters[e]?e=this.formatters[e]:(console.warn("Formatter Error - No such formatter found: ",e),e=this.formatters.plaintext);break;case"function":e=e;break;default:e=this.formatters.plaintext}return e},x.prototype.formatters={plaintext:function(e,t,o){return this.emptyToSpace(this.sanitizeHTML(e.getValue()))},html:function(e,t,o){return e.getValue()},textarea:function(e,t,o){return e.getElement().style.whiteSpace="pre-wrap",this.emptyToSpace(this.sanitizeHTML(e.getValue()))},money:function(e,t,o){var i,n,s,r,a=parseFloat(e.getValue()),l=t.decimal||".",c=t.thousand||",",u=t.symbol||"",d=!!t.symbolAfter,h=void 0!==t.precision?t.precision:2;if(isNaN(a))return this.emptyToSpace(this.sanitizeHTML(e.getValue()));for(i=!1!==h?a.toFixed(h):a,i=String(i).split("."),n=i[0],s=i.length>1?l+i[1]:"",r=/(\d+)(\d{3})/;r.test(n);)n=n.replace(r,"$1"+c+"$2");return d?n+s+u:u+n+s},link:function(e,t,o){var i,n=e.getValue(),s=t.urlPrefix||"",r=t.download,a=n,l=document.createElement("a");if(t.labelField&&(i=e.getData(),a=i[t.labelField]),t.label)switch(_typeof(t.label)){case"string":a=t.label;break;case"function":a=t.label(e)}if(a){if(t.urlField&&(i=e.getData(),n=i[t.urlField]),t.url)switch(_typeof(t.url)){case"string":n=t.url;break;case"function":n=t.url(e)}return l.setAttribute("href",s+n),t.target&&l.setAttribute("target",t.target),t.download&&(r="function"==typeof r?r(e):!0===r?"":r,l.setAttribute("download",r)),l.innerHTML=this.emptyToSpace(this.sanitizeHTML(a)),l}return" "},image:function(e,t,o){var i=document.createElement("img");switch(i.setAttribute("src",e.getValue()),_typeof(t.height)){case"number":i.style.height=t.height+"px";break;case"string":i.style.height=t.height}switch(_typeof(t.width)){case"number":i.style.width=t.width+"px";break;case"string":i.style.width=t.width}return i.addEventListener("load",function(){e.getRow().normalizeHeight()}),i},tickCross:function(e,t,o){var i=e.getValue(),n=e.getElement(),s=t.allowEmpty,r=t.allowTruthy,a=void 0!==t.tickElement?t.tickElement:'',l=void 0!==t.crossElement?t.crossElement:'';return r&&i||!0===i||"true"===i||"True"===i||1===i||"1"===i?(n.setAttribute("aria-checked",!0),a||""):!s||"null"!==i&&""!==i&&null!==i&&void 0!==i?(n.setAttribute("aria-checked",!1),l||""):(n.setAttribute("aria-checked","mixed"),"")},datetime:function(e,t,o){var i=t.inputFormat||"YYYY-MM-DD hh:mm:ss",n=t.outputFormat||"DD/MM/YYYY hh:mm:ss",s=void 0!==t.invalidPlaceholder?t.invalidPlaceholder:"",r=e.getValue(),a=moment(r,i);return a.isValid()?a.format(n):!0===s?r:"function"==typeof s?s(r):s},datetimediff:function(e,t,o){var i=t.inputFormat||"YYYY-MM-DD hh:mm:ss",n=void 0!==t.invalidPlaceholder?t.invalidPlaceholder:"",s=void 0!==t.suffix&&t.suffix,r=void 0!==t.unit?t.unit:void 0,a=void 0!==t.humanize&&t.humanize,l=void 0!==t.date?t.date:moment(),c=e.getValue(),u=moment(c,i);return u.isValid()?a?moment.duration(u.diff(l)).humanize(s):u.diff(l,r)+(s?" "+s:""):!0===n?c:"function"==typeof n?n(c):n},lookup:function(e,t,o){var i=e.getValue();return void 0===t[i]?(console.warn("Missing display value for "+i),i):t[i]},star:function(e,t,o){var i=e.getValue(),n=e.getElement(),s=t&&t.stars?t.stars:5,r=document.createElement("span"),a=document.createElementNS("http://www.w3.org/2000/svg","svg");r.style.verticalAlign="middle",a.setAttribute("width","14"),a.setAttribute("height","14"),a.setAttribute("viewBox","0 0 512 512"),a.setAttribute("xml:space","preserve"),a.style.padding="0 1px",i=i&&!isNaN(i)?parseInt(i):0,i=Math.max(0,Math.min(i,s));for(var l=1;l<=s;l++){var c=a.cloneNode(!0);c.innerHTML=l<=i?'':'',r.appendChild(c)}return n.style.whiteSpace="nowrap",n.style.overflow="hidden",n.style.textOverflow="ellipsis",n.setAttribute("aria-label",i),r},traffic:function(e,t,o){var i,n,s=this.sanitizeHTML(e.getValue())||0,r=document.createElement("span"),a=t&&t.max?t.max:100,l=t&&t.min?t.min:0,c=t&&void 0!==t.color?t.color:["red","orange","green"],u="#666666";if(!isNaN(s)&&void 0!==e.getValue()){switch(r.classList.add("tabulator-traffic-light"),n=parseFloat(s)<=a?parseFloat(s):a,n=parseFloat(n)>=l?parseFloat(n):l,i=(a-l)/100,n=Math.round((n-l)/i),void 0===c?"undefined":_typeof(c)){case"string":u=c;break;case"function":u=c(s);break;case"object":if(Array.isArray(c)){var d=100/c.length,h=Math.floor(n/d);h=Math.min(h,c.length-1),h=Math.max(h,0),u=c[h];break}}return r.style.backgroundColor=u,r}},progress:function(e,t,o){var i,n,s,r,l,c=this.sanitizeHTML(e.getValue())||0,u=e.getElement(),d=t&&t.max?t.max:100,h=t&&t.min?t.min:0,p=t&&t.legendAlign?t.legendAlign:"center";switch(n=parseFloat(c)<=d?parseFloat(c):d,n=parseFloat(n)>=h?parseFloat(n):h,i=(d-h)/100,n=Math.round((n-h)/i),_typeof(t.color)){case"string":s=t.color;break;case"function":s=t.color(c);break;case"object":if(Array.isArray(t.color)){var m=100/t.color.length,f=Math.floor(n/m);f=Math.min(f,t.color.length-1),f=Math.max(f,0),s=t.color[f];break}default:s="#2DC214"}switch(_typeof(t.legend)){case"string":r=t.legend;break;case"function":r=t.legend(c);break;case"boolean":r=c;break;default:r=!1}switch(_typeof(t.legendColor)){case"string":l=t.legendColor;break;case"function":l=t.legendColor(c);break;case"object":if(Array.isArray(t.legendColor)){var m=100/t.legendColor.length,f=Math.floor(n/m);f=Math.min(f,t.legendColor.length-1),f=Math.max(f,0),l=t.legendColor[f]}break;default:l="#000"}u.style.minWidth="30px",u.style.position="relative",u.setAttribute("aria-label",n);var g=document.createElement("div");if(g.style.display="inline-block",g.style.position="relative",g.style.width=n+"%",g.style.backgroundColor=s,g.style.height="100%",g.setAttribute("data-max",d),g.setAttribute("data-min",h),r){var b=document.createElement("div");b.style.position="absolute",b.style.top="4px",b.style.left=0,b.style.textAlign=p,b.style.width="100%",b.style.color=l,b.innerHTML=r}return o(function(){if(!(e instanceof a)){var t=document.createElement("div");t.style.position="absolute",t.style.top="4px",t.style.bottom="4px",t.style.left="4px",t.style.right="4px",u.appendChild(t),u=t}u.appendChild(g),r&&u.appendChild(b)}),""},color:function(e,t,o){return e.getElement().style.backgroundColor=this.sanitizeHTML(e.getValue()),""},buttonTick:function(e,t,o){return''},buttonCross:function(e,t,o){return''},rownum:function(e,t,o){return this.table.rowManager.activeRows.indexOf(e.getRow()._getSelf())+1},handle:function(e,t,o){return e.getElement().classList.add("tabulator-row-handle"),"
"},responsiveCollapse:function(e,t,o){function i(e){var t=s.element;s.open=e,t&&(s.open?(n.classList.add("open"),t.style.display=""):(n.classList.remove("open"),t.style.display="none"))}var n=document.createElement("div"),s=e.getRow()._row.modules.responsiveLayout;return n.classList.add("tabulator-responsive-collapse-toggle"),n.innerHTML="+-",e.getElement().classList.add("tabulator-row-handle"),n.addEventListener("click",function(e){e.stopImmediatePropagation(),i(!s.open)}),i(s.open),n},rowSelection:function(e){var t=this,o=document.createElement("input");if(o.type="checkbox",this.table.modExists("selectRow",!0))if(o.addEventListener("click",function(e){e.stopPropagation()}),"function"==typeof e.getRow){var i=e.getRow();o.addEventListener("change",function(e){i.toggleSelect()}),o.checked=i.isSelected(),this.table.modules.selectRow.registerRowSelectCheckbox(i,o)}else o.addEventListener("change",function(e){t.table.modules.selectRow.selectedRows.length?t.table.deselectRow():t.table.selectRow()}),this.table.modules.selectRow.registerHeaderSelectCheckbox(o);return o}},u.prototype.registerModule("format",x);var R=function(e){this.table=e,this.leftColumns=[],this.rightColumns=[],this.leftMargin=0,this.rightMargin=0,this.rightPadding=0,this.initializationMode="left",this.active=!1,this.scrollEndTimer=!1};R.prototype.reset=function(){this.initializationMode="left",this.leftColumns=[],this.rightColumns=[],this.leftMargin=0,this.rightMargin=0,this.rightMargin=0,this.active=!1,this.table.columnManager.headersElement.style.marginLeft=0,this.table.columnManager.element.style.paddingRight=0},R.prototype.initializeColumn=function(e){var t={margin:0,edge:!1} -;e.isGroup||(this.frozenCheck(e)?(t.position=this.initializationMode,"left"==this.initializationMode?this.leftColumns.push(e):this.rightColumns.unshift(e),this.active=!0,e.modules.frozen=t):this.initializationMode="right")},R.prototype.frozenCheck=function(e){return e.parent.isGroup&&e.definition.frozen&&console.warn("Frozen Column Error - Parent column group must be frozen, not individual columns or sub column groups"),e.parent.isGroup?this.frozenCheck(e.parent):e.definition.frozen},R.prototype.scrollHorizontal=function(){var e,t=this;this.active&&(clearTimeout(this.scrollEndTimer),this.scrollEndTimer=setTimeout(function(){t.layout()},100),e=this.table.rowManager.getVisibleRows(),this.calcMargins(),this.layoutColumnPosition(),this.layoutCalcRows(),e.forEach(function(e){"row"===e.type&&t.layoutRow(e)}),this.table.rowManager.tableElement.style.marginRight=this.rightMargin)},R.prototype.calcMargins=function(){this.leftMargin=this._calcSpace(this.leftColumns,this.leftColumns.length)+"px",this.table.columnManager.headersElement.style.marginLeft=this.leftMargin,this.rightMargin=this._calcSpace(this.rightColumns,this.rightColumns.length)+"px",this.table.columnManager.element.style.paddingRight=this.rightMargin,this.rightPadding=this.table.rowManager.element.clientWidth+this.table.columnManager.scrollLeft},R.prototype.layoutCalcRows=function(){this.table.modExists("columnCalcs")&&(this.table.modules.columnCalcs.topInitialized&&this.table.modules.columnCalcs.topRow&&this.layoutRow(this.table.modules.columnCalcs.topRow),this.table.modules.columnCalcs.botInitialized&&this.table.modules.columnCalcs.botRow&&this.layoutRow(this.table.modules.columnCalcs.botRow))},R.prototype.layoutColumnPosition=function(e){var t=this,o=[];this.leftColumns.forEach(function(i,n){if(i.modules.frozen.margin=t._calcSpace(t.leftColumns,n)+t.table.columnManager.scrollLeft+"px",n==t.leftColumns.length-1?i.modules.frozen.edge=!0:i.modules.frozen.edge=!1,i.parent.isGroup){var s=t.getColGroupParentElement(i);o.includes(s)||(t.layoutElement(s,i),o.push(s)),i.modules.frozen.edge&&s.classList.add("tabulator-frozen-"+i.modules.frozen.position)}else t.layoutElement(i.getElement(),i);e&&i.cells.forEach(function(e){t.layoutElement(e.getElement(),i)})}),this.rightColumns.forEach(function(o,i){o.modules.frozen.margin=t.rightPadding-t._calcSpace(t.rightColumns,i+1)+"px",i==t.rightColumns.length-1?o.modules.frozen.edge=!0:o.modules.frozen.edge=!1,o.parent.isGroup?t.layoutElement(t.getColGroupParentElement(o),o):t.layoutElement(o.getElement(),o),e&&o.cells.forEach(function(e){t.layoutElement(e.getElement(),o)})})},R.prototype.getColGroupParentElement=function(e){return e.parent.isGroup?this.getColGroupParentElement(e.parent):e.getElement()},R.prototype.layout=function(){var e=this;e.active&&(this.calcMargins(),e.table.rowManager.getDisplayRows().forEach(function(t){"row"===t.type&&e.layoutRow(t)}),this.layoutCalcRows(),this.layoutColumnPosition(!0),this.table.rowManager.tableElement.style.marginRight=this.rightMargin)},R.prototype.layoutRow=function(e){var t=this;e.getElement().style.paddingLeft=this.leftMargin,this.leftColumns.forEach(function(o){var i=e.getCell(o);i&&t.layoutElement(i.getElement(),o)}),this.rightColumns.forEach(function(o){var i=e.getCell(o);i&&t.layoutElement(i.getElement(),o)})},R.prototype.layoutElement=function(e,t){t.modules.frozen&&(e.style.position="absolute",e.style.left=t.modules.frozen.margin,e.classList.add("tabulator-frozen"),t.modules.frozen.edge&&e.classList.add("tabulator-frozen-"+t.modules.frozen.position))},R.prototype._calcSpace=function(e,t){for(var o=0,i=0;i-1&&t.splice(o,1)}),t},M.prototype.freezeRow=function(e){e.modules.frozen?console.warn("Freeze Error - Row is already frozen"):(e.modules.frozen=!0,this.topElement.appendChild(e.getElement()),e.initialize(),e.normalizeHeight(),this.table.rowManager.adjustTableSize(),this.rows.push(e),this.table.rowManager.refreshActiveData("display"),this.styleRows())},M.prototype.unfreezeRow=function(e){var t=this.rows.indexOf(e);if(e.modules.frozen){e.modules.frozen=!1;var o=e.getElement();o.parentNode.removeChild(o),this.table.rowManager.adjustTableSize(),this.rows.splice(t,1),this.table.rowManager.refreshActiveData("display"),this.rows.length&&this.styleRows()}else console.warn("Freeze Error - Row is already unfrozen")},M.prototype.styleRows=function(e){var t=this;this.rows.forEach(function(e,o){t.table.rowManager.styleRow(e,o)})},u.prototype.registerModule("frozenRows",M);var L=function(e){this._group=e,this.type="GroupComponent"};L.prototype.getKey=function(){return this._group.key},L.prototype.getField=function(){return this._group.field},L.prototype.getElement=function(){return this._group.element},L.prototype.getRows=function(){return this._group.getRows(!0)},L.prototype.getSubGroups=function(){return this._group.getSubGroups(!0)},L.prototype.getParentGroup=function(){return!!this._group.parent&&this._group.parent.getComponent()},L.prototype.getVisibility=function(){return this._group.visible},L.prototype.show=function(){this._group.show()},L.prototype.hide=function(){this._group.hide()},L.prototype.toggle=function(){this._group.toggleVisibility()},L.prototype._getSelf=function(){return this._group},L.prototype.getTable=function(){return this._group.groupManager.table};var D=function(e,t,o,i,n,s,r){this.groupManager=e,this.parent=t,this.key=i,this.level=o,this.field=n,this.hasSubGroups=o-1?o?this.rows.splice(n+1,0,e):this.rows.splice(n,0,e):o?this.rows.push(e):this.rows.unshift(e),e.modules.group=this,this.generateGroupHeaderContents(),this.groupManager.table.modExists("columnCalcs")&&"table"!=this.groupManager.table.options.columnCalcs&&this.groupManager.table.modules.columnCalcs.recalcGroup(this),this.groupManager.updateGroupRows(!0)},D.prototype.scrollHeader=function(e){this.arrowElement.style.marginLeft=e,this.groupList.forEach(function(t){t.scrollHeader(e)})},D.prototype.getRowIndex=function(e){},D.prototype.conformRowData=function(e){return this.field?e[this.field]=this.key:console.warn("Data Conforming Error - Cannot conform row data to match new group as groupBy is a function"),this.parent&&(e=this.parent.conformRowData(e)),e},D.prototype.removeRow=function(e){var t=this.rows.indexOf(e),o=e.getElement();t>-1&&this.rows.splice(t,1),this.groupManager.table.options.groupValues||this.rows.length?(o.parentNode&&o.parentNode.removeChild(o),this.generateGroupHeaderContents(),this.groupManager.table.modExists("columnCalcs")&&"table"!=this.groupManager.table.options.columnCalcs&&this.groupManager.table.modules.columnCalcs.recalcGroup(this)):(this.parent?this.parent.removeGroup(this):this.groupManager.removeGroup(this),this.groupManager.updateGroupRows(!0))},D.prototype.removeGroup=function(e){var t,o=e.level+"_"+e.key;this.groups[o]&&(delete this.groups[o],t=this.groupList.indexOf(e),t>-1&&this.groupList.splice(t,1),this.groupList.length||(this.parent?this.parent.removeGroup(this):this.groupManager.removeGroup(this)))},D.prototype.getHeadersAndRows=function(e){var t=[];return t.push(this),this._visSet(),this.visible?this.groupList.length?this.groupList.forEach(function(o){t=t.concat(o.getHeadersAndRows(e))}):(!e&&"table"!=this.groupManager.table.options.columnCalcs&&this.groupManager.table.modExists("columnCalcs")&&this.groupManager.table.modules.columnCalcs.hasTopCalcs()&&(this.calcs.top&&(this.calcs.top.detachElement(),this.calcs.top.deleteCells()),this.calcs.top=this.groupManager.table.modules.columnCalcs.generateTopRow(this.rows),t.push(this.calcs.top)),t=t.concat(this.rows),!e&&"table"!=this.groupManager.table.options.columnCalcs&&this.groupManager.table.modExists("columnCalcs")&&this.groupManager.table.modules.columnCalcs.hasBottomCalcs()&&(this.calcs.bottom&&(this.calcs.bottom.detachElement(),this.calcs.bottom.deleteCells()),this.calcs.bottom=this.groupManager.table.modules.columnCalcs.generateBottomRow(this.rows),t.push(this.calcs.bottom))):this.groupList.length||"table"==this.groupManager.table.options.columnCalcs||this.groupManager.table.modExists("columnCalcs")&&(!e&&this.groupManager.table.modules.columnCalcs.hasTopCalcs()&&(this.calcs.top&&(this.calcs.top.detachElement(),this.calcs.top.deleteCells()),this.groupManager.table.options.groupClosedShowCalcs&&(this.calcs.top=this.groupManager.table.modules.columnCalcs.generateTopRow(this.rows),t.push(this.calcs.top))),!e&&this.groupManager.table.modules.columnCalcs.hasBottomCalcs()&&(this.calcs.bottom&&(this.calcs.bottom.detachElement(),this.calcs.bottom.deleteCells()),this.groupManager.table.options.groupClosedShowCalcs&&(this.calcs.bottom=this.groupManager.table.modules.columnCalcs.generateBottomRow(this.rows),t.push(this.calcs.bottom)))),t},D.prototype.getData=function(e,t){var o=[];return this._visSet(),(!e||e&&this.visible)&&this.rows.forEach(function(e){o.push(e.getData(t||"data"))}),o},D.prototype.getRowCount=function(){var e=0;return this.groupList.length?this.groupList.forEach(function(t){e+=t.getRowCount()}):e=this.rows.length,e},D.prototype.toggleVisibility=function(){this.visible?this.hide():this.show()},D.prototype.hide=function(){this.visible=!1,"classic"!=this.groupManager.table.rowManager.getRenderMode()||this.groupManager.table.options.pagination?this.groupManager.updateGroupRows(!0):(this.element.classList.remove("tabulator-group-visible"),this.groupList.length?this.groupList.forEach(function(e){e.getHeadersAndRows().forEach(function(e){e.detachElement()})}):this.rows.forEach(function(e){var t=e.getElement();t.parentNode.removeChild(t)}),this.groupManager.table.rowManager.setDisplayRows(this.groupManager.updateGroupRows(),this.groupManager.getDisplayIndex()),this.groupManager.table.rowManager.checkClassicModeGroupHeaderWidth()),this.groupManager.table.options.groupVisibilityChanged.call(this.table,this.getComponent(),!1)},D.prototype.show=function(){var e=this;if(e.visible=!0,"classic"!=this.groupManager.table.rowManager.getRenderMode()||this.groupManager.table.options.pagination)this.groupManager.updateGroupRows(!0);else{this.element.classList.add("tabulator-group-visible");var t=e.getElement();this.groupList.length?this.groupList.forEach(function(e){e.getHeadersAndRows().forEach(function(e){var o=e.getElement();t.parentNode.insertBefore(o,t.nextSibling),e.initialize(),t=o})}):e.rows.forEach(function(e){var o=e.getElement();t.parentNode.insertBefore(o,t.nextSibling),e.initialize(),t=o}),this.groupManager.table.rowManager.setDisplayRows(this.groupManager.updateGroupRows(),this.groupManager.getDisplayIndex()),this.groupManager.table.rowManager.checkClassicModeGroupHeaderWidth()}this.groupManager.table.options.groupVisibilityChanged.call(this.table,this.getComponent(),!0)},D.prototype._visSet=function(){var e=[];"function"==typeof this.visible&&(this.rows.forEach(function(t){e.push(t.getData())}),this.visible=this.visible(this.key,this.getRowCount(),e,this.getComponent()))},D.prototype.getRowGroup=function(e){var t=!1;return this.groupList.length?this.groupList.forEach(function(o){var i=o.getRowGroup(e);i&&(t=i)}):this.rows.find(function(t){return t===e})&&(t=this),t},D.prototype.getSubGroups=function(e){var t=[];return this.groupList.forEach(function(o){t.push(e?o.getComponent():o)}),t},D.prototype.getRows=function(e){var t=[];return this.rows.forEach(function(o){t.push(e?o.getComponent():o)}),t},D.prototype.generateGroupHeaderContents=function(){var e=[];for(this.rows.forEach(function(t){e.push(t.getData())}),this.elementContents=this.generator(this.key,this.getRowCount(),e,this.getComponent());this.element.firstChild;)this.element.removeChild(this.element.firstChild);"string"==typeof this.elementContents?this.element.innerHTML=this.elementContents:this.element.appendChild(this.elementContents),this.element.insertBefore(this.arrowElement,this.element.firstChild)},D.prototype.getElement=function(){this.addBindingsd=!1,this._visSet(),this.visible?this.element.classList.add("tabulator-group-visible"):this.element.classList.remove("tabulator-group-visible");for(var e=0;ei.length&&console.warn("Error creating group headers, groupHeader array is shorter than groupBy array"),e.headerGenerator=[function(){return""}],this.startOpen=[function(){return!1}],e.table.modules.localize.bind("groups|item",function(t,o){e.headerGenerator[0]=function(e,i,n){return(void 0===e?"":e)+"("+i+" "+(1===i?t:o.groups.items)+")"}}),this.groupIDLookups=[],Array.isArray(t)||t)this.table.modExists("columnCalcs")&&"table"!=this.table.options.columnCalcs&&"both"!=this.table.options.columnCalcs&&this.table.modules.columnCalcs.removeCalcs();else if(this.table.modExists("columnCalcs")&&"group"!=this.table.options.columnCalcs){var n=this.table.columnManager.getRealColumns();n.forEach(function(t){t.definition.topCalc&&e.table.modules.columnCalcs.initializeTopRow(),t.definition.bottomCalc&&e.table.modules.columnCalcs.initializeBottomRow()})}Array.isArray(t)||(t=[t]),t.forEach(function(t,o){var i,n;"function"==typeof t?i=t:(n=e.table.columnManager.getColumnByField(t),i=n?function(e){return n.getFieldValue(e)}:function(e){return e[t]}),e.groupIDLookups.push({field:"function"!=typeof t&&t,func:i,values:!!e.allowedValues&&e.allowedValues[o]})}),o&&(Array.isArray(o)||(o=[o]),o.forEach(function(e){e="function"==typeof e?e:function(){return!0}}),e.startOpen=o),i&&(e.headerGenerator=Array.isArray(i)?i:[i]),this.initialized=!0},T.prototype.setDisplayIndex=function(e){this.displayIndex=e},T.prototype.getDisplayIndex=function(){return this.displayIndex},T.prototype.getRows=function(e){return this.groupIDLookups.length?(this.table.options.dataGrouping.call(this.table),this.generateGroups(e),this.table.options.dataGrouped&&this.table.options.dataGrouped.call(this.table,this.getGroups(!0)),this.updateGroupRows()):e.slice(0)},T.prototype.getGroups=function(e){var t=[];return this.groupList.forEach(function(o){t.push(e?o.getComponent():o)}),t},T.prototype.getChildGroups=function(e){var t=this,o=[];return e||(e=this),e.groupList.forEach(function(e){e.groupList.length?o=o.concat(t.getChildGroups(e)):o.push(e)}),o},T.prototype.wipe=function(){this.groupList.forEach(function(e){e.wipe()})},T.prototype.pullGroupListData=function(e){var t=this,o=[];return e.forEach(function(e){var i={};i.level=0,i.rowCount=0,i.headerContent="";var n=[];e.hasSubGroups?(n=t.pullGroupListData(e.groupList),i.level=e.level,i.rowCount=n.length-e.groupList.length,i.headerContent=e.generator(e.key,i.rowCount,e.rows,e),o.push(i),o=o.concat(n)):(i.level=e.level,i.headerContent=e.generator(e.key,e.rows.length,e.rows,e),i.rowCount=e.getRows().length,o.push(i),e.getRows().forEach(function(e){o.push(e.getData("data"))}))}),o},T.prototype.getGroupedData=function(){return this.pullGroupListData(this.groupList)},T.prototype.getRowGroup=function(e){var t=!1;return this.groupList.forEach(function(o){var i=o.getRowGroup(e);i&&(t=i)}),t},T.prototype.countGroups=function(){return this.groupList.length},T.prototype.generateGroups=function(e){var t=this,o=t.groups;t.groups={},t.groupList=[],this.allowedValues&&this.allowedValues[0]?(this.allowedValues[0].forEach(function(e){t.createGroup(e,0,o)}),e.forEach(function(e){t.assignRowToExistingGroup(e,o)})):e.forEach(function(e){t.assignRowToGroup(e,o)})},T.prototype.createGroup=function(e,t,o){var i,n=t+"_"+e;o=o||[],i=new D(this,!1,t,e,this.groupIDLookups[0].field,this.headerGenerator[0],o[n]),this.groups[n]=i,this.groupList.push(i)},T.prototype.assignRowToExistingGroup=function(e,t){var o=this.groupIDLookups[0].func(e.getData()),i="0_"+o;this.groups[i]&&this.groups[i].addRow(e)},T.prototype.assignRowToGroup=function(e,t){var o=this.groupIDLookups[0].func(e.getData()),i=!this.groups["0_"+o];return i&&this.createGroup(o,0,t),this.groups["0_"+o].addRow(e),!i},T.prototype.updateGroupRows=function(e){var t=this,o=[];if(t.groupList.forEach(function(e){o=o.concat(e.getHeadersAndRows())}),e){var i=t.table.rowManager.setDisplayRows(o,this.getDisplayIndex());!0!==i&&this.setDisplayIndex(i),t.table.rowManager.refreshActiveData("group",!0,!0)}return o},T.prototype.scrollHeaders=function(e){e+="px",this.groupList.forEach(function(t){t.scrollHeader(e)})},T.prototype.removeGroup=function(e){var t,o=e.level+"_"+e.key;this.groups[o]&&(delete this.groups[o],(t=this.groupList.indexOf(e))>-1&&this.groupList.splice(t,1))},u.prototype.registerModule("groupRows",T);var k=function(e){this.table=e,this.history=[],this.index=-1};k.prototype.clear=function(){this.history=[],this.index=-1},k.prototype.action=function(e,t,o){this.history=this.history.slice(0,this.index+1),this.history.push({type:e,component:t,data:o}),this.index++},k.prototype.getHistoryUndoSize=function(){return this.index+1},k.prototype.getHistoryRedoSize=function(){return this.history.length-(this.index+1)},k.prototype.undo=function(){if(this.index>-1){var e=this.history[this.index];return this.undoers[e.type].call(this,e),this.index--,this.table.options.historyUndo.call(this.table,e.type,e.component.getComponent(),e.data),!0}return console.warn("History Undo Error - No more history to undo"),!1},k.prototype.redo=function(){if(this.history.length-1>this.index){this.index++;var e=this.history[this.index];return this.redoers[e.type].call(this,e),this.table.options.historyRedo.call(this.table,e.type,e.component.getComponent(),e.data),!0}return console.warn("History Redo Error - No more history to redo"),!1},k.prototype.undoers={cellEdit:function(e){e.component.setValueProcessData(e.data.oldValue)},rowAdd:function(e){e.component.deleteActual()},rowDelete:function(e){var t=this.table.rowManager.addRowActual(e.data.data,e.data.pos,e.data.index);this.table.options.groupBy&&this.table.modExists("groupRows")&&this.table.modules.groupRows.updateGroupRows(!0),this._rebindRow(e.component,t)},rowMove:function(e){this.table.rowManager.moveRowActual(e.component,this.table.rowManager.rows[e.data.posFrom],!e.data.after),this.table.rowManager.redraw()}},k.prototype.redoers={cellEdit:function(e){e.component.setValueProcessData(e.data.newValue)},rowAdd:function(e){var t=this.table.rowManager.addRowActual(e.data.data,e.data.pos,e.data.index);this.table.options.groupBy&&this.table.modExists("groupRows")&&this.table.modules.groupRows.updateGroupRows(!0),this._rebindRow(e.component,t)},rowDelete:function(e){e.component.deleteActual()},rowMove:function(e){this.table.rowManager.moveRowActual(e.component,this.table.rowManager.rows[e.data.posTo],e.data.after),this.table.rowManager.redraw()}},k.prototype._rebindRow=function(e,t){this.history.forEach(function(o){if(o.component instanceof r)o.component===e&&(o.component=t);else if(o.component instanceof l&&o.component.row===e){var i=o.component.column.getField();i&&(o.component=t.getCell(i))}})},u.prototype.registerModule("history",k);var S=function(e){this.table=e,this.fieldIndex=[],this.hasIndex=!1};S.prototype.parseTable=function(){var e=this,t=e.table.element,o=e.table.options,i=(o.columns,t.getElementsByTagName("th")),n=t.getElementsByTagName("tbody")[0],s=[];e.hasIndex=!1,e.table.options.htmlImporting.call(this.table),n=n?n.getElementsByTagName("tr"):[],e._extractOptions(t,o),i.length?e._extractHeaders(i,n):e._generateBlankHeaders(i,n);for(var r=0;r-1&&e.pressedKeys.splice(i,1)}},this.table.element.addEventListener("keydown",this.keyupBinding),this.table.element.addEventListener("keyup",this.keydownBinding)},z.prototype.clearBindings=function(){this.keyupBinding&&this.table.element.removeEventListener("keydown",this.keyupBinding),this.keydownBinding&&this.table.element.removeEventListener("keyup",this.keydownBinding)},z.prototype.checkBinding=function(e,t){var o=this,i=!0;return e.ctrlKey==t.ctrl&&e.shiftKey==t.shift&&e.metaKey==t.meta&&(t.keys.forEach(function(e){-1==o.pressedKeys.indexOf(e)&&(i=!1)}),i&&t.action.call(o,e),!0)},z.prototype.bindings={navPrev:"shift + 9",navNext:9,navUp:38,navDown:40,scrollPageUp:33,scrollPageDown:34,scrollToStart:36,scrollToEnd:35,undo:"ctrl + 90",redo:"ctrl + 89",copyToClipboard:"ctrl + 67"},z.prototype.actions={keyBlock:function(e){e.stopPropagation(),e.preventDefault()},scrollPageUp:function(e){var t=this.table.rowManager,o=t.scrollTop-t.height;t.element.scrollHeight;e.preventDefault(),t.displayRowsCount&&(o>=0?t.element.scrollTop=o:t.scrollToRow(t.getDisplayRows()[0])),this.table.element.focus()},scrollPageDown:function(e){var t=this.table.rowManager,o=t.scrollTop+t.height,i=t.element.scrollHeight;e.preventDefault(),t.displayRowsCount&&(o<=i?t.element.scrollTop=o:t.scrollToRow(t.getDisplayRows()[t.displayRowsCount-1])),this.table.element.focus()},scrollToStart:function(e){var t=this.table.rowManager;e.preventDefault(),t.displayRowsCount&&t.scrollToRow(t.getDisplayRows()[0]),this.table.element.focus()},scrollToEnd:function(e){var t=this.table.rowManager;e.preventDefault(),t.displayRowsCount&&t.scrollToRow(t.getDisplayRows()[t.displayRowsCount-1]),this.table.element.focus()},navPrev:function(e){var t=!1;this.table.modExists("edit")&&(t=this.table.modules.edit.currentCell)&&(e.preventDefault(),t.nav().prev())},navNext:function(e){var t,o=!1,i=this.table.options.tabEndNewRow;this.table.modExists("edit")&&(o=this.table.modules.edit.currentCell)&&(e.preventDefault(),t=o.nav(),t.next()||i&&(o.getElement().firstChild.blur(),i=!0===i?this.table.addRow({}):"function"==typeof i?this.table.addRow(i(o.row.getComponent())):this.table.addRow(i),i.then(function(){setTimeout(function(){t.next()})})))},navLeft:function(e){var t=!1;this.table.modExists("edit")&&(t=this.table.modules.edit.currentCell)&&(e.preventDefault(),t.nav().left())},navRight:function(e){var t=!1;this.table.modExists("edit")&&(t=this.table.modules.edit.currentCell)&&(e.preventDefault(),t.nav().right())},navUp:function(e){var t=!1;this.table.modExists("edit")&&(t=this.table.modules.edit.currentCell)&&(e.preventDefault(),t.nav().up())},navDown:function(e){var t=!1;this.table.modExists("edit")&&(t=this.table.modules.edit.currentCell)&&(e.preventDefault(),t.nav().down())},undo:function(e){this.table.options.history&&this.table.modExists("history")&&this.table.modExists("edit")&&(this.table.modules.edit.currentCell||(e.preventDefault(),this.table.modules.history.undo()))},redo:function(e){this.table.options.history&&this.table.modExists("history")&&this.table.modExists("edit")&&(this.table.modules.edit.currentCell||(e.preventDefault(),this.table.modules.history.redo()))},copyToClipboard:function(e){this.table.modules.edit.currentCell||this.table.modExists("clipboard",!0)&&this.table.modules.clipboard.copy(!1,!0)}},u.prototype.registerModule("keybindings",z);var F=function(e){this.table=e,this.menuEl=!1,this.blurEvent=this.hideMenu.bind(this)};F.prototype.initializeColumnHeader=function(e){var t,o=this;e.definition.headerContextMenu&&e.getElement().addEventListener("contextmenu",function(t){ -var i="function"==typeof e.definition.headerContextMenu?e.definition.headerContextMenu():e.definition.headerContextMenu;t.preventDefault(),o.loadMenu(t,e,i)}),e.definition.headerMenu&&(t=document.createElement("span"),t.classList.add("tabulator-header-menu-button"),t.innerHTML="⋮",t.addEventListener("click",function(t){var i="function"==typeof e.definition.headerMenu?e.definition.headerMenu():e.definition.headerMenu;t.stopPropagation(),t.preventDefault(),o.loadMenu(t,e,i)}),e.titleElement.insertBefore(t,e.titleElement.firstChild))},F.prototype.initializeCell=function(e){var t=this;e.getElement().addEventListener("contextmenu",function(o){var i="function"==typeof e.column.definition.contextMenu?e.column.definition.contextMenu():e.column.definition.contextMenu;o.preventDefault(),t.loadMenu(o,e,i)})},F.prototype.initializeRow=function(e){var t=this;e.getElement().addEventListener("contextmenu",function(o){var i="function"==typeof t.table.options.rowContextMenu?t.table.options.rowContextMenu():t.table.options.rowContextMenu;o.preventDefault(),t.loadMenu(o,e,i)})},F.prototype.loadMenu=function(e,t,o){var i=this,n=document.body.offsetHeight;o&&o.length&&(this.hideMenu(),this.menuEl=document.createElement("div"),this.menuEl.classList.add("tabulator-menu"),o.forEach(function(e){var o=document.createElement("div"),n=e.label,s=e.disabled;e.separator?o.classList.add("tabulator-menu-separator"):(o.classList.add("tabulator-menu-item"),"function"==typeof n&&(n=n(t.getComponent())),n instanceof Node?o.appendChild(n):o.innerHTML=n,"function"==typeof s&&(s=s(t.getComponent())),s?(o.classList.add("tabulator-menu-item-disabled"),o.addEventListener("click",function(e){e.stopPropagation()})):o.addEventListener("click",function(o){i.hideMenu(),e.action(o,t.getComponent())})),i.menuEl.appendChild(o)}),this.menuEl.style.top=e.pageY+"px",this.menuEl.style.left=e.pageX+"px",document.body.addEventListener("click",this.blurEvent),this.table.rowManager.element.addEventListener("scroll",this.blurEvent),setTimeout(function(){document.body.addEventListener("contextmenu",i.blurEvent)},100),document.body.appendChild(this.menuEl),e.pageX+this.menuEl.offsetWidth>=document.body.offsetWidth&&(this.menuEl.style.left="",this.menuEl.style.right=document.body.offsetWidth-e.pageX+"px"),e.pageY+this.menuEl.offsetHeight>=n&&(this.menuEl.style.top="",this.menuEl.style.bottom=n-e.pageY+"px"))},F.prototype.hideMenu=function(){this.menuEl.parentNode&&this.menuEl.parentNode.removeChild(this.menuEl),this.blurEvent&&(document.body.removeEventListener("click",this.blurEvent),document.body.removeEventListener("contextmenu",this.blurEvent),this.table.rowManager.element.removeEventListener("scroll",this.blurEvent))},F.prototype.menus={},u.prototype.registerModule("menu",F);var H=function(e){this.table=e,this.placeholderElement=this.createPlaceholderElement(),this.hoverElement=!1,this.checkTimeout=!1,this.checkPeriod=250,this.moving=!1,this.toCol=!1,this.toColAfter=!1,this.startX=0,this.autoScrollMargin=40,this.autoScrollStep=5,this.autoScrollTimeout=!1,this.touchMove=!1,this.moveHover=this.moveHover.bind(this),this.endMove=this.endMove.bind(this)};H.prototype.createPlaceholderElement=function(){var e=document.createElement("div");return e.classList.add("tabulator-col"),e.classList.add("tabulator-col-placeholder"),e},H.prototype.initializeColumn=function(e){var t,o=this,i={};e.modules.frozen||(t=e.getElement(),i.mousemove=function(i){e.parent===o.moving.parent&&((o.touchMove?i.touches[0].pageX:i.pageX)-u.prototype.helpers.elOffset(t).left+o.table.columnManager.element.scrollLeft>e.getWidth()/2?o.toCol===e&&o.toColAfter||(t.parentNode.insertBefore(o.placeholderElement,t.nextSibling),o.moveColumn(e,!0)):(o.toCol!==e||o.toColAfter)&&(t.parentNode.insertBefore(o.placeholderElement,t),o.moveColumn(e,!1)))}.bind(o),t.addEventListener("mousedown",function(t){o.touchMove=!1,1===t.which&&(o.checkTimeout=setTimeout(function(){o.startMove(t,e)},o.checkPeriod))}),t.addEventListener("mouseup",function(e){1===e.which&&o.checkTimeout&&clearTimeout(o.checkTimeout)}),o.bindTouchEvents(e)),e.modules.moveColumn=i},H.prototype.bindTouchEvents=function(e){var t,o,i,n,s,r,a,l=this,c=e.getElement(),u=!1;c.addEventListener("touchstart",function(c){l.checkTimeout=setTimeout(function(){l.touchMove=!0,t=e,o=e.nextColumn(),n=o?o.getWidth()/2:0,i=e.prevColumn(),s=i?i.getWidth()/2:0,r=0,a=0,u=!1,l.startMove(c,e)},l.checkPeriod)},{passive:!0}),c.addEventListener("touchmove",function(c){var d,h;l.moving&&(l.moveHover(c),u||(u=c.touches[0].pageX),d=c.touches[0].pageX-u,d>0?o&&d-r>n&&(h=o)!==e&&(u=c.touches[0].pageX,h.getElement().parentNode.insertBefore(l.placeholderElement,h.getElement().nextSibling),l.moveColumn(h,!0)):i&&-d-a>s&&(h=i)!==e&&(u=c.touches[0].pageX,h.getElement().parentNode.insertBefore(l.placeholderElement,h.getElement()),l.moveColumn(h,!1)),h&&(t=h,o=h.nextColumn(),r=n,n=o?o.getWidth()/2:0,i=h.prevColumn(),a=s,s=i?i.getWidth()/2:0))},{passive:!0}),c.addEventListener("touchend",function(e){l.checkTimeout&&clearTimeout(l.checkTimeout),l.moving&&l.endMove(e)})},H.prototype.startMove=function(e,t){var o=t.getElement();this.moving=t,this.startX=(this.touchMove?e.touches[0].pageX:e.pageX)-u.prototype.helpers.elOffset(o).left,this.table.element.classList.add("tabulator-block-select"),this.placeholderElement.style.width=t.getWidth()+"px",this.placeholderElement.style.height=t.getHeight()+"px",o.parentNode.insertBefore(this.placeholderElement,o),o.parentNode.removeChild(o),this.hoverElement=o.cloneNode(!0),this.hoverElement.classList.add("tabulator-moving"),this.table.columnManager.getElement().appendChild(this.hoverElement),this.hoverElement.style.left="0",this.hoverElement.style.bottom="0",this.touchMove||(this._bindMouseMove(),document.body.addEventListener("mousemove",this.moveHover),document.body.addEventListener("mouseup",this.endMove)),this.moveHover(e)},H.prototype._bindMouseMove=function(){this.table.columnManager.columnsByIndex.forEach(function(e){e.modules.moveColumn.mousemove&&e.getElement().addEventListener("mousemove",e.modules.moveColumn.mousemove)})},H.prototype._unbindMouseMove=function(){this.table.columnManager.columnsByIndex.forEach(function(e){e.modules.moveColumn.mousemove&&e.getElement().removeEventListener("mousemove",e.modules.moveColumn.mousemove)})},H.prototype.moveColumn=function(e,t){var o=this.moving.getCells();this.toCol=e,this.toColAfter=t,t?e.getCells().forEach(function(e,t){var i=e.getElement();i.parentNode.insertBefore(o[t].getElement(),i.nextSibling)}):e.getCells().forEach(function(e,t){var i=e.getElement();i.parentNode.insertBefore(o[t].getElement(),i)})},H.prototype.endMove=function(e){(1===e.which||this.touchMove)&&(this._unbindMouseMove(),this.placeholderElement.parentNode.insertBefore(this.moving.getElement(),this.placeholderElement.nextSibling),this.placeholderElement.parentNode.removeChild(this.placeholderElement),this.hoverElement.parentNode.removeChild(this.hoverElement),this.table.element.classList.remove("tabulator-block-select"),this.toCol&&this.table.columnManager.moveColumnActual(this.moving,this.toCol,this.toColAfter),this.moving=!1,this.toCol=!1,this.toColAfter=!1,this.touchMove||(document.body.removeEventListener("mousemove",this.moveHover),document.body.removeEventListener("mouseup",this.endMove)))},H.prototype.moveHover=function(e){var t,o=this,i=o.table.columnManager.getElement(),n=i.scrollLeft,s=(o.touchMove?e.touches[0].pageX:e.pageX)-u.prototype.helpers.elOffset(i).left+n;o.hoverElement.style.left=s-o.startX+"px",s-ne.getHeight()/2){if(t.toRow!==e||!t.toRowAfter){var i=e.getElement();i.parentNode.insertBefore(t.placeholderElement,i.nextSibling),t.moveRow(e,!0)}}else if(t.toRow!==e||t.toRowAfter){var i=e.getElement();i.previousSibling&&(i.parentNode.insertBefore(t.placeholderElement,i),t.moveRow(e,!1))}}.bind(t),e.modules.moveRow=o},A.prototype.initializeRow=function(e){var t,o=this,i={};i.mouseup=function(t){o.tableRowDrop(t,e)}.bind(o),i.mousemove=function(t){if(t.pageY-u.prototype.helpers.elOffset(e.element).top+o.table.rowManager.element.scrollTop>e.getHeight()/2){if(o.toRow!==e||!o.toRowAfter){var i=e.getElement();i.parentNode.insertBefore(o.placeholderElement,i.nextSibling),o.moveRow(e,!0)}}else if(o.toRow!==e||o.toRowAfter){var i=e.getElement();i.parentNode.insertBefore(o.placeholderElement,i),o.moveRow(e,!1)}}.bind(o),this.hasHandle||(t=e.getElement(),t.addEventListener("mousedown",function(t){1===t.which&&(o.checkTimeout=setTimeout(function(){o.startMove(t,e)},o.checkPeriod))}),t.addEventListener("mouseup",function(e){1===e.which&&o.checkTimeout&&clearTimeout(o.checkTimeout)}),this.bindTouchEvents(e,e.getElement())),e.modules.moveRow=i},A.prototype.initializeCell=function(e){var t=this,o=e.getElement();o.addEventListener("mousedown",function(o){1===o.which&&(t.checkTimeout=setTimeout(function(){t.startMove(o,e.row)},t.checkPeriod))}),o.addEventListener("mouseup",function(e){1===e.which&&t.checkTimeout&&clearTimeout(t.checkTimeout)}),this.bindTouchEvents(e.row,e.getElement())},A.prototype.bindTouchEvents=function(e,t){var o,i,n,s,r,a,l,c=this,u=!1;t.addEventListener("touchstart",function(t){c.checkTimeout=setTimeout(function(){c.touchMove=!0,o=e,i=e.nextRow(),s=i?i.getHeight()/2:0,n=e.prevRow(),r=n?n.getHeight()/2:0,a=0,l=0,u=!1,c.startMove(t,e)},c.checkPeriod)},{passive:!0}),this.moving,this.toRow,this.toRowAfter,t.addEventListener("touchmove",function(t){var d,h;c.moving&&(t.preventDefault(),c.moveHover(t),u||(u=t.touches[0].pageY),d=t.touches[0].pageY-u,d>0?i&&d-a>s&&(h=i)!==e&&(u=t.touches[0].pageY,h.getElement().parentNode.insertBefore(c.placeholderElement,h.getElement().nextSibling),c.moveRow(h,!0)):n&&-d-l>r&&(h=n)!==e&&(u=t.touches[0].pageY,h.getElement().parentNode.insertBefore(c.placeholderElement,h.getElement()),c.moveRow(h,!1)),h&&(o=h,i=h.nextRow(),a=s,s=i?i.getHeight()/2:0,n=h.prevRow(),l=r,r=n?n.getHeight()/2:0))}),t.addEventListener("touchend",function(e){c.checkTimeout&&clearTimeout(c.checkTimeout),c.moving&&(c.endMove(e),c.touchMove=!1)})},A.prototype._bindMouseMove=function(){this.table.rowManager.getDisplayRows().forEach(function(e){"row"!==e.type&&"group"!==e.type||!e.modules.moveRow.mousemove||e.getElement().addEventListener("mousemove",e.modules.moveRow.mousemove)})},A.prototype._unbindMouseMove=function(){this.table.rowManager.getDisplayRows().forEach(function(e){"row"!==e.type&&"group"!==e.type||!e.modules.moveRow.mousemove||e.getElement().removeEventListener("mousemove",e.modules.moveRow.mousemove)})},A.prototype.startMove=function(e,t){var o=t.getElement();this.setStartPosition(e,t),this.moving=t,this.table.element.classList.add("tabulator-block-select"),this.placeholderElement.style.width=t.getWidth()+"px",this.placeholderElement.style.height=t.getHeight()+"px",this.connection?(this.table.element.classList.add("tabulator-movingrow-sending"),this.connectToTables(t)):(o.parentNode.insertBefore(this.placeholderElement,o),o.parentNode.removeChild(o)),this.hoverElement=o.cloneNode(!0),this.hoverElement.classList.add("tabulator-moving"),this.connection?(document.body.appendChild(this.hoverElement),this.hoverElement.style.left="0",this.hoverElement.style.top="0",this.hoverElement.style.width=this.table.element.clientWidth+"px",this.hoverElement.style.whiteSpace="nowrap",this.hoverElement.style.overflow="hidden",this.hoverElement.style.pointerEvents="none"):(this.table.rowManager.getTableElement().appendChild(this.hoverElement),this.hoverElement.style.left="0",this.hoverElement.style.top="0",this._bindMouseMove()),document.body.addEventListener("mousemove",this.moveHover),document.body.addEventListener("mouseup",this.endMove),this.moveHover(e)},A.prototype.setStartPosition=function(e,t){var o,i,n=this.touchMove?e.touches[0].pageX:e.pageX,s=this.touchMove?e.touches[0].pageY:e.pageY;o=t.getElement(),this.connection?(i=o.getBoundingClientRect(),this.startX=i.left-n+window.pageXOffset,this.startY=i.top-s+window.pageYOffset):this.startY=s-o.getBoundingClientRect().top},A.prototype.endMove=function(e){e&&1!==e.which&&!this.touchMove||(this._unbindMouseMove(),this.connection||(this.placeholderElement.parentNode.insertBefore(this.moving.getElement(),this.placeholderElement.nextSibling),this.placeholderElement.parentNode.removeChild(this.placeholderElement)),this.hoverElement.parentNode.removeChild(this.hoverElement),this.table.element.classList.remove("tabulator-block-select"),this.toRow&&this.table.rowManager.moveRow(this.moving,this.toRow,this.toRowAfter),this.moving=!1,this.toRow=!1,this.toRowAfter=!1,document.body.removeEventListener("mousemove",this.moveHover),document.body.removeEventListener("mouseup",this.endMove),this.connection&&(this.table.element.classList.remove("tabulator-movingrow-sending"),this.disconnectFromTables()))},A.prototype.moveRow=function(e,t){this.toRow=e,this.toRowAfter=t},A.prototype.moveHover=function(e){this.connection?this.moveHoverConnections.call(this,e):this.moveHoverTable.call(this,e)},A.prototype.moveHoverTable=function(e){var t=this.table.rowManager.getElement(),o=t.scrollTop,i=(this.touchMove?e.touches[0].pageY:e.pageY)-t.getBoundingClientRect().top+o;this.hoverElement.style.top=i-this.startY+"px"},A.prototype.moveHoverConnections=function(e){this.hoverElement.style.left=this.startX+(this.touchMove?e.touches[0].pageX:e.pageX)+"px",this.hoverElement.style.top=this.startY+(this.touchMove?e.touches[0].pageY:e.pageY)+"px"},A.prototype.connectToTables=function(e){var t=this.table.modules.comms.getConnections(this.connection);this.table.options.movableRowsSendingStart.call(this.table,t),this.table.modules.comms.send(this.connection,"moveRow","connect",{row:e})},A.prototype.disconnectFromTables=function(){var e=this.table.modules.comms.getConnections(this.connection);this.table.options.movableRowsSendingStop.call(this.table,e),this.table.modules.comms.send(this.connection,"moveRow","disconnect")},A.prototype.connect=function(e,t){var o=this;return this.connectedTable?(console.warn("Move Row Error - Table cannot accept connection, already connected to table:",this.connectedTable),!1):(this.connectedTable=e,this.connectedRow=t,this.table.element.classList.add("tabulator-movingrow-receiving"),o.table.rowManager.getDisplayRows().forEach(function(e){"row"===e.type&&e.modules.moveRow&&e.modules.moveRow.mouseup&&e.getElement().addEventListener("mouseup",e.modules.moveRow.mouseup)}),o.tableRowDropEvent=o.tableRowDrop.bind(o),o.table.element.addEventListener("mouseup",o.tableRowDropEvent),this.table.options.movableRowsReceivingStart.call(this.table,t,e),!0)},A.prototype.disconnect=function(e){var t=this;e===this.connectedTable?(this.connectedTable=!1,this.connectedRow=!1,this.table.element.classList.remove("tabulator-movingrow-receiving"),t.table.rowManager.getDisplayRows().forEach(function(e){"row"===e.type&&e.modules.moveRow&&e.modules.moveRow.mouseup&&e.getElement().removeEventListener("mouseup",e.modules.moveRow.mouseup)}),t.table.element.removeEventListener("mouseup",t.tableRowDropEvent),this.table.options.movableRowsReceivingStop.call(this.table,e)):console.warn("Move Row Error - trying to disconnect from non connected table")},A.prototype.dropComplete=function(e,t,o){var i=!1;if(o){switch(_typeof(this.table.options.movableRowsSender)){case"string":i=this.senders[this.table.options.movableRowsSender];break;case"function":i=this.table.options.movableRowsSender}i?i.call(this,this.moving.getComponent(),t?t.getComponent():void 0,e):this.table.options.movableRowsSender&&console.warn("Mover Row Error - no matching sender found:",this.table.options.movableRowsSender),this.table.options.movableRowsSent.call(this.table,this.moving.getComponent(),t?t.getComponent():void 0,e)}else this.table.options.movableRowsSentFailed.call(this.table,this.moving.getComponent(),t?t.getComponent():void 0,e);this.endMove()},A.prototype.tableRowDrop=function(e,t){var o=!1,i=!1;switch(e.stopImmediatePropagation(),_typeof(this.table.options.movableRowsReceiver)){case"string":o=this.receivers[this.table.options.movableRowsReceiver];break;case"function":o=this.table.options.movableRowsReceiver}o?i=o.call(this,this.connectedRow.getComponent(),t?t.getComponent():void 0,this.connectedTable):console.warn("Mover Row Error - no matching receiver found:",this.table.options.movableRowsReceiver),i?this.table.options.movableRowsReceived.call(this.table,this.connectedRow.getComponent(),t?t.getComponent():void 0,this.connectedTable):this.table.options.movableRowsReceivedFailed.call(this.table,this.connectedRow.getComponent(),t?t.getComponent():void 0,this.connectedTable),this.table.modules.comms.send(this.connectedTable,"moveRow","dropcomplete",{row:t,success:i})},A.prototype.receivers={insert:function(e,t,o){return this.table.addRow(e.getData(),void 0,t),!0},add:function(e,t,o){return this.table.addRow(e.getData()),!0},update:function(e,t,o){return!!t&&(t.update(e.getData()),!0)},replace:function(e,t,o){return!!t&&(this.table.addRow(e.getData(),void 0,t),t.delete(),!0)}},A.prototype.senders={delete:function(e,t,o){e.delete()}},A.prototype.commsReceived=function(e,t,o){switch(t){case"connect":return this.connect(e,o.row);case"disconnect":return this.disconnect(e);case"dropcomplete":return this.dropComplete(e,o.row,o.success)}},u.prototype.registerModule("moveRow",A);var P=function(e){this.table=e,this.allowedTypes=["","data","edit","clipboard"],this.enabled=!0};P.prototype.initializeColumn=function(e){var t=this,o=!1,i={};this.allowedTypes.forEach(function(n){var s,r="mutator"+(n.charAt(0).toUpperCase()+n.slice(1));e.definition[r]&&(s=t.lookupMutator(e.definition[r]))&&(o=!0,i[r]={mutator:s,params:e.definition[r+"Params"]||{}})}),o&&(e.modules.mutate=i)},P.prototype.lookupMutator=function(e){var t=!1;switch(void 0===e?"undefined":_typeof(e)){case"string":this.mutators[e]?t=this.mutators[e]:console.warn("Mutator Error - No such mutator found, ignoring: ",e);break;case"function":t=e}return t},P.prototype.transformRow=function(e,t,o){var i,n=this,s="mutator"+(t.charAt(0).toUpperCase()+t.slice(1));return this.enabled&&n.table.columnManager.traverse(function(n){var r,a,l;n.modules.mutate&&(r=n.modules.mutate[s]||n.modules.mutate.mutator||!1)&&(i=n.getFieldValue(void 0!==o?o:e),"data"!=t&&void 0===i||(l=n.getComponent(),a="function"==typeof r.params?r.params(i,e,t,l):r.params,n.setFieldValue(e,r.mutator(i,e,t,a,l))))}),e},P.prototype.transformCell=function(e,t){var o=e.column.modules.mutate.mutatorEdit||e.column.modules.mutate.mutator||!1,i={};return o?(i=Object.assign(i,e.row.getData()),e.column.setFieldValue(i,t),o.mutator(t,i,"edit",o.params,e.getComponent())):t},P.prototype.enable=function(){this.enabled=!0},P.prototype.disable=function(){this.enabled=!1},P.prototype.mutators={},u.prototype.registerModule("mutator",P);var _=function(e){this.table=e,this.mode="local",this.progressiveLoad=!1,this.size=0,this.page=1,this.count=5,this.max=1,this.displayIndex=0,this.initialLoad=!0,this.pageSizes=[],this.createElements()};_.prototype.createElements=function(){var e;this.element=document.createElement("span"),this.element.classList.add("tabulator-paginator"),this.pagesElement=document.createElement("span"),this.pagesElement.classList.add("tabulator-pages"),e=document.createElement("button"),e.classList.add("tabulator-page"),e.setAttribute("type","button"),e.setAttribute("role","button"),e.setAttribute("aria-label",""),e.setAttribute("title",""),this.firstBut=e.cloneNode(!0),this.firstBut.setAttribute("data-page","first"),this.prevBut=e.cloneNode(!0),this.prevBut.setAttribute("data-page","prev"),this.nextBut=e.cloneNode(!0),this.nextBut.setAttribute("data-page","next"),this.lastBut=e.cloneNode(!0),this.lastBut.setAttribute("data-page","last"),this.table.options.paginationSizeSelector&&(this.pageSizeSelect=document.createElement("select"),this.pageSizeSelect.classList.add("tabulator-page-size"))},_.prototype.generatePageSizeSelectList=function(){var e=this,t=[];if(this.pageSizeSelect){if(Array.isArray(this.table.options.paginationSizeSelector))t=this.table.options.paginationSizeSelector,this.pageSizes=t,-1==this.pageSizes.indexOf(this.size)&&t.unshift(this.size);else if(-1==this.pageSizes.indexOf(this.size)){t=[];for(var o=1;o<5;o++)t.push(this.size*o);this.pageSizes=t}else t=this.pageSizes;for(;this.pageSizeSelect.firstChild;)this.pageSizeSelect.removeChild(this.pageSizeSelect.firstChild);t.forEach(function(t){var o=document.createElement("option");o.value=t,o.innerHTML=t,e.pageSizeSelect.appendChild(o)}),this.pageSizeSelect.value=this.size}},_.prototype.initialize=function(e){var t,o=this;for(var i in o.table.options.paginationDataSent)o.paginationDataSentNames[i]=o.table.options.paginationDataSent[i];for(var n in o.table.options.paginationDataReceived)o.paginationDataReceivedNames[n]=o.table.options.paginationDataReceived[n];o.table.modules.localize.bind("pagination|first",function(e){o.firstBut.innerHTML=e}),o.table.modules.localize.bind("pagination|first_title",function(e){o.firstBut.setAttribute("aria-label",e),o.firstBut.setAttribute("title",e)}),o.table.modules.localize.bind("pagination|prev",function(e){o.prevBut.innerHTML=e}),o.table.modules.localize.bind("pagination|prev_title",function(e){o.prevBut.setAttribute("aria-label",e),o.prevBut.setAttribute("title",e)}),o.table.modules.localize.bind("pagination|next",function(e){o.nextBut.innerHTML=e}),o.table.modules.localize.bind("pagination|next_title",function(e){o.nextBut.setAttribute("aria-label",e),o.nextBut.setAttribute("title",e)}),o.table.modules.localize.bind("pagination|last",function(e){o.lastBut.innerHTML=e}),o.table.modules.localize.bind("pagination|last_title",function(e){o.lastBut.setAttribute("aria-label",e),o.lastBut.setAttribute("title",e)}),o.firstBut.addEventListener("click",function(){o.setPage(1)}),o.prevBut.addEventListener("click",function(){o.previousPage()}),o.nextBut.addEventListener("click",function(){o.nextPage().then(function(){}).catch(function(){})}),o.lastBut.addEventListener("click",function(){o.setPage(o.max)}),o.table.options.paginationElement&&(o.element=o.table.options.paginationElement),this.pageSizeSelect&&(t=document.createElement("label"),o.table.modules.localize.bind("pagination|page_size",function(e){o.pageSizeSelect.setAttribute("aria-label",e),o.pageSizeSelect.setAttribute("title",e),t.innerHTML=e}),o.element.appendChild(t),o.element.appendChild(o.pageSizeSelect),o.pageSizeSelect.addEventListener("change",function(e){o.setPageSize(o.pageSizeSelect.value),o.setPage(1).then(function(){}).catch(function(){})})),o.element.appendChild(o.firstBut),o.element.appendChild(o.prevBut),o.element.appendChild(o.pagesElement),o.element.appendChild(o.nextBut),o.element.appendChild(o.lastBut),o.table.options.paginationElement||e||o.table.footerManager.append(o.element,o),o.mode=o.table.options.pagination,o.size=o.table.options.paginationSize||Math.floor(o.table.rowManager.getElement().clientHeight/24),o.count=o.table.options.paginationButtonCount,o.generatePageSizeSelectList()},_.prototype.initializeProgressive=function(e){this.initialize(!0),this.mode="progressive_"+e,this.progressiveLoad=!0},_.prototype.setDisplayIndex=function(e){this.displayIndex=e},_.prototype.getDisplayIndex=function(){return this.displayIndex},_.prototype.setMaxRows=function(e){this.max=e?Math.ceil(e/this.size):1,this.page>this.max&&(this.page=this.max)},_.prototype.reset=function(e,t){return("local"==this.mode||e)&&(this.page=1),t&&(this.initialLoad=!0),!0},_.prototype.setMaxPage=function(e){e=parseInt(e),this.max=e||1,this.page>this.max&&(this.page=this.max,this.trigger())},_.prototype.setPage=function(e){var t=this,o=this;return new Promise(function(i,n){e=parseInt(e),e>0&&e<=t.max?(t.page=e,t.trigger().then(function(){i()}).catch(function(){n()}),o.table.options.persistence&&o.table.modExists("persistence",!0)&&o.table.modules.persistence.config.page&&o.table.modules.persistence.save("page")):(console.warn("Pagination Error - Requested page is out of range of 1 - "+t.max+":",e),n())})},_.prototype.setPageToRow=function(e){var t=this;return new Promise(function(o,i){var n=t.table.rowManager.getDisplayRows(t.displayIndex-1),s=n.indexOf(e);if(s>-1){var r=Math.ceil((s+1)/t.size);t.setPage(r).then(function(){o()}).catch(function(){i()})}else console.warn("Pagination Error - Requested row is not visible"),i()})},_.prototype.setPageSize=function(e){e=parseInt(e),e>0&&(this.size=e),this.pageSizeSelect&&this.generatePageSizeSelectList(),this.table.options.persistence&&this.table.modExists("persistence",!0)&&this.table.modules.persistence.config.page&&this.table.modules.persistence.save("page")},_.prototype._setPageButtons=function(){for(var e=this,t=Math.floor((this.count-1)/2),o=Math.ceil((this.count-1)/2),i=this.max-this.page+t+10&&s<=e.max&&e.pagesElement.appendChild(e._generatePageButton(s));this.footerRedraw()},_.prototype._generatePageButton=function(e){var t=this,o=document.createElement("button");return o.classList.add("tabulator-page"),e==t.page&&o.classList.add("active"),o.setAttribute("type","button"),o.setAttribute("role","button"),o.setAttribute("aria-label","Show Page "+e),o.setAttribute("title","Show Page "+e),o.setAttribute("data-page",e),o.textContent=e,o.addEventListener("click",function(o){t.setPage(e)}),o},_.prototype.previousPage=function(){var e=this;return new Promise(function(t,o){e.page>1?(e.page--,e.trigger().then(function(){t()}).catch(function(){o()}),e.table.options.persistence&&e.table.modExists("persistence",!0)&&e.table.modules.persistence.config.page&&e.table.modules.persistence.save("page")):(console.warn("Pagination Error - Previous page would be less than page 1:",0),o())})},_.prototype.nextPage=function(){var e=this;return new Promise(function(t,o){e.pagen?i.splice(n,0,e):i.push(e))}),i},B.prototype._findColumn=function(e,t){var o=t.columns?"group":t.field?"field":"object";return e.find(function(e){switch(o){case"group":return e.title===t.title&&e.columns.length===t.columns.length;case"field":return e.field===t.field;case"object":return e===t}})},B.prototype.save=function(e){var t={};switch(e){case"columns":t=this.parseColumns(this.table.columnManager.getColumns());break;case"filter":t=this.table.modules.filter.getFilters();break;case"sort":t=this.validateSorters(this.table.modules.sort.getSort());break;case"group":t=this.getGroupConfig();break;case"page":t=this.getPageConfig()}this.writeFunc&&this.writeFunc(this.id,e,t)},B.prototype.validateSorters=function(e){return e.forEach(function(e){e.column=e.field,delete e.field}),e},B.prototype.getGroupConfig=function(){return this.config.group&&((!0===this.config.group||this.config.group.groupBy)&&(data.groupBy=this.table.options.groupBy),(!0===this.config.group||this.config.group.groupStartOpen)&&(data.groupStartOpen=this.table.options.groupStartOpen),(!0===this.config.group||this.config.group.groupHeader)&&(data.groupHeader=this.table.options.groupHeader)),data},B.prototype.getPageConfig=function(){var e={};return this.config.page&&((!0===this.config.page||this.config.page.size)&&(e.paginationSize=this.table.modules.page.getPageSize()),(!0===this.config.page||this.config.page.page)&&(e.paginationInitialPage=this.table.modules.page.getPage())),e},B.prototype.parseColumns=function(e){var t=this,o=[];return e.forEach(function(e){var i,n={},s=e.getDefinition();e.isGroup?(n.title=s.title,n.columns=t.parseColumns(e.getColumns())):(n.field=e.getField(),!0===t.config.columns||void 0==t.config.columns?(i=Object.keys(s),i.push("width")):i=t.config.columns,i.forEach(function(t){switch(t){case"width":n.width=e.getWidth();break;case"visible":n.visible=e.visible;break;default:n[t]=s[t]}})),o.push(n)}),o},B.prototype.readers={local:function(e,t){var o=localStorage.getItem(e+"-"+t);return!!o&&JSON.parse(o)},cookie:function(e,t){var o,i,n=document.cookie,s=e+"-"+t,r=n.indexOf(s+"=");return r>-1&&(n=n.substr(r),o=n.indexOf(";"),o>-1&&(n=n.substr(0,o)),i=n.replace(s+"=","")),!!i&&JSON.parse(i)}},B.prototype.writers={local:function(e,t,o){localStorage.setItem(e+"-"+t,JSON.stringify(o))},cookie:function(e,t,o){var i=new Date;i.setDate(i.getDate()+1e4),document.cookie=e+"-"+t+"="+JSON.stringify(o)+"; expires="+i.toUTCString()}},u.prototype.registerModule("persistence",B);var N=function(e){this.table=e,this.element=!1,this.manualBlock=!1};N.prototype.initialize=function(){window.addEventListener("beforeprint",this.replaceTable.bind(this)),window.addEventListener("afterprint",this.cleanup.bind(this))},N.prototype.replaceTable=function(){this.manualBlock||(this.element=document.createElement("div"),this.element.classList.add("tabulator-print-table"),this.element.appendChild(this.table.modules.export.genereateTable(this.table.options.printConfig,this.table.options.printStyled,this.table.options.printRowRange,"print")),this.table.element.style.display="none",this.table.element.parentNode.insertBefore(this.element,this.table.element))},N.prototype.cleanup=function(){document.body.classList.remove("tabulator-print-fullscreen-hide"),this.element&&this.element.parentNode&&(this.element.parentNode.removeChild(this.element),this.table.element.style.display="")},N.prototype.printFullscreen=function(e,t,o){var i,n,s=window.scrollX,r=window.scrollY,a=document.createElement("div"),l=document.createElement("div"),c=this.table.modules.export.genereateTable(void 0!==o?o:this.table.options.printConfig,void 0!==t?t:this.table.options.printStyled,e,"print");this.manualBlock=!0,this.element=document.createElement("div"),this.element.classList.add("tabulator-print-fullscreen"),this.table.options.printHeader&&(a.classList.add("tabulator-print-header"),i="function"==typeof this.table.options.printHeader?this.table.options.printHeader.call(this.table):this.table.options.printHeader,"string"==typeof i?a.innerHTML=i:a.appendChild(i),this.element.appendChild(a)),this.element.appendChild(c),this.table.options.printFooter&&(l.classList.add("tabulator-print-footer"),n="function"==typeof this.table.options.printFooter?this.table.options.printFooter.call(this.table):this.table.options.printFooter,"string"==typeof n?l.innerHTML=n:l.appendChild(n),this.element.appendChild(l)),document.body.classList.add("tabulator-print-fullscreen-hide"),document.body.appendChild(this.element),this.table.options.printFormatter&&this.table.options.printFormatter(this.element,c),window.print(),this.cleanup(),window.scrollTo(s,r),this.manualBlock=!1},u.prototype.registerModule("print",N);var I=function(e){this.table=e,this.data=!1,this.blocked=!1,this.origFuncs={},this.currentVersion=0};I.prototype.watchData=function(e){var t,o=this;this.currentVersion++,t=this.currentVersion,o.unwatchData(),o.data=e,o.origFuncs.push=e.push,Object.defineProperty(o.data,"push",{enumerable:!1,configurable:!0,value:function(){var i=Array.from(arguments);return o.blocked||t!==o.currentVersion||i.forEach(function(e){o.table.rowManager.addRowActual(e,!1)}),o.origFuncs.push.apply(e,arguments)}}),o.origFuncs.unshift=e.unshift,Object.defineProperty(o.data,"unshift",{enumerable:!1,configurable:!0,value:function(){var i=Array.from(arguments);return o.blocked||t!==o.currentVersion||i.forEach(function(e){o.table.rowManager.addRowActual(e,!0)}),o.origFuncs.unshift.apply(e,arguments)}}),o.origFuncs.shift=e.shift,Object.defineProperty(o.data,"shift",{enumerable:!1,configurable:!0,value:function(){var i;return o.blocked||t!==o.currentVersion||o.data.length&&(i=o.table.rowManager.getRowFromDataObject(o.data[0]))&&i.deleteActual(),o.origFuncs.shift.call(e)}}),o.origFuncs.pop=e.pop,Object.defineProperty(o.data,"pop",{enumerable:!1,configurable:!0,value:function(){var i;return o.blocked||t!==o.currentVersion||o.data.length&&(i=o.table.rowManager.getRowFromDataObject(o.data[o.data.length-1]))&&i.deleteActual(),o.origFuncs.pop.call(e)}}),o.origFuncs.splice=e.splice,Object.defineProperty(o.data,"splice",{enumerable:!1,configurable:!0,value:function(){var i,n=Array.from(arguments),s=n[0]<0?e.length+n[0]:n[0],r=n[1],a=!!n[2]&&n.slice(2);if(!o.blocked&&t===o.currentVersion){if(a&&(i=!!e[s]&&o.table.rowManager.getRowFromDataObject(e[s]),i?a.forEach(function(e){o.table.rowManager.addRowActual(e,!0,i,!0)}):(a=a.slice().reverse(),a.forEach(function(e){o.table.rowManager.addRowActual(e,!0,!1,!0)}))),0!==r){var l=e.slice(s,void 0===n[1]?n[1]:s+r);l.forEach(function(e,t){var i=o.table.rowManager.getRowFromDataObject(e);i&&i.deleteActual(t!==l.length-1)})}(a||0!==r)&&o.table.rowManager.reRenderInPosition()}return o.origFuncs.splice.apply(e,arguments)}})},I.prototype.unwatchData=function(){if(!1!==this.data)for(var e in this.origFuncs)Object.defineProperty(this.data,e,{enumerable:!0,configurable:!0,writable:!0,value:this.origFuncs.key})},I.prototype.watchRow=function(e){var t=e.getData();this.blocked=!0;for(var o in t)this.watchKey(e,t,o);this.blocked=!1},I.prototype.watchKey=function(e,t,o){var i=this,n=Object.getOwnPropertyDescriptor(t,o),s=t[o],r=this.currentVersion;Object.defineProperty(t,o,{set:function(t){if(s=t,!i.blocked&&r===i.currentVersion){var a={};a[o]=t,e.updateData(a)}n.set&&n.set(t)},get:function(){return n.get&&n.get(),s}})},I.prototype.unwatchRow=function(e){var t=e.getData();for(var o in t)Object.defineProperty(t,o,{value:t[o]})},I.prototype.block=function(){this.blocked=!0},I.prototype.unblock=function(){this.blocked=!1},u.prototype.registerModule("reactiveData",I);var O=function(e){this.table=e,this.startColumn=!1,this.startX=!1,this.startWidth=!1,this.handle=null,this.prevHandle=null};O.prototype.initializeColumn=function(e,t,o){var i=this,n=!1,s=this.table.options.resizableColumns;if("header"===e&&(n="textarea"==t.definition.formatter||t.definition.variableHeight,t.modules.resize={variableHeight:n}),!0===s||s==e){var r=document.createElement("div");r.className="tabulator-col-resize-handle";var a=document.createElement("div");a.className="tabulator-col-resize-handle prev",r.addEventListener("click",function(e){e.stopPropagation()});var l=function(e){var o=t.getLastColumn();o&&i._checkResizability(o)&&(i.startColumn=t,i._mouseDown(e,o,r))};r.addEventListener("mousedown",l),r.addEventListener("touchstart",l,{passive:!0}),r.addEventListener("dblclick",function(e){var o=t.getLastColumn();o&&i._checkResizability(o)&&(e.stopPropagation(),o.reinitializeWidth(!0))}),a.addEventListener("click",function(e){e.stopPropagation()});var c=function(e){var o,n,s;(o=t.getFirstColumn())&&(n=i.table.columnManager.findColumnIndex(o),(s=n>0&&i.table.columnManager.getColumnByIndex(n-1))&&i._checkResizability(s)&&(i.startColumn=t,i._mouseDown(e,s,a)))};a.addEventListener("mousedown",c),a.addEventListener("touchstart",c,{passive:!0}),a.addEventListener("dblclick",function(e){var o,n,s;(o=t.getFirstColumn())&&(n=i.table.columnManager.findColumnIndex(o),(s=n>0&&i.table.columnManager.getColumnByIndex(n-1))&&i._checkResizability(s)&&(e.stopPropagation(),s.reinitializeWidth(!0)))}),o.appendChild(r),o.appendChild(a)}},O.prototype._checkResizability=function(e){return void 0!==e.definition.resizable?e.definition.resizable:this.table.options.resizableColumns},O.prototype._mouseDown=function(e,t,o){function i(e){t.setWidth(s.startWidth+((void 0===e.screenX?e.touches[0].screenX:e.screenX)-s.startX)),!s.table.browserSlow&&t.modules.resize&&t.modules.resize.variableHeight&&t.checkCellHeights()}function n(e){s.startColumn.modules.edit&&(s.startColumn.modules.edit.blocked=!1),s.table.browserSlow&&t.modules.resize&&t.modules.resize.variableHeight&&t.checkCellHeights(),document.body.removeEventListener("mouseup",n),document.body.removeEventListener("mousemove",i),o.removeEventListener("touchmove",i),o.removeEventListener("touchend",n),s.table.element.classList.remove("tabulator-block-select"),s.table.options.persistence&&s.table.modExists("persistence",!0)&&s.table.modules.persistence.config.columns&&s.table.modules.persistence.save("columns"),s.table.options.columnResized.call(s.table,t.getComponent())}var s=this;s.table.element.classList.add("tabulator-block-select"),e.stopPropagation(),s.startColumn.modules.edit&&(s.startColumn.modules.edit.blocked=!0),s.startX=void 0===e.screenX?e.touches[0].screenX:e.screenX,s.startWidth=t.getWidth(),document.body.addEventListener("mousemove",i),document.body.addEventListener("mouseup",n),o.addEventListener("touchmove",i,{passive:!0}),o.addEventListener("touchend",n)},u.prototype.registerModule("resizeColumns",O);var j=function(e){this.table=e,this.startColumn=!1,this.startY=!1,this.startHeight=!1,this.handle=null,this.prevHandle=null};j.prototype.initializeRow=function(e){var t=this,o=e.getElement(),i=document.createElement("div");i.className="tabulator-row-resize-handle";var n=document.createElement("div");n.className="tabulator-row-resize-handle prev",i.addEventListener("click",function(e){e.stopPropagation()});var s=function(o){t.startRow=e,t._mouseDown(o,e,i)};i.addEventListener("mousedown",s),i.addEventListener("touchstart",s,{passive:!0}),n.addEventListener("click",function(e){e.stopPropagation()});var r=function(o){var i=t.table.rowManager.prevDisplayRow(e);i&&(t.startRow=i,t._mouseDown(o,i,n))};n.addEventListener("mousedown",r),n.addEventListener("touchstart",r,{passive:!0}),o.appendChild(i),o.appendChild(n)},j.prototype._mouseDown=function(e,t,o){function i(e){t.setHeight(s.startHeight+((void 0===e.screenY?e.touches[0].screenY:e.screenY)-s.startY))}function n(e){document.body.removeEventListener("mouseup",i),document.body.removeEventListener("mousemove",i),o.removeEventListener("touchmove",i),o.removeEventListener("touchend",n),s.table.element.classList.remove("tabulator-block-select"),s.table.options.rowResized.call(this.table,t.getComponent())}var s=this;s.table.element.classList.add("tabulator-block-select"),e.stopPropagation(),s.startY=void 0===e.screenY?e.touches[0].screenY:e.screenY,s.startHeight=t.getHeight(),document.body.addEventListener("mousemove",i),document.body.addEventListener("mouseup",n),o.addEventListener("touchmove",i,{passive:!0}),o.addEventListener("touchend",n)},u.prototype.registerModule("resizeRows",j);var V=function(e){this.table=e,this.binding=!1,this.observer=!1,this.containerObserver=!1,this.tableHeight=0,this.tableWidth=0,this.containerHeight=0,this.containerWidth=0,this.autoResize=!1};V.prototype.initialize=function(e){var t,o=this,i=this.table;this.tableHeight=i.element.clientHeight,this.tableWidth=i.element.clientWidth,this.containerHeight=i.element.parentNode.clientHeight,this.containerWidth=i.element.parentNode.clientWidth,"undefined"!=typeof ResizeObserver&&"virtual"===i.rowManager.getRenderMode()?(this.autoResize=!0,this.observer=new ResizeObserver(function(e){if(!i.browserMobile||i.browserMobile&&!i.modules.edit.currentCell){var t=Math.floor(e[0].contentRect.height),n=Math.floor(e[0].contentRect.width);o.tableHeight==t&&o.tableWidth==n||(o.tableHeight=t,o.tableWidth=n,o.containerHeight=i.element.parentNode.clientHeight,o.containerWidth=i.element.parentNode.clientWidth,i.redraw())}}),this.observer.observe(i.element),t=window.getComputedStyle(i.element),this.table.rowManager.fixedHeight||!t.getPropertyValue("max-height")&&!t.getPropertyValue("min-height")||(this.containerObserver=new ResizeObserver(function(e){if(!i.browserMobile||i.browserMobile&&!i.modules.edit.currentCell){var t=Math.floor(e[0].contentRect.height),n=Math.floor(e[0].contentRect.width);o.containerHeight==t&&o.containerWidth==n||(o.containerHeight=t,o.containerWidth=n,o.tableHeight=i.element.clientHeight,o.tableWidth=i.element.clientWidth,i.redraw()),i.redraw()}}),this.containerObserver.observe(this.table.element.parentNode))):(this.binding=function(){(!i.browserMobile||i.browserMobile&&!i.modules.edit.currentCell)&&i.redraw()},window.addEventListener("resize",this.binding))},V.prototype.clearBindings=function(e){this.binding&&window.removeEventListener("resize",this.binding),this.observer&&this.observer.unobserve(this.table.element),this.containerObserver&&this.containerObserver.unobserve(this.table.element.parentNode)},u.prototype.registerModule("resizeTable",V);var G=function(e){this.table=e,this.columns=[],this.hiddenColumns=[],this.mode="",this.index=0,this.collapseFormatter=[],this.collapseStartOpen=!0,this.collapseHandleColumn=!1};G.prototype.initialize=function(){var e=this,t=[];this.mode=this.table.options.responsiveLayout,this.collapseFormatter=this.table.options.responsiveLayoutCollapseFormatter||this.formatCollapsedData,this.collapseStartOpen=this.table.options.responsiveLayoutCollapseStartOpen,this.hiddenColumns=[],this.table.columnManager.columnsByIndex.forEach(function(o,i){o.modules.responsive&&o.modules.responsive.order&&o.modules.responsive.visible&&(o.modules.responsive.index=i,t.push(o),o.visible||"collapse"!==e.mode||e.hiddenColumns.push(o))}),t=t.reverse(),t=t.sort(function(e,t){return t.modules.responsive.order-e.modules.responsive.order||t.modules.responsive.index-e.modules.responsive.index}),this.columns=t,"collapse"===this.mode&&this.generateCollapsedContent();for(var o=this.table.columnManager.columnsByIndex,i=Array.isArray(o),n=0,o=i?o:o[Symbol.iterator]();;){var s;if(i){if(n>=o.length)break;s=o[n++]}else{if(n=o.next(),n.done)break;s=n.value}var r=s;if("responsiveCollapse"==r.definition.formatter){this.collapseHandleColumn=r;break}}this.collapseHandleColumn&&(this.hiddenColumns.length?this.collapseHandleColumn.show():this.collapseHandleColumn.hide())},G.prototype.initializeColumn=function(e){var t=e.getDefinition();e.modules.responsive={order:void 0===t.responsive?1:t.responsive,visible:!1!==t.visible}},G.prototype.initializeRow=function(e){var t;"calc"!==e.type&&(t=document.createElement("div"),t.classList.add("tabulator-responsive-collapse"),e.modules.responsiveLayout={element:t,open:this.collapseStartOpen},this.collapseStartOpen||(t.style.display="none"))},G.prototype.layoutRow=function(e){var t=e.getElement();e.modules.responsiveLayout&&(t.appendChild(e.modules.responsiveLayout.element),this.generateCollapsedRowContent(e))},G.prototype.updateColumnVisibility=function(e,t){e.modules.responsive&&(e.modules.responsive.visible=t,this.initialize())},G.prototype.hideColumn=function(e){var t=this.hiddenColumns.length;e.hide(!1,!0),"collapse"===this.mode&&(this.hiddenColumns.unshift(e),this.generateCollapsedContent(),this.collapseHandleColumn&&!t&&this.collapseHandleColumn.show())},G.prototype.showColumn=function(e){var t;e.show(!1,!0),e.setWidth(e.getWidth()),"collapse"===this.mode&&(t=this.hiddenColumns.indexOf(e),t>-1&&this.hiddenColumns.splice(t,1),this.generateCollapsedContent(),this.collapseHandleColumn&&!this.hiddenColumns.length&&this.collapseHandleColumn.hide())},G.prototype.update=function(){for(var e=this,t=!0;t;){var o="fitColumns"==e.table.modules.layout.getMode()?e.table.columnManager.getFlexBaseWidth():e.table.columnManager.getWidth(),i=(e.table.options.headerVisible?e.table.columnManager.element.clientWidth:e.table.element.clientWidth)-o;if(i<0){var n=e.columns[e.index];n?(e.hideColumn(n),e.index++):t=!1}else{var s=e.columns[e.index-1];s&&i>0&&i>=s.getWidth()?(e.showColumn(s),e.index--):t=!1}e.table.rowManager.activeRowsCount||e.table.rowManager.renderEmptyScroll()}},G.prototype.generateCollapsedContent=function(){var e=this;this.table.rowManager.getDisplayRows().forEach(function(t){e.generateCollapsedRowContent(t)})},G.prototype.generateCollapsedRowContent=function(e){var t,o;if(e.modules.responsiveLayout){for(t=e.modules.responsiveLayout.element;t.firstChild;)t.removeChild(t.firstChild);o=this.collapseFormatter(this.generateCollapsedRowData(e)),o&&t.appendChild(o)}},G.prototype.generateCollapsedRowData=function(e){var t,o=this,i=e.getData(),n=[];return this.hiddenColumns.forEach(function(s){var r=s.getFieldValue(i);s.definition.title&&s.field&&(s.modules.format&&o.table.options.responsiveLayoutCollapseUseFormatters?(t={value:!1,data:{},getValue:function(){return r},getData:function(){return i},getElement:function(){return document.createElement("div")},getRow:function(){return e.getComponent()},getColumn:function(){return s.getComponent()}},n.push({title:s.definition.title,value:s.modules.format.formatter.call(o.table.modules.format,t,s.modules.format.params)})):n.push({title:s.definition.title,value:r}))}),n},G.prototype.formatCollapsedData=function(e){var t=document.createElement("table"),o="";return e.forEach(function(e){var t=document.createElement("div");e.value instanceof Node&&(t.appendChild(e.value),e.value=t.innerHTML),o+=""+e.title+""+e.value+""}),t.innerHTML=o,Object.keys(e).length?t:""},u.prototype.registerModule("responsiveLayout",G);var W=function(e){this.table=e,this.selecting=!1,this.lastClickedRow=!1,this.selectPrev=[],this.selectedRows=[],this.headerCheckboxElement=null};W.prototype.clearSelectionData=function(e){this.selecting=!1,this.lastClickedRow=!1,this.selectPrev=[],this.selectedRows=[],e||this._rowSelectionChanged()},W.prototype.initializeRow=function(e){var t=this,o=e.getElement(),i=function e(){setTimeout(function(){t.selecting=!1},50),document.body.removeEventListener("mouseup",e)};e.modules.select={selected:!1},t.table.options.selectableCheck.call(this.table,e.getComponent())?(o.classList.add("tabulator-selectable"),o.classList.remove("tabulator-unselectable"),t.table.options.selectable&&"highlight"!=t.table.options.selectable&&("click"===t.table.options.selectableRangeMode?o.addEventListener("click",function(o){if(o.shiftKey){t.table._clearSelection(),t.lastClickedRow=t.lastClickedRow||e;var i=t.table.rowManager.getDisplayRowIndex(t.lastClickedRow),n=t.table.rowManager.getDisplayRowIndex(e),s=i<=n?i:n,r=i>=n?i:n,a=t.table.rowManager.getDisplayRows().slice(0),l=a.splice(s,r-s+1);o.ctrlKey||o.metaKey?(l.forEach(function(o){o!==t.lastClickedRow&&(!0===t.table.options.selectable||t.isRowSelected(e)?t.toggleRow(o):t.selectedRows.lengtht.table.options.selectable&&(l=l.slice(0,t.table.options.selectable)),t.selectRows(l)),t.table._clearSelection()}else o.ctrlKey||o.metaKey?(t.toggleRow(e),t.lastClickedRow=e):(t.deselectRows(void 0,!0),t.selectRows(e),t.lastClickedRow=e)}):(o.addEventListener("click",function(o){t.table.modExists("edit")&&t.table.modules.edit.getCurrentCell()||t.table._clearSelection(),t.selecting||t.toggleRow(e)}),o.addEventListener("mousedown",function(o){if(o.shiftKey)return t.table._clearSelection(),t.selecting=!0,t.selectPrev=[],document.body.addEventListener("mouseup",i),document.body.addEventListener("keyup",i),t.toggleRow(e),!1}),o.addEventListener("mouseenter",function(o){t.selecting&&(t.table._clearSelection(),t.toggleRow(e),t.selectPrev[1]==e&&t.toggleRow(t.selectPrev[0]))}),o.addEventListener("mouseout",function(o){t.selecting&&(t.table._clearSelection(),t.selectPrev.unshift(e))})))):(o.classList.add("tabulator-unselectable"),o.classList.remove("tabulator-selectable"))},W.prototype.toggleRow=function(e){this.table.options.selectableCheck.call(this.table,e.getComponent())&&(e.modules.select&&e.modules.select.selected?this._deselectRow(e):this._selectRow(e))},W.prototype.selectRows=function(e){var t,o=this;switch(void 0===e?"undefined":_typeof(e)){case"undefined":this.table.rowManager.rows.forEach(function(e){o._selectRow(e,!0,!0)}),this._rowSelectionChanged();break;case"string":t=this.table.rowManager.findRow(e),t?this._selectRow(t,!0,!0):this.table.rowManager.getRows(e).forEach(function(e){o._selectRow(e,!0,!0)}),this._rowSelectionChanged();break;default:Array.isArray(e)?(e.forEach(function(e){o._selectRow(e,!0,!0)}),this._rowSelectionChanged()):this._selectRow(e,!1,!0)}},W.prototype._selectRow=function(e,t,o){if(!isNaN(this.table.options.selectable)&&!0!==this.table.options.selectable&&!o&&this.selectedRows.length>=this.table.options.selectable){if(!this.table.options.selectableRollingSelection)return!1;this._deselectRow(this.selectedRows[0])}var i=this.table.rowManager.findRow(e);i?-1==this.selectedRows.indexOf(i)&&(i.modules.select||(i.modules.select={}),i.modules.select.selected=!0,i.modules.select.checkboxEl&&(i.modules.select.checkboxEl.checked=!0),i.getElement().classList.add("tabulator-selected"),this.selectedRows.push(i),this.table.options.dataTreeSelectPropagate&&this.childRowSelection(i,!0),t||this.table.options.rowSelected.call(this.table,i.getComponent()),this._rowSelectionChanged(t)):t||console.warn("Selection Error - No such row found, ignoring selection:"+e)},W.prototype.isRowSelected=function(e){return-1!==this.selectedRows.indexOf(e)},W.prototype.deselectRows=function(e,t){var o,i=this;if(void 0===e){o=i.selectedRows.length;for(var n=0;n-1&&(n.modules.select||(n.modules.select={}),n.modules.select.selected=!1,n.modules.select.checkboxEl&&(n.modules.select.checkboxEl.checked=!1),n.getElement().classList.remove("tabulator-selected"),i.selectedRows.splice(o,1),this.table.options.dataTreeSelectPropagate&&this.childRowSelection(n,!1),t||i.table.options.rowDeselected.call(this.table,n.getComponent()),i._rowSelectionChanged(t)):t||console.warn("Deselection Error - No such row found, ignoring selection:"+e)},W.prototype.getSelectedData=function(){var e=[];return this.selectedRows.forEach(function(t){e.push(t.getData())}),e},W.prototype.getSelectedRows=function(){var e=[];return this.selectedRows.forEach(function(t){e.push(t.getComponent())}),e},W.prototype._rowSelectionChanged=function(e){this.headerCheckboxElement&&(0===this.selectedRows.length?(this.headerCheckboxElement.checked=!1,this.headerCheckboxElement.indeterminate=!1):this.table.rowManager.rows.length===this.selectedRows.length?(this.headerCheckboxElement.checked=!0,this.headerCheckboxElement.indeterminate=!1):(this.headerCheckboxElement.indeterminate=!0,this.headerCheckboxElement.checked=!1)),e||this.table.options.rowSelectionChanged.call(this.table,this.getSelectedData(),this.getSelectedRows())},W.prototype.registerRowSelectCheckbox=function(e,t){e._row.modules.select||(e._row.modules.select={}),e._row.modules.select.checkboxEl=t},W.prototype.registerHeaderSelectCheckbox=function(e){this.headerCheckboxElement=e},W.prototype.childRowSelection=function(e,t){var o=this.table.modules.dataTree.getChildren(e);if(t)for(var i=o,n=Array.isArray(i),s=0,i=n?i:i[Symbol.iterator]();;){var r;if(n){if(s>=i.length)break;r=i[s++]}else{if(s=i.next(),s.done)break;r=s.value}var a=r;this._selectRow(a,!0)}else for(var l=o,c=Array.isArray(l),u=0,l=c?l:l[Symbol.iterator]();;){var d;if(c){if(u>=l.length)break;d=l[u++]}else{if(u=l.next(),u.done)break;d=u.value}var h=d;this._deselectRow(h,!0)}},u.prototype.registerModule("selectRow",W);var U=function(e){this.table=e,this.sortList=[],this.changed=!1};U.prototype.initializeColumn=function(e,t){var o,i,n=this,s=!1;switch(_typeof(e.definition.sorter)){case"string":n.sorters[e.definition.sorter]?s=n.sorters[e.definition.sorter]:console.warn("Sort Error - No such sorter found: ",e.definition.sorter);break;case"function":s=e.definition.sorter}e.modules.sort={sorter:s,dir:"none",params:e.definition.sorterParams||{},startingDir:e.definition.headerSortStartingDir||"asc",tristate:void 0!==e.definition.headerSortTristate?e.definition.headerSortTristate:this.table.options.headerSortTristate},(void 0===e.definition.headerSort?!1!==this.table.options.headerSort:!1!==e.definition.headerSort)&&(o=e.getElement(),o.classList.add("tabulator-sortable"),i=document.createElement("div"),i.classList.add("tabulator-arrow"),t.appendChild(i),o.addEventListener("click",function(t){var o="",i=[],s=!1;if(e.modules.sort){if(e.modules.sort.tristate)o="none"==e.modules.sort.dir?e.modules.sort.startingDir:e.modules.sort.dir==e.modules.sort.startingDir?"asc"==e.modules.sort.dir?"desc":"asc":"none";else switch(e.modules.sort.dir){case"asc":o="desc";break;case"desc":o="asc";break;default:o=e.modules.sort.startingDir}n.table.options.columnHeaderSortMulti&&(t.shiftKey||t.ctrlKey)?(i=n.getSort(),s=i.findIndex(function(t){return t.field===e.getField()}),s>-1?(i[s].dir=o,s!=i.length-1&&(s=i.splice(s,1)[0],"none"!=o&&i.push(s))):"none"!=o&&i.push({column:e,dir:o}),n.setSort(i)):"none"==o?n.clear():n.setSort(e,o),n.table.rowManager.sorterRefresh(!n.sortList.length)}}))},U.prototype.hasChanged=function(){var e=this.changed;return this.changed=!1,e},U.prototype.getSort=function(){var e=this,t=[];return e.sortList.forEach(function(e){e.column&&t.push({column:e.column.getComponent(),field:e.column.getField(),dir:e.dir})}),t},U.prototype.setSort=function(e,t){var o=this,i=[];Array.isArray(e)||(e=[{column:e,dir:t}]),e.forEach(function(e){var t;t=o.table.columnManager.findColumn(e.column),t?(e.column=t,i.push(e),o.changed=!0):console.warn("Sort Warning - Sort field does not exist and is being ignored: ",e.column)}),o.sortList=i,this.table.options.persistence&&this.table.modExists("persistence",!0)&&this.table.modules.persistence.config.sort&&this.table.modules.persistence.save("sort")},U.prototype.clear=function(){this.setSort([])},U.prototype.findSorter=function(e){var t,o=this.table.rowManager.activeRows[0],i="string";if(o&&(o=o.getData(),e.getField()))switch(t=e.getFieldValue(o),void 0===t?"undefined":_typeof(t)){case"undefined":i="string";break;case"boolean":i="boolean";break;default:isNaN(t)||""===t?t.match(/((^[0-9]+[a-z]+)|(^[a-z]+[0-9]+))+$/i)&&(i="alphanum"):i="number"}return this.sorters[i]},U.prototype.sort=function(e){var t,o=this;t=this.table.options.sortOrderReverse?o.sortList.slice().reverse():o.sortList,o.table.options.dataSorting&&o.table.options.dataSorting.call(o.table,o.getSort()),o.clearColumnHeaders(),o.table.options.ajaxSorting?t.forEach(function(e,t){o.setColumnHeader(e.column,e.dir)}):t.forEach(function(i,n){ -i.column&&i.column.modules.sort&&(i.column.modules.sort.sorter||(i.column.modules.sort.sorter=o.findSorter(i.column)),o._sortItem(e,i.column,i.dir,t,n)),o.setColumnHeader(i.column,i.dir)}),o.table.options.dataSorted&&o.table.options.dataSorted.call(o.table,o.getSort(),o.table.rowManager.getComponents("active"))},U.prototype.clearColumnHeaders=function(){this.table.columnManager.getRealColumns().forEach(function(e){e.modules.sort&&(e.modules.sort.dir="none",e.getElement().setAttribute("aria-sort","none"))})},U.prototype.setColumnHeader=function(e,t){e.modules.sort.dir=t,e.getElement().setAttribute("aria-sort",t)},U.prototype._sortItem=function(e,t,o,i,n){var s=this,r="function"==typeof t.modules.sort.params?t.modules.sort.params(t.getComponent(),o):t.modules.sort.params;e.sort(function(e,a){var l=s._sortRow(e,a,t,o,r);if(0===l&&n)for(var c=n-1;c>=0&&0===(l=s._sortRow(e,a,i[c].column,i[c].dir,r));c--);return l})},U.prototype._sortRow=function(e,t,o,i,n){var s,r,a="asc"==i?e:t,l="asc"==i?t:e;return e=o.getFieldValue(a.getData()),t=o.getFieldValue(l.getData()),e=void 0!==e?e:"",t=void 0!==t?t:"",s=a.getComponent(),r=l.getComponent(),o.modules.sort.sorter.call(this,e,t,s,r,o.getComponent(),i,n)},U.prototype.sorters={number:function(e,t,o,i,n,s,r){var a=r.alignEmptyValues,l=r.decimalSeparator||".",c=r.thousandSeparator||",",u=0;if(e=parseFloat(String(e).split(c).join("").split(l).join(".")),t=parseFloat(String(t).split(c).join("").split(l).join(".")),isNaN(e))u=isNaN(t)?0:-1;else{if(!isNaN(t))return e-t;u=1}return("top"===a&&"desc"===s||"bottom"===a&&"asc"===s)&&(u*=-1),u},string:function(e,t,o,i,n,s,r){var a,l=r.alignEmptyValues,c=0;if(e){if(t){switch(_typeof(r.locale)){case"boolean":r.locale&&(a=this.table.modules.localize.getLocale());break;case"string":a=r.locale}return String(e).toLowerCase().localeCompare(String(t).toLowerCase(),a)}c=1}else c=t?-1:0;return("top"===l&&"desc"===s||"bottom"===l&&"asc"===s)&&(c*=-1),c},date:function(e,t,o,i,n,s,r){return r.format||(r.format="DD/MM/YYYY"),this.sorters.datetime.call(this,e,t,o,i,n,s,r)},time:function(e,t,o,i,n,s,r){return r.format||(r.format="hh:mm"),this.sorters.datetime.call(this,e,t,o,i,n,s,r)},datetime:function(e,t,o,i,n,s,r){var a=r.format||"DD/MM/YYYY hh:mm:ss",l=r.alignEmptyValues,c=0;if("undefined"!=typeof moment){if(e=moment(e,a),t=moment(t,a),e.isValid()){if(t.isValid())return e-t;c=1}else c=t.isValid()?-1:0;return("top"===l&&"desc"===s||"bottom"===l&&"asc"===s)&&(c*=-1),c}console.error("Sort Error - 'datetime' sorter is dependant on moment.js")},boolean:function(e,t,o,i,n,s,r){return(!0===e||"true"===e||"True"===e||1===e?1:0)-(!0===t||"true"===t||"True"===t||1===t?1:0)},array:function(e,t,o,i,n,s,r){function a(e){switch(u){case"length":return e.length;case"sum":return e.reduce(function(e,t){return e+t});case"max":return Math.max.apply(null,e);case"min":return Math.min.apply(null,e);case"avg":return e.reduce(function(e,t){return e+t})/e.length}}var l=0,c=0,u=r.type||"length",d=r.alignEmptyValues,h=0;if(Array.isArray(e)){if(Array.isArray(t))return l=e?a(e):0,c=t?a(t):0,l-c;d=1}else d=Array.isArray(t)?-1:0;return("top"===d&&"desc"===s||"bottom"===d&&"asc"===s)&&(h*=-1),h},exists:function(e,t,o,i,n,s,r){return(void 0===e?0:1)-(void 0===t?0:1)},alphanum:function(e,t,o,i,n,s,r){var a,l,c,u,d,h=0,p=/(\d+)|(\D+)/g,m=/\d/,f=r.alignEmptyValues,g=0;if(e||0===e){if(t||0===t){if(isFinite(e)&&isFinite(t))return e-t;if(a=String(e).toLowerCase(),l=String(t).toLowerCase(),a===l)return 0;if(!m.test(a)||!m.test(l))return a>l?1:-1;for(a=a.match(p),l=l.match(p),d=a.length>l.length?l.length:a.length;hu?1:-1;return a.length>l.length}g=1}else g=t||0===t?-1:0;return("top"===f&&"desc"===s||"bottom"===f&&"asc"===s)&&(g*=-1),g}},u.prototype.registerModule("sort",U);var Y=function(e){this.table=e};return Y.prototype.initializeColumn=function(e){var t,o=this,i=[];e.definition.validator&&(Array.isArray(e.definition.validator)?e.definition.validator.forEach(function(e){(t=o._extractValidator(e))&&i.push(t)}):(t=this._extractValidator(e.definition.validator))&&i.push(t),e.modules.validate=!!i.length&&i)},Y.prototype._extractValidator=function(e){var t,o,i;switch(void 0===e?"undefined":_typeof(e)){case"string":return i=e.indexOf(":"),i>-1?(t=e.substring(0,i),o=e.substring(i+1)):t=e,this._buildValidator(t,o);case"function":return this._buildValidator(e);case"object":return this._buildValidator(e.type,e.parameters)}},Y.prototype._buildValidator=function(e,t){var o="function"==typeof e?e:this.validators[e];return o?{type:"function"==typeof e?"function":e,func:o,params:t}:(console.warn("Validator Setup Error - No matching validator found:",e),!1)},Y.prototype.validate=function(e,t,o){var i=this,n=[];return e&&e.forEach(function(e){e.func.call(i,t,o,e.params)||n.push({type:e.type,parameters:e.params})}),!n.length||n},Y.prototype.validators={integer:function(e,t,o){return""===t||null===t||void 0===t||"number"==typeof(t=Number(t))&&isFinite(t)&&Math.floor(t)===t},float:function(e,t,o){return""===t||null===t||void 0===t||"number"==typeof(t=Number(t))&&isFinite(t)&&t%1!=0},numeric:function(e,t,o){return""===t||null===t||void 0===t||!isNaN(t)},string:function(e,t,o){return""===t||null===t||void 0===t||isNaN(t)},max:function(e,t,o){return""===t||null===t||void 0===t||parseFloat(t)<=o},min:function(e,t,o){return""===t||null===t||void 0===t||parseFloat(t)>=o},minLength:function(e,t,o){return""===t||null===t||void 0===t||String(t).length>=o},maxLength:function(e,t,o){return""===t||null===t||void 0===t||String(t).length<=o},in:function(e,t,o){return""===t||null===t||void 0===t||("string"==typeof o&&(o=o.split("|")),""===t||o.indexOf(t)>-1)},regex:function(e,t,o){return""===t||null===t||void 0===t||new RegExp(o).test(t)},unique:function(e,t,o){if(""===t||null===t||void 0===t)return!0;var i=!0,n=e.getData(),s=e.getColumn()._getSelf();return this.table.rowManager.rows.forEach(function(e){var o=e.getData();o!==n&&t==s.getFieldValue(o)&&(i=!1)}),i},required:function(e,t,o){return""!==t&&null!==t&&void 0!==t}},u.prototype.registerModule("validate",Y),u}); \ No newline at end of file diff --git a/cookbook/static/tabulator/tabulator_bootstrap4.min.css b/cookbook/static/tabulator/tabulator_bootstrap4.min.css deleted file mode 100644 index 0454d48c..00000000 --- a/cookbook/static/tabulator/tabulator_bootstrap4.min.css +++ /dev/null @@ -1,3 +0,0 @@ -/* Tabulator v4.5.1 (c) Oliver Folkerd */ -.tabulator{position:relative;background-color:#fff;overflow:hidden;font-size:1rem;text-align:left;width:100%;max-width:100%;transform:translatez(0)}.tabulator[tabulator-layout=fitDataFill] .tabulator-tableHolder .tabulator-table{min-width:100%}.tabulator.tabulator-block-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tabulator .tabulator-header{position:relative;box-sizing:border-box;width:100%;border-top:1px solid #dee2e6;border-bottom:2px solid #dee2e6;background-color:#fff;font-weight:700;white-space:nowrap;overflow:hidden;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none}.tabulator .tabulator-header.tabulator-header-hidden{display:none}.tabulator .tabulator-header .tabulator-col{display:inline-block;position:relative;box-sizing:border-box;background-color:#fff;text-align:left;vertical-align:bottom;overflow:hidden}.tabulator .tabulator-header .tabulator-col.tabulator-moving{position:absolute;border:1px solid #dee2e6;background:#e6e6e6;pointer-events:none}.tabulator .tabulator-header .tabulator-col .tabulator-col-content{box-sizing:border-box;position:relative;padding:.75rem}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title{box-sizing:border-box;width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:bottom}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title .tabulator-title-editor{box-sizing:border-box;width:100%;border:1px solid #999;padding:1px;background:#fff}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-arrow{display:inline-block;position:absolute;top:14px;right:8px;width:0;height:0;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #bbb}.tabulator .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols{position:relative;display:-ms-flexbox;display:flex;border-top:1px solid #dee2e6;overflow:hidden}.tabulator .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols .tabulator-col:last-child{margin-right:-1px}.tabulator .tabulator-header .tabulator-col:first-child .tabulator-col-resize-handle.prev{display:none}.tabulator .tabulator-header .tabulator-col.ui-sortable-helper{position:absolute;background-color:#e6e6e6!important;border:1px solid #dee2e6}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter{position:relative;box-sizing:border-box;margin-top:2px;width:100%;text-align:center}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter textarea{height:auto!important}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter svg{margin-top:3px}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter input::-ms-clear{width:0;height:0}.tabulator .tabulator-header .tabulator-col.tabulator-sortable .tabulator-col-title{padding-right:25px}.tabulator .tabulator-header .tabulator-col.tabulator-sortable:hover{cursor:pointer;background-color:#e6e6e6}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=none] .tabulator-col-content .tabulator-arrow{border-top:none;border-bottom:6px solid #bbb}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=asc] .tabulator-col-content .tabulator-arrow{border-top:none;border-bottom:6px solid #666}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=desc] .tabulator-col-content .tabulator-arrow{border-top:6px solid #666;border-bottom:none}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical .tabulator-col-content .tabulator-col-title{-ms-writing-mode:tb-rl;writing-mode:vertical-rl;text-orientation:mixed;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-col-vertical-flip .tabulator-col-title{transform:rotate(180deg)}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-sortable .tabulator-col-title{padding-right:0;padding-top:20px}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-sortable.tabulator-col-vertical-flip .tabulator-col-title{padding-right:0;padding-bottom:20px}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-sortable .tabulator-arrow{right:calc(50% - 6px)}.tabulator .tabulator-header .tabulator-frozen{display:inline-block;position:absolute;z-index:10}.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-left{border-right:2px solid #dee2e6}.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-right{border-left:2px solid #dee2e6}.tabulator .tabulator-header .tabulator-calcs-holder{box-sizing:border-box;width:100%;background:#fff!important;border-top:1px solid #dee2e6;border-bottom:1px solid #dee2e6;overflow:hidden}.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row{background:#fff!important}.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row .tabulator-col-resize-handle{display:none}.tabulator .tabulator-header .tabulator-frozen-rows-holder{min-width:600%}.tabulator .tabulator-header .tabulator-frozen-rows-holder:empty{display:none}.tabulator .tabulator-tableHolder{position:relative;width:100%;white-space:nowrap;overflow:auto;-webkit-overflow-scrolling:touch}.tabulator .tabulator-tableHolder:focus{outline:none}.tabulator .tabulator-tableHolder .tabulator-placeholder{box-sizing:border-box;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;width:100%}.tabulator .tabulator-tableHolder .tabulator-placeholder[tabulator-render-mode=virtual]{position:absolute;top:0;left:0;height:100%}.tabulator .tabulator-tableHolder .tabulator-placeholder span{display:inline-block;margin:0 auto;padding:10px;color:#000;font-weight:700;font-size:20px}.tabulator .tabulator-tableHolder .tabulator-table{position:relative;display:inline-block;background-color:#fff;white-space:nowrap;overflow:visible}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.tabulator-calcs{font-weight:700;background:#ececec!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.tabulator-calcs.tabulator-calcs-top{border-bottom:2px solid #dee2e6}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.tabulator-calcs.tabulator-calcs-bottom{border-top:2px solid #dee2e6}.tabulator .tabulator-col-resize-handle{position:absolute;right:0;top:0;bottom:0;width:5px}.tabulator .tabulator-col-resize-handle.prev{left:0;right:auto}.tabulator .tabulator-col-resize-handle:hover{cursor:ew-resize}.tabulator .tabulator-footer{padding:5px 10px;border-top:2px solid #dee2e6;text-align:right;font-weight:700;white-space:nowrap;-ms-user-select:none;user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none}.tabulator .tabulator-footer .tabulator-calcs-holder{box-sizing:border-box;width:calc(100% + 20px);margin:-5px -10px 5px;text-align:left;background:#fff!important;border-bottom:1px solid #dee2e6;border-top:1px solid #dee2e6;overflow:hidden}.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row{background:#fff!important}.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row .tabulator-col-resize-handle{display:none}.tabulator .tabulator-footer .tabulator-calcs-holder:only-child{margin-bottom:-5px;border-bottom:none}.tabulator .tabulator-footer .tabulator-paginator{font-family:inherit;font-weight:inherit;font-size:inherit}.tabulator .tabulator-footer .tabulator-page-size{display:inline-block;margin:0 5px;padding:2px 5px;border:1px solid #dee2e6;border-radius:3px}.tabulator .tabulator-footer .tabulator-page{display:inline-block;margin:0;margin-top:5px;padding:8px 12px;border:1px solid #dee2e6;border-right:none;background:hsla(0,0%,100%,.2)}.tabulator .tabulator-footer .tabulator-page[data-page=first]{border-top-left-radius:4px;border-bottom-left-radius:4px}.tabulator .tabulator-footer .tabulator-page[data-page=last]{border:1px solid #dee2e6;border-top-right-radius:4px;border-bottom-right-radius:4px}.tabulator .tabulator-footer .tabulator-page.active{border-color:#007bff;background-color:#007bff;color:#fff}.tabulator .tabulator-footer .tabulator-page:disabled{border-color:#dee2e6;background:#fff;color:#6c757d}.tabulator .tabulator-footer .tabulator-page:not(.disabled):hover{cursor:pointer;border-color:#dee2e6;background:#e9ecef;color:#0056b3}.tabulator .tabulator-loader{position:absolute;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;top:0;left:0;z-index:100;height:100%;width:100%;background:rgba(0,0,0,.4);text-align:center}.tabulator .tabulator-loader .tabulator-loader-msg{display:inline-block;margin:0 auto;padding:10px 20px;border-radius:10px;background:#fff;font-weight:700;font-size:16px}.tabulator .tabulator-loader .tabulator-loader-msg.tabulator-loading{border:4px solid #333;color:#000}.tabulator .tabulator-loader .tabulator-loader-msg.tabulator-error{border:4px solid #d00;color:#590000}.tabulator.thead-dark .tabulator-header,.tabulator.thead-dark .tabulator-header .tabulator-col{border-color:#32383e;background-color:#212529;color:#fff}.tabulator.table-dark{background-color:#212529}.tabulator.table-dark:not(.thead-light) .tabulator-header,.tabulator.table-dark:not(.thead-light) .tabulator-header .tabulator-col{border-color:#32383e;background-color:#212529;color:#fff}.tabulator.table-dark .tabulator-tableHolder{color:#fff}.tabulator.table-dark .tabulator-row{border-color:#32383e}.tabulator.table-dark .tabulator-row:hover{background-color:hsla(0,0%,100%,.075)!important}.tabulator.table-striped .tabulator-row:nth-child(2n){background-color:#f9f9f9}.tabulator.table-striped .tabulator-row:nth-child(2n).tabulator-selected{background-color:#9abcea}.tabulator.table-striped .tabulator-row:nth-child(2n).tabulator-selectable:hover{background-color:#f5f5f5;cursor:pointer}.tabulator.table-striped .tabulator-row:nth-child(2n).tabulator-selected:hover{background-color:#769bcc;cursor:pointer}.tabulator.table-striped.table-dark .tabulator-row:nth-child(2n){background-color:hsla(0,0%,100%,.05)}.tabulator.table-bordered{border:1px solid #dee2e6}.tabulator.table-bordered .tabulator-header .tabulator-col,.tabulator.table-bordered .tabulator-tableHolder .tabulator-table .tabulator-row .tabulator-cell{border-right:1px solid #dee2e6}.tabulator.table-borderless .tabulator-header,.tabulator.table-borderless .tabulator-row{border:none}.tabulator.table-sm .tabulator-header .tabulator-col .tabulator-col-content{padding:.3rem!important}.tabulator.table-sm .tabulator-tableHolder .tabulator-table .tabulator-row{min-height:1.6rem}.tabulator.table-sm .tabulator-tableHolder .tabulator-table .tabulator-row .tabulator-cell{padding:.3rem!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.table-primary{background:#b8daff!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.table-secondary{background:#d6d8db!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.table-success{background:#c3e6cb!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.table-info{background:#bee5eb!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.table-warning{background:#ffeeba!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.table-danger{background:#f5c6cb!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.table-light{background:#fdfdfe!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.table-dark{background:#c6c8ca!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.table-active{background:#f5f5f5!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.bg-primary{background:#007bff!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.bg-secondary{background:#6c757d!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.bg-success{background:#28a745!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.bg-info{background:#17a2b8!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.bg-warning{background:#ffc107!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.bg-danger{background:#dc3545!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.bg-light{background:#f8f9fa!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.bg-dark{background:#343a40!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.bg-active{background:#f5f5f5!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row .tabulator-cell.table-primary{background:#b8daff!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row .tabulator-cell.table-secondary{background:#d6d8db!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row .tabulator-cell.table-success{background:#c3e6cb!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row .tabulator-cell.table-info{background:#bee5eb!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row .tabulator-cell.table-warning{background:#ffeeba!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row .tabulator-cell.table-danger{background:#f5c6cb!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row .tabulator-cell.table-light{background:#fdfdfe!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row .tabulator-cell.table-dark{background:#c6c8ca!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row .tabulator-cell.table-active{background:#f5f5f5!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row .tabulator-cell.bg-primary{background:#007bff!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row .tabulator-cell.bg-secondary{background:#6c757d!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row .tabulator-cell.bg-success{background:#28a745!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row .tabulator-cell.bg-info{background:#17a2b8!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row .tabulator-cell.bg-warning{background:#ffc107!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row .tabulator-cell.bg-danger{background:#dc3545!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row .tabulator-cell.bg-light{background:#f8f9fa!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row .tabulator-cell.bg-dark{background:#343a40!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row .tabulator-cell.bg-active{background:#f5f5f5!important}.tabulator-row{position:relative;box-sizing:border-box;min-height:2.5rem;background-color:#fff;border-bottom:1px solid #dee2e6}.tabulator-row.tabulator-selectable:hover{background-color:#f5f5f5;cursor:pointer}.tabulator-row.tabulator-selected{background-color:#9abcea}.tabulator-row.tabulator-selected:hover{background-color:#769bcc;cursor:pointer}.tabulator-row.tabulator-moving{position:absolute;border-top:1px solid #dee2e6;border-bottom:1px solid #dee2e6;pointer-events:none!important;z-index:15}.tabulator-row .tabulator-row-resize-handle{position:absolute;right:0;bottom:0;left:0;height:5px}.tabulator-row .tabulator-row-resize-handle.prev{top:0;bottom:auto}.tabulator-row .tabulator-row-resize-handle:hover{cursor:ns-resize}.tabulator-row .tabulator-frozen{display:inline-block;position:absolute;background-color:inherit;z-index:10}.tabulator-row .tabulator-frozen.tabulator-frozen-left{border-right:2px solid #dee2e6}.tabulator-row .tabulator-frozen.tabulator-frozen-right{border-left:2px solid #dee2e6}.tabulator-row .tabulator-responsive-collapse{box-sizing:border-box;padding:5px;border-top:1px solid #dee2e6;border-bottom:1px solid #dee2e6}.tabulator-row .tabulator-responsive-collapse:empty{display:none}.tabulator-row .tabulator-responsive-collapse table{font-size:1rem}.tabulator-row .tabulator-responsive-collapse table tr td{position:relative}.tabulator-row .tabulator-responsive-collapse table tr td:first-of-type{padding-right:10px}.tabulator-row .tabulator-cell{display:inline-block;position:relative;box-sizing:border-box;padding:.75rem;vertical-align:middle;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tabulator-row .tabulator-cell:last-of-type{border-right:none}.tabulator-row .tabulator-cell.tabulator-editing{border:1px solid #1d68cd;padding:0}.tabulator-row .tabulator-cell.tabulator-editing input,.tabulator-row .tabulator-cell.tabulator-editing select{border:1px;background:transparent}.tabulator-row .tabulator-cell.tabulator-validation-fail{border:1px solid #d00}.tabulator-row .tabulator-cell.tabulator-validation-fail input,.tabulator-row .tabulator-cell.tabulator-validation-fail select{border:1px;background:transparent;color:#d00}.tabulator-row .tabulator-cell:first-child .tabulator-col-resize-handle.prev{display:none}.tabulator-row .tabulator-cell.tabulator-row-handle{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none}.tabulator-row .tabulator-cell.tabulator-row-handle .tabulator-row-handle-box{width:80%}.tabulator-row .tabulator-cell.tabulator-row-handle .tabulator-row-handle-box .tabulator-row-handle-bar{width:100%;height:3px;margin-top:2px;background:#666}.tabulator-row .tabulator-cell .tabulator-data-tree-branch{display:inline-block;vertical-align:middle;height:9px;width:7px;margin-top:-9px;margin-right:5px;border-bottom-left-radius:1px;border-left:2px solid #dee2e6;border-bottom:2px solid #dee2e6}.tabulator-row .tabulator-cell .tabulator-data-tree-control{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;vertical-align:middle;height:11px;width:11px;margin-right:5px;border:1px solid #ccc;border-radius:2px;background:rgba(0,0,0,.1);overflow:hidden}.tabulator-row .tabulator-cell .tabulator-data-tree-control:hover{cursor:pointer;background:rgba(0,0,0,.2)}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-collapse{display:inline-block;position:relative;height:7px;width:1px;background:transparent}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-collapse:after{position:absolute;content:"";left:-3px;top:3px;height:1px;width:7px;background:#ccc}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-expand{display:inline-block;position:relative;height:7px;width:1px;background:#ccc}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-expand:after{position:absolute;content:"";left:-3px;top:3px;height:1px;width:7px;background:#ccc}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;height:15px;width:15px;border-radius:20px;background:#666;color:#fff;font-weight:700;font-size:1.1em}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle:hover{opacity:.7}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle.open .tabulator-responsive-collapse-toggle-close{display:initial}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle.open .tabulator-responsive-collapse-toggle-open,.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle .tabulator-responsive-collapse-toggle-close{display:none}.tabulator-row .tabulator-cell .tabulator-traffic-light{display:inline-block;height:14px;width:14px;border-radius:14px}.tabulator-row.tabulator-group{box-sizing:border-box;border-bottom:1px solid #999;border-right:1px solid #dee2e6;border-top:1px solid #999;padding:5px;padding-left:10px;background:#fafafa;font-weight:700;min-width:100%}.tabulator-row.tabulator-group:hover{cursor:pointer;background-color:rgba(0,0,0,.1)}.tabulator-row.tabulator-group.tabulator-group-visible .tabulator-arrow{margin-right:10px;border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #666;border-bottom:0}.tabulator-row.tabulator-group.tabulator-group-level-1{padding-left:30px}.tabulator-row.tabulator-group.tabulator-group-level-2{padding-left:50px}.tabulator-row.tabulator-group.tabulator-group-level-3{padding-left:70px}.tabulator-row.tabulator-group.tabulator-group-level-4{padding-left:90px}.tabulator-row.tabulator-group.tabulator-group-level-5{padding-left:110px}.tabulator-row.tabulator-group .tabulator-group-toggle{display:inline-block}.tabulator-row.tabulator-group .tabulator-arrow{display:inline-block;width:0;height:0;margin-right:16px;border-top:6px solid transparent;border-bottom:6px solid transparent;border-right:0;border-left:6px solid #666;vertical-align:middle}.tabulator-row.tabulator-group span{margin-left:10px;color:#666}.tabulator-edit-select-list{position:absolute;display:inline-block;box-sizing:border-box;max-height:200px;background:#fff;border:1px solid #dee2e6;font-size:1rem;overflow-y:auto;-webkit-overflow-scrolling:touch;z-index:10000}.tabulator-edit-select-list .tabulator-edit-select-list-item{padding:4px}.tabulator-edit-select-list .tabulator-edit-select-list-item.active{color:#fff;background:#1d68cd}.tabulator-edit-select-list .tabulator-edit-select-list-item:hover{cursor:pointer;color:#fff;background:#1d68cd}.tabulator-edit-select-list .tabulator-edit-select-list-group{border-bottom:1px solid #dee2e6;padding:4px;padding-top:6px;font-weight:700}.tabulator-print-fullscreen{position:absolute;top:0;bottom:0;left:0;right:0;z-index:10000}body.tabulator-print-fullscreen-hide>:not(.tabulator-print-fullscreen){display:none!important}.tabulator-print-table{border-collapse:collapse} -/*# sourceMappingURL=tabulator_bootstrap4.min.css.map */ diff --git a/cookbook/static/tabulator/tabulator_midnight.min.css b/cookbook/static/tabulator/tabulator_midnight.min.css deleted file mode 100644 index ed8ed506..00000000 --- a/cookbook/static/tabulator/tabulator_midnight.min.css +++ /dev/null @@ -1,3 +0,0 @@ -/* Tabulator v4.5.3 (c) Oliver Folkerd */ -.tabulator{position:relative;border:1px solid #333;background-color:#222;overflow:hidden;font-size:14px;text-align:left;transform:translatez(0)}.tabulator[tabulator-layout=fitDataFill] .tabulator-tableHolder .tabulator-table{min-width:100%}.tabulator.tabulator-block-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tabulator .tabulator-header{position:relative;box-sizing:border-box;width:100%;border-bottom:1px solid #999;background-color:#333;color:#fff;font-weight:700;white-space:nowrap;overflow:hidden;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none}.tabulator .tabulator-header.tabulator-header-hidden{display:none}.tabulator .tabulator-header .tabulator-col{display:inline-block;position:relative;box-sizing:border-box;border-right:1px solid #aaa;background-color:#333;text-align:left;vertical-align:bottom;overflow:hidden}.tabulator .tabulator-header .tabulator-col.tabulator-moving{position:absolute;border:1px solid #999;background:#1a1a1a;pointer-events:none}.tabulator .tabulator-header .tabulator-col .tabulator-col-content{box-sizing:border-box;position:relative;padding:4px}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title{box-sizing:border-box;width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:bottom}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title .tabulator-title-editor{box-sizing:border-box;width:100%;border:1px solid #999;padding:1px;background:#444;color:#fff}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-arrow{display:inline-block;position:absolute;top:9px;right:8px;width:0;height:0;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #bbb}.tabulator .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols{position:relative;display:-ms-flexbox;display:flex;border-top:1px solid #aaa;overflow:hidden}.tabulator .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols .tabulator-col:last-child{margin-right:-1px}.tabulator .tabulator-header .tabulator-col:first-child .tabulator-col-resize-handle.prev{display:none}.tabulator .tabulator-header .tabulator-col.ui-sortable-helper{position:absolute;background-color:#1a1a1a!important;border:1px solid #aaa}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter{position:relative;box-sizing:border-box;margin-top:2px;width:100%;text-align:center}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter textarea{height:auto!important}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter svg{margin-top:3px}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter input,.tabulator .tabulator-header .tabulator-col .tabulator-header-filter select{border:1px solid #999;background:#444;color:#fff}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter input::-ms-clear{width:0;height:0}.tabulator .tabulator-header .tabulator-col.tabulator-sortable .tabulator-col-title{padding-right:25px}.tabulator .tabulator-header .tabulator-col.tabulator-sortable:hover{cursor:pointer;background-color:#1a1a1a}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=none] .tabulator-col-content .tabulator-arrow{border-top:none;border-bottom:6px solid #bbb}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=asc] .tabulator-col-content .tabulator-arrow{border-top:none;border-bottom:6px solid #666}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=desc] .tabulator-col-content .tabulator-arrow{border-top:6px solid #666;border-bottom:none}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical .tabulator-col-content .tabulator-col-title{-ms-writing-mode:tb-rl;writing-mode:vertical-rl;text-orientation:mixed;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-col-vertical-flip .tabulator-col-title{transform:rotate(180deg)}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-sortable .tabulator-col-title{padding-right:0;padding-top:20px}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-sortable.tabulator-col-vertical-flip .tabulator-col-title{padding-right:0;padding-bottom:20px}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-sortable .tabulator-arrow{right:calc(50% - 6px)}.tabulator .tabulator-header .tabulator-frozen{display:inline-block;position:absolute;z-index:10}.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-left{border-right:2px solid #888}.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-right{border-left:2px solid #888}.tabulator .tabulator-header .tabulator-calcs-holder{box-sizing:border-box;min-width:600%;background:#1a1a1a!important;border-top:1px solid #888;border-bottom:1px solid #aaa;overflow:hidden}.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row{background:#1a1a1a!important}.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row .tabulator-col-resize-handle{display:none}.tabulator .tabulator-header .tabulator-frozen-rows-holder{min-width:600%}.tabulator .tabulator-header .tabulator-frozen-rows-holder:empty{display:none}.tabulator .tabulator-tableHolder{position:relative;width:100%;white-space:nowrap;overflow:auto;-webkit-overflow-scrolling:touch}.tabulator .tabulator-tableHolder:focus{outline:none}.tabulator .tabulator-tableHolder .tabulator-placeholder{box-sizing:border-box;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;width:100%}.tabulator .tabulator-tableHolder .tabulator-placeholder[tabulator-render-mode=virtual]{position:absolute;top:0;left:0;height:100%}.tabulator .tabulator-tableHolder .tabulator-placeholder span{display:inline-block;margin:0 auto;padding:10px;color:#eee;font-weight:700;font-size:20px}.tabulator .tabulator-tableHolder .tabulator-table{position:relative;display:inline-block;background-color:#666;white-space:nowrap;overflow:visible;color:#fff}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.tabulator-calcs{font-weight:700;background:#373737!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.tabulator-calcs.tabulator-calcs-top{border-bottom:2px solid #888}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.tabulator-calcs.tabulator-calcs-bottom{border-top:2px solid #888}.tabulator .tabulator-col-resize-handle{position:absolute;right:0;top:0;bottom:0;width:5px}.tabulator .tabulator-col-resize-handle.prev{left:0;right:auto}.tabulator .tabulator-col-resize-handle:hover{cursor:ew-resize}.tabulator .tabulator-footer{padding:5px 10px;border-top:1px solid #999;background-color:#333;text-align:right;color:#333;font-weight:700;white-space:nowrap;-ms-user-select:none;user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none}.tabulator .tabulator-footer .tabulator-calcs-holder{box-sizing:border-box;width:calc(100% + 20px);margin:-5px -10px 5px;text-align:left;background:#262626!important;border-bottom:1px solid #888;border-top:1px solid #888;overflow:hidden}.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row{background:#262626!important;color:#fff}.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row .tabulator-col-resize-handle{display:none}.tabulator .tabulator-footer .tabulator-calcs-holder:only-child{margin-bottom:-5px;border-bottom:none}.tabulator .tabulator-footer .tabulator-paginator label{color:#fff}.tabulator .tabulator-footer .tabulator-page-size{display:inline-block;margin:0 5px;padding:2px 5px;border:1px solid #aaa;border-radius:3px}.tabulator .tabulator-footer .tabulator-pages{margin:0 7px}.tabulator .tabulator-footer .tabulator-page{display:inline-block;margin:0 2px;padding:2px 5px;border:1px solid #aaa;border-radius:3px;background:hsla(0,0%,100%,.2);color:#333;font-family:inherit;font-weight:inherit;font-size:inherit}.tabulator .tabulator-footer .tabulator-page.active{color:#fff}.tabulator .tabulator-footer .tabulator-page:disabled{opacity:.5}.tabulator .tabulator-footer .tabulator-page:not(.disabled):hover{cursor:pointer;background:rgba(0,0,0,.2);color:#fff}.tabulator .tabulator-loader{position:absolute;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;top:0;left:0;z-index:100;height:100%;width:100%;background:rgba(0,0,0,.4);text-align:center}.tabulator .tabulator-loader .tabulator-loader-msg{display:inline-block;margin:0 auto;padding:10px 20px;border-radius:10px;background:#fff;font-weight:700;font-size:16px}.tabulator .tabulator-loader .tabulator-loader-msg.tabulator-loading{border:4px solid #333;color:#000}.tabulator .tabulator-loader .tabulator-loader-msg.tabulator-error{border:4px solid #d00;color:#590000}.tabulator-row{position:relative;box-sizing:border-box;min-height:22px;background-color:#666}.tabulator-row:nth-child(2n){background-color:#444}.tabulator-row.tabulator-selectable:hover{background-color:#999;cursor:pointer}.tabulator-row.tabulator-selected{background-color:#000}.tabulator-row.tabulator-selected:hover{background-color:#888;cursor:pointer}.tabulator-row.tabulator-moving{position:absolute;border-top:1px solid #888;border-bottom:1px solid #888;pointer-events:none!important;z-index:15}.tabulator-row .tabulator-row-resize-handle{position:absolute;right:0;bottom:0;left:0;height:5px}.tabulator-row .tabulator-row-resize-handle.prev{top:0;bottom:auto}.tabulator-row .tabulator-row-resize-handle:hover{cursor:ns-resize}.tabulator-row .tabulator-frozen{display:inline-block;position:absolute;background-color:inherit;z-index:10}.tabulator-row .tabulator-frozen.tabulator-frozen-left{border-right:2px solid #888}.tabulator-row .tabulator-frozen.tabulator-frozen-right{border-left:2px solid #888}.tabulator-row .tabulator-responsive-collapse{box-sizing:border-box;padding:5px;border-top:1px solid #888;border-bottom:1px solid #888}.tabulator-row .tabulator-responsive-collapse:empty{display:none}.tabulator-row .tabulator-responsive-collapse table{font-size:14px}.tabulator-row .tabulator-responsive-collapse table tr td{position:relative}.tabulator-row .tabulator-responsive-collapse table tr td:first-of-type{padding-right:10px}.tabulator-row .tabulator-cell{display:inline-block;position:relative;box-sizing:border-box;padding:4px;border-right:1px solid #888;vertical-align:middle;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tabulator-row .tabulator-cell.tabulator-editing{border:1px solid #999;padding:0}.tabulator-row .tabulator-cell.tabulator-editing input,.tabulator-row .tabulator-cell.tabulator-editing select{border:1px;background:transparent}.tabulator-row .tabulator-cell.tabulator-validation-fail{border:1px solid #d00}.tabulator-row .tabulator-cell.tabulator-validation-fail input,.tabulator-row .tabulator-cell.tabulator-validation-fail select{border:1px;background:transparent;color:#d00}.tabulator-row .tabulator-cell:first-child .tabulator-col-resize-handle.prev{display:none}.tabulator-row .tabulator-cell.tabulator-row-handle{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none}.tabulator-row .tabulator-cell.tabulator-row-handle .tabulator-row-handle-box{width:80%}.tabulator-row .tabulator-cell.tabulator-row-handle .tabulator-row-handle-box .tabulator-row-handle-bar{width:100%;height:3px;margin-top:2px;background:#666}.tabulator-row .tabulator-cell .tabulator-data-tree-branch{display:inline-block;vertical-align:middle;height:9px;width:7px;margin-top:-9px;margin-right:5px;border-bottom-left-radius:1px;border-left:2px solid #888;border-bottom:2px solid #888}.tabulator-row .tabulator-cell .tabulator-data-tree-control{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;vertical-align:middle;height:11px;width:11px;margin-right:5px;border:1px solid #fff;border-radius:2px;background:rgba(0,0,0,.1);overflow:hidden}.tabulator-row .tabulator-cell .tabulator-data-tree-control:hover{cursor:pointer;background:rgba(0,0,0,.2)}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-collapse{display:inline-block;position:relative;height:7px;width:1px;background:transparent}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-collapse:after{position:absolute;content:"";left:-3px;top:3px;height:1px;width:7px;background:#fff}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-expand{display:inline-block;position:relative;height:7px;width:1px;background:#fff}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-expand:after{position:absolute;content:"";left:-3px;top:3px;height:1px;width:7px;background:#fff}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;height:15px;width:15px;border-radius:20px;background:#fff;color:#666;font-weight:700;font-size:1.1em}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle:hover{opacity:.7}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle.open .tabulator-responsive-collapse-toggle-close{display:initial}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle.open .tabulator-responsive-collapse-toggle-open,.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle .tabulator-responsive-collapse-toggle-close{display:none}.tabulator-row .tabulator-cell .tabulator-traffic-light{display:inline-block;height:14px;width:14px;border-radius:14px}.tabulator-row.tabulator-group{box-sizing:border-box;border-bottom:1px solid #999;border-right:1px solid #888;border-top:1px solid #999;padding:5px;padding-left:10px;background:#ccc;font-weight:700;color:#333;min-width:100%}.tabulator-row.tabulator-group:hover{cursor:pointer;background-color:rgba(0,0,0,.1)}.tabulator-row.tabulator-group.tabulator-group-visible .tabulator-arrow{margin-right:10px;border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #666;border-bottom:0}.tabulator-row.tabulator-group.tabulator-group-level-1{padding-left:30px}.tabulator-row.tabulator-group.tabulator-group-level-2{padding-left:50px}.tabulator-row.tabulator-group.tabulator-group-level-3{padding-left:70px}.tabulator-row.tabulator-group.tabulator-group-level-4{padding-left:90px}.tabulator-row.tabulator-group.tabulator-group-level-5{padding-left:110px}.tabulator-row.tabulator-group .tabulator-group-toggle{display:inline-block}.tabulator-row.tabulator-group .tabulator-arrow{display:inline-block;width:0;height:0;margin-right:16px;border-top:6px solid transparent;border-bottom:6px solid transparent;border-right:0;border-left:6px solid #666;vertical-align:middle}.tabulator-row.tabulator-group span{margin-left:10px;color:#666}.tabulator-edit-select-list{position:absolute;display:inline-block;box-sizing:border-box;max-height:200px;background:#fff;border:1px solid #888;font-size:14px;overflow-y:auto;-webkit-overflow-scrolling:touch;z-index:10000}.tabulator-edit-select-list .tabulator-edit-select-list-item{padding:4px;color:#666}.tabulator-edit-select-list .tabulator-edit-select-list-item.active{color:#999;background:#444}.tabulator-edit-select-list .tabulator-edit-select-list-item:hover{cursor:pointer;color:#999;background:#666}.tabulator-edit-select-list .tabulator-edit-select-list-group{border-bottom:1px solid #888;padding:4px;padding-top:6px;color:#fff;font-weight:700}.tabulator-print-fullscreen{position:absolute;top:0;bottom:0;left:0;right:0;z-index:10000}body.tabulator-print-fullscreen-hide>:not(.tabulator-print-fullscreen){display:none!important}.tabulator-print-table{border-collapse:collapse} -/*# sourceMappingURL=tabulator_midnight.min.css.map */ diff --git a/cookbook/static/tabulator/tabulator_modern.min.css b/cookbook/static/tabulator/tabulator_modern.min.css deleted file mode 100644 index 333c6194..00000000 --- a/cookbook/static/tabulator/tabulator_modern.min.css +++ /dev/null @@ -1,3 +0,0 @@ -/* Tabulator v4.5.3 (c) Oliver Folkerd */ -.tabulator{position:relative;border:1px solid #fff;background-color:#fff;overflow:hidden;font-size:16px;text-align:left;transform:translatez(0)}.tabulator[tabulator-layout=fitDataFill] .tabulator-tableHolder .tabulator-table{min-width:100%}.tabulator.tabulator-block-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tabulator .tabulator-header{position:relative;box-sizing:border-box;width:100%;border-bottom:3px solid #3759d7;margin-bottom:4px;background-color:#fff;color:#3759d7;font-weight:700;white-space:nowrap;overflow:hidden;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;padding-left:10px;font-size:1.1em}.tabulator .tabulator-header.tabulator-header-hidden{display:none}.tabulator .tabulator-header .tabulator-col{display:inline-block;position:relative;box-sizing:border-box;border-right:2px solid #fff;background-color:#fff;text-align:left;vertical-align:bottom;overflow:hidden}.tabulator .tabulator-header .tabulator-col.tabulator-moving{position:absolute;border:1px solid #3759d7;background:#e6e6e6;pointer-events:none}.tabulator .tabulator-header .tabulator-col .tabulator-col-content{box-sizing:border-box;position:relative;padding:4px}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title{box-sizing:border-box;width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:bottom}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title .tabulator-title-editor{box-sizing:border-box;width:100%;border:1px solid #3759d7;padding:1px;background:#fff;font-size:1em;color:#3759d7}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-arrow{display:inline-block;position:absolute;top:9px;right:8px;width:0;height:0;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #b7c3f1}.tabulator .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols{position:relative;display:-ms-flexbox;display:flex;border-top:2px solid #3759d7;overflow:hidden}.tabulator .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols .tabulator-col:last-child{margin-right:-1px}.tabulator .tabulator-header .tabulator-col:first-child .tabulator-col-resize-handle.prev{display:none}.tabulator .tabulator-header .tabulator-col.ui-sortable-helper{position:absolute;background-color:#e6e6e6!important;border:1px solid #fff}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter{position:relative;box-sizing:border-box;margin-top:2px;width:100%;text-align:center}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter textarea{height:auto!important}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter svg{margin-top:3px}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter input::-ms-clear{width:0;height:0}.tabulator .tabulator-header .tabulator-col.tabulator-sortable .tabulator-col-title{padding-right:25px}.tabulator .tabulator-header .tabulator-col.tabulator-sortable:hover{cursor:pointer;background-color:#e6e6e6}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=none] .tabulator-col-content .tabulator-arrow{border-top:none;border-bottom:6px solid #b7c3f1}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=asc] .tabulator-col-content .tabulator-arrow{border-top:none;border-bottom:6px solid #3759d7}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=desc] .tabulator-col-content .tabulator-arrow{border-top:6px solid #3759d7;border-bottom:none}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical .tabulator-col-content .tabulator-col-title{-ms-writing-mode:tb-rl;writing-mode:vertical-rl;text-orientation:mixed;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-col-vertical-flip .tabulator-col-title{transform:rotate(180deg)}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-sortable .tabulator-col-title{padding-right:0;padding-top:20px}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-sortable.tabulator-col-vertical-flip .tabulator-col-title{padding-right:0;padding-bottom:20px}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-sortable .tabulator-arrow{right:calc(50% - 6px)}.tabulator .tabulator-header .tabulator-frozen{display:inline-block;position:absolute;z-index:10}.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-left{padding-left:10px;border-right:2px solid #fff}.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-right{border-left:2px solid #fff}.tabulator .tabulator-header .tabulator-calcs-holder{box-sizing:border-box;min-width:600%;border-top:2px solid #3759d7!important;background:#fff!important;border-top:1px solid #fff;border-bottom:1px solid #fff;overflow:hidden}.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row{padding-left:0!important;background:#fff!important}.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row .tabulator-col-resize-handle{display:none}.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row .tabulator-cell{background:none}.tabulator .tabulator-header .tabulator-frozen-rows-holder{min-width:600%}.tabulator .tabulator-header .tabulator-frozen-rows-holder:empty{display:none}.tabulator .tabulator-tableHolder{position:relative;width:100%;white-space:nowrap;overflow:auto;-webkit-overflow-scrolling:touch}.tabulator .tabulator-tableHolder:focus{outline:none}.tabulator .tabulator-tableHolder .tabulator-placeholder{box-sizing:border-box;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;width:100%}.tabulator .tabulator-tableHolder .tabulator-placeholder[tabulator-render-mode=virtual]{position:absolute;top:0;left:0;height:100%}.tabulator .tabulator-tableHolder .tabulator-placeholder span{display:inline-block;margin:0 auto;padding:10px;color:#3759d7;font-weight:700;font-size:20px}.tabulator .tabulator-tableHolder .tabulator-table{position:relative;display:inline-block;background-color:#f3f3f3;white-space:nowrap;overflow:visible;color:#333}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.tabulator-calcs{font-weight:700;background:#f2f2f2!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.tabulator-calcs.tabulator-calcs-top{border-bottom:2px solid #3759d7}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.tabulator-calcs.tabulator-calcs-bottom{border-top:2px solid #3759d7}.tabulator .tabulator-col-resize-handle{position:absolute;right:0;top:0;bottom:0;width:5px}.tabulator .tabulator-col-resize-handle.prev{left:0;right:auto}.tabulator .tabulator-col-resize-handle:hover{cursor:ew-resize}.tabulator .tabulator-footer{padding:5px 10px;border-top:1px solid #999;background-color:#fff;text-align:right;color:#3759d7;font-weight:700;white-space:nowrap;-ms-user-select:none;user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none}.tabulator .tabulator-footer .tabulator-calcs-holder{box-sizing:border-box;width:calc(100% + 20px);margin:-5px -10px 5px;text-align:left;background:#fff!important;border-top:3px solid #3759d7!important;border-bottom:2px solid #3759d7!important;border-bottom:1px solid #fff;border-top:1px solid #fff;overflow:hidden}.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row{background:#fff!important}.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row .tabulator-col-resize-handle{display:none}.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row .tabulator-cell{background:none}.tabulator .tabulator-footer .tabulator-calcs-holder:only-child{margin-bottom:-5px;border-bottom:none;border-bottom:none!important}.tabulator .tabulator-footer .tabulator-paginator{color:#3759d7;font-family:inherit;font-weight:inherit;font-size:inherit}.tabulator .tabulator-footer .tabulator-page-size{display:inline-block;margin:0 5px;padding:2px 5px;border:1px solid #aaa;border-radius:3px}.tabulator .tabulator-footer .tabulator-pages{margin:0 7px}.tabulator .tabulator-footer .tabulator-page{display:inline-block;margin:0 2px;padding:2px 5px;border:1px solid #aaa;border-radius:3px;background:hsla(0,0%,100%,.2)}.tabulator .tabulator-footer .tabulator-page.active{color:#3759d7}.tabulator .tabulator-footer .tabulator-page:disabled{opacity:.5}.tabulator .tabulator-footer .tabulator-page:not(.disabled):hover{cursor:pointer;background:rgba(0,0,0,.2);color:#fff}.tabulator .tabulator-loader{position:absolute;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;top:0;left:0;z-index:100;height:100%;width:100%;background:rgba(0,0,0,.4);text-align:center}.tabulator .tabulator-loader .tabulator-loader-msg{display:inline-block;margin:0 auto;padding:10px 20px;border-radius:10px;background:#fff;font-weight:700;font-size:16px}.tabulator .tabulator-loader .tabulator-loader-msg.tabulator-loading{border:4px solid #333;color:#000}.tabulator .tabulator-loader .tabulator-loader-msg.tabulator-error{border:4px solid #d00;color:#590000}.tabulator-row{position:relative;box-sizing:border-box;min-height:24px;background-color:#3759d7;padding-left:10px!important;margin-bottom:2px}.tabulator-row:nth-child(2n){background-color:#627ce0}.tabulator-row:nth-child(2n) .tabulator-cell{background-color:#fff}.tabulator-row.tabulator-selectable:hover{cursor:pointer}.tabulator-row.tabulator-selectable:hover .tabulator-cell{background-color:#bbb}.tabulator-row.tabulator-selected .tabulator-cell{background-color:#9abcea}.tabulator-row.tabulator-selected:hover .tabulator-cell{background-color:#769bcc;cursor:pointer}.tabulator-row.tabulator-moving{position:absolute;border-top:1px solid #fff;border-bottom:1px solid #fff;pointer-events:none!important;z-index:15}.tabulator-row .tabulator-row-resize-handle{position:absolute;right:0;bottom:0;left:0;height:5px}.tabulator-row .tabulator-row-resize-handle.prev{top:0;bottom:auto}.tabulator-row .tabulator-row-resize-handle:hover{cursor:ns-resize}.tabulator-row .tabulator-frozen{display:inline-block;position:absolute;background-color:inherit;z-index:10}.tabulator-row .tabulator-frozen.tabulator-frozen-left{padding-left:10px;border-right:2px solid #fff}.tabulator-row .tabulator-frozen.tabulator-frozen-right{border-left:2px solid #fff}.tabulator-row .tabulator-responsive-collapse{box-sizing:border-box;padding:5px;border-top:1px solid #fff;border-bottom:1px solid #fff}.tabulator-row .tabulator-responsive-collapse:empty{display:none}.tabulator-row .tabulator-responsive-collapse table{font-size:16px}.tabulator-row .tabulator-responsive-collapse table tr td{position:relative}.tabulator-row .tabulator-responsive-collapse table tr td:first-of-type{padding-right:10px}.tabulator-row .tabulator-cell{display:inline-block;position:relative;box-sizing:border-box;padding:6px 4px;border-right:2px solid #fff;vertical-align:middle;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;background-color:#f3f3f3}.tabulator-row .tabulator-cell.tabulator-editing{border:1px solid #1d68cd;padding:0}.tabulator-row .tabulator-cell.tabulator-editing input,.tabulator-row .tabulator-cell.tabulator-editing select{border:1px;background:transparent}.tabulator-row .tabulator-cell.tabulator-validation-fail{border:1px solid #d00}.tabulator-row .tabulator-cell.tabulator-validation-fail input,.tabulator-row .tabulator-cell.tabulator-validation-fail select{border:1px;background:transparent;color:#d00}.tabulator-row .tabulator-cell:first-child .tabulator-col-resize-handle.prev{display:none}.tabulator-row .tabulator-cell.tabulator-row-handle{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none}.tabulator-row .tabulator-cell.tabulator-row-handle .tabulator-row-handle-box{width:80%}.tabulator-row .tabulator-cell.tabulator-row-handle .tabulator-row-handle-box .tabulator-row-handle-bar{width:100%;height:3px;margin-top:2px;background:#666}.tabulator-row .tabulator-cell .tabulator-data-tree-branch{display:inline-block;vertical-align:middle;height:9px;width:7px;margin-top:-9px;margin-right:5px;border-bottom-left-radius:1px;border-left:2px solid #fff;border-bottom:2px solid #fff}.tabulator-row .tabulator-cell .tabulator-data-tree-control{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;vertical-align:middle;height:11px;width:11px;margin-right:5px;border:1px solid #333;border-radius:2px;background:rgba(0,0,0,.1);overflow:hidden}.tabulator-row .tabulator-cell .tabulator-data-tree-control:hover{cursor:pointer;background:rgba(0,0,0,.2)}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-collapse{display:inline-block;position:relative;height:7px;width:1px;background:transparent}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-collapse:after{position:absolute;content:"";left:-3px;top:3px;height:1px;width:7px;background:#333}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-expand{display:inline-block;position:relative;height:7px;width:1px;background:#333}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-expand:after{position:absolute;content:"";left:-3px;top:3px;height:1px;width:7px;background:#333}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;height:15px;width:15px;border-radius:20px;background:#666;color:#f3f3f3;font-weight:700;font-size:1.1em}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle:hover{opacity:.7}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle.open .tabulator-responsive-collapse-toggle-close{display:initial}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle.open .tabulator-responsive-collapse-toggle-open,.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle .tabulator-responsive-collapse-toggle-close{display:none}.tabulator-row .tabulator-cell .tabulator-traffic-light{display:inline-block;height:14px;width:14px;border-radius:14px}.tabulator-row.tabulator-group{box-sizing:border-box;border-bottom:2px solid #3759d7;border-top:2px solid #3759d7;padding:5px;padding-left:10px;background:#8ca0e8;font-weight:700;color:fff;margin-bottom:2px;min-width:100%}.tabulator-row.tabulator-group:hover{cursor:pointer;background-color:rgba(0,0,0,.1)}.tabulator-row.tabulator-group.tabulator-group-visible .tabulator-arrow{margin-right:10px;border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #3759d7;border-bottom:0}.tabulator-row.tabulator-group.tabulator-group-level-1{padding-left:30px}.tabulator-row.tabulator-group.tabulator-group-level-2{padding-left:50px}.tabulator-row.tabulator-group.tabulator-group-level-3{padding-left:70px}.tabulator-row.tabulator-group.tabulator-group-level-4{padding-left:90px}.tabulator-row.tabulator-group.tabulator-group-level-5{padding-left:110px}.tabulator-row.tabulator-group .tabulator-group-toggle{display:inline-block}.tabulator-row.tabulator-group .tabulator-arrow{display:inline-block;width:0;height:0;margin-right:16px;border-top:6px solid transparent;border-bottom:6px solid transparent;border-right:0;border-left:6px solid #3759d7;vertical-align:middle}.tabulator-row.tabulator-group span{margin-left:10px;color:#3759d7}.tabulator-edit-select-list{position:absolute;display:inline-block;box-sizing:border-box;max-height:200px;background:#f3f3f3;border:1px solid #1d68cd;font-size:16px;overflow-y:auto;-webkit-overflow-scrolling:touch;z-index:10000}.tabulator-edit-select-list .tabulator-edit-select-list-item{padding:4px;color:#333}.tabulator-edit-select-list .tabulator-edit-select-list-item.active{color:#f3f3f3;background:#1d68cd}.tabulator-edit-select-list .tabulator-edit-select-list-item:hover{cursor:pointer;color:#f3f3f3;background:#1d68cd}.tabulator-edit-select-list .tabulator-edit-select-list-group{border-bottom:1px solid #fff;padding:4px;padding-top:6px;color:#333;font-weight:700}.tabulator-print-fullscreen{position:absolute;top:0;bottom:0;left:0;right:0;z-index:10000}body.tabulator-print-fullscreen-hide>:not(.tabulator-print-fullscreen){display:none!important}.tabulator-print-table{border-collapse:collapse} -/*# sourceMappingURL=tabulator_modern.min.css.map */ diff --git a/cookbook/static/tabulator/tabulator_simple.min.css b/cookbook/static/tabulator/tabulator_simple.min.css deleted file mode 100644 index 6820ae39..00000000 --- a/cookbook/static/tabulator/tabulator_simple.min.css +++ /dev/null @@ -1,3 +0,0 @@ -/* Tabulator v4.5.3 (c) Oliver Folkerd */ -.tabulator{position:relative;background-color:#fff;overflow:hidden;font-size:14px;text-align:left;transform:translatez(0)}.tabulator[tabulator-layout=fitDataFill] .tabulator-tableHolder .tabulator-table{min-width:100%}.tabulator.tabulator-block-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tabulator .tabulator-header{position:relative;box-sizing:border-box;width:100%;border-bottom:1px solid #999;background-color:#fff;color:#555;font-weight:700;white-space:nowrap;overflow:hidden;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none}.tabulator .tabulator-header.tabulator-header-hidden{display:none}.tabulator .tabulator-header .tabulator-col{display:inline-block;position:relative;box-sizing:border-box;border-right:1px solid #ddd;background-color:#fff;text-align:left;vertical-align:bottom;overflow:hidden}.tabulator .tabulator-header .tabulator-col.tabulator-moving{position:absolute;border:1px solid #999;background:#e6e6e6;pointer-events:none}.tabulator .tabulator-header .tabulator-col .tabulator-col-content{box-sizing:border-box;position:relative;padding:4px}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title{box-sizing:border-box;width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:bottom}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title .tabulator-title-editor{box-sizing:border-box;width:100%;border:1px solid #999;padding:1px;background:#fff}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-arrow{display:inline-block;position:absolute;top:9px;right:8px;width:0;height:0;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #bbb}.tabulator .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols{position:relative;display:-ms-flexbox;display:flex;border-top:1px solid #ddd;overflow:hidden}.tabulator .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols .tabulator-col:last-child{margin-right:-1px}.tabulator .tabulator-header .tabulator-col:first-child .tabulator-col-resize-handle.prev{display:none}.tabulator .tabulator-header .tabulator-col.ui-sortable-helper{position:absolute;background-color:#e6e6e6!important;border:1px solid #ddd}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter{position:relative;box-sizing:border-box;margin-top:2px;width:100%;text-align:center}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter textarea{height:auto!important}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter svg{margin-top:3px}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter input::-ms-clear{width:0;height:0}.tabulator .tabulator-header .tabulator-col.tabulator-sortable .tabulator-col-title{padding-right:25px}.tabulator .tabulator-header .tabulator-col.tabulator-sortable:hover{cursor:pointer;background-color:#e6e6e6}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=none] .tabulator-col-content .tabulator-arrow{border-top:none;border-bottom:6px solid #bbb}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=asc] .tabulator-col-content .tabulator-arrow{border-top:none;border-bottom:6px solid #666}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=desc] .tabulator-col-content .tabulator-arrow{border-top:6px solid #666;border-bottom:none}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical .tabulator-col-content .tabulator-col-title{-ms-writing-mode:tb-rl;writing-mode:vertical-rl;text-orientation:mixed;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-col-vertical-flip .tabulator-col-title{transform:rotate(180deg)}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-sortable .tabulator-col-title{padding-right:0;padding-top:20px}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-sortable.tabulator-col-vertical-flip .tabulator-col-title{padding-right:0;padding-bottom:20px}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-sortable .tabulator-arrow{right:calc(50% - 6px)}.tabulator .tabulator-header .tabulator-frozen{display:inline-block;position:absolute;z-index:10}.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-left{border-right:2px solid #ddd}.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-right{border-left:2px solid #ddd}.tabulator .tabulator-header .tabulator-calcs-holder{box-sizing:border-box;min-width:600%;background:#f2f2f2!important;border-top:1px solid #ddd;border-bottom:1px solid #999;overflow:hidden}.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row{background:#f2f2f2!important}.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row .tabulator-col-resize-handle{display:none}.tabulator .tabulator-header .tabulator-frozen-rows-holder{min-width:600%}.tabulator .tabulator-header .tabulator-frozen-rows-holder:empty{display:none}.tabulator .tabulator-tableHolder{position:relative;width:100%;white-space:nowrap;overflow:auto;-webkit-overflow-scrolling:touch}.tabulator .tabulator-tableHolder:focus{outline:none}.tabulator .tabulator-tableHolder .tabulator-placeholder{box-sizing:border-box;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;width:100%}.tabulator .tabulator-tableHolder .tabulator-placeholder[tabulator-render-mode=virtual]{position:absolute;top:0;left:0;height:100%}.tabulator .tabulator-tableHolder .tabulator-placeholder span{display:inline-block;margin:0 auto;padding:10px;color:#000;font-weight:700;font-size:20px}.tabulator .tabulator-tableHolder .tabulator-table{position:relative;display:inline-block;background-color:#fff;white-space:nowrap;overflow:visible;color:#333}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.tabulator-calcs{font-weight:700;background:#f2f2f2!important}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.tabulator-calcs.tabulator-calcs-top{border-bottom:2px solid #ddd}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.tabulator-calcs.tabulator-calcs-bottom{border-top:2px solid #ddd}.tabulator .tabulator-col-resize-handle{position:absolute;right:0;top:0;bottom:0;width:5px}.tabulator .tabulator-col-resize-handle.prev{left:0;right:auto}.tabulator .tabulator-col-resize-handle:hover{cursor:ew-resize}.tabulator .tabulator-footer{padding:5px 10px;border-top:1px solid #999;background-color:#fff;text-align:right;color:#555;font-weight:700;white-space:nowrap;-ms-user-select:none;user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none}.tabulator .tabulator-footer .tabulator-calcs-holder{box-sizing:border-box;width:calc(100% + 20px);margin:-5px -10px 5px;text-align:left;background:#f2f2f2!important;border-bottom:1px solid #fff;border-top:1px solid #ddd;overflow:hidden}.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row{background:#f2f2f2!important}.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row .tabulator-col-resize-handle{display:none}.tabulator .tabulator-footer .tabulator-calcs-holder:only-child{margin-bottom:-5px;border-bottom:none}.tabulator .tabulator-footer .tabulator-paginator{color:#555;font-family:inherit;font-weight:inherit;font-size:inherit}.tabulator .tabulator-footer .tabulator-page-size{display:inline-block;margin:0 5px;padding:2px 5px;border:1px solid #aaa;border-radius:3px}.tabulator .tabulator-footer .tabulator-pages{margin:0 7px}.tabulator .tabulator-footer .tabulator-page{display:inline-block;margin:0 2px;padding:2px 5px;border:1px solid #aaa;border-radius:3px;background:hsla(0,0%,100%,.2)}.tabulator .tabulator-footer .tabulator-page.active{color:#d00}.tabulator .tabulator-footer .tabulator-page:disabled{opacity:.5}.tabulator .tabulator-footer .tabulator-page:not(.disabled):hover{cursor:pointer;background:rgba(0,0,0,.2);color:#fff}.tabulator .tabulator-loader{position:absolute;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;top:0;left:0;z-index:100;height:100%;width:100%;background:rgba(0,0,0,.4);text-align:center}.tabulator .tabulator-loader .tabulator-loader-msg{display:inline-block;margin:0 auto;padding:10px 20px;border-radius:10px;background:#fff;font-weight:700;font-size:16px}.tabulator .tabulator-loader .tabulator-loader-msg.tabulator-loading{border:4px solid #333;color:#000}.tabulator .tabulator-loader .tabulator-loader-msg.tabulator-error{border:4px solid #d00;color:#590000}.tabulator-row{position:relative;box-sizing:border-box;min-height:22px;border-bottom:1px solid #ddd}.tabulator-row,.tabulator-row:nth-child(2n){background-color:#fff}.tabulator-row.tabulator-selectable:hover{background-color:#bbb;cursor:pointer}.tabulator-row.tabulator-selected{background-color:#9abcea}.tabulator-row.tabulator-selected:hover{background-color:#769bcc;cursor:pointer}.tabulator-row.tabulator-moving{position:absolute;border-top:1px solid #ddd;border-bottom:1px solid #ddd;pointer-events:none!important;z-index:15}.tabulator-row .tabulator-row-resize-handle{position:absolute;right:0;bottom:0;left:0;height:5px}.tabulator-row .tabulator-row-resize-handle.prev{top:0;bottom:auto}.tabulator-row .tabulator-row-resize-handle:hover{cursor:ns-resize}.tabulator-row .tabulator-frozen{display:inline-block;position:absolute;background-color:inherit;z-index:10}.tabulator-row .tabulator-frozen.tabulator-frozen-left{border-right:2px solid #ddd}.tabulator-row .tabulator-frozen.tabulator-frozen-right{border-left:2px solid #ddd}.tabulator-row .tabulator-responsive-collapse{box-sizing:border-box;padding:5px;border-top:1px solid #ddd;border-bottom:1px solid #ddd}.tabulator-row .tabulator-responsive-collapse:empty{display:none}.tabulator-row .tabulator-responsive-collapse table{font-size:14px}.tabulator-row .tabulator-responsive-collapse table tr td{position:relative}.tabulator-row .tabulator-responsive-collapse table tr td:first-of-type{padding-right:10px}.tabulator-row .tabulator-cell{display:inline-block;position:relative;box-sizing:border-box;padding:4px;border-right:1px solid #ddd;vertical-align:middle;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tabulator-row .tabulator-cell:last-of-type{border-right:none}.tabulator-row .tabulator-cell.tabulator-editing{border:1px solid #1d68cd;padding:0}.tabulator-row .tabulator-cell.tabulator-editing input,.tabulator-row .tabulator-cell.tabulator-editing select{border:1px;background:transparent}.tabulator-row .tabulator-cell.tabulator-validation-fail{border:1px solid #d00}.tabulator-row .tabulator-cell.tabulator-validation-fail input,.tabulator-row .tabulator-cell.tabulator-validation-fail select{border:1px;background:transparent;color:#d00}.tabulator-row .tabulator-cell:first-child .tabulator-col-resize-handle.prev{display:none}.tabulator-row .tabulator-cell.tabulator-row-handle{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none}.tabulator-row .tabulator-cell.tabulator-row-handle .tabulator-row-handle-box{width:80%}.tabulator-row .tabulator-cell.tabulator-row-handle .tabulator-row-handle-box .tabulator-row-handle-bar{width:100%;height:3px;margin-top:2px;background:#666}.tabulator-row .tabulator-cell .tabulator-data-tree-branch{display:inline-block;vertical-align:middle;height:9px;width:7px;margin-top:-9px;margin-right:5px;border-bottom-left-radius:1px;border-left:2px solid #ddd;border-bottom:2px solid #ddd}.tabulator-row .tabulator-cell .tabulator-data-tree-control{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;vertical-align:middle;height:11px;width:11px;margin-right:5px;border:1px solid #333;border-radius:2px;background:rgba(0,0,0,.1);overflow:hidden}.tabulator-row .tabulator-cell .tabulator-data-tree-control:hover{cursor:pointer;background:rgba(0,0,0,.2)}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-collapse{display:inline-block;position:relative;height:7px;width:1px;background:transparent}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-collapse:after{position:absolute;content:"";left:-3px;top:3px;height:1px;width:7px;background:#333}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-expand{display:inline-block;position:relative;height:7px;width:1px;background:#333}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-expand:after{position:absolute;content:"";left:-3px;top:3px;height:1px;width:7px;background:#333}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;height:15px;width:15px;border-radius:20px;background:#666;color:#fff;font-weight:700;font-size:1.1em}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle:hover{opacity:.7}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle.open .tabulator-responsive-collapse-toggle-close{display:initial}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle.open .tabulator-responsive-collapse-toggle-open,.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle .tabulator-responsive-collapse-toggle-close{display:none}.tabulator-row .tabulator-cell .tabulator-traffic-light{display:inline-block;height:14px;width:14px;border-radius:14px}.tabulator-row.tabulator-group{box-sizing:border-box;border-bottom:1px solid #999;border-right:1px solid #ddd;border-top:1px solid #999;padding:5px;padding-left:10px;background:#fafafa;font-weight:700;min-width:100%}.tabulator-row.tabulator-group:hover{cursor:pointer;background-color:rgba(0,0,0,.1)}.tabulator-row.tabulator-group.tabulator-group-visible .tabulator-arrow{margin-right:10px;border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #666;border-bottom:0}.tabulator-row.tabulator-group.tabulator-group-level-1{padding-left:30px}.tabulator-row.tabulator-group.tabulator-group-level-2{padding-left:50px}.tabulator-row.tabulator-group.tabulator-group-level-3{padding-left:70px}.tabulator-row.tabulator-group.tabulator-group-level-4{padding-left:90px}.tabulator-row.tabulator-group.tabulator-group-level-5{padding-left:110px}.tabulator-row.tabulator-group .tabulator-group-toggle{display:inline-block}.tabulator-row.tabulator-group .tabulator-arrow{display:inline-block;width:0;height:0;margin-right:16px;border-top:6px solid transparent;border-bottom:6px solid transparent;border-right:0;border-left:6px solid #666;vertical-align:middle}.tabulator-row.tabulator-group span{margin-left:10px;color:#666}.tabulator-edit-select-list{position:absolute;display:inline-block;box-sizing:border-box;max-height:200px;background:#fff;border:1px solid #ddd;font-size:14px;overflow-y:auto;-webkit-overflow-scrolling:touch;z-index:10000}.tabulator-edit-select-list .tabulator-edit-select-list-item{padding:4px;color:#333}.tabulator-edit-select-list .tabulator-edit-select-list-item.active{color:#fff;background:#1d68cd}.tabulator-edit-select-list .tabulator-edit-select-list-item:hover{cursor:pointer;color:#fff;background:#1d68cd}.tabulator-edit-select-list .tabulator-edit-select-list-group{border-bottom:1px solid #ddd;padding:4px;padding-top:6px;color:#333;font-weight:700}.tabulator-print-fullscreen{position:absolute;top:0;bottom:0;left:0;right:0;z-index:10000}body.tabulator-print-fullscreen-hide>:not(.tabulator-print-fullscreen){display:none!important}.tabulator-print-table{border-collapse:collapse} -/*# sourceMappingURL=tabulator_simple.min.css.map */ diff --git a/cookbook/static/tabulator/tabulator_site.min.css b/cookbook/static/tabulator/tabulator_site.min.css deleted file mode 100644 index 7ee17eaf..00000000 --- a/cookbook/static/tabulator/tabulator_site.min.css +++ /dev/null @@ -1,3 +0,0 @@ -/* Tabulator v4.5.3 (c) Oliver Folkerd */ -.tabulator{position:relative;border-bottom:5px solid #222;background-color:#fff;font-size:14px;text-align:left;overflow:hidden;transform:translatez(0)}.tabulator[tabulator-layout=fitDataFill] .tabulator-tableHolder .tabulator-table{min-width:100%}.tabulator[tabulator-layout=fitColumns] .tabulator-row .tabulator-cell:last-of-type{border-right:none}.tabulator.tabulator-block-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tabulator .tabulator-header{position:relative;box-sizing:border-box;width:100%;border-bottom:3px solid #3fb449;background-color:#222;color:#fff;font-weight:700;white-space:nowrap;overflow:hidden;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none}.tabulator .tabulator-header.tabulator-header-hidden{display:none}.tabulator .tabulator-header .tabulator-col{display:inline-block;position:relative;box-sizing:border-box;border-right:1px solid #aaa;background-color:#222;text-align:left;vertical-align:bottom;overflow:hidden}.tabulator .tabulator-header .tabulator-col.tabulator-moving{position:absolute;border:1px solid #3fb449;background:#090909;pointer-events:none}.tabulator .tabulator-header .tabulator-col .tabulator-col-content{box-sizing:border-box;position:relative;padding:8px}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title{box-sizing:border-box;width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:bottom}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title .tabulator-title-editor{box-sizing:border-box;width:100%;border:1px solid #999;padding:1px;background:#fff}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-arrow{display:inline-block;position:absolute;top:14px;right:8px;width:0;height:0;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #bbb}.tabulator .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols{position:relative;display:-ms-flexbox;display:flex;border-top:1px solid #aaa;overflow:hidden}.tabulator .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols .tabulator-col:last-child{margin-right:-1px}.tabulator .tabulator-header .tabulator-col:first-child .tabulator-col-resize-handle.prev{display:none}.tabulator .tabulator-header .tabulator-col.ui-sortable-helper{position:absolute;background-color:#222!important;border:1px solid #aaa}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter{position:relative;box-sizing:border-box;margin-top:2px;width:100%;text-align:center}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter textarea{height:auto!important}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter svg{margin-top:3px}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter input::-ms-clear{width:0;height:0}.tabulator .tabulator-header .tabulator-col.tabulator-sortable .tabulator-col-title{padding-right:25px}.tabulator .tabulator-header .tabulator-col.tabulator-sortable:hover{cursor:pointer;background-color:#090909}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=none] .tabulator-col-content .tabulator-arrow{border-top:none;border-bottom:6px solid #bbb}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=asc] .tabulator-col-content .tabulator-arrow{border-top:none;border-bottom:6px solid #3fb449}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=desc] .tabulator-col-content .tabulator-arrow{border-top:6px solid #3fb449;border-bottom:none}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical .tabulator-col-content .tabulator-col-title{-ms-writing-mode:tb-rl;writing-mode:vertical-rl;text-orientation:mixed;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-col-vertical-flip .tabulator-col-title{transform:rotate(180deg)}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-sortable .tabulator-col-title{padding-right:0;padding-top:20px}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-sortable.tabulator-col-vertical-flip .tabulator-col-title{padding-right:0;padding-bottom:20px}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-sortable .tabulator-arrow{right:calc(50% - 6px)}.tabulator .tabulator-header .tabulator-frozen{display:inline-block;position:absolute;z-index:10}.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-left{border-right:2px solid #aaa}.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-right{border-left:2px solid #aaa}.tabulator .tabulator-header .tabulator-calcs-holder{box-sizing:border-box;min-width:600%;background:#3c3c3c!important;border-top:1px solid #aaa;overflow:hidden}.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row{background:#3c3c3c!important}.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row .tabulator-col-resize-handle{display:none}.tabulator .tabulator-header .tabulator-frozen-rows-holder{min-width:600%}.tabulator .tabulator-header .tabulator-frozen-rows-holder:empty{display:none}.tabulator .tabulator-tableHolder{position:relative;width:100%;white-space:nowrap;overflow:auto;-webkit-overflow-scrolling:touch}.tabulator .tabulator-tableHolder:focus{outline:none}.tabulator .tabulator-tableHolder .tabulator-placeholder{box-sizing:border-box;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;width:100%}.tabulator .tabulator-tableHolder .tabulator-placeholder[tabulator-render-mode=virtual]{position:absolute;top:0;left:0;height:100%}.tabulator .tabulator-tableHolder .tabulator-placeholder span{display:inline-block;margin:0 auto;padding:10px;color:#3fb449;font-weight:700;font-size:20px}.tabulator .tabulator-tableHolder .tabulator-table{position:relative;display:inline-block;background-color:#fff;white-space:nowrap;overflow:visible;color:#333}.tabulator .tabulator-tableHolder .tabulator-table .tabulator-row.tabulator-calcs{font-weight:700;background:#484848!important;color:#fff}.tabulator .tabulator-footer{padding:5px 10px;padding-top:8px;border-top:3px solid #3fb449;background-color:#222;text-align:right;color:#222;font-weight:700;white-space:nowrap;-ms-user-select:none;user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none}.tabulator .tabulator-footer .tabulator-calcs-holder{box-sizing:border-box;width:calc(100% + 20px);margin:-8px -10px 8px;text-align:left;background:#3c3c3c!important;border-bottom:1px solid #aaa;overflow:hidden}.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row{background:#3c3c3c!important;color:#fff!important}.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row .tabulator-col-resize-handle{display:none}.tabulator .tabulator-footer .tabulator-calcs-holder:only-child{margin-bottom:-5px;border-bottom:none}.tabulator .tabulator-footer .tabulator-paginator label{color:#fff}.tabulator .tabulator-footer .tabulator-page-size{display:inline-block;margin:0 5px;padding:2px 5px;border:1px solid #aaa;border-radius:3px}.tabulator .tabulator-footer .tabulator-pages{margin:0 7px}.tabulator .tabulator-footer .tabulator-page{display:inline-block;margin:0 2px;padding:2px 5px;border:1px solid #aaa;border-radius:3px;background:#fff;color:#222;font-family:inherit;font-weight:inherit;font-size:inherit}.tabulator .tabulator-footer .tabulator-page.active{color:#3fb449}.tabulator .tabulator-footer .tabulator-page:disabled{opacity:.5}.tabulator .tabulator-footer .tabulator-page:not(.disabled):hover{cursor:pointer;background:rgba(0,0,0,.2);color:#fff}.tabulator .tabulator-col-resize-handle{position:absolute;right:0;top:0;bottom:0;width:5px}.tabulator .tabulator-col-resize-handle.prev{left:0;right:auto}.tabulator .tabulator-col-resize-handle:hover{cursor:ew-resize}.tabulator .tabulator-loader{position:absolute;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;top:0;left:0;z-index:100;height:100%;width:100%;background:rgba(0,0,0,.4);text-align:center}.tabulator .tabulator-loader .tabulator-loader-msg{display:inline-block;margin:0 auto;padding:10px 20px;border-radius:10px;background:#fff;font-weight:700;font-size:16px}.tabulator .tabulator-loader .tabulator-loader-msg.tabulator-loading{border:4px solid #333;color:#000}.tabulator .tabulator-loader .tabulator-loader-msg.tabulator-error{border:4px solid #d00;color:#590000}.tabulator-row{position:relative;box-sizing:border-box;min-height:22px;background-color:#fff}.tabulator-row.tabulator-row-even{background-color:#efefef}.tabulator-row.tabulator-selectable:hover{background-color:#bbb;cursor:pointer}.tabulator-row.tabulator-selected{background-color:#9abcea}.tabulator-row.tabulator-selected:hover{background-color:#769bcc;cursor:pointer}.tabulator-row.tabulator-row-moving{border:1px solid #000;background:#fff}.tabulator-row.tabulator-moving{position:absolute;border-top:1px solid #aaa;border-bottom:1px solid #aaa;pointer-events:none!important;z-index:15}.tabulator-row .tabulator-row-resize-handle{position:absolute;right:0;bottom:0;left:0;height:5px}.tabulator-row .tabulator-row-resize-handle.prev{top:0;bottom:auto}.tabulator-row .tabulator-row-resize-handle:hover{cursor:ns-resize}.tabulator-row .tabulator-frozen{display:inline-block;position:absolute;background-color:inherit;z-index:10}.tabulator-row .tabulator-frozen.tabulator-frozen-left{border-right:2px solid #aaa}.tabulator-row .tabulator-frozen.tabulator-frozen-right{border-left:2px solid #aaa}.tabulator-row .tabulator-responsive-collapse{box-sizing:border-box;padding:5px;border-top:1px solid #aaa;border-bottom:1px solid #aaa}.tabulator-row .tabulator-responsive-collapse:empty{display:none}.tabulator-row .tabulator-responsive-collapse table{font-size:14px}.tabulator-row .tabulator-responsive-collapse table tr td{position:relative}.tabulator-row .tabulator-responsive-collapse table tr td:first-of-type{padding-right:10px}.tabulator-row .tabulator-cell{display:inline-block;position:relative;box-sizing:border-box;padding:6px;border-right:1px solid #aaa;vertical-align:middle;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tabulator-row .tabulator-cell.tabulator-editing{border:1px solid #1d68cd;padding:0}.tabulator-row .tabulator-cell.tabulator-editing input,.tabulator-row .tabulator-cell.tabulator-editing select{border:1px;background:transparent}.tabulator-row .tabulator-cell.tabulator-validation-fail{border:1px solid #d00}.tabulator-row .tabulator-cell.tabulator-validation-fail input,.tabulator-row .tabulator-cell.tabulator-validation-fail select{border:1px;background:transparent;color:#d00}.tabulator-row .tabulator-cell:first-child .tabulator-col-resize-handle.prev{display:none}.tabulator-row .tabulator-cell.tabulator-row-handle{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none}.tabulator-row .tabulator-cell.tabulator-row-handle .tabulator-row-handle-box{width:80%}.tabulator-row .tabulator-cell.tabulator-row-handle .tabulator-row-handle-box .tabulator-row-handle-bar{width:100%;height:3px;margin-top:2px;background:#3fb449}.tabulator-row .tabulator-cell .tabulator-data-tree-branch{display:inline-block;vertical-align:middle;height:9px;width:7px;margin-top:-9px;margin-right:5px;border-bottom-left-radius:1px;border-left:2px solid #aaa;border-bottom:2px solid #aaa}.tabulator-row .tabulator-cell .tabulator-data-tree-control{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;vertical-align:middle;height:11px;width:11px;margin-right:5px;border:1px solid #333;border-radius:2px;background:rgba(0,0,0,.1);overflow:hidden}.tabulator-row .tabulator-cell .tabulator-data-tree-control:hover{cursor:pointer;background:rgba(0,0,0,.2)}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-collapse{display:inline-block;position:relative;height:7px;width:1px;background:transparent}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-collapse:after{position:absolute;content:"";left:-3px;top:3px;height:1px;width:7px;background:#333}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-expand{display:inline-block;position:relative;height:7px;width:1px;background:#333}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-expand:after{position:absolute;content:"";left:-3px;top:3px;height:1px;width:7px;background:#333}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;height:15px;width:15px;border-radius:20px;background:#666;color:#fff;font-weight:700;font-size:1.1em}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle:hover{opacity:.7}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle.open .tabulator-responsive-collapse-toggle-close{display:initial}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle.open .tabulator-responsive-collapse-toggle-open,.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle .tabulator-responsive-collapse-toggle-close{display:none}.tabulator-row .tabulator-cell .tabulator-traffic-light{display:inline-block;height:14px;width:14px;border-radius:14px}.tabulator-row.tabulator-group{box-sizing:border-box;border-right:1px solid #aaa;border-top:1px solid #000;border-bottom:2px solid #3fb449;padding:5px;padding-left:10px;background:#222;color:#fff;font-weight:700;min-width:100%}.tabulator-row.tabulator-group:hover{cursor:pointer;background-color:#090909}.tabulator-row.tabulator-group.tabulator-group-visible .tabulator-arrow{margin-right:10px;border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #3fb449;border-bottom:0}.tabulator-row.tabulator-group.tabulator-group-level-1{padding-left:30px}.tabulator-row.tabulator-group.tabulator-group-level-2{padding-left:50px}.tabulator-row.tabulator-group.tabulator-group-level-3{padding-left:70px}.tabulator-row.tabulator-group.tabulator-group-level-4{padding-left:90px}.tabulator-row.tabulator-group.tabulator-group-level-5{padding-left:110px}.tabulator-row.tabulator-group .tabulator-group-toggle{display:inline-block}.tabulator-row.tabulator-group .tabulator-arrow{display:inline-block;width:0;height:0;margin-right:16px;border-top:6px solid transparent;border-bottom:6px solid transparent;border-right:0;border-left:6px solid #3fb449;vertical-align:middle}.tabulator-row.tabulator-group span{margin-left:10px;color:#3fb449}.tabulator-edit-select-list{position:absolute;display:inline-block;box-sizing:border-box;max-height:200px;background:#fff;border:1px solid #aaa;font-size:14px;overflow-y:auto;-webkit-overflow-scrolling:touch;z-index:10000}.tabulator-edit-select-list .tabulator-edit-select-list-item{padding:4px;color:#333}.tabulator-edit-select-list .tabulator-edit-select-list-item.active{color:#fff;background:#1d68cd}.tabulator-edit-select-list .tabulator-edit-select-list-item:hover{cursor:pointer;color:#fff;background:#1d68cd}.tabulator-edit-select-list .tabulator-edit-select-list-group{border-bottom:1px solid #aaa;padding:4px;padding-top:6px;color:#333;font-weight:700}.tabulator-print-fullscreen{position:absolute;top:0;bottom:0;left:0;right:0;z-index:10000}body.tabulator-print-fullscreen-hide>:not(.tabulator-print-fullscreen){display:none!important}.tabulator-print-table{border-collapse:collapse} -/*# sourceMappingURL=tabulator_site.min.css.map */ diff --git a/cookbook/static/themes/tandoor.min.css b/cookbook/static/themes/tandoor.min.css index 9dc091af..f329e4e8 100644 --- a/cookbook/static/themes/tandoor.min.css +++ b/cookbook/static/themes/tandoor.min.css @@ -10461,4 +10461,9 @@ textarea, input:not([type="submit"]):not([class="multiselect__input"]):not([clas .form-control-search { font-size: 20px; +} + +.ghost { + opacity: 0.5 !important; + background: #b98766 !important; } \ No newline at end of file diff --git a/cookbook/static/vue/css/chunk-vendors.css b/cookbook/static/vue/css/chunk-vendors.css deleted file mode 100644 index f00bc613..00000000 --- a/cookbook/static/vue/css/chunk-vendors.css +++ /dev/null @@ -1,9 +0,0 @@ -@charset "UTF-8"; -/*! - * BootstrapVue Custom CSS (https://bootstrap-vue.org) - */.bv-no-focus-ring:focus{outline:none}@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: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{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(#fff,#000);mask-image:radial-gradient(#fff,#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:.6rem}.b-avatar-sm .b-avatar-badge{font-size:.42rem}.b-avatar-lg{width:3.5rem;height:3.5rem}.b-avatar-lg .b-avatar-text{font-size:1.4rem}.b-avatar-lg .b-avatar-badge{font-size:.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.dropleft .dropdown-toggle.dropdown-toggle-no-caret:before,.dropdown:not(.dropleft) .dropdown-toggle.dropdown-toggle-no-caret:after{display:none!important}.dropdown .dropdown-menu:focus{outline:none}.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{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{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(1.5em + .75rem);padding-left:.25rem;margin:0;border:0;outline:0;background:transparent;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(1.5em + .5rem)}.b-form-btn-label-control.form-control>.form-control.form-control-lg{min-height:calc(1.5em + 1rem)}.input-group.input-group-sm .b-form-btn-label-control.form-control>.form-control{min-height:calc(1.5em + .5rem);padding-top:.25rem;padding-bottom:.25rem}.input-group.input-group-lg .b-form-btn-label-control.form-control>.form-control{min-height:calc(1.5em + 1rem);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,.b-custom-control-lg .custom-file-input,.b-custom-control-lg .custom-file-label,.input-group-lg.custom-file,.input-group-lg .custom-file-input,.input-group-lg .custom-file-label{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,.b-custom-control-sm .custom-file-input,.b-custom-control-sm .custom-file-label,.input-group-sm.custom-file,.input-group-sm .custom-file-input,.input-group-sm .custom-file-label{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-file+.custom-range,.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,.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{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,.custom-range.is-valid::-ms-track-upper,.was-validated .custom-range:valid::-ms-track-lower,.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,.custom-range.is-invalid::-ms-track-upper,.was-validated .custom-range:invalid::-ms-track-lower,.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{transform:scale(1.5)}.b-rating[dir=rtl] .b-rating-star-half{transform:scaleX(-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{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-lg .b-form-tag,.form-control-sm .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] .popover-header:before,.b-popover-primary.bs-popover-auto[x-placement^=bottom]>.arrow:after,.b-popover-primary.bs-popover-bottom .popover-header:before,.b-popover-primary.bs-popover-bottom>.arrow:after{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] .popover-header:before,.b-popover-secondary.bs-popover-auto[x-placement^=bottom]>.arrow:after,.b-popover-secondary.bs-popover-bottom .popover-header:before,.b-popover-secondary.bs-popover-bottom>.arrow:after{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] .popover-header:before,.b-popover-success.bs-popover-auto[x-placement^=bottom]>.arrow:after,.b-popover-success.bs-popover-bottom .popover-header:before,.b-popover-success.bs-popover-bottom>.arrow:after{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] .popover-header:before,.b-popover-info.bs-popover-auto[x-placement^=bottom]>.arrow:after,.b-popover-info.bs-popover-bottom .popover-header:before,.b-popover-info.bs-popover-bottom>.arrow:after{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] .popover-header:before,.b-popover-warning.bs-popover-auto[x-placement^=bottom]>.arrow:after,.b-popover-warning.bs-popover-bottom .popover-header:before,.b-popover-warning.bs-popover-bottom>.arrow:after{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] .popover-header:before,.b-popover-danger.bs-popover-auto[x-placement^=bottom]>.arrow:after,.b-popover-danger.bs-popover-bottom .popover-header:before,.b-popover-danger.bs-popover-bottom>.arrow:after{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] .popover-header:before,.b-popover-light.bs-popover-auto[x-placement^=bottom]>.arrow:after,.b-popover-light.bs-popover-bottom .popover-header:before,.b-popover-light.bs-popover-bottom>.arrow:after{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] .popover-header:before,.b-popover-dark.bs-popover-auto[x-placement^=bottom]>.arrow:after,.b-popover-dark.bs-popover-bottom .popover-header:before,.b-popover-dark.bs-popover-bottom>.arrow:after{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:1035}.b-sidebar-backdrop{left:0;z-index:-1;width:100vw;opacity:.6}.b-sidebar,.b-sidebar-backdrop{position:fixed;top:0;height:100vh}.b-sidebar{display:flex;flex-direction:column;width:320px;max-width:100%;max-height:100%;margin:0;outline:0;transform:translateX(0)}.b-sidebar.slide{transition: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){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){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(#fff,#000);mask-image:radial-gradient(#fff,#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:1px solid #ced4da;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,hsla(0,0%,100%,.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:none;-webkit-animation:none;animation:none}}@-webkit-keyframes b-skeleton-animate-wave{0%{transform:translateX(-100%)}to{transform:translateX(100%)}}@keyframes b-skeleton-animate-wave{0%{transform:translateX(-100%)}to{transform:translateX(100%)}}.b-skeleton-animate-fade{-webkit-animation:b-skeleton-animate-fade .875s ease-in-out infinite alternate;animation:b-skeleton-animate-fade .875s ease-in-out infinite alternate}@media (prefers-reduced-motion:reduce){.b-skeleton-animate-fade{-webkit-animation:none;animation:none}}@-webkit-keyframes b-skeleton-animate-fade{0%{opacity:1}to{opacity:.4}}@keyframes b-skeleton-animate-fade{0%{opacity:1}to{opacity:.4}}.b-skeleton-animate-throb{-webkit-animation:b-skeleton-animate-throb .875s ease-in infinite alternate;animation:b-skeleton-animate-throb .875s ease-in infinite alternate}@media (prefers-reduced-motion:reduce){.b-skeleton-animate-throb{-webkit-animation:none;animation:none}}@-webkit-keyframes b-skeleton-animate-throb{0%{transform:scale(1)}to{transform:scale(.975)}}@keyframes b-skeleton-animate-throb{0%{transform:scale(1)}to{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:hsla(0,0%,100%,.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(hsla(0,0%,100%,.075),hsla(0,0%,100%,.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:sticky){.b-table-sticky-header>.table.b-table>thead>tr>th{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: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(hsla(0,0%,100%,.05),hsla(0,0%,100%,.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(hsla(0,0%,100%,.075),hsla(0,0%,100%,.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 .375rem 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 .375rem 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;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='101' height='101' preserveAspectRatio='none'%3E%3Cpath opacity='.3' d='M51 1l25 23 24 22H1l25-22zm0 100l25-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;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='101' height='101' preserveAspectRatio='none'%3E%3Cpath d='M51 1l25 23 24 22H1l25-22z'/%3E%3Cpath 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;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='101' height='101' preserveAspectRatio='none'%3E%3Cpath opacity='.3' d='M51 1l25 23 24 22H1l25-22z'/%3E%3Cpath 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;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='101' height='101' preserveAspectRatio='none'%3E%3Cpath fill='%23fff' opacity='.3' d='M51 1l25 23 24 22H1l25-22zm0 100l25-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;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='101' height='101' preserveAspectRatio='none'%3E%3Cpath fill='%23fff' d='M51 1l25 23 24 22H1l25-22z'/%3E%3Cpath fill='%23fff' 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;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='101' height='101' preserveAspectRatio='none'%3E%3Cpath fill='%23fff' opacity='.3' d='M51 1l25 23 24 22H1l25-22z'/%3E%3Cpath fill='%23fff' 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;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='101' height='101' preserveAspectRatio='none'%3E%3Cpath fill='%23fff' opacity='.3' d='M51 1l25 23 24 22H1l25-22zm0 100l25-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;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='101' height='101' preserveAspectRatio='none'%3E%3Cpath fill='%23fff' d='M51 1l25 23 24 22H1l25-22z'/%3E%3Cpath fill='%23fff' 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;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='101' height='101' preserveAspectRatio='none'%3E%3Cpath fill='%23fff' opacity='.3' d='M51 1l25 23 24 22H1l25-22z'/%3E%3Cpath fill='%23fff' 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 .15rem 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 .15rem 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>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,.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 .5rem 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:60%;padding:0 0 0 .5rem;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,.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>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,.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 .5rem 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:60%;padding:0 0 0 .5rem;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,.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>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,.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 .5rem 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:60%;padding:0 0 0 .5rem;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,.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>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,.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 .5rem 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:60%;padding:0 0 0 .5rem;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,.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>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,.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 .5rem 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:60%;padding:0 0 0 .5rem;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,.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[aria-disabled=true] output,.b-time[aria-readonly=true] output,.b-time output.disabled{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:hsla(0,0%,100%,.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:hsla(0,0%,100%,.85);border-color:rgba(253,253,254,.85);color:#818182}.b-toast-light .toast .toast-header{color:#818182;background-color:hsla(0,0%,99.6%,.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-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-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:transform .175s}.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:.175s}.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:.175s}.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{transform-origin:center;-webkit-animation:b-icon-animation-cylon .75s ease-in-out infinite alternate;animation:b-icon-animation-cylon .75s ease-in-out infinite alternate}@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{transform-origin:center;-webkit-animation:b-icon-animation-cylon-vertical .75s ease-in-out infinite alternate;animation:b-icon-animation-cylon-vertical .75s ease-in-out infinite alternate}@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{transform-origin:center;-webkit-animation:b-icon-animation-fade .75s ease-in-out infinite alternate;animation:b-icon-animation-fade .75s ease-in-out infinite alternate}@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{transform-origin:center;-webkit-animation:b-icon-animation-spin 2s linear infinite normal;animation:b-icon-animation-spin 2s linear infinite normal}@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{transform-origin:center;animation:b-icon-animation-spin 2s linear infinite reverse}@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{transform-origin:center;-webkit-animation:b-icon-animation-spin 1s steps(8) infinite normal;animation:b-icon-animation-spin 1s steps(8) infinite normal}@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{transform-origin:center;animation:b-icon-animation-spin 1s steps(8) infinite reverse}@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{transform-origin:center;-webkit-animation:b-icon-animation-throb .75s ease-in-out infinite alternate;animation:b-icon-animation-throb .75s ease-in-out infinite alternate}@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%{transform:translateX(-25%)}to{transform:translateX(25%)}}@keyframes b-icon-animation-cylon{0%{transform:translateX(-25%)}to{transform:translateX(25%)}}@-webkit-keyframes b-icon-animation-cylon-vertical{0%{transform:translateY(25%)}to{transform:translateY(-25%)}}@keyframes b-icon-animation-cylon-vertical{0%{transform:translateY(25%)}to{transform:translateY(-25%)}}@-webkit-keyframes b-icon-animation-fade{0%{opacity:.1}to{opacity:1}}@keyframes b-icon-animation-fade{0%{opacity:.1}to{opacity:1}}@-webkit-keyframes b-icon-animation-spin{0%{transform:rotate(0deg)}to{transform:rotate(359deg)}}@keyframes b-icon-animation-spin{0%{transform:rotate(0deg)}to{transform:rotate(359deg)}}@-webkit-keyframes b-icon-animation-throb{0%{opacity:.5;transform:scale(.5)}to{opacity:1;transform:scale(1)}}@keyframes b-icon-animation-throb{0%{opacity:.5;transform:scale(.5)}to{opacity: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}fieldset[disabled] .multiselect{pointer-events:none}.multiselect__spinner{position:absolute;right:1px;top:1px;width:48px;height:35px;background:#fff;display:block}.multiselect__spinner:after,.multiselect__spinner:before{position:absolute;content:"";top:50%;left:50%;margin:-8px 0 0 -8px;width:16px;height:16px;border-radius:100%;border:2px solid transparent;border-top-color:#41b883;box-shadow:0 0 0 1px transparent}.multiselect__spinner:before{-webkit-animation:spinning 2.4s cubic-bezier(.41,.26,.2,.62);animation:spinning 2.4s cubic-bezier(.41,.26,.2,.62);-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.multiselect__spinner:after{-webkit-animation:spinning 2.4s cubic-bezier(.51,.09,.21,.8);animation:spinning 2.4s cubic-bezier(.51,.09,.21,.8);-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.multiselect__loading-enter-active,.multiselect__loading-leave-active{transition:opacity .4s ease-in-out;opacity:1}.multiselect__loading-enter,.multiselect__loading-leave-active{opacity:0}.multiselect,.multiselect__input,.multiselect__single{font-family:inherit;font-size:16px;touch-action:manipulation}.multiselect{box-sizing:content-box;display:block;position:relative;width:100%;min-height:40px;text-align:left;color:#35495e}.multiselect *{box-sizing:border-box}.multiselect:focus{outline:none}.multiselect--disabled{background:#ededed;pointer-events:none;opacity:.6}.multiselect--active{z-index:50}.multiselect--active:not(.multiselect--above) .multiselect__current,.multiselect--active:not(.multiselect--above) .multiselect__input,.multiselect--active:not(.multiselect--above) .multiselect__tags{border-bottom-left-radius:0;border-bottom-right-radius:0}.multiselect--active .multiselect__select{transform:rotate(180deg)}.multiselect--above.multiselect--active .multiselect__current,.multiselect--above.multiselect--active .multiselect__input,.multiselect--above.multiselect--active .multiselect__tags{border-top-left-radius:0;border-top-right-radius:0}.multiselect__input,.multiselect__single{position:relative;display:inline-block;min-height:20px;line-height:20px;border:none;border-radius:5px;background:#fff;padding:0 0 0 5px;width:100%;transition:border .1s ease;box-sizing:border-box;margin-bottom:8px;vertical-align:top}.multiselect__input:-ms-input-placeholder{color:#35495e}.multiselect__input::-moz-placeholder{color:#35495e}.multiselect__input::placeholder{color:#35495e}.multiselect__tag~.multiselect__input,.multiselect__tag~.multiselect__single{width:auto}.multiselect__input:hover,.multiselect__single:hover{border-color:#cfcfcf}.multiselect__input:focus,.multiselect__single:focus{border-color:#a8a8a8;outline:none}.multiselect__single{padding-left:5px;margin-bottom:8px}.multiselect__tags-wrap{display:inline}.multiselect__tags{min-height:40px;display:block;padding:8px 40px 0 8px;border-radius:5px;border:1px solid #e8e8e8;background:#fff;font-size:14px}.multiselect__tag{position:relative;display:inline-block;padding:4px 26px 4px 10px;border-radius:5px;margin-right:10px;color:#fff;line-height:1;background:#41b883;margin-bottom:5px;white-space:nowrap;overflow:hidden;max-width:100%;text-overflow:ellipsis}.multiselect__tag-icon{cursor:pointer;margin-left:7px;position:absolute;right:0;top:0;bottom:0;font-weight:700;font-style:normal;width:22px;text-align:center;line-height:22px;transition:all .2s ease;border-radius:5px}.multiselect__tag-icon:after{content:"\D7";color:#266d4d;font-size:14px}.multiselect__tag-icon:focus,.multiselect__tag-icon:hover{background:#369a6e}.multiselect__tag-icon:focus:after,.multiselect__tag-icon:hover:after{color:#fff}.multiselect__current{min-height:40px;overflow:hidden;padding:8px 30px 0 12px;white-space:nowrap;border-radius:5px;border:1px solid #e8e8e8}.multiselect__current,.multiselect__select{line-height:16px;box-sizing:border-box;display:block;margin:0;text-decoration:none;cursor:pointer}.multiselect__select{position:absolute;width:40px;height:38px;right:1px;top:1px;padding:4px 8px;text-align:center;transition:transform .2s ease}.multiselect__select:before{position:relative;right:0;top:65%;color:#999;margin-top:4px;border-color:#999 transparent transparent;border-style:solid;border-width:5px 5px 0;content:""}.multiselect__placeholder{color:#adadad;display:inline-block;margin-bottom:10px;padding-top:2px}.multiselect--active .multiselect__placeholder{display:none}.multiselect__content-wrapper{position:absolute;display:block;background:#fff;width:100%;max-height:240px;overflow:auto;border:1px solid #e8e8e8;border-top:none;border-bottom-left-radius:5px;border-bottom-right-radius:5px;z-index:50;-webkit-overflow-scrolling:touch}.multiselect__content{list-style:none;display:inline-block;padding:0;margin:0;min-width:100%;vertical-align:top}.multiselect--above .multiselect__content-wrapper{bottom:100%;border-bottom-left-radius:0;border-bottom-right-radius:0;border-top-left-radius:5px;border-top-right-radius:5px;border-bottom:none;border-top:1px solid #e8e8e8}.multiselect__content::webkit-scrollbar{display:none}.multiselect__element{display:block}.multiselect__option{display:block;padding:12px;min-height:40px;line-height:16px;text-decoration:none;text-transform:none;vertical-align:middle;position:relative;cursor:pointer;white-space:nowrap}.multiselect__option:after{top:0;right:0;position:absolute;line-height:40px;padding-right:12px;padding-left:20px;font-size:13px}.multiselect__option--highlight{background:#41b883;outline:none;color:#fff}.multiselect__option--highlight:after{content:attr(data-select);background:#41b883;color:#fff}.multiselect__option--selected{background:#f3f3f3;color:#35495e;font-weight:700}.multiselect__option--selected:after{content:attr(data-selected);color:silver}.multiselect__option--selected.multiselect__option--highlight{background:#ff6a6a;color:#fff}.multiselect__option--selected.multiselect__option--highlight:after{background:#ff6a6a;content:attr(data-deselect);color:#fff}.multiselect--disabled .multiselect__current,.multiselect--disabled .multiselect__select{background:#ededed;color:#a6a6a6}.multiselect__option--disabled{background:#ededed!important;color:#a6a6a6!important;cursor:text;pointer-events:none}.multiselect__option--group{background:#ededed;color:#35495e}.multiselect__option--group.multiselect__option--highlight{background:#35495e;color:#fff}.multiselect__option--group.multiselect__option--highlight:after{background:#35495e}.multiselect__option--disabled.multiselect__option--highlight{background:#dedede}.multiselect__option--group-selected.multiselect__option--highlight{background:#ff6a6a;color:#fff}.multiselect__option--group-selected.multiselect__option--highlight:after{background:#ff6a6a;content:attr(data-deselect);color:#fff}.multiselect-enter-active,.multiselect-leave-active{transition:all .15s ease}.multiselect-enter,.multiselect-leave-active{opacity:0}.multiselect__strong{margin-bottom:8px;line-height:20px;display:inline-block;vertical-align:top}[dir=rtl] .multiselect{text-align:right}[dir=rtl] .multiselect__select{right:auto;left:1px}[dir=rtl] .multiselect__tags{padding:8px 8px 0 40px}[dir=rtl] .multiselect__content{text-align:right}[dir=rtl] .multiselect__option:after{right:auto;left:0}[dir=rtl] .multiselect__clear{right:auto;left:12px}[dir=rtl] .multiselect__spinner{right:auto;left:1px}@-webkit-keyframes spinning{0%{transform:rotate(0)}to{transform:rotate(2turn)}}@keyframes spinning{0%{transform:rotate(0)}to{transform:rotate(2turn)}} -/*! - * vue-treeselect v0.4.0 | (c) 2017-2019 Riophae Lee - * Released under the MIT License. - * https://vue-treeselect.js.org/ - */.vue-treeselect-helper-hide{display:none}.vue-treeselect-helper-zoom-effect-off{transform:none!important}@-webkit-keyframes vue-treeselect-animation-fade-in{0%{opacity:0}}@keyframes vue-treeselect-animation-fade-in{0%{opacity:0}}@-webkit-keyframes vue-treeselect-animation-bounce{0%,to{transform:scale(0)}50%{transform:scale(1)}}@keyframes vue-treeselect-animation-bounce{0%,to{transform:scale(0)}50%{transform:scale(1)}}@-webkit-keyframes vue-treeselect-animation-rotate{to{transform:rotate(1turn)}}@keyframes vue-treeselect-animation-rotate{to{transform:rotate(1turn)}}.vue-treeselect__multi-value-item--transition-enter-active,.vue-treeselect__multi-value-item--transition-leave-active{transition-duration:.2s;transition-property:transform,opacity}.vue-treeselect__multi-value-item--transition-enter-active{transition-timing-function:cubic-bezier(.075,.82,.165,1)}.vue-treeselect__multi-value-item--transition-leave-active{transition-timing-function:cubic-bezier(.215,.61,.355,1);position:absolute}.vue-treeselect__multi-value-item--transition-enter,.vue-treeselect__multi-value-item--transition-leave-to{transform:scale(.7);opacity:0}.vue-treeselect__multi-value-item--transition-move{transition:transform .2s cubic-bezier(.165,.84,.44,1)}.vue-treeselect{position:relative;text-align:left}[dir=rtl] .vue-treeselect{text-align:right}.vue-treeselect div,.vue-treeselect span{box-sizing:border-box}.vue-treeselect svg{fill:currentColor}.vue-treeselect__control{padding-left:5px;padding-right:5px;display:table;table-layout:fixed;width:100%;height:36px;border:1px solid #ddd;border-radius:5px;background:#fff;transition-duration:.2s;transition-property:border-color,box-shadow,width,height,background-color,opacity;transition-timing-function:cubic-bezier(.215,.61,.355,1)}.vue-treeselect:not(.vue-treeselect--disabled):not(.vue-treeselect--focused) .vue-treeselect__control:hover{border-color:#cfcfcf}.vue-treeselect--focused:not(.vue-treeselect--open) .vue-treeselect__control{border-color:#039be5;box-shadow:0 0 0 3px rgba(3,155,229,.1)}.vue-treeselect--disabled .vue-treeselect__control{background-color:#f9f9f9}.vue-treeselect--open .vue-treeselect__control{border-color:#cfcfcf}.vue-treeselect--open.vue-treeselect--open-below .vue-treeselect__control{border-bottom-left-radius:0;border-bottom-right-radius:0}.vue-treeselect--open.vue-treeselect--open-above .vue-treeselect__control{border-top-left-radius:0;border-top-right-radius:0}.vue-treeselect__multi-value,.vue-treeselect__value-container{width:100%;vertical-align:middle}.vue-treeselect__value-container{display:table-cell;position:relative}.vue-treeselect--searchable:not(.vue-treeselect--disabled) .vue-treeselect__value-container{cursor:text}.vue-treeselect__multi-value{display:inline-block}.vue-treeselect--has-value .vue-treeselect__multi-value{margin-bottom:5px}.vue-treeselect__placeholder,.vue-treeselect__single-value{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-left:5px;padding-right:5px;position:absolute;top:0;right:0;bottom:0;left:0;line-height:34px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}.vue-treeselect__placeholder{color:#bdbdbd}.vue-treeselect__single-value{color:#333}.vue-treeselect--focused.vue-treeselect--searchable .vue-treeselect__single-value{color:#bdbdbd}.vue-treeselect--disabled .vue-treeselect__single-value{position:static}.vue-treeselect__multi-value-item-container{display:inline-block;padding-top:5px;padding-right:5px;vertical-align:top}[dir=rtl] .vue-treeselect__multi-value-item-container{padding-right:0;padding-left:5px}.vue-treeselect__multi-value-item{display:inline-table;padding:2px 0;border:1px solid transparent;border-radius:2px;font-size:12px;vertical-align:top}.vue-treeselect:not(.vue-treeselect--disabled) .vue-treeselect__multi-value-item:not(.vue-treeselect__multi-value-item-disabled):hover .vue-treeselect__multi-value-item:not(.vue-treeselect__multi-value-item-new) .vue-treeselect__multi-value-item:not(.vue-treeselect__multi-value-item-new):hover,.vue-treeselect__multi-value-item{cursor:pointer;background:#e3f2fd;color:#039be5}.vue-treeselect__multi-value-item.vue-treeselect__multi-value-item-disabled{cursor:default;background:#f5f5f5;color:#757575}.vue-treeselect--disabled .vue-treeselect__multi-value-item{cursor:default;background:#fff;border-color:#e5e5e5;color:#555}.vue-treeselect__multi-value-item.vue-treeselect__multi-value-item-new,.vue-treeselect__multi-value-item.vue-treeselect__multi-value-item-new:hover{background:#e8f5e9}.vue-treeselect__multi-value-label,.vue-treeselect__value-remove{display:table-cell;padding:0 5px;vertical-align:middle}.vue-treeselect__value-remove{color:#039be5;padding-left:5px;border-left:1px solid #fff;line-height:0}[dir=rtl] .vue-treeselect__value-remove{border-left:0 none;border-right:1px solid #fff}.vue-treeselect__multi-value-item:hover .vue-treeselect__value-remove{color:#e53935}.vue-treeselect--disabled .vue-treeselect__value-remove,.vue-treeselect__multi-value-item-disabled .vue-treeselect__value-remove{display:none}.vue-treeselect__value-remove>svg{width:6px;height:6px}.vue-treeselect__multi-value-label{padding-right:5px;white-space:pre-line;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vue-treeselect__limit-tip{display:inline-block;padding-top:5px;padding-right:5px;vertical-align:top}[dir=rtl] .vue-treeselect__limit-tip{padding-right:0;padding-left:5px}.vue-treeselect__limit-tip-text{cursor:default;display:block;margin:2px 0;padding:1px 0;color:#bdbdbd;font-size:12px;font-weight:600}.vue-treeselect__input-container{display:block;max-width:100%;outline:none}.vue-treeselect--single .vue-treeselect__input-container{font-size:inherit;height:100%}.vue-treeselect--multi .vue-treeselect__input-container{display:inline-block;font-size:12px;vertical-align:top}.vue-treeselect--searchable .vue-treeselect__input-container{padding-left:5px;padding-right:5px}.vue-treeselect--searchable.vue-treeselect--multi.vue-treeselect--has-value .vue-treeselect__input-container{padding-top:5px;padding-left:0}[dir=rtl] .vue-treeselect--searchable.vue-treeselect--multi.vue-treeselect--has-value .vue-treeselect__input-container{padding-left:5px;padding-right:0}.vue-treeselect--disabled .vue-treeselect__input-container{display:none}.vue-treeselect__input,.vue-treeselect__sizer{margin:0;line-height:inherit;font-family:inherit;font-size:inherit}.vue-treeselect__input{max-width:100%;margin:0;padding:0;border:0;outline:none;box-sizing:content-box;box-shadow:none;background:none transparent;line-height:1;vertical-align:middle}.vue-treeselect__input::-ms-clear{display:none}.vue-treeselect--single .vue-treeselect__input{width:100%;height:100%}.vue-treeselect--multi .vue-treeselect__input{padding-top:3px;padding-bottom:3px}.vue-treeselect--has-value .vue-treeselect__input{line-height:inherit;vertical-align:top}.vue-treeselect__sizer{position:absolute;top:0;left:0;visibility:hidden;height:0;overflow:scroll;white-space:pre}.vue-treeselect__x-container{display:table-cell;vertical-align:middle;width:20px;text-align:center;line-height:0;cursor:pointer;color:#ccc;-webkit-animation:vue-treeselect-animation-fade-in .2s cubic-bezier(.075,.82,.165,1);animation:vue-treeselect-animation-fade-in .2s cubic-bezier(.075,.82,.165,1)}.vue-treeselect__x-container:hover{color:#e53935}.vue-treeselect__x{width:8px;height:8px}.vue-treeselect__control-arrow-container{display:table-cell;vertical-align:middle;width:20px;text-align:center;line-height:0;cursor:pointer}.vue-treeselect--disabled .vue-treeselect__control-arrow-container{cursor:default}.vue-treeselect__control-arrow{width:9px;height:9px;color:#ccc}.vue-treeselect:not(.vue-treeselect--disabled) .vue-treeselect__control-arrow-container:hover .vue-treeselect__control-arrow{color:#616161}.vue-treeselect--disabled .vue-treeselect__control-arrow{opacity:.35}.vue-treeselect__control-arrow--rotated{transform:rotate(180deg)}.vue-treeselect__menu-container{position:absolute;left:0;width:100%;overflow:visible;transition:0s}.vue-treeselect--open-below:not(.vue-treeselect--append-to-body) .vue-treeselect__menu-container{top:100%}.vue-treeselect--open-above:not(.vue-treeselect--append-to-body) .vue-treeselect__menu-container{bottom:100%}.vue-treeselect__menu{cursor:default;padding-top:5px;padding-bottom:5px;display:block;position:absolute;overflow-x:hidden;overflow-y:auto;width:auto;border:1px solid #cfcfcf;background:#fff;line-height:180%;-webkit-overflow-scrolling:touch}.vue-treeselect--open-below .vue-treeselect__menu{border-bottom-left-radius:5px;border-bottom-right-radius:5px;top:0;margin-top:-1px;border-top-color:#f2f2f2;box-shadow:0 1px 0 rgba(0,0,0,.06)}.vue-treeselect--open-above .vue-treeselect__menu{border-top-left-radius:5px;border-top-right-radius:5px;bottom:0;margin-bottom:-1px;border-bottom-color:#f2f2f2}.vue-treeselect__indent-level-0 .vue-treeselect__option{padding-left:5px}[dir=rtl] .vue-treeselect__indent-level-0 .vue-treeselect__option{padding-left:5px;padding-right:5px}.vue-treeselect__indent-level-0 .vue-treeselect__tip{padding-left:25px}[dir=rtl] .vue-treeselect__indent-level-0 .vue-treeselect__tip{padding-left:5px;padding-right:25px}.vue-treeselect__indent-level-1 .vue-treeselect__option{padding-left:25px}[dir=rtl] .vue-treeselect__indent-level-1 .vue-treeselect__option{padding-left:5px;padding-right:25px}.vue-treeselect__indent-level-1 .vue-treeselect__tip{padding-left:45px}[dir=rtl] .vue-treeselect__indent-level-1 .vue-treeselect__tip{padding-left:5px;padding-right:45px}.vue-treeselect__indent-level-2 .vue-treeselect__option{padding-left:45px}[dir=rtl] .vue-treeselect__indent-level-2 .vue-treeselect__option{padding-left:5px;padding-right:45px}.vue-treeselect__indent-level-2 .vue-treeselect__tip{padding-left:65px}[dir=rtl] .vue-treeselect__indent-level-2 .vue-treeselect__tip{padding-left:5px;padding-right:65px}.vue-treeselect__indent-level-3 .vue-treeselect__option{padding-left:65px}[dir=rtl] .vue-treeselect__indent-level-3 .vue-treeselect__option{padding-left:5px;padding-right:65px}.vue-treeselect__indent-level-3 .vue-treeselect__tip{padding-left:85px}[dir=rtl] .vue-treeselect__indent-level-3 .vue-treeselect__tip{padding-left:5px;padding-right:85px}.vue-treeselect__indent-level-4 .vue-treeselect__option{padding-left:85px}[dir=rtl] .vue-treeselect__indent-level-4 .vue-treeselect__option{padding-left:5px;padding-right:85px}.vue-treeselect__indent-level-4 .vue-treeselect__tip{padding-left:105px}[dir=rtl] .vue-treeselect__indent-level-4 .vue-treeselect__tip{padding-left:5px;padding-right:105px}.vue-treeselect__indent-level-5 .vue-treeselect__option{padding-left:105px}[dir=rtl] .vue-treeselect__indent-level-5 .vue-treeselect__option{padding-left:5px;padding-right:105px}.vue-treeselect__indent-level-5 .vue-treeselect__tip{padding-left:125px}[dir=rtl] .vue-treeselect__indent-level-5 .vue-treeselect__tip{padding-left:5px;padding-right:125px}.vue-treeselect__indent-level-6 .vue-treeselect__option{padding-left:125px}[dir=rtl] .vue-treeselect__indent-level-6 .vue-treeselect__option{padding-left:5px;padding-right:125px}.vue-treeselect__indent-level-6 .vue-treeselect__tip{padding-left:145px}[dir=rtl] .vue-treeselect__indent-level-6 .vue-treeselect__tip{padding-left:5px;padding-right:145px}.vue-treeselect__indent-level-7 .vue-treeselect__option{padding-left:145px}[dir=rtl] .vue-treeselect__indent-level-7 .vue-treeselect__option{padding-left:5px;padding-right:145px}.vue-treeselect__indent-level-7 .vue-treeselect__tip{padding-left:165px}[dir=rtl] .vue-treeselect__indent-level-7 .vue-treeselect__tip{padding-left:5px;padding-right:165px}.vue-treeselect__indent-level-8 .vue-treeselect__option{padding-left:165px}[dir=rtl] .vue-treeselect__indent-level-8 .vue-treeselect__option{padding-left:5px;padding-right:165px}.vue-treeselect__indent-level-8 .vue-treeselect__tip{padding-left:185px}[dir=rtl] .vue-treeselect__indent-level-8 .vue-treeselect__tip{padding-left:5px;padding-right:185px}.vue-treeselect__option{padding-left:5px;padding-right:5px;display:table;table-layout:fixed;width:100%}.vue-treeselect__option--highlight{background:#f5f5f5}.vue-treeselect--single .vue-treeselect__option--selected{background:#e3f2fd;font-weight:600}.vue-treeselect--single .vue-treeselect__option--selected:hover{background:#e3f2fd}.vue-treeselect__option--hide{display:none}.vue-treeselect__option-arrow-container,.vue-treeselect__option-arrow-placeholder{display:table-cell;vertical-align:middle;width:20px;text-align:center;line-height:0}.vue-treeselect__option-arrow-container{cursor:pointer}.vue-treeselect__option-arrow{display:inline-block;width:9px;height:9px;color:#ccc;vertical-align:middle;transition:transform .2s cubic-bezier(.19,1,.22,1);transform:rotate(-90deg)}[dir=rtl] .vue-treeselect__option-arrow{transform:rotate(90deg)}.vue-treeselect--branch-nodes-disabled .vue-treeselect__option:hover .vue-treeselect__option-arrow,.vue-treeselect__option-arrow-container:hover .vue-treeselect__option-arrow{color:#616161}.vue-treeselect__option-arrow--rotated,[dir=rtl] .vue-treeselect__option-arrow--rotated{transform:rotate(0)}.vue-treeselect__option-arrow--rotated.vue-treeselect__option-arrow--prepare-enter{transform:rotate(-90deg)!important}[dir=rtl] .vue-treeselect__option-arrow--rotated.vue-treeselect__option-arrow--prepare-enter{transform:rotate(90deg)!important}.vue-treeselect__label-container{display:table-cell;vertical-align:middle;cursor:pointer;display:table;width:100%;table-layout:fixed;color:inherit}.vue-treeselect__option--disabled .vue-treeselect__label-container{cursor:not-allowed;color:rgba(0,0,0,.25)}.vue-treeselect__checkbox-container{display:table-cell;width:20px;min-width:20px;height:100%;text-align:center;vertical-align:middle}.vue-treeselect__checkbox{display:block;margin:auto;width:12px;height:12px;border-width:1px;border-style:solid;border-radius:2px;position:relative;transition:all .2s cubic-bezier(.075,.82,.165,1)}.vue-treeselect__check-mark,.vue-treeselect__minus-mark{display:block;position:absolute;left:1px;top:1px;background-repeat:no-repeat;opacity:0;transition:all .2s ease}.vue-treeselect__minus-mark{width:8px;height:8px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAgMAAAC5YVYYAAAACVBMVEUAAAD///////9zeKVjAAAAAnRSTlMAuLMp9oYAAAAPSURBVAjXY4CDrJUgBAMAGaECJ9dz3BAAAAAASUVORK5CYII=);background-size:8px 8px}@media (-webkit-min-device-pixel-ratio:1.5),(min-resolution:1.5dppx){.vue-treeselect__minus-mark{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAgMAAABinRfyAAAADFBMVEUAAAD///////////84wDuoAAAAA3RSTlMAyTzPIdReAAAAGUlEQVQI12PAD+b///+Nof7//79gAsLFCwAx/w4blADeeQAAAABJRU5ErkJggg==)}}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.vue-treeselect__minus-mark{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAgMAAABinRfyAAAADFBMVEUAAAD///////////84wDuoAAAAA3RSTlMAyTzPIdReAAAAGUlEQVQI12PAD+b///+Nof7//79gAsLFCwAx/w4blADeeQAAAABJRU5ErkJggg==)}}@media (-webkit-min-device-pixel-ratio:3),(min-resolution:288dpi){.vue-treeselect__minus-mark{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYBAMAAAASWSDLAAAAD1BMVEUAAAD///////////////+PQt5oAAAABHRSTlMAy2EFIuWxUgAAACRJREFUGNNjGBBgJOICBY7KDCoucODEAJSAS6FwUJShGjAQAADBPRGrK2/FhgAAAABJRU5ErkJggg==)}}.vue-treeselect__checkbox--indeterminate>.vue-treeselect__minus-mark{opacity:1}.vue-treeselect__checkbox--disabled .vue-treeselect__minus-mark{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAgMAAAC5YVYYAAAACVBMVEUAAADi4uLh4eHOxeSRAAAAAnRSTlMAuLMp9oYAAAAPSURBVAjXY4CDrJUgBAMAGaECJ9dz3BAAAAAASUVORK5CYII=)}@media (-webkit-min-device-pixel-ratio:1.5),(min-resolution:1.5dppx){.vue-treeselect__checkbox--disabled .vue-treeselect__minus-mark{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAgMAAABinRfyAAAADFBMVEUAAADi4uLi4uLh4eE5RQaIAAAAA3RSTlMAyTzPIdReAAAAGUlEQVQI12PAD+b///+Nof7//79gAsLFCwAx/w4blADeeQAAAABJRU5ErkJggg==)}}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.vue-treeselect__checkbox--disabled .vue-treeselect__minus-mark{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAgMAAABinRfyAAAADFBMVEUAAADi4uLi4uLh4eE5RQaIAAAAA3RSTlMAyTzPIdReAAAAGUlEQVQI12PAD+b///+Nof7//79gAsLFCwAx/w4blADeeQAAAABJRU5ErkJggg==)}}@media (-webkit-min-device-pixel-ratio:3),(min-resolution:288dpi){.vue-treeselect__checkbox--disabled .vue-treeselect__minus-mark{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYBAMAAAASWSDLAAAAD1BMVEUAAADh4eHg4ODNzc3h4eEYfw2wAAAABHRSTlMAy2EFIuWxUgAAACRJREFUGNNjGBBgJOICBY7KDCoucODEAJSAS6FwUJShGjAQAADBPRGrK2/FhgAAAABJRU5ErkJggg==)}}.vue-treeselect__check-mark{width:8px;height:8px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAMAAADz0U65AAAAQlBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////8IX9KGAAAAFXRSTlMA8u24NxILB+Tawb6jiH1zRz0xIQIIP3GUAAAAMklEQVQI1y3FtQEAMQDDQD+EGbz/qkEVOpyEOP6PudKjZNSXn4Jm2CKRdBKzSLsFWl8fMG0Bl6Jk1rMAAAAASUVORK5CYII=);background-size:8px 8px;transform:scaleY(.125)}@media (-webkit-min-device-pixel-ratio:1.5),(min-resolution:1.5dppx){.vue-treeselect__check-mark{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAYFBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98JRy6AAAAH3RSTlMAzu4sDenl38fBvo1OMyIdEQrj1cSihX5hYFpHNycIcQOASAAAAF9JREFUGNN9zEcOgDAMRFHTS0LvNfe/JRmHKAIJ/mqeLJn+k9uDtaeUeFnFziGsBucUTirrprfe81RqZ3Bb6hPWeuZwDFOHyf+ig9CCzQ7INBn7bG5kF+QSt13BHNJnF7AaCT4Y+CW7AAAAAElFTkSuQmCC)}}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.vue-treeselect__check-mark{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAYFBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////98JRy6AAAAH3RSTlMAzu4sDenl38fBvo1OMyIdEQrj1cSihX5hYFpHNycIcQOASAAAAF9JREFUGNN9zEcOgDAMRFHTS0LvNfe/JRmHKAIJ/mqeLJn+k9uDtaeUeFnFziGsBucUTirrprfe81RqZ3Bb6hPWeuZwDFOHyf+ig9CCzQ7INBn7bG5kF+QSt13BHNJnF7AaCT4Y+CW7AAAAAElFTkSuQmCC)}}@media (-webkit-min-device-pixel-ratio:3),(min-resolution:288dpi){.vue-treeselect__check-mark{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAAWlBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////9ZMre9AAAAHXRSTlMA/PiJhGNI9XlEHJB/b2ldV08+Oibk49vPp6QhAYgGBuwAAACCSURBVCjPrdHdDoIwDAXgTWAqCigo/+f9X5OwnoUwtis4V92XNWladUl+rzQPeQJAN2EHxoOnsPn7/oYk8fxBv08Rr/deOH/aZ2Nm8ZJ+s573QGfWKnNuZGzWm3+lv2V3pcU1XQ385/yjmBoM3Z+dXvlbYLLD3ujhTaOM3KaIXvNkFkuSEvYy1LqOAAAAAElFTkSuQmCC)}}.vue-treeselect__checkbox--checked>.vue-treeselect__check-mark{opacity:1;transform:scaleY(1)}.vue-treeselect__checkbox--disabled .vue-treeselect__check-mark{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAMAAADz0U65AAAAP1BMVEUAAADj4+Pf39/h4eHh4eHh4eHk5OTh4eHg4ODi4uLh4eHh4eHg4ODh4eHh4eHg4ODh4eHh4eHp6en////h4eFqcyvUAAAAFHRSTlMAOQfy7bgS5NrBvqOIfXNHMSELAgQ/iFsAAAA2SURBVAjXY4AANjYIzcjMAaVFuBkY+RkEWERYmRjYRXjANAOfiIgIFxNIAa8IpxBEi6AwiAQAK2MBd7xY8csAAAAASUVORK5CYII=)}@media (-webkit-min-device-pixel-ratio:1.5),(min-resolution:1.5dppx){.vue-treeselect__checkbox--disabled .vue-treeselect__check-mark{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAXVBMVEUAAADh4eHh4eHh4eHi4uLb29vh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLj4+Pi4uLk5OTo6Ojh4eHh4eHi4uLg4ODg4ODh4eHg4ODh4eHf39/g4OD////h4eEzIk+wAAAAHnRSTlMAzu6/LA3p5eLZx8ONTjYiHRIKooV+YWBaRzEnCANnm5rnAAAAZElEQVQY033P2wqAIAyA4VWaaWrnc/n+j5mbhBjUf7WPoTD47TJb4i5zTr/sRDRHuyFaoWX7uK/RlbctlPEuyI1f4WY9yQINEkf6rzzo8YIzmUFoCs7J1EjeIaa9bXIEmzl8dgOZEAj/+2IvzAAAAABJRU5ErkJggg==)}}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.vue-treeselect__checkbox--disabled .vue-treeselect__check-mark{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAXVBMVEUAAADh4eHh4eHh4eHi4uLb29vh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLj4+Pi4uLk5OTo6Ojh4eHh4eHi4uLg4ODg4ODh4eHg4ODh4eHf39/g4OD////h4eEzIk+wAAAAHnRSTlMAzu6/LA3p5eLZx8ONTjYiHRIKooV+YWBaRzEnCANnm5rnAAAAZElEQVQY033P2wqAIAyA4VWaaWrnc/n+j5mbhBjUf7WPoTD47TJb4i5zTr/sRDRHuyFaoWX7uK/RlbctlPEuyI1f4WY9yQINEkf6rzzo8YIzmUFoCs7J1EjeIaa9bXIEmzl8dgOZEAj/+2IvzAAAAABJRU5ErkJggg==)}}@media (-webkit-min-device-pixel-ratio:3),(min-resolution:288dpi){.vue-treeselect__checkbox--disabled .vue-treeselect__check-mark{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAAUVBMVEUAAADh4eHh4eHh4eHh4eHi4uLi4uLh4eHh4eHh4eHf39/j4+Ph4eHh4eHh4eHg4ODi4uLh4eHh4eHi4uLh4eHh4eHh4eHh4eHh4eH////h4eF3FMFTAAAAGnRSTlMA+/eJhGhfSHE9JBzz5KaQf3pXT0Xbz0I5AYDw8F0AAAB+SURBVCjPrdHbDoMgEEVRKAii1dZe9fz/hxplTiKIT7qfYCWTEEZdUvOwbckNAD2WHeh3brHW5f5EzGQ+iN+b1Gt6KPvtv16Dn6JX9M9ya3/A1yfu5dlyduL6Hec7mXY6ddXLPP2lpABGZ8PWXfYLTJxZekVhhl7eTX24zZPNKXoRC7zQLjUAAAAASUVORK5CYII=)}}.vue-treeselect__checkbox--unchecked{border-color:#e0e0e0;background:#fff}.vue-treeselect__label-container:hover .vue-treeselect__checkbox--unchecked{border-color:#039be5;background:#fff}.vue-treeselect__checkbox--checked,.vue-treeselect__checkbox--indeterminate,.vue-treeselect__label-container:hover .vue-treeselect__checkbox--checked,.vue-treeselect__label-container:hover .vue-treeselect__checkbox--indeterminate{border-color:#039be5;background:#039be5}.vue-treeselect__checkbox--disabled,.vue-treeselect__label-container:hover .vue-treeselect__checkbox--disabled{border-color:#e0e0e0;background-color:#f7f7f7}.vue-treeselect__label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:table-cell;padding-left:5px;max-width:100%;vertical-align:middle;cursor:inherit}[dir=rtl] .vue-treeselect__label{padding-left:0;padding-right:5px}.vue-treeselect__count{margin-left:5px;font-weight:400;opacity:.6}[dir=rtl] .vue-treeselect__count{margin-left:0;margin-right:5px}.vue-treeselect__tip{padding-left:5px;padding-right:5px;display:table;table-layout:fixed;width:100%;color:#757575}.vue-treeselect__tip-text{display:table-cell;vertical-align:middle;padding-left:5px;padding-right:5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%;font-size:12px}.vue-treeselect__error-tip .vue-treeselect__retry{cursor:pointer;margin-left:5px;font-style:normal;font-weight:600;text-decoration:none;color:#039be5}[dir=rtl] .vue-treeselect__error-tip .vue-treeselect__retry{margin-left:0;margin-right:5px}.vue-treeselect__icon-container{display:table-cell;vertical-align:middle;width:20px;text-align:center;line-height:0}.vue-treeselect--single .vue-treeselect__icon-container{padding-left:5px}[dir=rtl] .vue-treeselect--single .vue-treeselect__icon-container{padding-left:0;padding-right:5px}.vue-treeselect__icon-warning{display:block;margin:auto;border-radius:50%;position:relative;width:12px;height:12px;background:#fb8c00}.vue-treeselect__icon-warning:after{display:block;position:absolute;content:"";left:5px;top:2.5px;width:2px;height:1px;border:0 solid #fff;border-top-width:5px;border-bottom-width:1px}.vue-treeselect__icon-error{display:block;margin:auto;border-radius:50%;position:relative;width:12px;height:12px;background:#e53935}.vue-treeselect__icon-error:after,.vue-treeselect__icon-error:before{display:block;position:absolute;content:"";background:#fff;transform:rotate(45deg)}.vue-treeselect__icon-error:before{width:6px;height:2px;left:3px;top:5px}.vue-treeselect__icon-error:after{width:2px;height:6px;left:5px;top:3px}.vue-treeselect__icon-loader{display:block;margin:auto;position:relative;width:12px;height:12px;text-align:center;-webkit-animation:vue-treeselect-animation-rotate 1.6s linear infinite;animation:vue-treeselect-animation-rotate 1.6s linear infinite}.vue-treeselect__icon-loader:after,.vue-treeselect__icon-loader:before{border-radius:50%;position:absolute;content:"";left:0;top:0;display:block;width:100%;height:100%;opacity:.6;-webkit-animation:vue-treeselect-animation-bounce 1.6s ease-in-out infinite;animation:vue-treeselect-animation-bounce 1.6s ease-in-out infinite}.vue-treeselect__icon-loader:before{background:#039be5}.vue-treeselect__icon-loader:after{background:#b3e5fc;-webkit-animation-delay:-.8s;animation-delay:-.8s}.vue-treeselect__menu-placeholder{display:none}.vue-treeselect__portal-target{position:absolute;display:block;left:0;top:0;height:0;width:0;padding:0;margin:0;border:0;overflow:visible;box-sizing:border-box} \ No newline at end of file diff --git a/cookbook/static/vue/css/keyword_list_view.css b/cookbook/static/vue/css/keyword_list_view.css deleted file mode 100644 index e8c03418..00000000 --- a/cookbook/static/vue/css/keyword_list_view.css +++ /dev/null @@ -1 +0,0 @@ -.shake[data-v-d5a65348]{-webkit-animation:shake-data-v-d5a65348 .82s cubic-bezier(.36,.07,.19,.97) both;animation:shake-data-v-d5a65348 .82s cubic-bezier(.36,.07,.19,.97) both;transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden;perspective:1000px}@-webkit-keyframes shake-data-v-d5a65348{10%,90%{transform:translate3d(-1px,0,0)}20%,80%{transform:translate3d(2px,0,0)}30%,50%,70%{transform:translate3d(-4px,0,0)}40%,60%{transform:translate3d(4px,0,0)}}@keyframes shake-data-v-d5a65348{10%,90%{transform:translate3d(-1px,0,0)}20%,80%{transform:translate3d(2px,0,0)}30%,50%,70%{transform:translate3d(-4px,0,0)}40%,60%{transform:translate3d(4px,0,0)}} \ No newline at end of file diff --git a/cookbook/static/vue/import_response_view.html b/cookbook/static/vue/import_response_view.html deleted file mode 100644 index 27032984..00000000 --- a/cookbook/static/vue/import_response_view.html +++ /dev/null @@ -1 +0,0 @@ -Vue App
\ No newline at end of file diff --git a/cookbook/static/vue/js/chunk-vendors.js b/cookbook/static/vue/js/chunk-vendors.js deleted file mode 100644 index e42c96a3..00000000 --- a/cookbook/static/vue/js/chunk-vendors.js +++ /dev/null @@ -1,366 +0,0 @@ -(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-vendors"],{"0056":function(e,t,n){"use strict";n.d(t,"a",(function(){return i})),n.d(t,"b",(function(){return r})),n.d(t,"c",(function(){return o})),n.d(t,"d",(function(){return a})),n.d(t,"e",(function(){return s})),n.d(t,"f",(function(){return c})),n.d(t,"g",(function(){return u})),n.d(t,"h",(function(){return d})),n.d(t,"i",(function(){return l})),n.d(t,"j",(function(){return f})),n.d(t,"k",(function(){return h})),n.d(t,"l",(function(){return p})),n.d(t,"m",(function(){return m})),n.d(t,"n",(function(){return b})),n.d(t,"o",(function(){return g})),n.d(t,"p",(function(){return v})),n.d(t,"q",(function(){return y})),n.d(t,"r",(function(){return _})),n.d(t,"s",(function(){return O})),n.d(t,"t",(function(){return j})),n.d(t,"u",(function(){return w})),n.d(t,"v",(function(){return k})),n.d(t,"w",(function(){return M})),n.d(t,"x",(function(){return x})),n.d(t,"y",(function(){return L})),n.d(t,"z",(function(){return S})),n.d(t,"A",(function(){return T})),n.d(t,"B",(function(){return D})),n.d(t,"C",(function(){return A})),n.d(t,"D",(function(){return P})),n.d(t,"E",(function(){return Y})),n.d(t,"F",(function(){return C})),n.d(t,"G",(function(){return E})),n.d(t,"H",(function(){return H})),n.d(t,"I",(function(){return $})),n.d(t,"J",(function(){return I})),n.d(t,"K",(function(){return F})),n.d(t,"L",(function(){return B})),n.d(t,"M",(function(){return N})),n.d(t,"N",(function(){return R})),n.d(t,"O",(function(){return z})),n.d(t,"P",(function(){return V})),n.d(t,"Q",(function(){return W})),n.d(t,"R",(function(){return U})),n.d(t,"S",(function(){return G})),n.d(t,"T",(function(){return q})),n.d(t,"U",(function(){return J})),n.d(t,"V",(function(){return K})),n.d(t,"W",(function(){return X})),n.d(t,"X",(function(){return Z})),n.d(t,"Y",(function(){return Q})),n.d(t,"Z",(function(){return ee})),n.d(t,"ab",(function(){return te})),n.d(t,"bb",(function(){return ne})),n.d(t,"eb",(function(){return ie})),n.d(t,"fb",(function(){return re})),n.d(t,"gb",(function(){return oe})),n.d(t,"hb",(function(){return ae})),n.d(t,"ib",(function(){return se})),n.d(t,"db",(function(){return ce})),n.d(t,"cb",(function(){return ue}));var i="activate-tab",r="blur",o="cancel",a="change",s="changed",c="click",u="close",d="context",l="context-changed",f="destroyed",h="disable",p="disabled",m="dismissed",b="dismiss-count-down",g="enable",v="enabled",y="filtered",_="first",O="focusin",j="focusout",w="head-clicked",k="hidden",M="hide",x="img-error",L="input",S="last",T="mouseenter",D="mouseleave",A="next",P="ok",Y="open",C="page-click",E="paused",H="prev",$="refresh",I="refreshed",F="remove",B="row-clicked",N="row-contextmenu",R="row-dblclicked",z="row-hovered",V="row-middle-clicked",W="row-selected",U="row-unhovered",G="selected",q="show",J="shown",K="sliding-end",X="sliding-start",Z="sort-changed",Q="tag-state",ee="toggle",te="unpaused",ne="update",ie="hook:beforeDestroy",re="hook:destroyed",oe="update:",ae="bv",se="::",ce={passive:!0},ue={passive:!0,capture:!1}},"00ee":function(e,t,n){var i=n("b622"),r=i("toStringTag"),o={};o[r]="z",e.exports="[object z]"===String(o)},"00fd":function(e,t,n){var i=n("9e69"),r=Object.prototype,o=r.hasOwnProperty,a=r.toString,s=i?i.toStringTag:void 0;function c(e){var t=o.call(e,s),n=e[s];try{e[s]=void 0;var i=!0}catch(c){}var r=a.call(e);return i&&(t?e[s]=n:delete e[s]),r}e.exports=c},"010e":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("uz-latn",{months:"Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr".split("_"),monthsShort:"Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek".split("_"),weekdays:"Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba".split("_"),weekdaysShort:"Yak_Dush_Sesh_Chor_Pay_Jum_Shan".split("_"),weekdaysMin:"Ya_Du_Se_Cho_Pa_Ju_Sha".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[Bugun soat] LT [da]",nextDay:"[Ertaga] LT [da]",nextWeek:"dddd [kuni soat] LT [da]",lastDay:"[Kecha soat] LT [da]",lastWeek:"[O'tgan] dddd [kuni soat] LT [da]",sameElse:"L"},relativeTime:{future:"Yaqin %s ichida",past:"Bir necha %s oldin",s:"soniya",ss:"%d soniya",m:"bir daqiqa",mm:"%d daqiqa",h:"bir soat",hh:"%d soat",d:"bir kun",dd:"%d kun",M:"bir oy",MM:"%d oy",y:"bir yil",yy:"%d yil"},week:{dow:1,doy:7}});return t}))},"02fb":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("ml",{months:"ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ".split("_"),monthsShort:"ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.".split("_"),monthsParseExact:!0,weekdays:"ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച".split("_"),weekdaysShort:"ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി".split("_"),weekdaysMin:"ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ".split("_"),longDateFormat:{LT:"A h:mm -നു",LTS:"A h:mm:ss -നു",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm -നു",LLLL:"dddd, D MMMM YYYY, A h:mm -നു"},calendar:{sameDay:"[ഇന്ന്] LT",nextDay:"[നാളെ] LT",nextWeek:"dddd, LT",lastDay:"[ഇന്നലെ] LT",lastWeek:"[കഴിഞ്ഞ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s കഴിഞ്ഞ്",past:"%s മുൻപ്",s:"അൽപ നിമിഷങ്ങൾ",ss:"%d സെക്കൻഡ്",m:"ഒരു മിനിറ്റ്",mm:"%d മിനിറ്റ്",h:"ഒരു മണിക്കൂർ",hh:"%d മണിക്കൂർ",d:"ഒരു ദിവസം",dd:"%d ദിവസം",M:"ഒരു മാസം",MM:"%d മാസം",y:"ഒരു വർഷം",yy:"%d വർഷം"},meridiemParse:/രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i,meridiemHour:function(e,t){return 12===e&&(e=0),"രാത്രി"===t&&e>=4||"ഉച്ച കഴിഞ്ഞ്"===t||"വൈകുന്നേരം"===t?e+12:e},meridiem:function(e,t,n){return e<4?"രാത്രി":e<12?"രാവിലെ":e<17?"ഉച്ച കഴിഞ്ഞ്":e<20?"വൈകുന്നേരം":"രാത്രി"}});return t}))},"0366":function(e,t,n){var i=n("1c0b");e.exports=function(e,t,n){if(i(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,i){return e.call(t,n,i)};case 3:return function(n,i,r){return e.call(t,n,i,r)}}return function(){return e.apply(t,arguments)}}},"03ec":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("cv",{months:"кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав".split("_"),monthsShort:"кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш".split("_"),weekdays:"вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун".split("_"),weekdaysShort:"выр_тун_ытл_юн_кӗҫ_эрн_шӑм".split("_"),weekdaysMin:"вр_тн_ыт_юн_кҫ_эр_шм".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]",LLL:"YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm",LLLL:"dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm"},calendar:{sameDay:"[Паян] LT [сехетре]",nextDay:"[Ыран] LT [сехетре]",lastDay:"[Ӗнер] LT [сехетре]",nextWeek:"[Ҫитес] dddd LT [сехетре]",lastWeek:"[Иртнӗ] dddd LT [сехетре]",sameElse:"L"},relativeTime:{future:function(e){var t=/сехет$/i.exec(e)?"рен":/ҫул$/i.exec(e)?"тан":"ран";return e+t},past:"%s каялла",s:"пӗр-ик ҫеккунт",ss:"%d ҫеккунт",m:"пӗр минут",mm:"%d минут",h:"пӗр сехет",hh:"%d сехет",d:"пӗр кун",dd:"%d кун",M:"пӗр уйӑх",MM:"%d уйӑх",y:"пӗр ҫул",yy:"%d ҫул"},dayOfMonthOrdinalParse:/\d{1,2}-мӗш/,ordinal:"%d-мӗш",week:{dow:1,doy:7}});return t}))},"0558":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -function t(e){return e%100===11||e%10!==1}function n(e,n,i,r){var o=e+" ";switch(i){case"s":return n||r?"nokkrar sekúndur":"nokkrum sekúndum";case"ss":return t(e)?o+(n||r?"sekúndur":"sekúndum"):o+"sekúnda";case"m":return n?"mínúta":"mínútu";case"mm":return t(e)?o+(n||r?"mínútur":"mínútum"):n?o+"mínúta":o+"mínútu";case"hh":return t(e)?o+(n||r?"klukkustundir":"klukkustundum"):o+"klukkustund";case"d":return n?"dagur":r?"dag":"degi";case"dd":return t(e)?n?o+"dagar":o+(r?"daga":"dögum"):n?o+"dagur":o+(r?"dag":"degi");case"M":return n?"mánuður":r?"mánuð":"mánuði";case"MM":return t(e)?n?o+"mánuðir":o+(r?"mánuði":"mánuðum"):n?o+"mánuður":o+(r?"mánuð":"mánuði");case"y":return n||r?"ár":"ári";case"yy":return t(e)?o+(n||r?"ár":"árum"):o+(n||r?"ár":"ári")}}var i=e.defineLocale("is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:n,ss:n,m:n,mm:n,h:"klukkustund",hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return i}))},"057f":function(e,t,n){var i=n("fc6a"),r=n("241c").f,o={}.toString,a="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(e){try{return r(e)}catch(t){return a.slice()}};e.exports.f=function(e){return a&&"[object Window]"==o.call(e)?s(e):r(i(e))}},"0676":function(e,t){function n(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}e.exports=n,e.exports["default"]=e.exports,e.exports.__esModule=!0},"06cf":function(e,t,n){var i=n("83ab"),r=n("d1e7"),o=n("5c6c"),a=n("fc6a"),s=n("c04e"),c=n("5135"),u=n("0cfb"),d=Object.getOwnPropertyDescriptor;t.f=i?d:function(e,t){if(e=a(e),t=s(t,!0),u)try{return d(e,t)}catch(n){}if(c(e,t))return o(!r.f.call(e,t),e[t])}},"0721":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("fo",{months:"januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur".split("_"),weekdaysShort:"sun_mán_týs_mik_hós_frí_ley".split("_"),weekdaysMin:"su_má_tý_mi_hó_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D. MMMM, YYYY HH:mm"},calendar:{sameDay:"[Í dag kl.] LT",nextDay:"[Í morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[Í gjár kl.] LT",lastWeek:"[síðstu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s síðani",s:"fá sekund",ss:"%d sekundir",m:"ein minuttur",mm:"%d minuttir",h:"ein tími",hh:"%d tímar",d:"ein dagur",dd:"%d dagar",M:"ein mánaður",MM:"%d mánaðir",y:"eitt ár",yy:"%d ár"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return t}))},"079e":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("ja",{eras:[{since:"2019-05-01",offset:1,name:"令和",narrow:"㋿",abbr:"R"},{since:"1989-01-08",until:"2019-04-30",offset:1,name:"平成",narrow:"㍻",abbr:"H"},{since:"1926-12-25",until:"1989-01-07",offset:1,name:"昭和",narrow:"㍼",abbr:"S"},{since:"1912-07-30",until:"1926-12-24",offset:1,name:"大正",narrow:"㍽",abbr:"T"},{since:"1873-01-01",until:"1912-07-29",offset:6,name:"明治",narrow:"㍾",abbr:"M"},{since:"0001-01-01",until:"1873-12-31",offset:1,name:"西暦",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"紀元前",narrow:"BC",abbr:"BC"}],eraYearOrdinalRegex:/(元|\d+)年/,eraYearOrdinalParse:function(e,t){return"元"===t[1]?1:parseInt(t[1]||e,10)},months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"日_月_火_水_木_金_土".split("_"),weekdaysMin:"日_月_火_水_木_金_土".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日 dddd HH:mm",l:"YYYY/MM/DD",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日(ddd) HH:mm"},meridiemParse:/午前|午後/i,isPM:function(e){return"午後"===e},meridiem:function(e,t,n){return e<12?"午前":"午後"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:function(e){return e.week()!==this.week()?"[来週]dddd LT":"dddd LT"},lastDay:"[昨日] LT",lastWeek:function(e){return this.week()!==e.week()?"[先週]dddd LT":"dddd LT"},sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}日/,ordinal:function(e,t){switch(t){case"y":return 1===e?"元年":e+"年";case"d":case"D":case"DDD":return e+"日";default:return e}},relativeTime:{future:"%s後",past:"%s前",s:"数秒",ss:"%d秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1日",dd:"%d日",M:"1ヶ月",MM:"%dヶ月",y:"1年",yy:"%d年"}});return t}))},"0a06":function(e,t,n){"use strict";var i=n("c532"),r=n("30b5"),o=n("f6b49"),a=n("5270"),s=n("4a7b");function c(e){this.defaults=e,this.interceptors={request:new o,response:new o}}c.prototype.request=function(e){"string"===typeof e?(e=arguments[1]||{},e.url=arguments[0]):e=e||{},e=s(this.defaults,e),e.method?e.method=e.method.toLowerCase():this.defaults.method?e.method=this.defaults.method.toLowerCase():e.method="get";var t=[a,void 0],n=Promise.resolve(e);this.interceptors.request.forEach((function(e){t.unshift(e.fulfilled,e.rejected)})),this.interceptors.response.forEach((function(e){t.push(e.fulfilled,e.rejected)}));while(t.length)n=n.then(t.shift(),t.shift());return n},c.prototype.getUri=function(e){return e=s(this.defaults,e),r(e.url,e.params,e.paramsSerializer).replace(/^\?/,"")},i.forEach(["delete","get","head","options"],(function(e){c.prototype[e]=function(t,n){return this.request(s(n||{},{method:e,url:t,data:(n||{}).data}))}})),i.forEach(["post","put","patch"],(function(e){c.prototype[e]=function(t,n,i){return this.request(s(i||{},{method:e,url:t,data:n}))}})),e.exports=c},"0a3c":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),i=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],r=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,o=e.defineLocale("es-do",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,i){return e?/-MMM-/.test(i)?n[e.month()]:t[e.month()]:t},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:i,longMonthsParse:i,shortMonthsParse:i,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return o}))},"0a84":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("ar-ma",{months:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:1,doy:4}});return t}))},"0b4b":function(e,t,n){},"0caa":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -function t(e,t,n,i){var r={s:["thoddea sekondamni","thodde sekond"],ss:[e+" sekondamni",e+" sekond"],m:["eka mintan","ek minut"],mm:[e+" mintamni",e+" mintam"],h:["eka voran","ek vor"],hh:[e+" voramni",e+" voram"],d:["eka disan","ek dis"],dd:[e+" disamni",e+" dis"],M:["eka mhoinean","ek mhoino"],MM:[e+" mhoineamni",e+" mhoine"],y:["eka vorsan","ek voros"],yy:[e+" vorsamni",e+" vorsam"]};return i?r[n][0]:r[n][1]}var n=e.defineLocale("gom-latn",{months:{standalone:"Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr".split("_"),format:"Janerachea_Febrerachea_Marsachea_Abrilachea_Maiachea_Junachea_Julaiachea_Agostachea_Setembrachea_Otubrachea_Novembrachea_Dezembrachea".split("_"),isFormat:/MMMM(\s)+D[oD]?/},monthsShort:"Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Aitar_Somar_Mongllar_Budhvar_Birestar_Sukrar_Son'var".split("_"),weekdaysShort:"Ait._Som._Mon._Bud._Bre._Suk._Son.".split("_"),weekdaysMin:"Ai_Sm_Mo_Bu_Br_Su_Sn".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A h:mm [vazta]",LTS:"A h:mm:ss [vazta]",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY A h:mm [vazta]",LLLL:"dddd, MMMM Do, YYYY, A h:mm [vazta]",llll:"ddd, D MMM YYYY, A h:mm [vazta]"},calendar:{sameDay:"[Aiz] LT",nextDay:"[Faleam] LT",nextWeek:"[Fuddlo] dddd[,] LT",lastDay:"[Kal] LT",lastWeek:"[Fattlo] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s",past:"%s adim",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}(er)/,ordinal:function(e,t){switch(t){case"D":return e+"er";default:case"M":case"Q":case"DDD":case"d":case"w":case"W":return e}},week:{dow:0,doy:3},meridiemParse:/rati|sokallim|donparam|sanje/,meridiemHour:function(e,t){return 12===e&&(e=0),"rati"===t?e<4?e:e+12:"sokallim"===t?e:"donparam"===t?e>12?e:e+12:"sanje"===t?e+12:void 0},meridiem:function(e,t,n){return e<4?"rati":e<12?"sokallim":e<16?"donparam":e<20?"sanje":"rati"}});return n}))},"0cb2":function(e,t,n){var i=n("7b0b"),r=Math.floor,o="".replace,a=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,s=/\$([$&'`]|\d{1,2})/g;e.exports=function(e,t,n,c,u,d){var l=n+e.length,f=c.length,h=s;return void 0!==u&&(u=i(u),h=a),o.call(d,h,(function(i,o){var a;switch(o.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,n);case"'":return t.slice(l);case"<":a=u[o.slice(1,-1)];break;default:var s=+o;if(0===s)return i;if(s>f){var d=r(s/10);return 0===d?i:d<=f?void 0===c[d-1]?o.charAt(1):c[d-1]+o.charAt(1):i}a=c[s-1]}return void 0===a?"":a}))}},"0cfb":function(e,t,n){var i=n("83ab"),r=n("d039"),o=n("cc12");e.exports=!i&&!r((function(){return 7!=Object.defineProperty(o("div"),"a",{get:function(){return 7}}).a}))},"0d08":function(e){e.exports=JSON.parse('[{"group":0,"description":"😀"},{"group":1,"description":"👍️"},{"group":2,"description":"🦲"},{"group":3,"description":"🐶"},{"group":4,"description":"🍉"},{"group":5,"description":"🏠️"},{"group":6,"description":"🎁"},{"group":7,"description":"🎶"},{"group":8,"description":"🔝"},{"group":9,"description":"🏁"}]')},"0d3b":function(e,t,n){var i=n("d039"),r=n("b622"),o=n("c430"),a=r("iterator");e.exports=!i((function(){var e=new URL("b?a=1&b=2&c=3","http://a"),t=e.searchParams,n="";return e.pathname="c%20d",t.forEach((function(e,i){t["delete"]("b"),n+=i+e})),o&&!e.toJSON||!t.sort||"http://a/c%20d?a=1&c=3"!==e.href||"3"!==t.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!t[a]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==n||"x"!==new URL("http://x",void 0).host}))},"0df6":function(e,t,n){"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}},"0e49":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("fr-ch",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd’hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(e,t){switch(t){default:case"M":case"Q":case"D":case"DDD":case"d":return e+(1===e?"er":"e");case"w":case"W":return e+(1===e?"re":"e")}},week:{dow:1,doy:4}});return t}))},"0e6b":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10,n=1===~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+n},week:{dow:0,doy:4}});return t}))},"0e81":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"},n=e.defineLocale("tr",{months:"Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),meridiem:function(e,t,n){return e<12?n?"öö":"ÖÖ":n?"ös":"ÖS"},meridiemParse:/öö|ÖÖ|ös|ÖS/,isPM:function(e){return"ös"===e||"ÖS"===e},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[gelecek] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",ss:"%d saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",w:"bir hafta",ww:"%d hafta",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinal:function(e,n){switch(n){case"d":case"D":case"Do":case"DD":return e;default:if(0===e)return e+"'ıncı";var i=e%10,r=e%100-i,o=e>=100?100:null;return e+(t[i]||t[r]||t[o])}},week:{dow:1,doy:7}});return n}))},"0f14":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd [d.] D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"på dddd [kl.] LT",lastDay:"[i går kl.] LT",lastWeek:"[i] dddd[s kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"få sekunder",ss:"%d sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en måned",MM:"%d måneder",y:"et år",yy:"%d år"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return t}))},"0f38":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(e){return e},week:{dow:1,doy:4}});return t}))},"0f65":function(e,t,n){"use strict";n.d(t,"a",(function(){return b}));var i=n("2b88"),r=n("a026"),o=n("c637"),a=n("0056"),s=n("a723"),c=n("906c"),u=n("6b77"),d=n("cf75"),l=n("686b"),f=n("602d"),h=n("8c18"),p=r["default"].extend({mixins:[h["a"]],data:function(){return{name:"b-toaster"}},methods:{onAfterEnter:function(e){var t=this;Object(c["D"])((function(){Object(c["A"])(e,"".concat(t.name,"-enter-to"))}))}},render:function(e){return e("transition-group",{props:{tag:"div",name:this.name},on:{afterEnter:this.onAfterEnter}},this.normalizeSlot())}}),m=Object(d["d"])({ariaAtomic:Object(d["c"])(s["u"]),ariaLive:Object(d["c"])(s["u"]),name:Object(d["c"])(s["u"],void 0,!0),role:Object(d["c"])(s["u"])},o["qc"]),b=r["default"].extend({name:o["qc"],mixins:[f["a"]],props:m,data:function(){return{doRender:!1,dead:!1,staticName:this.name}},beforeMount:function(){var e=this,t=this.name;this.staticName=t,i["Wormhole"].hasTarget(t)?(Object(l["a"])('A "" with name "'.concat(t,'" already exists in the document.'),o["qc"]),this.dead=!0):(this.doRender=!0,this.$once(a["eb"],(function(){e.emitOnRoot(Object(u["e"])(o["qc"],a["j"]),t)})))},destroyed:function(){var e=this.$el;e&&e.parentNode&&e.parentNode.removeChild(e)},render:function(e){var t=e("div",{class:["d-none",{"b-dead-toaster":this.dead}]});if(this.doRender){var n=e(i["PortalTarget"],{staticClass:"b-toaster-slot",props:{name:this.staticName,multiple:!0,tag:"div",slim:!1,transition:p}});t=e("div",{staticClass:"b-toaster",class:[this.staticName],attrs:{id:this.staticName,role:this.role||null,"aria-live":this.ariaLive,"aria-atomic":this.ariaAtomic}},[n])}return t}})},"0ff2":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),monthsParseExact:!0,weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] HH:mm",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] HH:mm",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] HH:mm",llll:"ddd, YYYY[ko] MMM D[a] HH:mm"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",ss:"%d segundo",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return t}))},"10e8":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("th",{months:"มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม".split("_"),monthsShort:"ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.".split("_"),monthsParseExact:!0,weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา H:mm",LLLL:"วันddddที่ D MMMM YYYY เวลา H:mm"},meridiemParse:/ก่อนเที่ยง|หลังเที่ยง/,isPM:function(e){return"หลังเที่ยง"===e},meridiem:function(e,t,n){return e<12?"ก่อนเที่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่แล้ว เวลา] LT",sameElse:"L"},relativeTime:{future:"อีก %s",past:"%sที่แล้ว",s:"ไม่กี่วินาที",ss:"%d วินาที",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",w:"1 สัปดาห์",ww:"%d สัปดาห์",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"}});return t}))},"11b0":function(e,t,n){function i(e){if("undefined"!==typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}n("a4d3"),n("e01a"),n("d3b7"),n("d28b"),n("3ca3"),n("ddb0"),n("a630"),e.exports=i,e.exports["default"]=e.exports,e.exports.__esModule=!0},"129f":function(e,t){e.exports=Object.is||function(e,t){return e===t?0!==e||1/e===1/t:e!=e&&t!=t}},1310:function(e,t){function n(e){return null!=e&&"object"==typeof e}e.exports=n},"13e9":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t={words:{ss:["секунда","секунде","секунди"],m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један сат","једног сата"],hh:["сат","сата","сати"],dd:["дан","дана","дана"],MM:["месец","месеца","месеци"],yy:["година","године","година"]},correctGrammaticalCase:function(e,t){return 1===e?t[0]:e>=2&&e<=4?t[1]:t[2]},translate:function(e,n,i){var r=t.words[i];return 1===i.length?n?r[0]:r[1]:e+" "+t.correctGrammaticalCase(e,r)}},n=e.defineLocale("sr-cyrl",{months:"јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар".split("_"),monthsShort:"јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.".split("_"),monthsParseExact:!0,weekdays:"недеља_понедељак_уторак_среда_четвртак_петак_субота".split("_"),weekdaysShort:"нед._пон._уто._сре._чет._пет._суб.".split("_"),weekdaysMin:"не_по_ут_ср_че_пе_су".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D. M. YYYY.",LL:"D. MMMM YYYY.",LLL:"D. MMMM YYYY. H:mm",LLLL:"dddd, D. MMMM YYYY. H:mm"},calendar:{sameDay:"[данас у] LT",nextDay:"[сутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [среду] [у] LT";case 6:return"[у] [суботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){var e=["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [среде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [суботе] [у] LT"];return e[this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико секунди",ss:t.translate,m:t.translate,mm:t.translate,h:t.translate,hh:t.translate,d:"дан",dd:t.translate,M:"месец",MM:t.translate,y:"годину",yy:t.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return n}))},"14c3":function(e,t,n){var i=n("c6b6"),r=n("9263");e.exports=function(e,t){var n=e.exec;if("function"===typeof n){var o=n.call(e,t);if("object"!==typeof o)throw TypeError("RegExp exec method returned something other than an Object or null");return o}if("RegExp"!==i(e))throw TypeError("RegExp#exec called on incompatible receiver");return r.call(e,t)}},"159b":function(e,t,n){var i=n("da84"),r=n("fdbc"),o=n("17c2"),a=n("9112");for(var s in r){var c=i[s],u=c&&c.prototype;if(u&&u.forEach!==o)try{a(u,"forEach",o)}catch(d){u.forEach=o}}},"167b":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("oc-lnc",{months:{standalone:"genièr_febrièr_març_abril_mai_junh_julhet_agost_setembre_octòbre_novembre_decembre".split("_"),format:"de genièr_de febrièr_de març_d'abril_de mai_de junh_de julhet_d'agost_de setembre_d'octòbre_de novembre_de decembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._març_abr._mai_junh_julh._ago._set._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"dimenge_diluns_dimars_dimècres_dijòus_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dm._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dm_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:"[uèi a] LT",nextDay:"[deman a] LT",nextWeek:"dddd [a] LT",lastDay:"[ièr a] LT",lastWeek:"dddd [passat a] LT",sameElse:"L"},relativeTime:{future:"d'aquí %s",past:"fa %s",s:"unas segondas",ss:"%d segondas",m:"una minuta",mm:"%d minutas",h:"una ora",hh:"%d oras",d:"un jorn",dd:"%d jorns",M:"un mes",MM:"%d meses",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|è|a)/,ordinal:function(e,t){var n=1===e?"r":2===e?"n":3===e?"r":4===e?"t":"è";return"w"!==t&&"W"!==t||(n="a"),e+n},week:{dow:1,doy:4}});return t}))},"17c2":function(e,t,n){"use strict";var i=n("b727").forEach,r=n("a640"),o=r("forEach");e.exports=o?[].forEach:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}},"19aa":function(e,t){e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e}},"1a8c":function(e,t){function n(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}e.exports=n},"1b45":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("mt",{months:"Jannar_Frar_Marzu_April_Mejju_Ġunju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Diċembru".split("_"),monthsShort:"Jan_Fra_Mar_Apr_Mej_Ġun_Lul_Aww_Set_Ott_Nov_Diċ".split("_"),weekdays:"Il-Ħadd_It-Tnejn_It-Tlieta_L-Erbgħa_Il-Ħamis_Il-Ġimgħa_Is-Sibt".split("_"),weekdaysShort:"Ħad_Tne_Tli_Erb_Ħam_Ġim_Sib".split("_"),weekdaysMin:"Ħa_Tn_Tl_Er_Ħa_Ġi_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Illum fil-]LT",nextDay:"[Għada fil-]LT",nextWeek:"dddd [fil-]LT",lastDay:"[Il-bieraħ fil-]LT",lastWeek:"dddd [li għadda] [fil-]LT",sameElse:"L"},relativeTime:{future:"f’ %s",past:"%s ilu",s:"ftit sekondi",ss:"%d sekondi",m:"minuta",mm:"%d minuti",h:"siegħa",hh:"%d siegħat",d:"ġurnata",dd:"%d ġranet",M:"xahar",MM:"%d xhur",y:"sena",yy:"%d sni"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return t}))},"1be4":function(e,t,n){var i=n("d066");e.exports=i("document","documentElement")},"1c0b":function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},"1c7e":function(e,t,n){var i=n("b622"),r=i("iterator"),o=!1;try{var a=0,s={next:function(){return{done:!!a++}},return:function(){o=!0}};s[r]=function(){return this},Array.from(s,(function(){throw 2}))}catch(c){}e.exports=function(e,t){if(!t&&!o)return!1;var n=!1;try{var i={};i[r]=function(){return{next:function(){return{done:n=!0}}}},e(i)}catch(c){}return n}},"1cdc":function(e,t,n){var i=n("342f");e.exports=/(?:iphone|ipod|ipad).*applewebkit/i.test(i)},"1cfd":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t={1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",0:"0"},n=function(e){return 0===e?0:1===e?1:2===e?2:e%100>=3&&e%100<=10?3:e%100>=11?4:5},i={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},r=function(e){return function(t,r,o,a){var s=n(t),c=i[e][n(t)];return 2===s&&(c=c[r?0:1]),c.replace(/%d/i,t)}},o=["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],a=e.defineLocale("ar-ly",{months:o,monthsShort:o,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/‏M/‏YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(e){return"م"===e},meridiem:function(e,t,n){return e<12?"ص":"م"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:r("s"),ss:r("s"),m:r("m"),mm:r("m"),h:r("h"),hh:r("h"),d:r("d"),dd:r("d"),M:r("M"),MM:r("M"),y:r("y"),yy:r("y")},preparse:function(e){return e.replace(/،/g,",")},postformat:function(e){return e.replace(/\d/g,(function(e){return t[e]})).replace(/,/g,"،")},week:{dow:6,doy:12}});return a}))},"1d2b":function(e,t,n){"use strict";e.exports=function(e,t){return function(){for(var n=new Array(arguments.length),i=0;i=51||!i((function(){var t=[],n=t.constructor={};return n[a]=function(){return{foo:1}},1!==t[e](Boolean).foo}))}},"1fc1":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -function t(e,t){var n=e.split("_");return t%10===1&&t%100!==11?n[0]:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?n[1]:n[2]}function n(e,n,i){var r={ss:n?"секунда_секунды_секунд":"секунду_секунды_секунд",mm:n?"хвіліна_хвіліны_хвілін":"хвіліну_хвіліны_хвілін",hh:n?"гадзіна_гадзіны_гадзін":"гадзіну_гадзіны_гадзін",dd:"дзень_дні_дзён",MM:"месяц_месяцы_месяцаў",yy:"год_гады_гадоў"};return"m"===i?n?"хвіліна":"хвіліну":"h"===i?n?"гадзіна":"гадзіну":e+" "+t(r[i],+e)}var i=e.defineLocale("be",{months:{format:"студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня".split("_"),standalone:"студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань".split("_")},monthsShort:"студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж".split("_"),weekdays:{format:"нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу".split("_"),standalone:"нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота".split("_"),isFormat:/\[ ?[Ууў] ?(?:мінулую|наступную)? ?\] ?dddd/},weekdaysShort:"нд_пн_ат_ср_чц_пт_сб".split("_"),weekdaysMin:"нд_пн_ат_ср_чц_пт_сб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., HH:mm",LLLL:"dddd, D MMMM YYYY г., HH:mm"},calendar:{sameDay:"[Сёння ў] LT",nextDay:"[Заўтра ў] LT",lastDay:"[Учора ў] LT",nextWeek:function(){return"[У] dddd [ў] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[У мінулую] dddd [ў] LT";case 1:case 2:case 4:return"[У мінулы] dddd [ў] LT"}},sameElse:"L"},relativeTime:{future:"праз %s",past:"%s таму",s:"некалькі секунд",m:n,mm:n,h:n,hh:n,d:"дзень",dd:n,M:"месяц",MM:n,y:"год",yy:n},meridiemParse:/ночы|раніцы|дня|вечара/,isPM:function(e){return/^(дня|вечара)$/.test(e)},meridiem:function(e,t,n){return e<4?"ночы":e<12?"раніцы":e<17?"дня":"вечара"},dayOfMonthOrdinalParse:/\d{1,2}-(і|ы|га)/,ordinal:function(e,t){switch(t){case"M":case"d":case"DDD":case"w":case"W":return e%10!==2&&e%10!==3||e%100===12||e%100===13?e+"-ы":e+"-і";case"D":return e+"-га";default:return e}},week:{dow:1,doy:7}});return i}))},"201b":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("ka",{months:"იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი".split("_"),monthsShort:"იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ".split("_"),weekdays:{standalone:"კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი".split("_"),format:"კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს".split("_"),isFormat:/(წინა|შემდეგ)/},weekdaysShort:"კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ".split("_"),weekdaysMin:"კვ_ორ_სა_ოთ_ხუ_პა_შა".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[დღეს] LT[-ზე]",nextDay:"[ხვალ] LT[-ზე]",lastDay:"[გუშინ] LT[-ზე]",nextWeek:"[შემდეგ] dddd LT[-ზე]",lastWeek:"[წინა] dddd LT-ზე",sameElse:"L"},relativeTime:{future:function(e){return e.replace(/(წამ|წუთ|საათ|წელ|დღ|თვ)(ი|ე)/,(function(e,t,n){return"ი"===n?t+"ში":t+n+"ში"}))},past:function(e){return/(წამი|წუთი|საათი|დღე|თვე)/.test(e)?e.replace(/(ი|ე)$/,"ის წინ"):/წელი/.test(e)?e.replace(/წელი$/,"წლის წინ"):e},s:"რამდენიმე წამი",ss:"%d წამი",m:"წუთი",mm:"%d წუთი",h:"საათი",hh:"%d საათი",d:"დღე",dd:"%d დღე",M:"თვე",MM:"%d თვე",y:"წელი",yy:"%d წელი"},dayOfMonthOrdinalParse:/0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/,ordinal:function(e){return 0===e?e:1===e?e+"-ლი":e<20||e<=100&&e%20===0||e%100===0?"მე-"+e:e+"-ე"},week:{dow:1,doy:7}});return t}))},2236:function(e,t,n){var i=n("5a43");function r(e){if(Array.isArray(e))return i(e)}e.exports=r,e.exports["default"]=e.exports,e.exports.__esModule=!0},2266:function(e,t,n){var i=n("825a"),r=n("e95a"),o=n("50c4"),a=n("0366"),s=n("35a1"),c=n("2a62"),u=function(e,t){this.stopped=e,this.result=t};e.exports=function(e,t,n){var d,l,f,h,p,m,b,g=n&&n.that,v=!(!n||!n.AS_ENTRIES),y=!(!n||!n.IS_ITERATOR),_=!(!n||!n.INTERRUPTED),O=a(t,g,1+v+_),j=function(e){return d&&c(d),new u(!0,e)},w=function(e){return v?(i(e),_?O(e[0],e[1],j):O(e[0],e[1])):_?O(e,j):O(e)};if(y)d=e;else{if(l=s(e),"function"!=typeof l)throw TypeError("Target is not iterable");if(r(l)){for(f=0,h=o(e.length);h>f;f++)if(p=w(e[f]),p&&p instanceof u)return p;return new u(!1)}d=l.call(e)}m=d.next;while(!(b=m.call(d)).done){try{p=w(b.value)}catch(k){throw c(d),k}if("object"==typeof p&&p&&p instanceof u)return p}return new u(!1)}},"228e":function(e,t,n){"use strict";n.d(t,"c",(function(){return u})),n.d(t,"a",(function(){return d})),n.d(t,"b",(function(){return h}));var i=n("a026"),r=n("50d3"),o=n("c9a9"),a=n("b508"),s=i["default"].prototype,c=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0,n=s[r["c"]];return n?n.getConfigValue(e,t):Object(o["a"])(t)},u=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;return t?c("".concat(e,".").concat(t),n):c(e,{})},d=function(){return c("breakpoints",r["a"])},l=Object(a["a"])((function(){return d()})),f=function(){return Object(o["a"])(l())},h=Object(a["a"])((function(){var e=f();return e[0]="",e}))},"22f8":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("ko",{months:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),monthsShort:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),weekdays:"일요일_월요일_화요일_수요일_목요일_금요일_토요일".split("_"),weekdaysShort:"일_월_화_수_목_금_토".split("_"),weekdaysMin:"일_월_화_수_목_금_토".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY년 MMMM D일",LLL:"YYYY년 MMMM D일 A h:mm",LLLL:"YYYY년 MMMM D일 dddd A h:mm",l:"YYYY.MM.DD.",ll:"YYYY년 MMMM D일",lll:"YYYY년 MMMM D일 A h:mm",llll:"YYYY년 MMMM D일 dddd A h:mm"},calendar:{sameDay:"오늘 LT",nextDay:"내일 LT",nextWeek:"dddd LT",lastDay:"어제 LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s 전",s:"몇 초",ss:"%d초",m:"1분",mm:"%d분",h:"한 시간",hh:"%d시간",d:"하루",dd:"%d일",M:"한 달",MM:"%d달",y:"일 년",yy:"%d년"},dayOfMonthOrdinalParse:/\d{1,2}(일|월|주)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"일";case"M":return e+"월";case"w":case"W":return e+"주";default:return e}},meridiemParse:/오전|오후/,isPM:function(e){return"오후"===e},meridiem:function(e,t,n){return e<12?"오전":"오후"}});return t}))},2326:function(e,t,n){"use strict";n.d(t,"f",(function(){return r})),n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return a})),n.d(t,"c",(function(){return s})),n.d(t,"d",(function(){return c})),n.d(t,"e",(function(){return u}));var i=n("7b1e"),r=function(){return Array.from.apply(Array,arguments)},o=function(e,t){return-1!==e.indexOf(t)},a=function(){for(var e=arguments.length,t=new Array(e),n=0;n=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};i.forEach(["delete","get","head"],(function(e){c.headers[e]={}})),i.forEach(["post","put","patch"],(function(e){c.headers[e]=i.merge(o)})),e.exports=c}).call(this,n("4362"))},2532:function(e,t,n){"use strict";var i=n("23e7"),r=n("5a34"),o=n("1d80"),a=n("ab13");i({target:"String",proto:!0,forced:!a("includes")},{includes:function(e){return!!~String(o(this)).indexOf(r(e),arguments.length>1?arguments[1]:void 0)}})},2554:function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -function t(e,t,n){var i=e+" ";switch(n){case"ss":return i+=1===e?"sekunda":2===e||3===e||4===e?"sekunde":"sekundi",i;case"m":return t?"jedna minuta":"jedne minute";case"mm":return i+=1===e?"minuta":2===e||3===e||4===e?"minute":"minuta",i;case"h":return t?"jedan sat":"jednog sata";case"hh":return i+=1===e?"sat":2===e||3===e||4===e?"sata":"sati",i;case"dd":return i+=1===e?"dan":"dana",i;case"MM":return i+=1===e?"mjesec":2===e||3===e||4===e?"mjeseca":"mjeseci",i;case"yy":return i+=1===e?"godina":2===e||3===e||4===e?"godine":"godina",i}}var n=e.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[jučer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[prošlu] dddd [u] LT";case 6:return"[prošle] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[prošli] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:t,m:t,mm:t,h:t,hh:t,d:"dan",dd:t,M:"mjesec",MM:t,y:"godinu",yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return n}))},"25f0":function(e,t,n){"use strict";var i=n("6eeb"),r=n("825a"),o=n("d039"),a=n("ad6d"),s="toString",c=RegExp.prototype,u=c[s],d=o((function(){return"/a/b"!=u.call({source:"a",flags:"b"})})),l=u.name!=s;(d||l)&&i(RegExp.prototype,s,(function(){var e=r(this),t=String(e.source),n=e.flags,i=String(void 0===n&&e instanceof RegExp&&!("flags"in c)?a.call(e):n);return"/"+t+"/"+i}),{unsafe:!0})},2626:function(e,t,n){"use strict";var i=n("d066"),r=n("9bf2"),o=n("b622"),a=n("83ab"),s=o("species");e.exports=function(e){var t=i(e),n=r.f;a&&t&&!t[s]&&n(t,s,{configurable:!0,get:function(){return this}})}},2655:function(e,t){function n(e){return!!e&&("object"===typeof e||"function"===typeof e)&&"function"===typeof e.then}e.exports=n,e.exports.default=n},"26f9":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t={ss:"sekundė_sekundžių_sekundes",m:"minutė_minutės_minutę",mm:"minutės_minučių_minutes",h:"valanda_valandos_valandą",hh:"valandos_valandų_valandas",d:"diena_dienos_dieną",dd:"dienos_dienų_dienas",M:"mėnuo_mėnesio_mėnesį",MM:"mėnesiai_mėnesių_mėnesius",y:"metai_metų_metus",yy:"metai_metų_metus"};function n(e,t,n,i){return t?"kelios sekundės":i?"kelių sekundžių":"kelias sekundes"}function i(e,t,n,i){return t?o(n)[0]:i?o(n)[1]:o(n)[2]}function r(e){return e%10===0||e>10&&e<20}function o(e){return t[e].split("_")}function a(e,t,n,a){var s=e+" ";return 1===e?s+i(e,t,n[0],a):t?s+(r(e)?o(n)[1]:o(n)[0]):a?s+o(n)[1]:s+(r(e)?o(n)[1]:o(n)[2])}var s=e.defineLocale("lt",{months:{format:"sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis".split("_"),isFormat:/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Šeš".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Š".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[Šiandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Praėjusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieš %s",s:n,ss:a,m:i,mm:a,h:i,hh:a,d:i,dd:a,M:i,MM:a,y:i,yy:a},dayOfMonthOrdinalParse:/\d{1,2}-oji/,ordinal:function(e){return e+"-oji"},week:{dow:1,doy:4}});return s}))},"278c":function(e,t,n){var i=n("c135"),r=n("9b42"),o=n("6613"),a=n("c240");function s(e,t){return i(e)||r(e,t)||o(e,t)||a()}e.exports=s,e.exports["default"]=e.exports,e.exports.__esModule=!0},2877:function(e,t,n){"use strict";function i(e,t,n,i,r,o,a,s){var c,u="function"===typeof e?e.options:e;if(t&&(u.render=t,u.staticRenderFns=n,u._compiled=!0),i&&(u.functional=!0),o&&(u._scopeId="data-v-"+o),a?(c=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||"undefined"===typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),r&&r.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(a)},u._ssrRegister=c):r&&(c=s?function(){r.call(this,(u.functional?this.parent:this).$root.$options.shadowRoot)}:r),c)if(u.functional){u._injectStyles=c;var d=u.render;u.render=function(e,t){return c.call(t),d(e,t)}}else{var l=u.beforeCreate;u.beforeCreate=l?[].concat(l,c):[c]}return{exports:e,options:u}}n.d(t,"a",(function(){return i}))},2921:function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("vi",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Thg 01_Thg 02_Thg 03_Thg 04_Thg 05_Thg 06_Thg 07_Thg 08_Thg 09_Thg 10_Thg 11_Thg 12".split("_"),monthsParseExact:!0,weekdays:"chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:!0,meridiemParse:/sa|ch/i,isPM:function(e){return/^ch$/i.test(e)},meridiem:function(e,t,n){return e<12?n?"sa":"SA":n?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY HH:mm",LLLL:"dddd, D MMMM [năm] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tới lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần trước lúc] LT",sameElse:"L"},relativeTime:{future:"%s tới",past:"%s trước",s:"vài giây",ss:"%d giây",m:"một phút",mm:"%d phút",h:"một giờ",hh:"%d giờ",d:"một ngày",dd:"%d ngày",w:"một tuần",ww:"%d tuần",M:"một tháng",MM:"%d tháng",y:"một năm",yy:"%d năm"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(e){return e},week:{dow:1,doy:4}});return t}))},"293c":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t={words:{ss:["sekund","sekunda","sekundi"],m:["jedan minut","jednog minuta"],mm:["minut","minuta","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mjesec","mjeseca","mjeseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(e,t){return 1===e?t[0]:e>=2&&e<=4?t[1]:t[2]},translate:function(e,n,i){var r=t.words[i];return 1===i.length?n?r[0]:r[1]:e+" "+t.correctGrammaticalCase(e,r)}},n=e.defineLocale("me",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sjutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juče u] LT",lastWeek:function(){var e=["[prošle] [nedjelje] [u] LT","[prošlog] [ponedjeljka] [u] LT","[prošlog] [utorka] [u] LT","[prošle] [srijede] [u] LT","[prošlog] [četvrtka] [u] LT","[prošlog] [petka] [u] LT","[prošle] [subote] [u] LT"];return e[this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"nekoliko sekundi",ss:t.translate,m:t.translate,mm:t.translate,h:t.translate,hh:t.translate,d:"dan",dd:t.translate,M:"mjesec",MM:t.translate,y:"godinu",yy:t.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return n}))},"29f3":function(e,t){var n=Object.prototype,i=n.toString;function r(e){return i.call(e)}e.exports=r},"2a62":function(e,t,n){var i=n("825a");e.exports=function(e){var t=e["return"];if(void 0!==t)return i(t.call(e)).value}},"2b27":function(e,t,n){(function(){var t={expires:"1d",path:"; path=/",domain:"",secure:"",sameSite:"; SameSite=Lax"},n={install:function(e){e.prototype.$cookies=this,e.$cookies=this},config:function(e,n,i,r,o){t.expires=e||"1d",t.path=n?"; path="+n:"; path=/",t.domain=i?"; domain="+i:"",t.secure=r?"; Secure":"",t.sameSite=o?"; SameSite="+o:"; SameSite=Lax"},get:function(e){var t=decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*"+encodeURIComponent(e).replace(/[\-\.\+\*]/g,"\\$&")+"\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"))||null;if(t&&"{"===t.substring(0,1)&&"}"===t.substring(t.length-1,t.length))try{t=JSON.parse(t)}catch(n){return t}return t},set:function(e,n,i,r,o,a,s){if(!e)throw new Error("Cookie name is not find in first argument.");if(/^(?:expires|max\-age|path|domain|secure|SameSite)$/i.test(e))throw new Error('Cookie key name illegality, Cannot be set to ["expires","max-age","path","domain","secure","SameSite"]\t current key name: '+e);n&&n.constructor===Object&&(n=JSON.stringify(n));var c="";if(i=void 0==i?t.expires:i,i&&0!=i)switch(i.constructor){case Number:c=i===1/0||-1===i?"; expires=Fri, 31 Dec 9999 23:59:59 GMT":"; max-age="+i;break;case String:if(/^(?:\d+(y|m|d|h|min|s))$/i.test(i)){var u=i.replace(/^(\d+)(?:y|m|d|h|min|s)$/i,"$1");switch(i.replace(/^(?:\d+)(y|m|d|h|min|s)$/i,"$1").toLowerCase()){case"m":c="; max-age="+2592e3*+u;break;case"d":c="; max-age="+86400*+u;break;case"h":c="; max-age="+3600*+u;break;case"min":c="; max-age="+60*+u;break;case"s":c="; max-age="+u;break;case"y":c="; max-age="+31104e3*+u;break;default:new Error('unknown exception of "set operation"')}}else c="; expires="+i;break;case Date:c="; expires="+i.toUTCString();break}return document.cookie=encodeURIComponent(e)+"="+encodeURIComponent(n)+c+(o?"; domain="+o:t.domain)+(r?"; path="+r:t.path)+(void 0==a?t.secure:a?"; Secure":"")+(void 0==s?t.sameSite:s?"; SameSite="+s:""),this},remove:function(e,n,i){return!(!e||!this.isKey(e))&&(document.cookie=encodeURIComponent(e)+"=; expires=Thu, 01 Jan 1970 00:00:00 GMT"+(i?"; domain="+i:t.domain)+(n?"; path="+n:t.path)+"; SameSite=Lax",this)},isKey:function(e){return new RegExp("(?:^|;\\s*)"+encodeURIComponent(e).replace(/[\-\.\+\*]/g,"\\$&")+"\\s*\\=").test(document.cookie)},keys:function(){if(!document.cookie)return[];for(var e=document.cookie.replace(/((?:^|\s*;)[^\=]+)(?=;|$)|^\s*|\s*(?:\=[^;]*)?(?:\1|$)/g,"").split(/\s*(?:\=[^;]*)?;\s*/),t=0;t4)return e;for(n=[],i=0;i1&&"0"==r.charAt(0)&&(o=Y.test(r)?16:8,r=r.slice(8==o?1:2)),""===r)a=0;else{if(!(10==o?E:8==o?C:H).test(r))return e;a=parseInt(r,o)}n.push(a)}for(i=0;i=M(256,5-t))return null}else if(a>255)return null;for(s=n.pop(),i=0;i6)return;i=0;while(f()){if(r=null,i>0){if(!("."==f()&&i<4))return;l++}if(!P.test(f()))return;while(P.test(f())){if(o=parseInt(f(),10),null===r)r=o;else{if(0==r)return;r=10*r+o}if(r>255)return;l++}c[u]=256*c[u]+r,i++,2!=i&&4!=i||u++}if(4!=i)return;break}if(":"==f()){if(l++,!f())return}else if(f())return;c[u++]=t}else{if(null!==d)return;l++,u++,d=u}}if(null!==d){a=u-d,u=7;while(0!=u&&a>0)s=c[u],c[u--]=c[d+a-1],c[d+--a]=s}else if(8!=u)return;return c},V=function(e){for(var t=null,n=1,i=null,r=0,o=0;o<8;o++)0!==e[o]?(r>n&&(t=i,n=r),i=null,r=0):(null===i&&(i=o),++r);return r>n&&(t=i,n=r),t},W=function(e){var t,n,i,r;if("number"==typeof e){for(t=[],n=0;n<4;n++)t.unshift(e%256),e=k(e/256);return t.join(".")}if("object"==typeof e){for(t="",i=V(e),n=0;n<8;n++)r&&0===e[n]||(r&&(r=!1),i===n?(t+=n?":":"::",r=!0):(t+=e[n].toString(16),n<7&&(t+=":")));return"["+t+"]"}return e},U={},G=f({},U,{" ":1,'"':1,"<":1,">":1,"`":1}),q=f({},G,{"#":1,"?":1,"{":1,"}":1}),J=f({},q,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),K=function(e,t){var n=p(e,0);return n>32&&n<127&&!l(t,e)?e:encodeURIComponent(e)},X={ftp:21,file:null,http:80,https:443,ws:80,wss:443},Z=function(e){return l(X,e.scheme)},Q=function(e){return""!=e.username||""!=e.password},ee=function(e){return!e.host||e.cannotBeABaseURL||"file"==e.scheme},te=function(e,t){var n;return 2==e.length&&D.test(e.charAt(0))&&(":"==(n=e.charAt(1))||!t&&"|"==n)},ne=function(e){var t;return e.length>1&&te(e.slice(0,2))&&(2==e.length||"/"===(t=e.charAt(2))||"\\"===t||"?"===t||"#"===t)},ie=function(e){var t=e.path,n=t.length;!n||"file"==e.scheme&&1==n&&te(t[0],!0)||t.pop()},re=function(e){return"."===e||"%2e"===e.toLowerCase()},oe=function(e){return e=e.toLowerCase(),".."===e||"%2e."===e||".%2e"===e||"%2e%2e"===e},ae={},se={},ce={},ue={},de={},le={},fe={},he={},pe={},me={},be={},ge={},ve={},ye={},_e={},Oe={},je={},we={},ke={},Me={},xe={},Le=function(e,t,n,r){var o,a,s,c,u=n||ae,d=0,f="",p=!1,m=!1,b=!1;n||(e.scheme="",e.username="",e.password="",e.host=null,e.port=null,e.path=[],e.query=null,e.fragment=null,e.cannotBeABaseURL=!1,t=t.replace(F,"")),t=t.replace(B,""),o=h(t);while(d<=o.length){switch(a=o[d],u){case ae:if(!a||!D.test(a)){if(n)return L;u=ce;continue}f+=a.toLowerCase(),u=se;break;case se:if(a&&(A.test(a)||"+"==a||"-"==a||"."==a))f+=a.toLowerCase();else{if(":"!=a){if(n)return L;f="",u=ce,d=0;continue}if(n&&(Z(e)!=l(X,f)||"file"==f&&(Q(e)||null!==e.port)||"file"==e.scheme&&!e.host))return;if(e.scheme=f,n)return void(Z(e)&&X[e.scheme]==e.port&&(e.port=null));f="","file"==e.scheme?u=ye:Z(e)&&r&&r.scheme==e.scheme?u=ue:Z(e)?u=he:"/"==o[d+1]?(u=de,d++):(e.cannotBeABaseURL=!0,e.path.push(""),u=ke)}break;case ce:if(!r||r.cannotBeABaseURL&&"#"!=a)return L;if(r.cannotBeABaseURL&&"#"==a){e.scheme=r.scheme,e.path=r.path.slice(),e.query=r.query,e.fragment="",e.cannotBeABaseURL=!0,u=xe;break}u="file"==r.scheme?ye:le;continue;case ue:if("/"!=a||"/"!=o[d+1]){u=le;continue}u=pe,d++;break;case de:if("/"==a){u=me;break}u=we;continue;case le:if(e.scheme=r.scheme,a==i)e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.query=r.query;else if("/"==a||"\\"==a&&Z(e))u=fe;else if("?"==a)e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.query="",u=Me;else{if("#"!=a){e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.path.pop(),u=we;continue}e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.query=r.query,e.fragment="",u=xe}break;case fe:if(!Z(e)||"/"!=a&&"\\"!=a){if("/"!=a){e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,u=we;continue}u=me}else u=pe;break;case he:if(u=pe,"/"!=a||"/"!=f.charAt(d+1))continue;d++;break;case pe:if("/"!=a&&"\\"!=a){u=me;continue}break;case me:if("@"==a){p&&(f="%40"+f),p=!0,s=h(f);for(var g=0;g65535)return T;e.port=Z(e)&&_===X[e.scheme]?null:_,f=""}if(n)return;u=je;continue}return T}f+=a;break;case ye:if(e.scheme="file","/"==a||"\\"==a)u=_e;else{if(!r||"file"!=r.scheme){u=we;continue}if(a==i)e.host=r.host,e.path=r.path.slice(),e.query=r.query;else if("?"==a)e.host=r.host,e.path=r.path.slice(),e.query="",u=Me;else{if("#"!=a){ne(o.slice(d).join(""))||(e.host=r.host,e.path=r.path.slice(),ie(e)),u=we;continue}e.host=r.host,e.path=r.path.slice(),e.query=r.query,e.fragment="",u=xe}}break;case _e:if("/"==a||"\\"==a){u=Oe;break}r&&"file"==r.scheme&&!ne(o.slice(d).join(""))&&(te(r.path[0],!0)?e.path.push(r.path[0]):e.host=r.host),u=we;continue;case Oe:if(a==i||"/"==a||"\\"==a||"?"==a||"#"==a){if(!n&&te(f))u=we;else if(""==f){if(e.host="",n)return;u=je}else{if(c=N(e,f),c)return c;if("localhost"==e.host&&(e.host=""),n)return;f="",u=je}continue}f+=a;break;case je:if(Z(e)){if(u=we,"/"!=a&&"\\"!=a)continue}else if(n||"?"!=a)if(n||"#"!=a){if(a!=i&&(u=we,"/"!=a))continue}else e.fragment="",u=xe;else e.query="",u=Me;break;case we:if(a==i||"/"==a||"\\"==a&&Z(e)||!n&&("?"==a||"#"==a)){if(oe(f)?(ie(e),"/"==a||"\\"==a&&Z(e)||e.path.push("")):re(f)?"/"==a||"\\"==a&&Z(e)||e.path.push(""):("file"==e.scheme&&!e.path.length&&te(f)&&(e.host&&(e.host=""),f=f.charAt(0)+":"),e.path.push(f)),f="","file"==e.scheme&&(a==i||"?"==a||"#"==a))while(e.path.length>1&&""===e.path[0])e.path.shift();"?"==a?(e.query="",u=Me):"#"==a&&(e.fragment="",u=xe)}else f+=K(a,q);break;case ke:"?"==a?(e.query="",u=Me):"#"==a?(e.fragment="",u=xe):a!=i&&(e.path[0]+=K(a,U));break;case Me:n||"#"!=a?a!=i&&("'"==a&&Z(e)?e.query+="%27":e.query+="#"==a?"%23":K(a,U)):(e.fragment="",u=xe);break;case xe:a!=i&&(e.fragment+=K(a,G));break}d++}},Se=function(e){var t,n,i=d(this,Se,"URL"),r=arguments.length>1?arguments[1]:void 0,a=String(e),s=j(i,{type:"URL"});if(void 0!==r)if(r instanceof Se)t=w(r);else if(n=Le(t={},String(r)),n)throw TypeError(n);if(n=Le(s,a,null,t),n)throw TypeError(n);var c=s.searchParams=new _,u=O(c);u.updateSearchParams(s.query),u.updateURL=function(){s.query=String(c)||null},o||(i.href=De.call(i),i.origin=Ae.call(i),i.protocol=Pe.call(i),i.username=Ye.call(i),i.password=Ce.call(i),i.host=Ee.call(i),i.hostname=He.call(i),i.port=$e.call(i),i.pathname=Ie.call(i),i.search=Fe.call(i),i.searchParams=Be.call(i),i.hash=Ne.call(i))},Te=Se.prototype,De=function(){var e=w(this),t=e.scheme,n=e.username,i=e.password,r=e.host,o=e.port,a=e.path,s=e.query,c=e.fragment,u=t+":";return null!==r?(u+="//",Q(e)&&(u+=n+(i?":"+i:"")+"@"),u+=W(r),null!==o&&(u+=":"+o)):"file"==t&&(u+="//"),u+=e.cannotBeABaseURL?a[0]:a.length?"/"+a.join("/"):"",null!==s&&(u+="?"+s),null!==c&&(u+="#"+c),u},Ae=function(){var e=w(this),t=e.scheme,n=e.port;if("blob"==t)try{return new Se(t.path[0]).origin}catch(i){return"null"}return"file"!=t&&Z(e)?t+"://"+W(e.host)+(null!==n?":"+n:""):"null"},Pe=function(){return w(this).scheme+":"},Ye=function(){return w(this).username},Ce=function(){return w(this).password},Ee=function(){var e=w(this),t=e.host,n=e.port;return null===t?"":null===n?W(t):W(t)+":"+n},He=function(){var e=w(this).host;return null===e?"":W(e)},$e=function(){var e=w(this).port;return null===e?"":String(e)},Ie=function(){var e=w(this),t=e.path;return e.cannotBeABaseURL?t[0]:t.length?"/"+t.join("/"):""},Fe=function(){var e=w(this).query;return e?"?"+e:""},Be=function(){return w(this).searchParams},Ne=function(){var e=w(this).fragment;return e?"#"+e:""},Re=function(e,t){return{get:e,set:t,configurable:!0,enumerable:!0}};if(o&&c(Te,{href:Re(De,(function(e){var t=w(this),n=String(e),i=Le(t,n);if(i)throw TypeError(i);O(t.searchParams).updateSearchParams(t.query)})),origin:Re(Ae),protocol:Re(Pe,(function(e){var t=w(this);Le(t,String(e)+":",ae)})),username:Re(Ye,(function(e){var t=w(this),n=h(String(e));if(!ee(t)){t.username="";for(var i=0;i1&&void 0!==arguments[1]?arguments[1]:{};return e.reduce((function(e,n){var i=n.passengers[0],r="function"===typeof i?i(t):n.passengers;return e.concat(r)}),[])}function h(e,t){return e.map((function(e,t){return[t,e]})).sort((function(e,n){return t(e[1],n[1])||e[0]-n[0]})).map((function(e){return e[1]}))}function p(e,t){return t.reduce((function(t,n){return e.hasOwnProperty(n)&&(t[n]=e[n]),t}),{})}var m={},b={},g={},v=r.extend({data:function(){return{transports:m,targets:b,sources:g,trackInstances:d}},methods:{open:function(e){if(d){var t=e.to,n=e.from,i=e.passengers,o=e.order,a=void 0===o?1/0:o;if(t&&n&&i){var s={to:t,from:n,passengers:l(i),order:a},c=Object.keys(this.transports);-1===c.indexOf(t)&&r.set(this.transports,t,[]);var u=this.$_getTransportIndex(s),f=this.transports[t].slice(0);-1===u?f.push(s):f[u]=s,this.transports[t]=h(f,(function(e,t){return e.order-t.order}))}}},close:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=e.to,i=e.from;if(n&&(i||!1!==t)&&this.transports[n])if(t)this.transports[n]=[];else{var r=this.$_getTransportIndex(e);if(r>=0){var o=this.transports[n].slice(0);o.splice(r,1),this.transports[n]=o}}},registerTarget:function(e,t,n){d&&(this.trackInstances&&!n&&this.targets[e]&&console.warn("[portal-vue]: Target ".concat(e," already exists")),this.$set(this.targets,e,Object.freeze([t])))},unregisterTarget:function(e){this.$delete(this.targets,e)},registerSource:function(e,t,n){d&&(this.trackInstances&&!n&&this.sources[e]&&console.warn("[portal-vue]: source ".concat(e," already exists")),this.$set(this.sources,e,Object.freeze([t])))},unregisterSource:function(e){this.$delete(this.sources,e)},hasTarget:function(e){return!(!this.targets[e]||!this.targets[e][0])},hasSource:function(e){return!(!this.sources[e]||!this.sources[e][0])},hasContentFor:function(e){return!!this.transports[e]&&!!this.transports[e].length},$_getTransportIndex:function(e){var t=e.to,n=e.from;for(var i in this.transports[t])if(this.transports[t][i].from===n)return+i;return-1}}}),y=new v(m),_=1,O=r.extend({name:"portal",props:{disabled:{type:Boolean},name:{type:String,default:function(){return String(_++)}},order:{type:Number,default:0},slim:{type:Boolean},slotProps:{type:Object,default:function(){return{}}},tag:{type:String,default:"DIV"},to:{type:String,default:function(){return String(Math.round(1e7*Math.random()))}}},created:function(){var e=this;this.$nextTick((function(){y.registerSource(e.name,e)}))},mounted:function(){this.disabled||this.sendUpdate()},updated:function(){this.disabled?this.clear():this.sendUpdate()},beforeDestroy:function(){y.unregisterSource(this.name),this.clear()},watch:{to:function(e,t){t&&t!==e&&this.clear(t),this.sendUpdate()}},methods:{clear:function(e){var t={from:this.name,to:e||this.to};y.close(t)},normalizeSlots:function(){return this.$scopedSlots.default?[this.$scopedSlots.default]:this.$slots.default},normalizeOwnChildren:function(e){return"function"===typeof e?e(this.slotProps):e},sendUpdate:function(){var e=this.normalizeSlots();if(e){var t={from:this.name,to:this.to,passengers:a(e),order:this.order};y.open(t)}else this.clear()}},render:function(e){var t=this.$slots.default||this.$scopedSlots.default||[],n=this.tag;return t&&this.disabled?t.length<=1&&this.slim?this.normalizeOwnChildren(t)[0]:e(n,[this.normalizeOwnChildren(t)]):this.slim?e():e(n,{class:{"v-portal":!0},style:{display:"none"},key:"v-portal-placeholder"})}}),j=r.extend({name:"portalTarget",props:{multiple:{type:Boolean,default:!1},name:{type:String,required:!0},slim:{type:Boolean,default:!1},slotProps:{type:Object,default:function(){return{}}},tag:{type:String,default:"div"},transition:{type:[String,Object,Function]}},data:function(){return{transports:y.transports,firstRender:!0}},created:function(){var e=this;this.$nextTick((function(){y.registerTarget(e.name,e)}))},watch:{ownTransports:function(){this.$emit("change",this.children().length>0)},name:function(e,t){y.unregisterTarget(t),y.registerTarget(e,this)}},mounted:function(){var e=this;this.transition&&this.$nextTick((function(){e.firstRender=!1}))},beforeDestroy:function(){y.unregisterTarget(this.name)},computed:{ownTransports:function(){var e=this.transports[this.name]||[];return this.multiple?e:0===e.length?[]:[e[e.length-1]]},passengers:function(){return f(this.ownTransports,this.slotProps)}},methods:{children:function(){return 0!==this.passengers.length?this.passengers:this.$scopedSlots.default?this.$scopedSlots.default(this.slotProps):this.$slots.default||[]},noWrapper:function(){var e=this.slim&&!this.transition;return e&&this.children().length>1&&console.warn("[portal-vue]: PortalTarget with `slim` option received more than one child element."),e}},render:function(e){var t=this.noWrapper(),n=this.children(),i=this.transition||this.tag;return t?n[0]:this.slim&&!i?e():e(i,{props:{tag:this.transition&&this.tag?this.tag:void 0},class:{"vue-portal-target":!0}},n)}}),w=0,k=["disabled","name","order","slim","slotProps","tag","to"],M=["multiple","transition"],x=r.extend({name:"MountingPortal",inheritAttrs:!1,props:{append:{type:[Boolean,String]},bail:{type:Boolean},mountTo:{type:String,required:!0},disabled:{type:Boolean},name:{type:String,default:function(){return"mounted_"+String(w++)}},order:{type:Number,default:0},slim:{type:Boolean},slotProps:{type:Object,default:function(){return{}}},tag:{type:String,default:"DIV"},to:{type:String,default:function(){return String(Math.round(1e7*Math.random()))}},multiple:{type:Boolean,default:!1},targetSlim:{type:Boolean},targetSlotProps:{type:Object,default:function(){return{}}},targetTag:{type:String,default:"div"},transition:{type:[String,Object,Function]}},created:function(){if("undefined"!==typeof document){var e=document.querySelector(this.mountTo);if(e){var t=this.$props;if(y.targets[t.name])t.bail?console.warn("[portal-vue]: Target ".concat(t.name," is already mounted.\n Aborting because 'bail: true' is set")):this.portalTarget=y.targets[t.name];else{var n=t.append;if(n){var i="string"===typeof n?n:"DIV",r=document.createElement(i);e.appendChild(r),e=r}var o=p(this.$props,M);o.slim=this.targetSlim,o.tag=this.targetTag,o.slotProps=this.targetSlotProps,o.name=this.to,this.portalTarget=new j({el:e,parent:this.$parent||this,propsData:o})}}else console.error("[portal-vue]: Mount Point '".concat(this.mountTo,"' not found in document"))}},beforeDestroy:function(){var e=this.portalTarget;if(this.append){var t=e.$el;t.parentNode.removeChild(t)}e.$destroy()},render:function(e){if(!this.portalTarget)return console.warn("[portal-vue] Target wasn't mounted"),e();if(!this.$scopedSlots.manual){var t=p(this.$props,k);return e(O,{props:t,attrs:this.$attrs,on:this.$listeners,scopedSlots:this.$scopedSlots},this.$slots.default)}var n=this.$scopedSlots.manual({to:this.to});return Array.isArray(n)&&(n=n[0]),n||e()}});function L(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};e.component(t.portalName||"Portal",O),e.component(t.portalTargetName||"PortalTarget",j),e.component(t.MountingPortalName||"MountingPortal",x)}var S={install:L};t.default=S,t.Portal=O,t.PortalTarget=j,t.MountingPortal=x,t.Wormhole=y},"2bfb":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(e){return/^nm$/i.test(e)},meridiem:function(e,t,n){return e<12?n?"vm":"VM":n?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[Môre om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",ss:"%d sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}});return t}))},"2cf4":function(e,t,n){var i,r,o,a=n("da84"),s=n("d039"),c=n("0366"),u=n("1be4"),d=n("cc12"),l=n("1cdc"),f=n("605d"),h=a.location,p=a.setImmediate,m=a.clearImmediate,b=a.process,g=a.MessageChannel,v=a.Dispatch,y=0,_={},O="onreadystatechange",j=function(e){if(_.hasOwnProperty(e)){var t=_[e];delete _[e],t()}},w=function(e){return function(){j(e)}},k=function(e){j(e.data)},M=function(e){a.postMessage(e+"",h.protocol+"//"+h.host)};p&&m||(p=function(e){var t=[],n=1;while(arguments.length>n)t.push(arguments[n++]);return _[++y]=function(){("function"==typeof e?e:Function(e)).apply(void 0,t)},i(y),y},m=function(e){delete _[e]},f?i=function(e){b.nextTick(w(e))}:v&&v.now?i=function(e){v.now(w(e))}:g&&!l?(r=new g,o=r.port2,r.port1.onmessage=k,i=c(o.postMessage,o,1)):a.addEventListener&&"function"==typeof postMessage&&!a.importScripts&&h&&"file:"!==h.protocol&&!s(M)?(i=M,a.addEventListener("message",k,!1)):i=O in d("script")?function(e){u.appendChild(d("script"))[O]=function(){u.removeChild(this),j(e)}}:function(e){setTimeout(w(e),0)}),e.exports={set:p,clear:m}},"2d00":function(e,t,n){var i,r,o=n("da84"),a=n("342f"),s=o.process,c=s&&s.versions,u=c&&c.v8;u?(i=u.split("."),r=i[0]<4?1:i[0]+i[1]):a&&(i=a.match(/Edge\/(\d+)/),(!i||i[1]>=74)&&(i=a.match(/Chrome\/(\d+)/),i&&(r=i[1]))),e.exports=r&&+r},"2d83":function(e,t,n){"use strict";var i=n("387f");e.exports=function(e,t,n,r,o){var a=new Error(e);return i(a,t,n,r,o)}},"2dd8":function(e,t,n){},"2e39":function(e,t,n){"use strict";function i(e,t){var n=t.length,i=e.length;if(i>n)return!1;if(i===n)return e===t;e:for(var r=0,o=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return e=Object(i["b"])(e).filter(r["a"]),e.some((function(e){return t[e]||n[e]}))},s=function(e){var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};e=Object(i["b"])(e).filter(r["a"]);for(var c=0;cc)r.f(e,n=i[c++],t[n]);return e}},"387f":function(e,t,n){"use strict";e.exports=function(e,t,n,i,r){return e.config=t,n&&(e.code=n),e.request=i,e.response=r,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code}},e}},3886:function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10,n=1===~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+n}});return t}))},3934:function(e,t,n){"use strict";var i=n("c532");e.exports=i.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function r(e){var i=e;return t&&(n.setAttribute("href",i),i=n.href),n.setAttribute("href",i),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return e=r(window.location.href),function(t){var n=i.isString(t)?r(t):t;return n.protocol===e.protocol&&n.host===e.host}}():function(){return function(){return!0}}()},"39a6":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10,n=1===~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+n},week:{dow:1,doy:4}});return t}))},"39bd":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},n={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};function i(e,t,n,i){var r="";if(t)switch(n){case"s":r="काही सेकंद";break;case"ss":r="%d सेकंद";break;case"m":r="एक मिनिट";break;case"mm":r="%d मिनिटे";break;case"h":r="एक तास";break;case"hh":r="%d तास";break;case"d":r="एक दिवस";break;case"dd":r="%d दिवस";break;case"M":r="एक महिना";break;case"MM":r="%d महिने";break;case"y":r="एक वर्ष";break;case"yy":r="%d वर्षे";break}else switch(n){case"s":r="काही सेकंदां";break;case"ss":r="%d सेकंदां";break;case"m":r="एका मिनिटा";break;case"mm":r="%d मिनिटां";break;case"h":r="एका तासा";break;case"hh":r="%d तासां";break;case"d":r="एका दिवसा";break;case"dd":r="%d दिवसां";break;case"M":r="एका महिन्या";break;case"MM":r="%d महिन्यां";break;case"y":r="एका वर्षा";break;case"yy":r="%d वर्षां";break}return r.replace(/%d/i,e)}var r=e.defineLocale("mr",{months:"जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर".split("_"),monthsShort:"जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.".split("_"),monthsParseExact:!0,weekdays:"रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि".split("_"),weekdaysMin:"र_सो_मं_बु_गु_शु_श".split("_"),longDateFormat:{LT:"A h:mm वाजता",LTS:"A h:mm:ss वाजता",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm वाजता",LLLL:"dddd, D MMMM YYYY, A h:mm वाजता"},calendar:{sameDay:"[आज] LT",nextDay:"[उद्या] LT",nextWeek:"dddd, LT",lastDay:"[काल] LT",lastWeek:"[मागील] dddd, LT",sameElse:"L"},relativeTime:{future:"%sमध्ये",past:"%sपूर्वी",s:i,ss:i,m:i,mm:i,h:i,hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},preparse:function(e){return e.replace(/[१२३४५६७८९०]/g,(function(e){return n[e]}))},postformat:function(e){return e.replace(/\d/g,(function(e){return t[e]}))},meridiemParse:/पहाटे|सकाळी|दुपारी|सायंकाळी|रात्री/,meridiemHour:function(e,t){return 12===e&&(e=0),"पहाटे"===t||"सकाळी"===t?e:"दुपारी"===t||"सायंकाळी"===t||"रात्री"===t?e>=12?e:e+12:void 0},meridiem:function(e,t,n){return e>=0&&e<6?"पहाटे":e<12?"सकाळी":e<17?"दुपारी":e<20?"सायंकाळी":"रात्री"},week:{dow:0,doy:6}});return r}))},"39c3":function(e,t,n){"use strict";function i(e){var t=e.getBoundingClientRect();return{width:t.width,height:t.height,top:t.top,right:t.right,bottom:t.bottom,left:t.left,x:t.left,y:t.top}}function r(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function o(e){var t=r(e),n=t.pageXOffset,i=t.pageYOffset;return{scrollLeft:n,scrollTop:i}}function a(e){var t=r(e).Element;return e instanceof t||e instanceof Element}function s(e){var t=r(e).HTMLElement;return e instanceof t||e instanceof HTMLElement}function c(e){if("undefined"===typeof ShadowRoot)return!1;var t=r(e).ShadowRoot;return e instanceof t||e instanceof ShadowRoot}function u(e){return{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}}function d(e){return e!==r(e)&&s(e)?u(e):o(e)}function l(e){return e?(e.nodeName||"").toLowerCase():null}function f(e){return((a(e)?e.ownerDocument:e.document)||window.document).documentElement}function h(e){return i(f(e)).left+o(e).scrollLeft}function p(e){return r(e).getComputedStyle(e)}function m(e){var t=p(e),n=t.overflow,i=t.overflowX,r=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+r+i)}function b(e,t,n){void 0===n&&(n=!1);var r=f(t),o=i(e),a=s(t),c={scrollLeft:0,scrollTop:0},u={x:0,y:0};return(a||!a&&!n)&&(("body"!==l(t)||m(r))&&(c=d(t)),s(t)?(u=i(t),u.x+=t.clientLeft,u.y+=t.clientTop):r&&(u.x=h(r))),{x:o.left+c.scrollLeft-u.x,y:o.top+c.scrollTop-u.y,width:o.width,height:o.height}}function g(e){var t=i(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function v(e){return"html"===l(e)?e:e.assignedSlot||e.parentNode||(c(e)?e.host:null)||f(e)}function y(e){return["html","body","#document"].indexOf(l(e))>=0?e.ownerDocument.body:s(e)&&m(e)?e:y(v(e))}function _(e,t){var n;void 0===t&&(t=[]);var i=y(e),o=i===(null==(n=e.ownerDocument)?void 0:n.body),a=r(i),s=o?[a].concat(a.visualViewport||[],m(i)?i:[]):i,c=t.concat(s);return o?c:c.concat(_(v(s)))}function O(e){return["table","td","th"].indexOf(l(e))>=0}function j(e){return s(e)&&"fixed"!==p(e).position?e.offsetParent:null}function w(e){var t=-1!==navigator.userAgent.toLowerCase().indexOf("firefox"),n=-1!==navigator.userAgent.indexOf("Trident");if(n&&s(e)){var i=p(e);if("fixed"===i.position)return null}var r=v(e);while(s(r)&&["html","body"].indexOf(l(r))<0){var o=p(r);if("none"!==o.transform||"none"!==o.perspective||"paint"===o.contain||-1!==["transform","perspective"].indexOf(o.willChange)||t&&"filter"===o.willChange||t&&o.filter&&"none"!==o.filter)return r;r=r.parentNode}return null}function k(e){var t=r(e),n=j(e);while(n&&O(n)&&"static"===p(n).position)n=j(n);return n&&("html"===l(n)||"body"===l(n)&&"static"===p(n).position)?t:n||w(e)||t}n.d(t,"a",(function(){return rt}));var M="top",x="bottom",L="right",S="left",T="auto",D=[M,x,L,S],A="start",P="end",Y="clippingParents",C="viewport",E="popper",H="reference",$=D.reduce((function(e,t){return e.concat([t+"-"+A,t+"-"+P])}),[]),I=[].concat(D,[T]).reduce((function(e,t){return e.concat([t,t+"-"+A,t+"-"+P])}),[]),F="beforeRead",B="read",N="afterRead",R="beforeMain",z="main",V="afterMain",W="beforeWrite",U="write",G="afterWrite",q=[F,B,N,R,z,V,W,U,G];function J(e){var t=new Map,n=new Set,i=[];function r(e){n.add(e.name);var o=[].concat(e.requires||[],e.requiresIfExists||[]);o.forEach((function(e){if(!n.has(e)){var i=t.get(e);i&&r(i)}})),i.push(e)}return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||r(e)})),i}function K(e){var t=J(e);return q.reduce((function(e,n){return e.concat(t.filter((function(e){return e.phase===n})))}),[])}function X(e){var t;return function(){return t||(t=new Promise((function(n){Promise.resolve().then((function(){t=void 0,n(e())}))}))),t}}function Z(e){var t=e.reduce((function(e,t){var n=e[t.name];return e[t.name]=n?Object.assign({},n,t,{options:Object.assign({},n.options,t.options),data:Object.assign({},n.data,t.data)}):t,e}),{});return Object.keys(t).map((function(e){return t[e]}))}var Q={placement:"bottom",modifiers:[],strategy:"absolute"};function ee(){for(var e=arguments.length,t=new Array(e),n=0;n=0?"x":"y"}function ce(e){var t,n=e.reference,i=e.element,r=e.placement,o=r?oe(r):null,a=r?ae(r):null,s=n.x+n.width/2-i.width/2,c=n.y+n.height/2-i.height/2;switch(o){case M:t={x:s,y:n.y-i.height};break;case x:t={x:s,y:n.y+n.height};break;case L:t={x:n.x+n.width,y:c};break;case S:t={x:n.x-i.width,y:c};break;default:t={x:n.x,y:n.y}}var u=o?se(o):null;if(null!=u){var d="y"===u?"height":"width";switch(a){case A:t[u]=t[u]-(n[d]/2-i[d]/2);break;case P:t[u]=t[u]+(n[d]/2-i[d]/2);break;default:}}return t}function ue(e){var t=e.state,n=e.name;t.modifiersData[n]=ce({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})}var de={name:"popperOffsets",enabled:!0,phase:"read",fn:ue,data:{}},le=Math.max,fe=Math.min,he=Math.round,pe={top:"auto",right:"auto",bottom:"auto",left:"auto"};function me(e){var t=e.x,n=e.y,i=window,r=i.devicePixelRatio||1;return{x:he(he(t*r)/r)||0,y:he(he(n*r)/r)||0}}function be(e){var t,n=e.popper,i=e.popperRect,o=e.placement,a=e.offsets,s=e.position,c=e.gpuAcceleration,u=e.adaptive,d=e.roundOffsets,l=!0===d?me(a):"function"===typeof d?d(a):a,h=l.x,m=void 0===h?0:h,b=l.y,g=void 0===b?0:b,v=a.hasOwnProperty("x"),y=a.hasOwnProperty("y"),_=S,O=M,j=window;if(u){var w=k(n),T="clientHeight",D="clientWidth";w===r(n)&&(w=f(n),"static"!==p(w).position&&(T="scrollHeight",D="scrollWidth")),w=w,o===M&&(O=x,g-=w[T]-i.height,g*=c?1:-1),o===S&&(_=L,m-=w[D]-i.width,m*=c?1:-1)}var A,P=Object.assign({position:s},u&&pe);return c?Object.assign({},P,(A={},A[O]=y?"0":"",A[_]=v?"0":"",A.transform=(j.devicePixelRatio||1)<2?"translate("+m+"px, "+g+"px)":"translate3d("+m+"px, "+g+"px, 0)",A)):Object.assign({},P,(t={},t[O]=y?g+"px":"",t[_]=v?m+"px":"",t.transform="",t))}function ge(e){var t=e.state,n=e.options,i=n.gpuAcceleration,r=void 0===i||i,o=n.adaptive,a=void 0===o||o,s=n.roundOffsets,c=void 0===s||s,u={placement:oe(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:r};null!=t.modifiersData.popperOffsets&&(t.styles.popper=Object.assign({},t.styles.popper,be(Object.assign({},u,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:a,roundOffsets:c})))),null!=t.modifiersData.arrow&&(t.styles.arrow=Object.assign({},t.styles.arrow,be(Object.assign({},u,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:c})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})}var ve={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:ge,data:{}};function ye(e){var t=e.state;Object.keys(t.elements).forEach((function(e){var n=t.styles[e]||{},i=t.attributes[e]||{},r=t.elements[e];s(r)&&l(r)&&(Object.assign(r.style,n),Object.keys(i).forEach((function(e){var t=i[e];!1===t?r.removeAttribute(e):r.setAttribute(e,!0===t?"":t)})))}))}function _e(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach((function(e){var i=t.elements[e],r=t.attributes[e]||{},o=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]),a=o.reduce((function(e,t){return e[t]="",e}),{});s(i)&&l(i)&&(Object.assign(i.style,a),Object.keys(r).forEach((function(e){i.removeAttribute(e)})))}))}}var Oe={name:"applyStyles",enabled:!0,phase:"write",fn:ye,effect:_e,requires:["computeStyles"]};function je(e,t,n){var i=oe(e),r=[S,M].indexOf(i)>=0?-1:1,o="function"===typeof n?n(Object.assign({},t,{placement:e})):n,a=o[0],s=o[1];return a=a||0,s=(s||0)*r,[S,L].indexOf(i)>=0?{x:s,y:a}:{x:a,y:s}}function we(e){var t=e.state,n=e.options,i=e.name,r=n.offset,o=void 0===r?[0,0]:r,a=I.reduce((function(e,n){return e[n]=je(n,t.rects,o),e}),{}),s=a[t.placement],c=s.x,u=s.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=c,t.modifiersData.popperOffsets.y+=u),t.modifiersData[i]=a}var ke={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:we},Me={left:"right",right:"left",bottom:"top",top:"bottom"};function xe(e){return e.replace(/left|right|bottom|top/g,(function(e){return Me[e]}))}var Le={start:"end",end:"start"};function Se(e){return e.replace(/start|end/g,(function(e){return Le[e]}))}function Te(e){var t=r(e),n=f(e),i=t.visualViewport,o=n.clientWidth,a=n.clientHeight,s=0,c=0;return i&&(o=i.width,a=i.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(s=i.offsetLeft,c=i.offsetTop)),{width:o,height:a,x:s+h(e),y:c}}function De(e){var t,n=f(e),i=o(e),r=null==(t=e.ownerDocument)?void 0:t.body,a=le(n.scrollWidth,n.clientWidth,r?r.scrollWidth:0,r?r.clientWidth:0),s=le(n.scrollHeight,n.clientHeight,r?r.scrollHeight:0,r?r.clientHeight:0),c=-i.scrollLeft+h(e),u=-i.scrollTop;return"rtl"===p(r||n).direction&&(c+=le(n.clientWidth,r?r.clientWidth:0)-a),{width:a,height:s,x:c,y:u}}function Ae(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&c(n)){var i=t;do{if(i&&e.isSameNode(i))return!0;i=i.parentNode||i.host}while(i)}return!1}function Pe(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function Ye(e){var t=i(e);return t.top=t.top+e.clientTop,t.left=t.left+e.clientLeft,t.bottom=t.top+e.clientHeight,t.right=t.left+e.clientWidth,t.width=e.clientWidth,t.height=e.clientHeight,t.x=t.left,t.y=t.top,t}function Ce(e,t){return t===C?Pe(Te(e)):s(t)?Ye(t):Pe(De(f(e)))}function Ee(e){var t=_(v(e)),n=["absolute","fixed"].indexOf(p(e).position)>=0,i=n&&s(e)?k(e):e;return a(i)?t.filter((function(e){return a(e)&&Ae(e,i)&&"body"!==l(e)})):[]}function He(e,t,n){var i="clippingParents"===t?Ee(e):[].concat(t),r=[].concat(i,[n]),o=r[0],a=r.reduce((function(t,n){var i=Ce(e,n);return t.top=le(i.top,t.top),t.right=fe(i.right,t.right),t.bottom=fe(i.bottom,t.bottom),t.left=le(i.left,t.left),t}),Ce(e,o));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}function $e(){return{top:0,right:0,bottom:0,left:0}}function Ie(e){return Object.assign({},$e(),e)}function Fe(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function Be(e,t){void 0===t&&(t={});var n=t,r=n.placement,o=void 0===r?e.placement:r,s=n.boundary,c=void 0===s?Y:s,u=n.rootBoundary,d=void 0===u?C:u,l=n.elementContext,h=void 0===l?E:l,p=n.altBoundary,m=void 0!==p&&p,b=n.padding,g=void 0===b?0:b,v=Ie("number"!==typeof g?g:Fe(g,D)),y=h===E?H:E,_=e.elements.reference,O=e.rects.popper,j=e.elements[m?y:h],w=He(a(j)?j:j.contextElement||f(e.elements.popper),c,d),k=i(_),S=ce({reference:k,element:O,strategy:"absolute",placement:o}),T=Pe(Object.assign({},O,S)),A=h===E?T:k,P={top:w.top-A.top+v.top,bottom:A.bottom-w.bottom+v.bottom,left:w.left-A.left+v.left,right:A.right-w.right+v.right},$=e.modifiersData.offset;if(h===E&&$){var I=$[o];Object.keys(P).forEach((function(e){var t=[L,x].indexOf(e)>=0?1:-1,n=[M,x].indexOf(e)>=0?"y":"x";P[e]+=I[n]*t}))}return P}function Ne(e,t){void 0===t&&(t={});var n=t,i=n.placement,r=n.boundary,o=n.rootBoundary,a=n.padding,s=n.flipVariations,c=n.allowedAutoPlacements,u=void 0===c?I:c,d=ae(i),l=d?s?$:$.filter((function(e){return ae(e)===d})):D,f=l.filter((function(e){return u.indexOf(e)>=0}));0===f.length&&(f=l);var h=f.reduce((function(t,n){return t[n]=Be(e,{placement:n,boundary:r,rootBoundary:o,padding:a})[oe(n)],t}),{});return Object.keys(h).sort((function(e,t){return h[e]-h[t]}))}function Re(e){if(oe(e)===T)return[];var t=xe(e);return[Se(e),t,Se(t)]}function ze(e){var t=e.state,n=e.options,i=e.name;if(!t.modifiersData[i]._skip){for(var r=n.mainAxis,o=void 0===r||r,a=n.altAxis,s=void 0===a||a,c=n.fallbackPlacements,u=n.padding,d=n.boundary,l=n.rootBoundary,f=n.altBoundary,h=n.flipVariations,p=void 0===h||h,m=n.allowedAutoPlacements,b=t.options.placement,g=oe(b),v=g===b,y=c||(v||!p?[xe(b)]:Re(b)),_=[b].concat(y).reduce((function(e,n){return e.concat(oe(n)===T?Ne(t,{placement:n,boundary:d,rootBoundary:l,padding:u,flipVariations:p,allowedAutoPlacements:m}):n)}),[]),O=t.rects.reference,j=t.rects.popper,w=new Map,k=!0,D=_[0],P=0;P<_.length;P++){var Y=_[P],C=oe(Y),E=ae(Y)===A,H=[M,x].indexOf(C)>=0,$=H?"width":"height",I=Be(t,{placement:Y,boundary:d,rootBoundary:l,altBoundary:f,padding:u}),F=H?E?L:S:E?x:M;O[$]>j[$]&&(F=xe(F));var B=xe(F),N=[];if(o&&N.push(I[C]<=0),s&&N.push(I[F]<=0,I[B]<=0),N.every((function(e){return e}))){D=Y,k=!1;break}w.set(Y,N)}if(k)for(var R=p?3:1,z=function(e){var t=_.find((function(t){var n=w.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return D=t,"break"},V=R;V>0;V--){var W=z(V);if("break"===W)break}t.placement!==D&&(t.modifiersData[i]._skip=!0,t.placement=D,t.reset=!0)}}var Ve={name:"flip",enabled:!0,phase:"main",fn:ze,requiresIfExists:["offset"],data:{_skip:!1}};function We(e){return"x"===e?"y":"x"}function Ue(e,t,n){return le(e,fe(t,n))}function Ge(e){var t=e.state,n=e.options,i=e.name,r=n.mainAxis,o=void 0===r||r,a=n.altAxis,s=void 0!==a&&a,c=n.boundary,u=n.rootBoundary,d=n.altBoundary,l=n.padding,f=n.tether,h=void 0===f||f,p=n.tetherOffset,m=void 0===p?0:p,b=Be(t,{boundary:c,rootBoundary:u,padding:l,altBoundary:d}),v=oe(t.placement),y=ae(t.placement),_=!y,O=se(v),j=We(O),w=t.modifiersData.popperOffsets,T=t.rects.reference,D=t.rects.popper,P="function"===typeof m?m(Object.assign({},t.rects,{placement:t.placement})):m,Y={x:0,y:0};if(w){if(o||s){var C="y"===O?M:S,E="y"===O?x:L,H="y"===O?"height":"width",$=w[O],I=w[O]+b[C],F=w[O]-b[E],B=h?-D[H]/2:0,N=y===A?T[H]:D[H],R=y===A?-D[H]:-T[H],z=t.elements.arrow,V=h&&z?g(z):{width:0,height:0},W=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:$e(),U=W[C],G=W[E],q=Ue(0,T[H],V[H]),J=_?T[H]/2-B-q-U-P:N-q-U-P,K=_?-T[H]/2+B+q+G+P:R+q+G+P,X=t.elements.arrow&&k(t.elements.arrow),Z=X?"y"===O?X.clientTop||0:X.clientLeft||0:0,Q=t.modifiersData.offset?t.modifiersData.offset[t.placement][O]:0,ee=w[O]+J-Q-Z,te=w[O]+K-Q;if(o){var ne=Ue(h?fe(I,ee):I,$,h?le(F,te):F);w[O]=ne,Y[O]=ne-$}if(s){var ie="x"===O?M:S,re="x"===O?x:L,ce=w[j],ue=ce+b[ie],de=ce-b[re],he=Ue(h?fe(ue,ee):ue,ce,h?le(de,te):de);w[j]=he,Y[j]=he-ce}}t.modifiersData[i]=Y}}var qe={name:"preventOverflow",enabled:!0,phase:"main",fn:Ge,requiresIfExists:["offset"]},Je=function(e,t){return e="function"===typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e,Ie("number"!==typeof e?e:Fe(e,D))};function Ke(e){var t,n=e.state,i=e.name,r=e.options,o=n.elements.arrow,a=n.modifiersData.popperOffsets,s=oe(n.placement),c=se(s),u=[S,L].indexOf(s)>=0,d=u?"height":"width";if(o&&a){var l=Je(r.padding,n),f=g(o),h="y"===c?M:S,p="y"===c?x:L,m=n.rects.reference[d]+n.rects.reference[c]-a[c]-n.rects.popper[d],b=a[c]-n.rects.reference[c],v=k(o),y=v?"y"===c?v.clientHeight||0:v.clientWidth||0:0,_=m/2-b/2,O=l[h],j=y-f[d]-l[p],w=y/2-f[d]/2+_,T=Ue(O,w,j),D=c;n.modifiersData[i]=(t={},t[D]=T,t.centerOffset=T-w,t)}}function Xe(e){var t=e.state,n=e.options,i=n.element,r=void 0===i?"[data-popper-arrow]":i;null!=r&&("string"!==typeof r||(r=t.elements.popper.querySelector(r),r))&&Ae(t.elements.popper,r)&&(t.elements.arrow=r)}var Ze={name:"arrow",enabled:!0,phase:"main",fn:Ke,effect:Xe,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Qe(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function et(e){return[M,L,x,S].some((function(t){return e[t]>=0}))}function tt(e){var t=e.state,n=e.name,i=t.rects.reference,r=t.rects.popper,o=t.modifiersData.preventOverflow,a=Be(t,{elementContext:"reference"}),s=Be(t,{altBoundary:!0}),c=Qe(a,i),u=Qe(s,r,o),d=et(c),l=et(u);t.modifiersData[n]={referenceClippingOffsets:c,popperEscapeOffsets:u,isReferenceHidden:d,hasPopperEscaped:l},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":d,"data-popper-escaped":l})}var nt={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:tt},it=[re,de,ve,Oe,ke,Ve,qe,Ze,nt],rt=te({defaultModifiers:it})},"3a39":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},n={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"},i=e.defineLocale("ne",{months:"जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर".split("_"),monthsShort:"जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.".split("_"),monthsParseExact:!0,weekdays:"आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार".split("_"),weekdaysShort:"आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.".split("_"),weekdaysMin:"आ._सो._मं._बु._बि._शु._श.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"Aको h:mm बजे",LTS:"Aको h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, Aको h:mm बजे",LLLL:"dddd, D MMMM YYYY, Aको h:mm बजे"},preparse:function(e){return e.replace(/[१२३४५६७८९०]/g,(function(e){return n[e]}))},postformat:function(e){return e.replace(/\d/g,(function(e){return t[e]}))},meridiemParse:/राति|बिहान|दिउँसो|साँझ/,meridiemHour:function(e,t){return 12===e&&(e=0),"राति"===t?e<4?e:e+12:"बिहान"===t?e:"दिउँसो"===t?e>=10?e:e+12:"साँझ"===t?e+12:void 0},meridiem:function(e,t,n){return e<3?"राति":e<12?"बिहान":e<16?"दिउँसो":e<20?"साँझ":"राति"},calendar:{sameDay:"[आज] LT",nextDay:"[भोलि] LT",nextWeek:"[आउँदो] dddd[,] LT",lastDay:"[हिजो] LT",lastWeek:"[गएको] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%sमा",past:"%s अगाडि",s:"केही क्षण",ss:"%d सेकेण्ड",m:"एक मिनेट",mm:"%d मिनेट",h:"एक घण्टा",hh:"%d घण्टा",d:"एक दिन",dd:"%d दिन",M:"एक महिना",MM:"%d महिना",y:"एक बर्ष",yy:"%d बर्ष"},week:{dow:0,doy:6}});return i}))},"3a58":function(e,t,n){"use strict";n.d(t,"c",(function(){return i})),n.d(t,"b",(function(){return r})),n.d(t,"a",(function(){return o}));var i=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:NaN,n=parseInt(e,10);return isNaN(n)?t:n},r=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:NaN,n=parseFloat(e);return isNaN(n)?t:n},o=function(e,t){return r(e).toFixed(i(t,0))}},"3a6c":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("zh-mo",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日dddd HH:mm",l:"D/M/YYYY",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(e,t){return 12===e&&(e=0),"凌晨"===t||"早上"===t||"上午"===t?e:"中午"===t?e>=11?e:e+12:"下午"===t||"晚上"===t?e+12:void 0},meridiem:function(e,t,n){var i=100*e+t;return i<600?"凌晨":i<900?"早上":i<1130?"上午":i<1230?"中午":i<1800?"下午":"晚上"},calendar:{sameDay:"[今天] LT",nextDay:"[明天] LT",nextWeek:"[下]dddd LT",lastDay:"[昨天] LT",lastWeek:"[上]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|週)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"日";case"M":return e+"月";case"w":case"W":return e+"週";default:return e}},relativeTime:{future:"%s內",past:"%s前",s:"幾秒",ss:"%d 秒",m:"1 分鐘",mm:"%d 分鐘",h:"1 小時",hh:"%d 小時",d:"1 天",dd:"%d 天",M:"1 個月",MM:"%d 個月",y:"1 年",yy:"%d 年"}});return t}))},"3b1b":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t={0:"-ум",1:"-ум",2:"-юм",3:"-юм",4:"-ум",5:"-ум",6:"-ум",7:"-ум",8:"-ум",9:"-ум",10:"-ум",12:"-ум",13:"-ум",20:"-ум",30:"-юм",40:"-ум",50:"-ум",60:"-ум",70:"-ум",80:"-ум",90:"-ум",100:"-ум"},n=e.defineLocale("tg",{months:{format:"январи_феврали_марти_апрели_майи_июни_июли_августи_сентябри_октябри_ноябри_декабри".split("_"),standalone:"январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр".split("_")},monthsShort:"янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек".split("_"),weekdays:"якшанбе_душанбе_сешанбе_чоршанбе_панҷшанбе_ҷумъа_шанбе".split("_"),weekdaysShort:"яшб_дшб_сшб_чшб_пшб_ҷум_шнб".split("_"),weekdaysMin:"яш_дш_сш_чш_пш_ҷм_шб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Имрӯз соати] LT",nextDay:"[Фардо соати] LT",lastDay:"[Дирӯз соати] LT",nextWeek:"dddd[и] [ҳафтаи оянда соати] LT",lastWeek:"dddd[и] [ҳафтаи гузашта соати] LT",sameElse:"L"},relativeTime:{future:"баъди %s",past:"%s пеш",s:"якчанд сония",m:"як дақиқа",mm:"%d дақиқа",h:"як соат",hh:"%d соат",d:"як рӯз",dd:"%d рӯз",M:"як моҳ",MM:"%d моҳ",y:"як сол",yy:"%d сол"},meridiemParse:/шаб|субҳ|рӯз|бегоҳ/,meridiemHour:function(e,t){return 12===e&&(e=0),"шаб"===t?e<4?e:e+12:"субҳ"===t?e:"рӯз"===t?e>=11?e:e+12:"бегоҳ"===t?e+12:void 0},meridiem:function(e,t,n){return e<4?"шаб":e<11?"субҳ":e<16?"рӯз":e<19?"бегоҳ":"шаб"},dayOfMonthOrdinalParse:/\d{1,2}-(ум|юм)/,ordinal:function(e){var n=e%10,i=e>=100?100:null;return e+(t[e]||t[n]||t[i])},week:{dow:1,doy:7}});return n}))},"3bbe":function(e,t,n){var i=n("861d");e.exports=function(e){if(!i(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e}},"3c0d":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t="leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec".split("_"),n="led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro".split("_"),i=[/^led/i,/^úno/i,/^bře/i,/^dub/i,/^kvě/i,/^(čvn|červen$|června)/i,/^(čvc|červenec|července)/i,/^srp/i,/^zář/i,/^říj/i,/^lis/i,/^pro/i],r=/^(leden|únor|březen|duben|květen|červenec|července|červen|června|srpen|září|říjen|listopad|prosinec|led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i;function o(e){return e>1&&e<5&&1!==~~(e/10)}function a(e,t,n,i){var r=e+" ";switch(n){case"s":return t||i?"pár sekund":"pár sekundami";case"ss":return t||i?r+(o(e)?"sekundy":"sekund"):r+"sekundami";case"m":return t?"minuta":i?"minutu":"minutou";case"mm":return t||i?r+(o(e)?"minuty":"minut"):r+"minutami";case"h":return t?"hodina":i?"hodinu":"hodinou";case"hh":return t||i?r+(o(e)?"hodiny":"hodin"):r+"hodinami";case"d":return t||i?"den":"dnem";case"dd":return t||i?r+(o(e)?"dny":"dní"):r+"dny";case"M":return t||i?"měsíc":"měsícem";case"MM":return t||i?r+(o(e)?"měsíce":"měsíců"):r+"měsíci";case"y":return t||i?"rok":"rokem";case"yy":return t||i?r+(o(e)?"roky":"let"):r+"lety"}}var s=e.defineLocale("cs",{months:t,monthsShort:n,monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(leden|ledna|února|únor|březen|března|duben|dubna|květen|května|červenec|července|červen|června|srpen|srpna|září|říjen|října|listopadu|listopad|prosinec|prosince)/i,monthsShortStrictRegex:/^(led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i,monthsParse:i,longMonthsParse:i,shortMonthsParse:i,weekdays:"neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_čt_pá_so".split("_"),weekdaysMin:"ne_po_út_st_čt_pá_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v neděli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve středu v] LT";case 4:return"[ve čtvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[včera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou neděli v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou středu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"před %s",s:a,ss:a,m:a,mm:a,h:a,hh:a,d:a,dd:a,M:a,MM:a,y:a,yy:a},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return s}))},"3c21":function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n("d82f"),r=n("7b1e"),o=function(e,t){if(e.length!==t.length)return!1;for(var n=!0,i=0;n&&i=n.length?{value:void 0,done:!0}:(e=i(n,r),t.index+=e.length,{value:e,done:!1})}))},"3de5":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t={1:"௧",2:"௨",3:"௩",4:"௪",5:"௫",6:"௬",7:"௭",8:"௮",9:"௯",0:"௦"},n={"௧":"1","௨":"2","௩":"3","௪":"4","௫":"5","௬":"6","௭":"7","௮":"8","௯":"9","௦":"0"},i=e.defineLocale("ta",{months:"ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்".split("_"),monthsShort:"ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்".split("_"),weekdays:"ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை".split("_"),weekdaysShort:"ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி".split("_"),weekdaysMin:"ஞா_தி_செ_பு_வி_வெ_ச".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, HH:mm",LLLL:"dddd, D MMMM YYYY, HH:mm"},calendar:{sameDay:"[இன்று] LT",nextDay:"[நாளை] LT",nextWeek:"dddd, LT",lastDay:"[நேற்று] LT",lastWeek:"[கடந்த வாரம்] dddd, LT",sameElse:"L"},relativeTime:{future:"%s இல்",past:"%s முன்",s:"ஒரு சில விநாடிகள்",ss:"%d விநாடிகள்",m:"ஒரு நிமிடம்",mm:"%d நிமிடங்கள்",h:"ஒரு மணி நேரம்",hh:"%d மணி நேரம்",d:"ஒரு நாள்",dd:"%d நாட்கள்",M:"ஒரு மாதம்",MM:"%d மாதங்கள்",y:"ஒரு வருடம்",yy:"%d ஆண்டுகள்"},dayOfMonthOrdinalParse:/\d{1,2}வது/,ordinal:function(e){return e+"வது"},preparse:function(e){return e.replace(/[௧௨௩௪௫௬௭௮௯௦]/g,(function(e){return n[e]}))},postformat:function(e){return e.replace(/\d/g,(function(e){return t[e]}))},meridiemParse:/யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/,meridiem:function(e,t,n){return e<2?" யாமம்":e<6?" வைகறை":e<10?" காலை":e<14?" நண்பகல்":e<18?" எற்பாடு":e<22?" மாலை":" யாமம்"},meridiemHour:function(e,t){return 12===e&&(e=0),"யாமம்"===t?e<2?e:e+12:"வைகறை"===t||"காலை"===t||"நண்பகல்"===t&&e>=10?e:e+12},week:{dow:0,doy:6}});return i}))},"3e92":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t={1:"೧",2:"೨",3:"೩",4:"೪",5:"೫",6:"೬",7:"೭",8:"೮",9:"೯",0:"೦"},n={"೧":"1","೨":"2","೩":"3","೪":"4","೫":"5","೬":"6","೭":"7","೮":"8","೯":"9","೦":"0"},i=e.defineLocale("kn",{months:"ಜನವರಿ_ಫೆಬ್ರವರಿ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂಬರ್_ಅಕ್ಟೋಬರ್_ನವೆಂಬರ್_ಡಿಸೆಂಬರ್".split("_"),monthsShort:"ಜನ_ಫೆಬ್ರ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂ_ಅಕ್ಟೋ_ನವೆಂ_ಡಿಸೆಂ".split("_"),monthsParseExact:!0,weekdays:"ಭಾನುವಾರ_ಸೋಮವಾರ_ಮಂಗಳವಾರ_ಬುಧವಾರ_ಗುರುವಾರ_ಶುಕ್ರವಾರ_ಶನಿವಾರ".split("_"),weekdaysShort:"ಭಾನು_ಸೋಮ_ಮಂಗಳ_ಬುಧ_ಗುರು_ಶುಕ್ರ_ಶನಿ".split("_"),weekdaysMin:"ಭಾ_ಸೋ_ಮಂ_ಬು_ಗು_ಶು_ಶ".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[ಇಂದು] LT",nextDay:"[ನಾಳೆ] LT",nextWeek:"dddd, LT",lastDay:"[ನಿನ್ನೆ] LT",lastWeek:"[ಕೊನೆಯ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s ನಂತರ",past:"%s ಹಿಂದೆ",s:"ಕೆಲವು ಕ್ಷಣಗಳು",ss:"%d ಸೆಕೆಂಡುಗಳು",m:"ಒಂದು ನಿಮಿಷ",mm:"%d ನಿಮಿಷ",h:"ಒಂದು ಗಂಟೆ",hh:"%d ಗಂಟೆ",d:"ಒಂದು ದಿನ",dd:"%d ದಿನ",M:"ಒಂದು ತಿಂಗಳು",MM:"%d ತಿಂಗಳು",y:"ಒಂದು ವರ್ಷ",yy:"%d ವರ್ಷ"},preparse:function(e){return e.replace(/[೧೨೩೪೫೬೭೮೯೦]/g,(function(e){return n[e]}))},postformat:function(e){return e.replace(/\d/g,(function(e){return t[e]}))},meridiemParse:/ರಾತ್ರಿ|ಬೆಳಿಗ್ಗೆ|ಮಧ್ಯಾಹ್ನ|ಸಂಜೆ/,meridiemHour:function(e,t){return 12===e&&(e=0),"ರಾತ್ರಿ"===t?e<4?e:e+12:"ಬೆಳಿಗ್ಗೆ"===t?e:"ಮಧ್ಯಾಹ್ನ"===t?e>=10?e:e+12:"ಸಂಜೆ"===t?e+12:void 0},meridiem:function(e,t,n){return e<4?"ರಾತ್ರಿ":e<10?"ಬೆಳಿಗ್ಗೆ":e<17?"ಮಧ್ಯಾಹ್ನ":e<20?"ಸಂಜೆ":"ರಾತ್ರಿ"},dayOfMonthOrdinalParse:/\d{1,2}(ನೇ)/,ordinal:function(e){return e+"ನೇ"},week:{dow:0,doy:6}});return i}))},"3f8c":function(e,t){e.exports={}},"408c":function(e,t,n){var i=n("2b3e"),r=function(){return i.Date.now()};e.exports=r},"423e":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("ar-kw",{months:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:0,doy:12}});return t}))},"428f":function(e,t,n){var i=n("da84");e.exports=i},4362:function(e,t,n){t.nextTick=function(e){var t=Array.prototype.slice.call(arguments);t.shift(),setTimeout((function(){e.apply(null,t)}),0)},t.platform=t.arch=t.execPath=t.title="browser",t.pid=1,t.browser=!0,t.env={},t.argv=[],t.binding=function(e){throw new Error("No such module. (Possibly not yet loaded)")},function(){var e,i="/";t.cwd=function(){return i},t.chdir=function(t){e||(e=n("df7c")),i=e.resolve(t,i)}}(),t.exit=t.kill=t.umask=t.dlopen=t.uptime=t.memoryUsage=t.uvCounters=function(){},t.features={}},"440c":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -function t(e,t,n,i){var r={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return t?r[n][0]:r[n][1]}function n(e){var t=e.substr(0,e.indexOf(" "));return r(t)?"a "+e:"an "+e}function i(e){var t=e.substr(0,e.indexOf(" "));return r(t)?"viru "+e:"virun "+e}function r(e){if(e=parseInt(e,10),isNaN(e))return!1;if(e<0)return!0;if(e<10)return 4<=e&&e<=7;if(e<100){var t=e%10,n=e/10;return r(0===t?n:t)}if(e<1e4){while(e>=10)e/=10;return r(e)}return e/=1e3,r(e)}var o=e.defineLocale("lb",{months:"Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._Mé._Dë._Më._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mé_Dë_Më_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm [Auer]",LLLL:"dddd, D. MMMM YYYY H:mm [Auer]"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gëschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:n,past:i,s:"e puer Sekonnen",ss:"%d Sekonnen",m:t,mm:"%d Minutten",h:t,hh:"%d Stonnen",d:t,dd:"%d Deeg",M:t,MM:"%d Méint",y:t,yy:"%d Joer"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return o}))},4416:function(e,t){function n(e){var t=null==e?0:e.length;return t?e[t-1]:void 0}e.exports=n},"448a":function(e,t,n){var i=n("2236"),r=n("11b0"),o=n("6613"),a=n("0676");function s(e){return i(e)||r(e)||o(e)||a()}e.exports=s,e.exports["default"]=e.exports,e.exports.__esModule=!0},"44ad":function(e,t,n){var i=n("d039"),r=n("c6b6"),o="".split;e.exports=i((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==r(e)?o.call(e,""):Object(e)}:Object},"44d2":function(e,t,n){var i=n("b622"),r=n("7c73"),o=n("9bf2"),a=i("unscopables"),s=Array.prototype;void 0==s[a]&&o.f(s,a,{configurable:!0,value:r(null)}),e.exports=function(e){s[a][e]=!0}},"44de":function(e,t,n){var i=n("da84");e.exports=function(e,t){var n=i.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))}},"44e7":function(e,t,n){var i=n("861d"),r=n("c6b6"),o=n("b622"),a=o("match");e.exports=function(e){var t;return i(e)&&(void 0!==(t=e[a])?!!t:"RegExp"==r(e))}},"466d":function(e,t,n){"use strict";var i=n("d784"),r=n("825a"),o=n("50c4"),a=n("1d80"),s=n("8aa5"),c=n("14c3");i("match",1,(function(e,t,n){return[function(t){var n=a(this),i=void 0==t?void 0:t[e];return void 0!==i?i.call(t,n):new RegExp(t)[e](String(n))},function(e){var i=n(t,e,this);if(i.done)return i.value;var a=r(e),u=String(this);if(!a.global)return c(a,u);var d=a.unicode;a.lastIndex=0;var l,f=[],h=0;while(null!==(l=c(a,u))){var p=String(l[0]);f[h]=p,""===p&&(a.lastIndex=s(u,o(a.lastIndex),d)),h++}return 0===h?null:f}]}))},"467f":function(e,t,n){"use strict";var i=n("2d83");e.exports=function(e,t,n){var r=n.config.validateStatus;n.status&&r&&!r(n.status)?t(i("Request failed with status code "+n.status,n.config,null,n.request,n)):e(n)}},4840:function(e,t,n){var i=n("825a"),r=n("1c0b"),o=n("b622"),a=o("species");e.exports=function(e,t){var n,o=i(e).constructor;return void 0===o||void 0==(n=i(o)[a])?t:r(n)}},"485c":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t={1:"-inci",5:"-inci",8:"-inci",70:"-inci",80:"-inci",2:"-nci",7:"-nci",20:"-nci",50:"-nci",3:"-üncü",4:"-üncü",100:"-üncü",6:"-ncı",9:"-uncu",10:"-uncu",30:"-uncu",60:"-ıncı",90:"-ıncı"},n=e.defineLocale("az",{months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekdays:"Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə".split("_"),weekdaysShort:"Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən".split("_"),weekdaysMin:"Bz_BE_ÇA_Çə_CA_Cü_Şə".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[sabah saat] LT",nextWeek:"[gələn həftə] dddd [saat] LT",lastDay:"[dünən] LT",lastWeek:"[keçən həftə] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s əvvəl",s:"bir neçə saniyə",ss:"%d saniyə",m:"bir dəqiqə",mm:"%d dəqiqə",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},meridiemParse:/gecə|səhər|gündüz|axşam/,isPM:function(e){return/^(gündüz|axşam)$/.test(e)},meridiem:function(e,t,n){return e<4?"gecə":e<12?"səhər":e<17?"gündüz":"axşam"},dayOfMonthOrdinalParse:/\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,ordinal:function(e){if(0===e)return e+"-ıncı";var n=e%10,i=e%100-n,r=e>=100?100:null;return e+(t[n]||t[i]||t[r])},week:{dow:1,doy:7}});return n}))},4930:function(e,t,n){var i=n("2d00"),r=n("d039");e.exports=!!Object.getOwnPropertySymbols&&!r((function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&i&&i<41}))},"493b":function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var i=n("8c4e"),r=Object(i["a"])("$attrs","bvAttrs")},"49ab":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("zh-hk",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日dddd HH:mm",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(e,t){return 12===e&&(e=0),"凌晨"===t||"早上"===t||"上午"===t?e:"中午"===t?e>=11?e:e+12:"下午"===t||"晚上"===t?e+12:void 0},meridiem:function(e,t,n){var i=100*e+t;return i<600?"凌晨":i<900?"早上":i<1200?"上午":1200===i?"中午":i<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|週)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"日";case"M":return e+"月";case"w":case"W":return e+"週";default:return e}},relativeTime:{future:"%s後",past:"%s前",s:"幾秒",ss:"%d 秒",m:"1 分鐘",mm:"%d 分鐘",h:"1 小時",hh:"%d 小時",d:"1 天",dd:"%d 天",M:"1 個月",MM:"%d 個月",y:"1 年",yy:"%d 年"}});return t}))},"4a38":function(e,t,n){"use strict";n.d(t,"f",(function(){return h})),n.d(t,"d",(function(){return p})),n.d(t,"e",(function(){return m})),n.d(t,"c",(function(){return b})),n.d(t,"b",(function(){return g})),n.d(t,"a",(function(){return v}));var i=n("992e"),r=n("906c"),o=n("7b1e"),a=n("d82f"),s=n("fa73"),c="a",u=function(e){return"%"+e.charCodeAt(0).toString(16)},d=function(e){return encodeURIComponent(Object(s["g"])(e)).replace(i["j"],u).replace(i["i"],",")},l=decodeURIComponent,f=function(e){if(!Object(o["k"])(e))return"";var t=Object(a["h"])(e).map((function(t){var n=e[t];return Object(o["o"])(n)?"":Object(o["g"])(n)?d(t):Object(o["a"])(n)?n.reduce((function(e,n){return Object(o["g"])(n)?e.push(d(t)):Object(o["o"])(n)||e.push(d(t)+"="+d(n)),e}),[]).join("&"):d(t)+"="+d(n)})).filter((function(e){return e.length>0})).join("&");return t?"?".concat(t):""},h=function(e){var t={};return e=Object(s["g"])(e).trim().replace(i["u"],""),e?(e.split("&").forEach((function(e){var n=e.replace(i["t"]," ").split("="),r=l(n.shift()),a=n.length>0?l(n.join("=")):null;Object(o["o"])(t[r])?t[r]=a:Object(o["a"])(t[r])?t[r].push(a):t[r]=[t[r],a]})),t):t},p=function(e){return!(!e.href&&!e.to)},m=function(e){return!(!e||Object(r["t"])(e,"a"))},b=function(e,t){var n=e.to,i=e.disabled,r=e.routerComponentName,o=!!t.$router;return!o||o&&(i||!n)?c:r||(t.$nuxt?"nuxt-link":"router-link")},g=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.target,n=e.rel;return"_blank"===t&&Object(o["g"])(n)?"noopener":n||null},v=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.href,n=e.to,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:c,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"#",a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"/";if(t)return t;if(m(i))return null;if(Object(o["n"])(n))return n||a;if(Object(o["k"])(n)&&(n.path||n.query||n.hash)){var u=Object(s["g"])(n.path),d=f(n.query),l=Object(s["g"])(n.hash);return l=l&&"#"!==l.charAt(0)?"#".concat(l):l,"".concat(u).concat(d).concat(l)||a}return r}},"4a7b":function(e,t,n){"use strict";var i=n("c532");e.exports=function(e,t){t=t||{};var n={},r=["url","method","data"],o=["headers","auth","proxy","params"],a=["baseURL","transformRequest","transformResponse","paramsSerializer","timeout","timeoutMessage","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","decompress","maxContentLength","maxBodyLength","maxRedirects","transport","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding"],s=["validateStatus"];function c(e,t){return i.isPlainObject(e)&&i.isPlainObject(t)?i.merge(e,t):i.isPlainObject(t)?i.merge({},t):i.isArray(t)?t.slice():t}function u(r){i.isUndefined(t[r])?i.isUndefined(e[r])||(n[r]=c(void 0,e[r])):n[r]=c(e[r],t[r])}i.forEach(r,(function(e){i.isUndefined(t[e])||(n[e]=c(void 0,t[e]))})),i.forEach(o,u),i.forEach(a,(function(r){i.isUndefined(t[r])?i.isUndefined(e[r])||(n[r]=c(void 0,e[r])):n[r]=c(void 0,t[r])})),i.forEach(s,(function(i){i in t?n[i]=c(e[i],t[i]):i in e&&(n[i]=c(void 0,e[i]))}));var d=r.concat(o).concat(a).concat(s),l=Object.keys(e).concat(Object.keys(t)).filter((function(e){return-1===d.indexOf(e)}));return i.forEach(l,u),n}},"4b17":function(e,t,n){var i=n("6428");function r(e){var t=i(e),n=t%1;return t===t?n?t-n:t:0}e.exports=r},"4ba9":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -function t(e,t,n){var i=e+" ";switch(n){case"ss":return i+=1===e?"sekunda":2===e||3===e||4===e?"sekunde":"sekundi",i;case"m":return t?"jedna minuta":"jedne minute";case"mm":return i+=1===e?"minuta":2===e||3===e||4===e?"minute":"minuta",i;case"h":return t?"jedan sat":"jednog sata";case"hh":return i+=1===e?"sat":2===e||3===e||4===e?"sata":"sati",i;case"dd":return i+=1===e?"dan":"dana",i;case"MM":return i+=1===e?"mjesec":2===e||3===e||4===e?"mjeseca":"mjeseci",i;case"yy":return i+=1===e?"godina":2===e||3===e||4===e?"godine":"godina",i}}var n=e.defineLocale("hr",{months:{format:"siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca".split("_"),standalone:"siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_")},monthsShort:"sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"Do MMMM YYYY",LLL:"Do MMMM YYYY H:mm",LLLL:"dddd, Do MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[jučer u] LT",lastWeek:function(){switch(this.day()){case 0:return"[prošlu] [nedjelju] [u] LT";case 3:return"[prošlu] [srijedu] [u] LT";case 6:return"[prošle] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[prošli] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:t,m:t,mm:t,h:t,hh:t,d:"dan",dd:t,M:"mjesec",MM:t,y:"godinu",yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return n}))},"4cef":function(e,t){var n=/\s/;function i(e){var t=e.length;while(t--&&n.test(e.charAt(t)));return t}e.exports=i},"4d64":function(e,t,n){var i=n("fc6a"),r=n("50c4"),o=n("23cb"),a=function(e){return function(t,n,a){var s,c=i(t),u=r(c.length),d=o(a,u);if(e&&n!=n){while(u>d)if(s=c[d++],s!=s)return!0}else for(;u>d;d++)if((e||d in c)&&c[d]===n)return e||d||0;return!e&&-1}};e.exports={includes:a(!0),indexOf:a(!1)}},"4de4":function(e,t,n){"use strict";var i=n("23e7"),r=n("b727").filter,o=n("1dde"),a=o("filter");i({target:"Array",proto:!0,forced:!a},{filter:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}})},"4df4":function(e,t,n){"use strict";var i=n("0366"),r=n("7b0b"),o=n("9bdd"),a=n("e95a"),s=n("50c4"),c=n("8418"),u=n("35a1");e.exports=function(e){var t,n,d,l,f,h,p=r(e),m="function"==typeof this?this:Array,b=arguments.length,g=b>1?arguments[1]:void 0,v=void 0!==g,y=u(p),_=0;if(v&&(g=i(g,b>2?arguments[2]:void 0,2)),void 0==y||m==Array&&a(y))for(t=s(p.length),n=new m(t);t>_;_++)h=v?g(p[_],_):p[_],c(n,_,h);else for(l=y.call(p),f=l.next,n=new m;!(d=f.call(l)).done;_++)h=v?o(l,g,[d.value,_],!0):d.value,c(n,_,h);return n.length=_,n}},5038:function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(e,t){return 12===e&&(e=0),"pagi"===t?e:"siang"===t?e>=11?e:e+12:"sore"===t||"malam"===t?e+12:void 0},meridiem:function(e,t,n){return e<11?"pagi":e<15?"siang":e<19?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",ss:"%d detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:0,doy:6}});return t}))},"50c4":function(e,t,n){var i=n("a691"),r=Math.min;e.exports=function(e){return e>0?r(i(e),9007199254740991):0}},"50d3":function(e,t,n){"use strict";n.d(t,"b",(function(){return i})),n.d(t,"c",(function(){return r})),n.d(t,"a",(function(){return o}));var i="BvConfig",r="$bvConfig",o=["xs","sm","md","lg","xl"]},5120:function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=["Eanáir","Feabhra","Márta","Aibreán","Bealtaine","Meitheamh","Iúil","Lúnasa","Meán Fómhair","Deireadh Fómhair","Samhain","Nollaig"],n=["Ean","Feabh","Márt","Aib","Beal","Meith","Iúil","Lún","M.F.","D.F.","Samh","Noll"],i=["Dé Domhnaigh","Dé Luain","Dé Máirt","Dé Céadaoin","Déardaoin","Dé hAoine","Dé Sathairn"],r=["Domh","Luan","Máirt","Céad","Déar","Aoine","Sath"],o=["Do","Lu","Má","Cé","Dé","A","Sa"],a=e.defineLocale("ga",{months:t,monthsShort:n,monthsParseExact:!0,weekdays:i,weekdaysShort:r,weekdaysMin:o,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Inniu ag] LT",nextDay:"[Amárach ag] LT",nextWeek:"dddd [ag] LT",lastDay:"[Inné ag] LT",lastWeek:"dddd [seo caite] [ag] LT",sameElse:"L"},relativeTime:{future:"i %s",past:"%s ó shin",s:"cúpla soicind",ss:"%d soicind",m:"nóiméad",mm:"%d nóiméad",h:"uair an chloig",hh:"%d uair an chloig",d:"lá",dd:"%d lá",M:"mí",MM:"%d míonna",y:"bliain",yy:"%d bliain"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(e){var t=1===e?"d":e%10===2?"na":"mh";return e+t},week:{dow:1,doy:4}});return a}))},5135:function(e,t,n){var i=n("7b0b"),r={}.hasOwnProperty;e.exports=Object.hasOwn||function(e,t){return r.call(i(e),t)}},5270:function(e,t,n){"use strict";var i=n("c532"),r=n("c401"),o=n("2e67"),a=n("2444");function s(e){e.cancelToken&&e.cancelToken.throwIfRequested()}e.exports=function(e){s(e),e.headers=e.headers||{},e.data=r(e.data,e.headers,e.transformRequest),e.headers=i.merge(e.headers.common||{},e.headers[e.method]||{},e.headers),i.forEach(["delete","get","head","post","put","patch","common"],(function(t){delete e.headers[t]}));var t=e.adapter||a.adapter;return t(e).then((function(t){return s(e),t.data=r(t.data,t.headers,e.transformResponse),t}),(function(t){return o(t)||(s(e),t&&t.response&&(t.response.data=r(t.response.data,t.response.headers,e.transformResponse))),Promise.reject(t)}))}},5294:function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"],n=["اتوار","پیر","منگل","بدھ","جمعرات","جمعہ","ہفتہ"],i=e.defineLocale("ur",{months:t,monthsShort:t,weekdays:n,weekdaysShort:n,weekdaysMin:n,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd، D MMMM YYYY HH:mm"},meridiemParse:/صبح|شام/,isPM:function(e){return"شام"===e},meridiem:function(e,t,n){return e<12?"صبح":"شام"},calendar:{sameDay:"[آج بوقت] LT",nextDay:"[کل بوقت] LT",nextWeek:"dddd [بوقت] LT",lastDay:"[گذشتہ روز بوقت] LT",lastWeek:"[گذشتہ] dddd [بوقت] LT",sameElse:"L"},relativeTime:{future:"%s بعد",past:"%s قبل",s:"چند سیکنڈ",ss:"%d سیکنڈ",m:"ایک منٹ",mm:"%d منٹ",h:"ایک گھنٹہ",hh:"%d گھنٹے",d:"ایک دن",dd:"%d دن",M:"ایک ماہ",MM:"%d ماہ",y:"ایک سال",yy:"%d سال"},preparse:function(e){return e.replace(/،/g,",")},postformat:function(e){return e.replace(/,/g,"،")},week:{dow:1,doy:4}});return i}))},"52bd":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("ss",{months:"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split("_"),monthsShort:"Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo".split("_"),weekdays:"Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo".split("_"),weekdaysShort:"Lis_Umb_Lsb_Les_Lsi_Lsh_Umg".split("_"),weekdaysMin:"Li_Us_Lb_Lt_Ls_Lh_Ug".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Namuhla nga] LT",nextDay:"[Kusasa nga] LT",nextWeek:"dddd [nga] LT",lastDay:"[Itolo nga] LT",lastWeek:"dddd [leliphelile] [nga] LT",sameElse:"L"},relativeTime:{future:"nga %s",past:"wenteka nga %s",s:"emizuzwana lomcane",ss:"%d mzuzwana",m:"umzuzu",mm:"%d emizuzu",h:"lihora",hh:"%d emahora",d:"lilanga",dd:"%d emalanga",M:"inyanga",MM:"%d tinyanga",y:"umnyaka",yy:"%d iminyaka"},meridiemParse:/ekuseni|emini|entsambama|ebusuku/,meridiem:function(e,t,n){return e<11?"ekuseni":e<15?"emini":e<19?"entsambama":"ebusuku"},meridiemHour:function(e,t){return 12===e&&(e=0),"ekuseni"===t?e:"emini"===t?e>=11?e:e+12:"entsambama"===t||"ebusuku"===t?0===e?0:e+12:void 0},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:"%d",week:{dow:1,doy:4}});return t}))},5319:function(e,t,n){"use strict";var i=n("d784"),r=n("825a"),o=n("50c4"),a=n("a691"),s=n("1d80"),c=n("8aa5"),u=n("0cb2"),d=n("14c3"),l=Math.max,f=Math.min,h=function(e){return void 0===e?e:String(e)};i("replace",2,(function(e,t,n,i){var p=i.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,m=i.REPLACE_KEEPS_$0,b=p?"$":"$0";return[function(n,i){var r=s(this),o=void 0==n?void 0:n[e];return void 0!==o?o.call(n,r,i):t.call(String(r),n,i)},function(e,i){if(!p&&m||"string"===typeof i&&-1===i.indexOf(b)){var s=n(t,e,this,i);if(s.done)return s.value}var g=r(e),v=String(this),y="function"===typeof i;y||(i=String(i));var _=g.global;if(_){var O=g.unicode;g.lastIndex=0}var j=[];while(1){var w=d(g,v);if(null===w)break;if(j.push(w),!_)break;var k=String(w[0]);""===k&&(g.lastIndex=c(v,o(g.lastIndex),O))}for(var M="",x=0,L=0;L=x&&(M+=v.slice(x,T)+C,x=T+S.length)}return M+v.slice(x)}]}))},"53ca":function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));n("a4d3"),n("e01a"),n("d3b7"),n("d28b"),n("3ca3"),n("ddb0");function i(e){return i="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"===typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i(e)}},"542c":function(e,t,n){},"55c9":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),i=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],r=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,o=e.defineLocale("es-us",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,i){return e?/-MMM-/.test(i)?n[e.month()]:t[e.month()]:t},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:i,longMonthsParse:i,shortMonthsParse:i,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"MM/DD/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:0,doy:6}});return o}))},5692:function(e,t,n){var i=n("c430"),r=n("c6cd");(e.exports=function(e,t){return r[e]||(r[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.14.0",mode:i?"pure":"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"})},"56ef":function(e,t,n){var i=n("d066"),r=n("241c"),o=n("7418"),a=n("825a");e.exports=i("Reflect","ownKeys")||function(e){var t=r.f(a(e)),n=o.f;return n?t.concat(n(e)):t}},"576c":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("tet",{months:"Janeiru_Fevereiru_Marsu_Abril_Maiu_Juñu_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu".split("_"),weekdaysShort:"Dom_Seg_Ters_Kua_Kint_Sest_Sab".split("_"),weekdaysMin:"Do_Seg_Te_Ku_Ki_Ses_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Ohin iha] LT",nextDay:"[Aban iha] LT",nextWeek:"dddd [iha] LT",lastDay:"[Horiseik iha] LT",lastWeek:"dddd [semana kotuk] [iha] LT",sameElse:"L"},relativeTime:{future:"iha %s",past:"%s liuba",s:"segundu balun",ss:"segundu %d",m:"minutu ida",mm:"minutu %d",h:"oras ida",hh:"oras %d",d:"loron ida",dd:"loron %d",M:"fulan ida",MM:"fulan %d",y:"tinan ida",yy:"tinan %d"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10,n=1===~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+n},week:{dow:1,doy:4}});return t}))},"585a":function(e,t,n){(function(t){var n="object"==typeof t&&t&&t.Object===Object&&t;e.exports=n}).call(this,n("c8ba"))},5899:function(e,t){e.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},"58a8":function(e,t,n){var i=n("1d80"),r=n("5899"),o="["+r+"]",a=RegExp("^"+o+o+"*"),s=RegExp(o+o+"*$"),c=function(e){return function(t){var n=String(i(t));return 1&e&&(n=n.replace(a,"")),2&e&&(n=n.replace(s,"")),n}};e.exports={start:c(1),end:c(2),trim:c(3)}},"58f2":function(e,t,n){"use strict";n.d(t,"a",(function(){return c}));var i=n("a026"),r=n("0056"),o=n("a723"),a=n("cf75");function s(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var c=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.type,c=void 0===n?o["a"]:n,u=t.defaultValue,d=void 0===u?void 0:u,l=t.validator,f=void 0===l?void 0:l,h=t.event,p=void 0===h?r["y"]:h,m=s({},e,Object(a["c"])(c,d,f)),b=i["default"].extend({model:{prop:e,event:p},props:m});return{mixin:b,props:m,prop:e,event:p}}},"598a":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=["ޖެނުއަރީ","ފެބްރުއަރީ","މާރިޗު","އޭޕްރީލު","މޭ","ޖޫން","ޖުލައި","އޯގަސްޓު","ސެޕްޓެމްބަރު","އޮކްޓޯބަރު","ނޮވެމްބަރު","ޑިސެމްބަރު"],n=["އާދިއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],i=e.defineLocale("dv",{months:t,monthsShort:t,weekdays:n,weekdaysShort:n,weekdaysMin:"އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/M/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/މކ|މފ/,isPM:function(e){return"މފ"===e},meridiem:function(e,t,n){return e<12?"މކ":"މފ"},calendar:{sameDay:"[މިއަދު] LT",nextDay:"[މާދަމާ] LT",nextWeek:"dddd LT",lastDay:"[އިއްޔެ] LT",lastWeek:"[ފާއިތުވި] dddd LT",sameElse:"L"},relativeTime:{future:"ތެރޭގައި %s",past:"ކުރިން %s",s:"ސިކުންތުކޮޅެއް",ss:"d% ސިކުންތު",m:"މިނިޓެއް",mm:"މިނިޓު %d",h:"ގަޑިއިރެއް",hh:"ގަޑިއިރު %d",d:"ދުވަހެއް",dd:"ދުވަސް %d",M:"މަހެއް",MM:"މަސް %d",y:"އަހަރެއް",yy:"އަހަރު %d"},preparse:function(e){return e.replace(/،/g,",")},postformat:function(e){return e.replace(/,/g,"،")},week:{dow:7,doy:12}});return i}))},"59e4":function(e,t,n){"use strict";n.d(t,"b",(function(){return F})),n.d(t,"a",(function(){return B}));var i,r=n("2b88"),o=n("a026"),a=n("2f79"),s=n("c637"),c=n("0056"),u=n("a723"),d=n("9b76"),l=n("6d40"),f=n("906c"),h=n("6b77"),p=n("a8c8"),m=n("58f2"),b=n("3a58"),g=n("d82f"),v=n("cf75"),y=n("4a38"),_=n("493b"),O=n("90ef"),j=n("602d"),w=n("8c18"),k=n("8d32"),M=n("f29e"),x=n("aa59"),L=n("ce2a"),S=n("0f65");function T(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function D(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:{};return new l["a"](e,D(D({cancelable:!1,target:this.$el||null,relatedTarget:null},t),{},{vueTarget:this,componentId:this.safeId()}))},emitEvent:function(e){var t=e.type;this.emitOnRoot(Object(h["e"])(s["pc"],t),e),this.$emit(t,e)},ensureToaster:function(){if(!this.static){var e=this.computedToaster;if(!r["Wormhole"].hasTarget(e)){var t=document.createElement("div");document.body.appendChild(t);var n=new S["a"]({parent:this.$root,propsData:{name:e}});n.$mount(t)}}},startDismissTimer:function(){this.clearDismissTimer(),this.noAutoHide||(this.$_dismissTimer=setTimeout(this.hide,this.resumeDismiss||this.computedDuration),this.dismissStarted=Date.now(),this.resumeDismiss=0)},clearDismissTimer:function(){clearTimeout(this.$_dismissTimer),this.$_dismissTimer=null},setHoverHandler:function(e){var t=this.$refs["b-toast"];Object(h["c"])(e,t,"mouseenter",this.onPause,c["cb"]),Object(h["c"])(e,t,"mouseleave",this.onUnPause,c["cb"])},onPause:function(){if(!this.noAutoHide&&!this.noHoverPause&&this.$_dismissTimer&&!this.resumeDismiss){var e=Date.now()-this.dismissStarted;e>0&&(this.clearDismissTimer(),this.resumeDismiss=Object(p["d"])(this.computedDuration-e,$))}},onUnPause:function(){this.noAutoHide||this.noHoverPause||!this.resumeDismiss?this.resumeDismiss=this.dismissStarted=0:this.startDismissTimer()},onLinkClick:function(){var e=this;this.$nextTick((function(){Object(f["D"])((function(){e.hide()}))}))},onBeforeEnter:function(){this.isTransitioning=!0},onAfterEnter:function(){this.isTransitioning=!1;var e=this.buildEvent(c["U"]);this.emitEvent(e),this.startDismissTimer(),this.setHoverHandler(!0)},onBeforeLeave:function(){this.isTransitioning=!0},onAfterLeave:function(){this.isTransitioning=!1,this.order=0,this.resumeDismiss=this.dismissStarted=0;var e=this.buildEvent(c["v"]);this.emitEvent(e),this.doRender=!1},makeToast:function(e){var t=this,n=this.title,i=this.slotScope,r=Object(y["d"])(this),o=[],s=this.normalizeSlot(d["jb"],i);s?o.push(s):n&&o.push(e("strong",{staticClass:"mr-2"},n)),this.noCloseButton||o.push(e(M["a"],{staticClass:"ml-auto mb-1",on:{click:function(){t.hide()}}}));var c=e();o.length>0&&(c=e("header",{staticClass:"toast-header",class:this.headerClass},o));var u=e(r?x["a"]:"div",{staticClass:"toast-body",class:this.bodyClass,props:r?Object(v["e"])(I,this):{},on:r?{click:this.onLinkClick}:{}},this.normalizeSlot(d["i"],i));return e("div",{staticClass:"toast",class:this.toastClass,attrs:this.computedAttrs,key:"toast-".concat(this[a["a"]]),ref:"toast"},[c,u])}},render:function(e){if(!this.doRender||!this.isMounted)return e();var t=this.order,n=this.static,i=this.isHiding,o=this.isStatus,s="b-toast-".concat(this[a["a"]]),c=e("div",{staticClass:"b-toast",class:this.toastClasses,attrs:D(D({},n?{}:this.scopedStyleAttrs),{},{id:this.safeId("_toast_outer"),role:i?null:o?"status":"alert","aria-live":i?null:o?"polite":"assertive","aria-atomic":i?null:"true"}),key:s,ref:"b-toast"},[e(L["a"],{props:{noFade:this.noFade},on:this.transitionHandlers},[this.localShow?this.makeToast(e):e()])]);return e(r["Portal"],{props:{name:s,to:this.computedToaster,order:t,slim:!0,disabled:n}},[c])}})},"5a34":function(e,t,n){var i=n("44e7");e.exports=function(e){if(i(e))throw TypeError("The method doesn't accept regular expressions");return e}},"5a43":function(e,t){function n(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);n=100?100:null;return e+(t[i]||t[r]||t[o])}},week:{dow:1,doy:7}});return n}))},"5b14":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t="vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton".split(" ");function n(e,t,n,i){var r=e;switch(n){case"s":return i||t?"néhány másodperc":"néhány másodperce";case"ss":return r+(i||t)?" másodperc":" másodperce";case"m":return"egy"+(i||t?" perc":" perce");case"mm":return r+(i||t?" perc":" perce");case"h":return"egy"+(i||t?" óra":" órája");case"hh":return r+(i||t?" óra":" órája");case"d":return"egy"+(i||t?" nap":" napja");case"dd":return r+(i||t?" nap":" napja");case"M":return"egy"+(i||t?" hónap":" hónapja");case"MM":return r+(i||t?" hónap":" hónapja");case"y":return"egy"+(i||t?" év":" éve");case"yy":return r+(i||t?" év":" éve")}return""}function i(e){return(e?"":"[múlt] ")+"["+t[this.day()]+"] LT[-kor]"}var r=e.defineLocale("hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan._feb._márc._ápr._máj._jún._júl._aug._szept._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"},meridiemParse:/de|du/i,isPM:function(e){return"u"===e.charAt(1).toLowerCase()},meridiem:function(e,t,n){return e<12?!0===n?"de":"DE":!0===n?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return i.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return i.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:n,ss:n,m:n,mm:n,h:n,hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return r}))},"5c3a":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日Ah点mm分",LLLL:"YYYY年M月D日ddddAh点mm分",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(e,t){return 12===e&&(e=0),"凌晨"===t||"早上"===t||"上午"===t?e:"下午"===t||"晚上"===t?e+12:e>=11?e:e+12},meridiem:function(e,t,n){var i=100*e+t;return i<600?"凌晨":i<900?"早上":i<1130?"上午":i<1230?"中午":i<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:function(e){return e.week()!==this.week()?"[下]dddLT":"[本]dddLT"},lastDay:"[昨天]LT",lastWeek:function(e){return this.week()!==e.week()?"[上]dddLT":"[本]dddLT"},sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|周)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"日";case"M":return e+"月";case"w":case"W":return e+"周";default:return e}},relativeTime:{future:"%s后",past:"%s前",s:"几秒",ss:"%d 秒",m:"1 分钟",mm:"%d 分钟",h:"1 小时",hh:"%d 小时",d:"1 天",dd:"%d 天",w:"1 周",ww:"%d 周",M:"1 个月",MM:"%d 个月",y:"1 年",yy:"%d 年"},week:{dow:1,doy:4}});return t}))},"5c6c":function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},"5cbb":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("te",{months:"జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జులై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్".split("_"),monthsShort:"జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జులై_ఆగ._సెప్._అక్టో._నవ._డిసె.".split("_"),monthsParseExact:!0,weekdays:"ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం".split("_"),weekdaysShort:"ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని".split("_"),weekdaysMin:"ఆ_సో_మం_బు_గు_శు_శ".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[నేడు] LT",nextDay:"[రేపు] LT",nextWeek:"dddd, LT",lastDay:"[నిన్న] LT",lastWeek:"[గత] dddd, LT",sameElse:"L"},relativeTime:{future:"%s లో",past:"%s క్రితం",s:"కొన్ని క్షణాలు",ss:"%d సెకన్లు",m:"ఒక నిమిషం",mm:"%d నిమిషాలు",h:"ఒక గంట",hh:"%d గంటలు",d:"ఒక రోజు",dd:"%d రోజులు",M:"ఒక నెల",MM:"%d నెలలు",y:"ఒక సంవత్సరం",yy:"%d సంవత్సరాలు"},dayOfMonthOrdinalParse:/\d{1,2}వ/,ordinal:"%dవ",meridiemParse:/రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/,meridiemHour:function(e,t){return 12===e&&(e=0),"రాత్రి"===t?e<4?e:e+12:"ఉదయం"===t?e:"మధ్యాహ్నం"===t?e>=10?e:e+12:"సాయంత్రం"===t?e+12:void 0},meridiem:function(e,t,n){return e<4?"రాత్రి":e<10?"ఉదయం":e<17?"మధ్యాహ్నం":e<20?"సాయంత్రం":"రాత్రి"},week:{dow:0,doy:6}});return t}))},"5f02":function(e,t,n){"use strict";e.exports=function(e){return"object"===typeof e&&!0===e.isAxiosError}},"5f5b":function(e,t,n){"use strict";n.d(t,"a",(function(){return vk}));var i=n("a026"),r=n("e863"),o=n("50d3"),a=n("c9a9"),s=n("992e"),c=n("6c06"),u=n("7b1e"),d=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;if(t=Object(u["a"])(t)?t.join("."):t,!t||!Object(u["j"])(e))return n;if(t in e)return e[t];t=String(t).replace(s["a"],".$1");var i=t.split(".").filter(c["a"]);return 0===i.length?n:i.every((function(t){return Object(u["j"])(e)&&t in e&&!Object(u["p"])(e=e[t])}))?e:Object(u["g"])(e)?null:n},l=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=d(e,t);return Object(u["p"])(i)?n:i},f=n("d82f"),h=n("686b");function p(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function m(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};if(Object(u["k"])(t)){var n=Object(f["f"])(t);n.forEach((function(n){var i=t[n];"breakpoints"===n?!Object(u["a"])(i)||i.length<2||i.some((function(e){return!Object(u["n"])(e)||0===e.length}))?Object(h["a"])('"breakpoints" must be an array of at least 2 breakpoint names',o["b"]):e.$_config[n]=Object(a["a"])(i):Object(u["k"])(i)&&(e.$_config[n]=Object(f["f"])(i).reduce((function(e,t){return Object(u["o"])(i[t])||(e[t]=Object(a["a"])(i[t])),e}),e.$_config[n]||{}))}))}}},{key:"resetConfig",value:function(){this.$_config={}}},{key:"getConfig",value:function(){return Object(a["a"])(this.$_config)}},{key:"getConfigValue",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0;return Object(a["a"])(d(this.$_config,e,t))}}]),e}(),v=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:i["default"];t.prototype[o["c"]]=i["default"].prototype[o["c"]]=t.prototype[o["c"]]||i["default"].prototype[o["c"]]||new g,t.prototype[o["c"]].setConfig(e)};function y(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function _(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:{},t=e.components,n=e.directives,i=e.plugins,r=function e(r){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};e.installed||(e.installed=!0,w(r),v(o,r),S(r,t),D(r,n),x(r,i))};return r.installed=!1,r},M=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return _(_({},t),{},{install:k(e)})},x=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};for(var n in t)n&&t[n]&&e.use(t[n])},L=function(e,t,n){e&&t&&n&&e.component(t,n)},S=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};for(var n in t)L(e,n,t[n])},T=function(e,t,n){e&&t&&n&&e.directive(t.replace(/^VB/,"B"),n)},D=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};for(var n in t)T(e,n,t[n])},A=n("2f79"),P=n("c637"),Y=n("0056"),C=n("a723"),E=n("9b76"),H=n("906c"),$=n("58f2"),I=n("3a58"),F=n("cf75"),B=n("8c18"),N=n("f29e"),R=n("ce2a");function z(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function V(e){for(var t=1;t0?e:0)},Z=function(e){return""===e||!0===e||!(Object(I["c"])(e,0)<1)&&!!e},Q=Object(F["d"])(Object(f["m"])(V(V({},q),{},{dismissLabel:Object(F["c"])(C["u"],"Close"),dismissible:Object(F["c"])(C["g"],!1),fade:Object(F["c"])(C["g"],!1),variant:Object(F["c"])(C["u"],"info")})),P["a"]),ee=i["default"].extend({name:P["a"],mixins:[G,B["a"]],props:Q,data:function(){return{countDown:0,localShow:Z(this[J])}},watch:(j={},W(j,J,(function(e){this.countDown=X(e),this.localShow=Z(e)})),W(j,"countDown",(function(e){var t=this;this.clearCountDownInterval();var n=this[J];Object(u["i"])(n)&&(this.$emit(Y["n"],e),n!==e&&this.$emit(K,e),e>0?(this.localShow=!0,this.$_countDownTimeout=setTimeout((function(){t.countDown--}),1e3)):this.$nextTick((function(){Object(H["D"])((function(){t.localShow=!1}))})))})),W(j,"localShow",(function(e){var t=this[J];e||!this.dismissible&&!Object(u["i"])(t)||this.$emit(Y["m"]),Object(u["i"])(t)||t===e||this.$emit(K,e)})),j),created:function(){this.$_filterTimer=null;var e=this[J];this.countDown=X(e),this.localShow=Z(e)},beforeDestroy:function(){this.clearCountDownInterval()},methods:{dismiss:function(){this.clearCountDownInterval(),this.countDown=0,this.localShow=!1},clearCountDownInterval:function(){clearTimeout(this.$_countDownTimeout),this.$_countDownTimeout=null}},render:function(e){var t=e();if(this.localShow){var n=this.dismissible,i=this.variant,r=e();n&&(r=e(N["a"],{attrs:{"aria-label":this.dismissLabel},on:{click:this.dismiss}},[this.normalizeSlot(E["k"])])),t=e("div",{staticClass:"alert",class:W({"alert-dismissible":n},"alert-".concat(i),i),attrs:{role:"alert","aria-live":"polite","aria-atomic":!0},key:this[A["a"]]},[r,this.normalizeSlot()])}return e(R["a"],{props:{noFade:!this.fade}},[t])}}),te=M({components:{BAlert:ee}}),ne=n("a8c8");function ie(e,t){return ce(e)||se(e,t)||oe(e,t)||re()}function re(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function oe(e,t){if(e){if("string"===typeof e)return ae(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?ae(e,t):void 0}}function ae(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);n'),Le=ke("CalendarFill",''),Se=ke("ChevronBarLeft",''),Te=ke("ChevronDoubleLeft",''),De=ke("ChevronDown",''),Ae=ke("ChevronLeft",''),Pe=ke("ChevronUp",''),Ye=ke("CircleFill",''),Ce=ke("Clock",''),Ee=ke("ClockFill",''),He=ke("Dash",''),$e=ke("PersonFill",''),Ie=ke("Plus",''),Fe=ke("Star",''),Be=ke("StarFill",''),Ne=ke("StarHalf",''),Re=ke("X",''); -/*! - * BootstrapVue Icons, generated from Bootstrap Icons 1.2.2 - * - * @link https://icons.getbootstrap.com/ - * @license MIT - * https://github.com/twbs/icons/blob/master/LICENSE.md - */function ze(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function Ve(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:"";return String(e).replace(s["o"],"")},qt=function(e,t){return e?{innerHTML:e}:t?{textContent:t}:{}};function Jt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function Kt(e){for(var t=1;t-1&&(t=t.slice(0,n).reverse(),Object(H["d"])(t[0]))},focusNext:function(e){var t=this.getItems(),n=t.indexOf(e.target);n>-1&&(t=t.slice(n+1),Object(H["d"])(t[0]))},focusLast:function(){var e=this.getItems().reverse();Object(H["d"])(e[0])},onFocusin:function(e){var t=this.$el;e.target!==t||Object(H["f"])(t,e.relatedTarget)||(Object(dt["f"])(e),this.focusFirst(e))},onKeydown:function(e){var t=e.keyCode,n=e.shiftKey;t===ct||t===it?(Object(dt["f"])(e),n?this.focusFirst(e):this.focusPrev(e)):t!==Ze&&t!==at||(Object(dt["f"])(e),n?this.focusLast(e):this.focusNext(e))}},render:function(e){var t=this.keyNav;return e("div",{staticClass:"btn-toolbar",class:{"justify-content-between":this.justify},attrs:{role:"toolbar",tabindex:t?"0":null},on:t?{focusin:this.onFocusin,keydown:this.onKeydown}:{}},[this.normalizeSlot()])}}),yn=M({components:{BButtonToolbar:vn,BBtnToolbar:vn}}),_n="gregory",On="long",jn="narrow",wn="short",kn="2-digit",Mn="numeric";function xn(e,t){return An(e)||Dn(e,t)||Sn(e,t)||Ln()}function Ln(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function Sn(e,t){if(e){if("string"===typeof e)return Tn(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Tn(e,t):void 0}}function Tn(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);n1&&void 0!==arguments[1]?arguments[1]:_n;e=Object(ut["b"])(e).filter(c["a"]);var n=new Intl.DateTimeFormat(e,{calendar:t});return n.resolvedOptions().locale},Bn=function(e,t){var n=new Intl.DateTimeFormat(e,t);return n.format},Nn=function(e,t){return In(e)===In(t)},Rn=function(e){return e=Hn(e),e.setDate(1),e},zn=function(e){return e=Hn(e),e.setMonth(e.getMonth()+1),e.setDate(0),e},Vn=function(e,t){e=Hn(e);var n=e.getMonth();return e.setFullYear(e.getFullYear()+t),e.getMonth()!==n&&e.setDate(0),e},Wn=function(e){e=Hn(e);var t=e.getMonth();return e.setMonth(t-1),e.getMonth()===t&&e.setDate(0),e},Un=function(e){e=Hn(e);var t=e.getMonth();return e.setMonth(t+1),e.getMonth()===(t+2)%12&&e.setDate(0),e},Gn=function(e){return Vn(e,-1)},qn=function(e){return Vn(e,1)},Jn=function(e){return Vn(e,-10)},Kn=function(e){return Vn(e,10)},Xn=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;return e=$n(e),t=$n(t)||e,n=$n(n)||e,e?en?n:e:null},Zn=["ar","az","ckb","fa","he","ks","lrc","mzn","ps","sd","te","ug","ur","yi"].map((function(e){return e.toLowerCase()})),Qn=function(e){var t=Object(me["g"])(e).toLowerCase().replace(s["A"],"").split("-"),n=t.slice(0,2).join("-"),i=t[0];return Object(ut["a"])(Zn,n)||Object(ut["a"])(Zn,i)},ei=n("3c21"),ti=n("493b"),ni=n("90ef");function ii(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function ri(e){for(var t=1;tt}},dateDisabled:function(){var e=this,t=this.dateOutOfRange;return function(n){n=$n(n);var i=In(n);return!(!t(n)&&!e.computedDateDisabledFn(i,n))}},formatDateString:function(){return Bn(this.calendarLocale,ri(ri({year:Mn,month:kn,day:kn},this.dateFormatOptions),{},{hour:void 0,minute:void 0,second:void 0,calendar:_n}))},formatYearMonth:function(){return Bn(this.calendarLocale,{year:Mn,month:On,calendar:_n})},formatWeekdayName:function(){return Bn(this.calendarLocale,{weekday:On,calendar:_n})},formatWeekdayNameShort:function(){return Bn(this.calendarLocale,{weekday:this.weekdayHeaderFormat||wn,calendar:_n})},formatDay:function(){var e=new Intl.NumberFormat([this.computedLocale],{style:"decimal",minimumIntegerDigits:1,minimumFractionDigits:0,maximumFractionDigits:0,notation:"standard"});return function(t){return e.format(t.getDate())}},prevDecadeDisabled:function(){var e=this.computedMin;return this.disabled||e&&zn(Jn(this.activeDate))e},nextYearDisabled:function(){var e=this.computedMax;return this.disabled||e&&Rn(qn(this.activeDate))>e},nextDecadeDisabled:function(){var e=this.computedMax;return this.disabled||e&&Rn(Kn(this.activeDate))>e},calendar:function(){for(var e=[],t=this.calendarFirstDay,n=t.getFullYear(),i=t.getMonth(),r=this.calendarDaysInMonth,o=t.getDay(),a=(this.computedWeekStarts>o?7:0)-this.computedWeekStarts,s=0-a-o,c=0;c<6&&s0);n!==this.visible&&(this.visible=n,this.callback(n),this.once&&this.visible&&(this.doneOnce=!0,this.stop()))}},{key:"stop",value:function(){this.observer&&this.observer.disconnect(),this.observer=null}}]),e}(),ir=function(e){var t=e[tr];t&&t.stop&&t.stop(),delete e[tr]},rr=function(e,t,n){var i=t.value,r=t.modifiers,o={margin:"0px",once:!1,callback:i};Object(f["h"])(r).forEach((function(e){s["h"].test(e)?o.margin="".concat(e,"px"):"once"===e.toLowerCase()&&(o.once=!0)})),ir(e),e[tr]=new nr(e,o,n),e[tr]._prevModifiers=Object(f["b"])(r)},or=function(e,t,n){var i=t.value,r=t.oldValue,o=t.modifiers;o=Object(f["b"])(o),!e||i===r&&e[tr]&&Object(ei["a"])(o,e[tr]._prevModifiers)||rr(e,{value:i,modifiers:o},n)},ar=function(e){ir(e)},sr={bind:rr,componentUpdated:or,unbind:ar};function cr(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function ur(e){for(var t=1;t0||r.removedNodes.length>0))&&(n=!0)}n&&t()}));return i.observe(e,Sr({childList:!0,subtree:!0},n)),i};function Pr(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function Yr(e){for(var t=1;t0),touchStartX:0,touchDeltaX:0}},computed:{numSlides:function(){return this.slides.length}},watch:(Dr={},Cr(Dr,Ir,(function(e,t){e!==t&&this.setSlide(Object(I["c"])(e,0))})),Cr(Dr,"interval",(function(e,t){e!==t&&(e?(this.pause(!0),this.start(!1)):this.pause(!1))})),Cr(Dr,"isPaused",(function(e,t){e!==t&&this.$emit(e?Y["G"]:Y["ab"])})),Cr(Dr,"index",(function(e,t){e===t||this.isSliding||this.doSlide(e,t)})),Dr),created:function(){this.$_interval=null,this.$_animationTimeout=null,this.$_touchTimeout=null,this.$_observer=null,this.isPaused=!(Object(I["c"])(this.interval,0)>0)},mounted:function(){this.transitionEndEvent=Ur(this.$el)||null,this.updateSlides(),this.setObserver(!0)},beforeDestroy:function(){this.clearInterval(),this.clearAnimationTimeout(),this.clearTouchTimeout(),this.setObserver(!1)},methods:{clearInterval:function(e){function t(){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(){clearInterval(this.$_interval),this.$_interval=null})),clearAnimationTimeout:function(){clearTimeout(this.$_animationTimeout),this.$_animationTimeout=null},clearTouchTimeout:function(){clearTimeout(this.$_touchTimeout),this.$_touchTimeout=null},setObserver:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.$_observer&&this.$_observer.disconnect(),this.$_observer=null,e&&(this.$_observer=Ar(this.$refs.inner,this.updateSlides.bind(this),{subtree:!1,childList:!0,attributes:!0,attributeFilter:["id"]}))},setSlide:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(!(r["i"]&&document.visibilityState&&document.hidden)){var i=this.noWrap,o=this.numSlides;e=Object(ne["c"])(e),0!==o&&(this.isSliding?this.$once(Y["V"],(function(){Object(H["D"])((function(){return t.setSlide(e,n)}))})):(this.direction=n,this.index=e>=o?i?o-1:0:e<0?i?0:o-1:e,i&&this.index!==e&&this.index!==this[Ir]&&this.$emit(Fr,this.index)))}},prev:function(){this.setSlide(this.index-1,"prev")},next:function(){this.setSlide(this.index+1,"next")},pause:function(e){e||(this.isPaused=!0),this.clearInterval()},start:function(e){e||(this.isPaused=!1),this.clearInterval(),this.interval&&this.numSlides>1&&(this.$_interval=setInterval(this.next,Object(ne["d"])(1e3,this.interval)))},restart:function(){this.$el.contains(Object(H["g"])())||this.start()},doSlide:function(e,t){var n=this,i=Boolean(this.interval),r=this.calcDirection(this.direction,t,e),o=r.overlayClass,a=r.dirClass,s=this.slides[t],c=this.slides[e];if(s&&c){if(this.isSliding=!0,i&&this.pause(!1),this.$emit(Y["W"],e),this.$emit(Fr,this.index),this.noAnimation)Object(H["b"])(c,"active"),Object(H["A"])(s,"active"),this.isSliding=!1,this.$nextTick((function(){return n.$emit(Y["V"],e)}));else{Object(H["b"])(c,o),Object(H["y"])(c),Object(H["b"])(s,a),Object(H["b"])(c,a);var u=!1,d=function t(){if(!u){if(u=!0,n.transitionEndEvent){var i=n.transitionEndEvent.split(/\s+/);i.forEach((function(e){return Object(dt["a"])(c,e,t,Y["cb"])}))}n.clearAnimationTimeout(),Object(H["A"])(c,a),Object(H["A"])(c,o),Object(H["b"])(c,"active"),Object(H["A"])(s,"active"),Object(H["A"])(s,a),Object(H["A"])(s,o),Object(H["G"])(s,"aria-current","false"),Object(H["G"])(c,"aria-current","true"),Object(H["G"])(s,"aria-hidden","true"),Object(H["G"])(c,"aria-hidden","false"),n.isSliding=!1,n.direction=null,n.$nextTick((function(){return n.$emit(Y["V"],e)}))}};if(this.transitionEndEvent){var l=this.transitionEndEvent.split(/\s+/);l.forEach((function(e){return Object(dt["b"])(c,e,d,Y["cb"])}))}this.$_animationTimeout=setTimeout(d,Nr)}i&&this.start(!1)}},updateSlides:function(){this.pause(!0),this.slides=Object(H["F"])(".carousel-item",this.$refs.inner);var e=this.slides.length,t=Object(ne["d"])(0,Object(ne["e"])(Object(ne["c"])(this.index),e-1));this.slides.forEach((function(n,i){var r=i+1;i===t?(Object(H["b"])(n,"active"),Object(H["G"])(n,"aria-current","true")):(Object(H["A"])(n,"active"),Object(H["G"])(n,"aria-current","false")),Object(H["G"])(n,"aria-posinset",String(r)),Object(H["G"])(n,"aria-setsize",String(e))})),this.setSlide(t),this.start(this.isPaused)},calcDirection:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;return e?Br[e]:n>t?Br.next:Br.prev},handleClick:function(e,t){var n=e.keyCode;"click"!==e.type&&n!==st&&n!==et||(Object(dt["f"])(e),t())},handleSwipe:function(){var e=Object(ne["a"])(this.touchDeltaX);if(!(e<=zr)){var t=e/this.touchDeltaX;this.touchDeltaX=0,t>0?this.prev():t<0&&this.next()}},touchStart:function(e){r["e"]&&Vr[e.pointerType.toUpperCase()]?this.touchStartX=e.clientX:r["e"]||(this.touchStartX=e.touches[0].clientX)},touchMove:function(e){e.touches&&e.touches.length>1?this.touchDeltaX=0:this.touchDeltaX=e.touches[0].clientX-this.touchStartX},touchEnd:function(e){r["e"]&&Vr[e.pointerType.toUpperCase()]&&(this.touchDeltaX=e.clientX-this.touchStartX),this.handleSwipe(),this.pause(!1),this.clearTouchTimeout(),this.$_touchTimeout=setTimeout(this.start,Rr+Object(ne["d"])(1e3,this.interval))}},render:function(e){var t=this,n=this.indicators,i=this.background,o=this.noAnimation,a=this.noHoverPause,s=this.noTouch,c=this.index,u=this.isSliding,d=this.pause,l=this.restart,f=this.touchStart,h=this.touchEnd,p=this.safeId("__BV_inner_"),m=e("div",{staticClass:"carousel-inner",attrs:{id:p,role:"list"},ref:"inner"},[this.normalizeSlot()]),b=e();if(this.controls){var g=function(n,i,r){var o=function(e){u?Object(dt["f"])(e,{propagation:!1}):t.handleClick(e,r)};return e("a",{staticClass:"carousel-control-".concat(n),attrs:{href:"#",role:"button","aria-controls":p,"aria-disabled":u?"true":null},on:{click:o,keydown:o}},[e("span",{staticClass:"carousel-control-".concat(n,"-icon"),attrs:{"aria-hidden":"true"}}),e("span",{class:"sr-only"},[i])])};b=[g("prev",this.labelPrev,this.prev),g("next",this.labelNext,this.next)]}var v=e("ol",{staticClass:"carousel-indicators",directives:[{name:"show",value:n}],attrs:{id:this.safeId("__BV_indicators_"),"aria-hidden":n?"false":"true","aria-label":this.labelIndicators,"aria-owns":p}},this.slides.map((function(i,r){var o=function(e){t.handleClick(e,(function(){t.setSlide(r)}))};return e("li",{class:{active:r===c},attrs:{role:"button",id:t.safeId("__BV_indicator_".concat(r+1,"_")),tabindex:n?"0":"-1","aria-current":r===c?"true":"false","aria-label":"".concat(t.labelGotoSlide," ").concat(r+1),"aria-describedby":i.id||null,"aria-controls":p},on:{click:o,keydown:o},key:"slide_".concat(r)})}))),y={mouseenter:a?xr:d,mouseleave:a?xr:l,focusin:d,focusout:l,keydown:function(e){if(!/input|textarea/i.test(e.target.tagName)){var n=e.keyCode;n!==it&&n!==at||(Object(dt["f"])(e),t[n===it?"prev":"next"]())}}};return r["g"]&&!s&&(r["e"]?(y["&pointerdown"]=f,y["&pointerup"]=h):(y["&touchstart"]=f,y["&touchmove"]=this.touchMove,y["&touchend"]=h)),e("div",{staticClass:"carousel",class:{slide:!o,"carousel-fade":!o&&this.fade,"pointer-event":r["g"]&&r["e"]&&!s},style:{background:i},attrs:{role:"region",id:this.safeId(),"aria-busy":u?"true":"false"},on:y},[m,b,v])}});function Jr(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function Kr(e){for(var t=1;t0?(Object(H["G"])(e,Io,i.join(" ")),Object(H["H"])(e,Ro,"none")):(Object(H["z"])(e,Io),Object(H["C"])(e,Ro)),Object(H["D"])((function(){Xo(e,n)})),Object(ei["a"])(i,e[Eo])||(e[Eo]=i,i.forEach((function(e){n.context.$root.$emit(Uo,e)})))}},ia={bind:function(e,t,n){e[Co]=!1,e[Eo]=[],Qo(e,n),na(e,t,n)},componentUpdated:na,updated:na,unbind:function(e,t,n){Ko(e),Zo(e,n),ta(e,Po),ta(e,Yo),ta(e,Co),ta(e,Eo),Object(H["A"])(e,To),Object(H["A"])(e,Do),Object(H["z"])(e,Fo),Object(H["z"])(e,Io),Object(H["z"])(e,Bo),Object(H["C"])(e,Ro)}},ra=M({directives:{VBToggle:ia}}),oa=M({components:{BCollapse:So},plugins:{VBTogglePlugin:ra}}),aa=n("f0bd"),sa="top-start",ca="top-end",ua="bottom-start",da="bottom-end",la="right-start",fa="left-start",ha=n("ca88"),pa=n("6d40"),ma=i["default"].extend({data:function(){return{listenForClickOut:!1}},watch:{listenForClickOut:function(e,t){e!==t&&(Object(dt["a"])(this.clickOutElement,this.clickOutEventName,this._clickOutHandler,Y["cb"]),e&&Object(dt["b"])(this.clickOutElement,this.clickOutEventName,this._clickOutHandler,Y["cb"]))}},beforeCreate:function(){this.clickOutElement=null,this.clickOutEventName=null},mounted:function(){this.clickOutElement||(this.clickOutElement=document),this.clickOutEventName||(this.clickOutEventName="click"),this.listenForClickOut&&Object(dt["b"])(this.clickOutElement,this.clickOutEventName,this._clickOutHandler,Y["cb"])},beforeDestroy:function(){Object(dt["a"])(this.clickOutElement,this.clickOutEventName,this._clickOutHandler,Y["cb"])},methods:{isClickOut:function(e){return!Object(H["f"])(this.$el,e.target)},_clickOutHandler:function(e){this.clickOutHandler&&this.isClickOut(e)&&this.clickOutHandler(e)}}}),ba=i["default"].extend({data:function(){return{listenForFocusIn:!1}},watch:{listenForFocusIn:function(e,t){e!==t&&(Object(dt["a"])(this.focusInElement,"focusin",this._focusInHandler,Y["cb"]),e&&Object(dt["b"])(this.focusInElement,"focusin",this._focusInHandler,Y["cb"]))}},beforeCreate:function(){this.focusInElement=null},mounted:function(){this.focusInElement||(this.focusInElement=document),this.listenForFocusIn&&Object(dt["b"])(this.focusInElement,"focusin",this._focusInHandler,Y["cb"])},beforeDestroy:function(){Object(dt["a"])(this.focusInElement,"focusin",this._focusInHandler,Y["cb"])},methods:{_focusInHandler:function(e){this.focusInHandler&&this.focusInHandler(e)}}});function ga(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function va(e){for(var t=1;t0&&void 0!==arguments[0]&&arguments[0];this.disabled||(this.visible=!1,e&&this.$once(Y["v"],this.focusToggler))},toggle:function(e){e=e||{};var t=e,n=t.type,i=t.keyCode;("click"===n||"keydown"===n&&-1!==[et,st,Ze].indexOf(i))&&(this.disabled?this.visible=!1:(this.$emit(Y["Z"],e),Object(dt["f"])(e),this.visible?this.hide(!0):this.show()))},onMousedown:function(e){Object(dt["f"])(e,{propagation:!1})},onKeydown:function(e){var t=e.keyCode;t===tt?this.onEsc(e):t===Ze?this.focusNext(e,!1):t===ct&&this.focusNext(e,!0)},onEsc:function(e){this.visible&&(this.visible=!1,Object(dt["f"])(e),this.$once(Y["v"],this.focusToggler))},onSplitClick:function(e){this.disabled?this.visible=!1:this.$emit(Y["f"],e)},hideHandler:function(e){var t=this,n=e.target;!this.visible||Object(H["f"])(this.$refs.menu,n)||Object(H["f"])(this.toggler,n)||(this.clearHideTimeout(),this.$_hideTimeout=setTimeout((function(){return t.hide()}),this.inNavbar?300:0))},clickOutHandler:function(e){this.hideHandler(e)},focusInHandler:function(e){this.hideHandler(e)},focusNext:function(e,t){var n=this,i=e.target;!this.visible||e&&Object(H["e"])(ja,i)||(Object(dt["f"])(e),this.$nextTick((function(){var e=n.getItems();if(!(e.length<1)){var r=e.indexOf(i);t&&r>0?r--:!t&&r1&&void 0!==arguments[1]?arguments[1]:null;if(Object(u["k"])(e)){var n=l(e,this.valueField),i=l(e,this.textField);return{value:Object(u["o"])(n)?t||i:n,text:Gt(String(Object(u["o"])(i)?t:i)),html:l(e,this.htmlField),disabled:Boolean(l(e,this.disabledField))}}return{value:t||e,text:Gt(String(e)),disabled:!1}},normalizeOptions:function(e){var t=this;return Object(u["a"])(e)?e.map((function(e){return t.normalizeOption(e)})):Object(u["k"])(e)?(Object(h["a"])(_s,this.$options.name),Object(f["h"])(e).map((function(n){return t.normalizeOption(e[n]||{},n)}))):[]}}});function ws(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function ks(e){for(var t=1;t-1:Object(ei["a"])(t,e)},isRadio:function(){return!1}},watch:uc({},dc,(function(e,t){Object(ei["a"])(e,t)||this.setIndeterminate(e)})),mounted:function(){this.setIndeterminate(this[dc])},methods:{computedLocalCheckedWatcher:function(e,t){if(!Object(ei["a"])(e,t)){this.$emit(rc,e);var n=this.$refs.input;n&&this.$emit(lc,n.indeterminate)}},handleChange:function(e){var t=this,n=e.target,i=n.checked,r=n.indeterminate,o=this.value,a=this.uncheckedValue,s=this.computedLocalChecked;if(Object(u["a"])(s)){var c=Bs(s,o);i&&c<0?s=s.concat(o):!i&&c>-1&&(s=s.slice(0,c).concat(s.slice(c+1)))}else s=i?o:a;this.computedLocalChecked=s,this.$nextTick((function(){t.$emit(Y["d"],s),t.isGroup&&t.bvGroup.$emit(Y["d"],s),t.$emit(lc,r)}))},setIndeterminate:function(e){Object(u["a"])(this.computedLocalChecked)&&(e=!1);var t=this.$refs.input;t&&(t.indeterminate=e,this.$emit(lc,e))}}});function pc(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function mc(e){for(var t=1;t0&&(c=[e("div",{staticClass:"b-form-date-controls d-flex flex-wrap",class:{"justify-content-between":c.length>1,"justify-content-end":c.length<2}},c)]);var p=e(fi,{staticClass:"b-form-date-calendar w-100",props:Zc(Zc({},Object(F["e"])(au,o)),{},{hidden:!this.isVisible,value:t,valueAsDate:!1,width:this.calendarWidth}),on:{selected:this.onSelected,input:this.onInput,context:this.onContext},scopedSlots:Object(f["k"])(a,["nav-prev-decade","nav-prev-year","nav-prev-month","nav-this-month","nav-next-month","nav-next-year","nav-next-decade"]),key:"calendar",ref:"calendar"},c);return e(Kc,{staticClass:"b-form-datepicker",props:Zc(Zc({},Object(F["e"])(su,o)),{},{formattedValue:t?this.formattedValue:"",id:this.safeId(),lang:this.computedLang,menuClass:[{"bg-dark":r,"text-light":r},this.menuClass],placeholder:s,rtl:this.isRTL,value:t}),on:{show:this.onShow,shown:this.onShown,hidden:this.onHidden},scopedSlots:Qc({},E["f"],a[E["f"]]||this.defaultButtonFn),ref:"control"},[p])}}),du=M({components:{BFormDatepicker:uu,BDatepicker:uu}});function lu(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function fu(e){for(var t=1;t1&&void 0!==arguments[1])||arguments[1];return Promise.all(Object(ut["f"])(e).filter((function(e){return"file"===e.kind})).map((function(e){var n=Ou(e);if(n){if(n.isDirectory&&t)return wu(n.createReader(),"".concat(n.name,"/"));if(n.isFile)return new Promise((function(e){n.file((function(t){t.$path="",e(t)}))}))}return null})).filter(c["a"]))},wu=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return new Promise((function(i){var r=[],o=function o(){t.readEntries((function(t){0===t.length?i(Promise.all(r).then((function(e){return Object(ut["d"])(e)}))):(r.push(Promise.all(t.map((function(t){if(t){if(t.isDirectory)return e(t.createReader(),"".concat(n).concat(t.name,"/"));if(t.isFile)return new Promise((function(e){t.file((function(t){t.$path="".concat(n).concat(t.name),e(t)}))}))}return null})).filter(c["a"]))),o())}))};o()}))},ku=Object(F["d"])(Object(f["m"])(fu(fu(fu(fu(fu(fu(fu({},ni["b"]),bu),Rs),Vs),qs),Us),{},{accept:Object(F["c"])(C["u"],""),browseText:Object(F["c"])(C["u"],"Browse"),capture:Object(F["c"])(C["g"],!1),directory:Object(F["c"])(C["g"],!1),dropPlaceholder:Object(F["c"])(C["u"],"Drop files here"),fileNameFormatter:Object(F["c"])(C["l"]),multiple:Object(F["c"])(C["g"],!1),noDrop:Object(F["c"])(C["g"],!1),noDropPlaceholder:Object(F["c"])(C["u"],"Not allowed"),noTraverse:Object(F["c"])(C["g"],!1),placeholder:Object(F["c"])(C["u"],"No file chosen")})),P["S"]),Mu=i["default"].extend({name:P["S"],mixins:[ti["a"],ni["a"],mu,B["a"],zs,Js,Ws,B["a"]],inheritAttrs:!1,props:ku,data:function(){return{files:[],dragging:!1,dropAllowed:!this.noDrop,hasFocus:!1}},computed:{computedAccept:function(){var e=this.accept;return e=(e||"").trim().split(/[,\s]+/).filter(c["a"]),0===e.length?null:e.map((function(e){var t="name",n="^",i="$";s["k"].test(e)?n="":(t="type",s["y"].test(e)&&(i=".+$",e=e.slice(0,-1))),e=Object(me["a"])(e);var r=new RegExp("".concat(n).concat(e).concat(i));return{rx:r,prop:t}}))},computedCapture:function(){var e=this.capture;return!0===e||""===e||(e||null)},computedAttrs:function(){var e=this.name,t=this.disabled,n=this.required,i=this.form,r=this.computedCapture,o=this.accept,a=this.multiple,s=this.directory;return fu(fu({},this.bvAttrs),{},{type:"file",id:this.safeId(),name:e,disabled:t,required:n,form:i||null,capture:r,accept:o||null,multiple:a,directory:s,webkitdirectory:s,"aria-required":n?"true":null})},computedFileNameFormatter:function(){var e=this.fileNameFormatter;return Object(F["b"])(e)?e:this.defaultFileNameFormatter},clonedFiles:function(){return Object(a["a"])(this.files)},flattenedFiles:function(){return Object(ut["e"])(this.files)},fileNames:function(){return this.flattenedFiles.map((function(e){return e.name}))},labelContent:function(){if(this.dragging&&!this.noDrop)return this.normalizeSlot(E["l"],{allowed:this.dropAllowed})||(this.dropAllowed?this.dropPlaceholder:this.$createElement("span",{staticClass:"text-danger"},this.noDropPlaceholder));if(0===this.files.length)return this.normalizeSlot(E["X"])||this.placeholder;var e=this.flattenedFiles,t=this.clonedFiles,n=this.fileNames,i=this.computedFileNameFormatter;return this.hasNormalizedSlot(E["p"])?this.normalizeSlot(E["p"],{files:e,filesTraversed:t,names:n}):i(e,t,n)}},watch:(eu={},hu(eu,gu,(function(e){(!e||Object(u["a"])(e)&&0===e.length)&&this.reset()})),hu(eu,"files",(function(e,t){if(!Object(ei["a"])(e,t)){var n=this.multiple,i=this.noTraverse,r=!n||i?Object(ut["e"])(e):e;this.$emit(vu,n?r:r[0]||null)}})),eu),created:function(){this.$_form=null},mounted:function(){var e=Object(H["e"])("form",this.$el);e&&(Object(dt["b"])(e,"reset",this.reset,Y["db"]),this.$_form=e)},beforeDestroy:function(){var e=this.$_form;e&&Object(dt["a"])(e,"reset",this.reset,Y["db"])},methods:{isFileValid:function(e){if(!e)return!1;var t=this.computedAccept;return!t||t.some((function(t){return t.rx.test(e[t.prop])}))},isFilesArrayValid:function(e){var t=this;return Object(u["a"])(e)?e.every((function(e){return t.isFileValid(e)})):this.isFileValid(e)},defaultFileNameFormatter:function(e,t,n){return n.join(", ")},setFiles:function(e){this.dropAllowed=!this.noDrop,this.dragging=!1,this.files=this.multiple?this.directory?e:Object(ut["e"])(e):Object(ut["e"])(e).slice(0,1)},setInputFiles:function(e){try{var t=new ClipboardEvent("").clipboardData||new DataTransfer;Object(ut["e"])(Object(a["a"])(e)).forEach((function(e){delete e.$path,t.items.add(e)})),this.$refs.input.files=t.files}catch(n){}},reset:function(){try{var e=this.$refs.input;e.value="",e.type="",e.type="file"}catch(t){}this.files=[]},handleFiles:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(t){var n=e.filter(this.isFilesArrayValid);n.length>0&&(this.setFiles(n),this.setInputFiles(n))}else this.setFiles(e)},focusHandler:function(e){this.plain||"focusout"===e.type?this.hasFocus=!1:this.hasFocus=!0},onChange:function(e){var t=this,n=e.type,i=e.target,o=e.dataTransfer,a=void 0===o?{}:o,s="drop"===n;this.$emit(Y["d"],e);var c=Object(ut["f"])(a.items||[]);if(r["f"]&&c.length>0&&!Object(u["g"])(Ou(c[0])))ju(c,this.directory).then((function(e){return t.handleFiles(e,s)}));else{var d=Object(ut["f"])(i.files||a.files||[]).map((function(e){return e.$path=e.webkitRelativePath||"",e}));this.handleFiles(d,s)}},onDragenter:function(e){Object(dt["f"])(e),this.dragging=!0;var t=e.dataTransfer,n=void 0===t?{}:t;if(this.noDrop||this.disabled||!this.dropAllowed)return n.dropEffect="none",void(this.dropAllowed=!1);n.dropEffect="copy"},onDragover:function(e){Object(dt["f"])(e),this.dragging=!0;var t=e.dataTransfer,n=void 0===t?{}:t;if(this.noDrop||this.disabled||!this.dropAllowed)return n.dropEffect="none",void(this.dropAllowed=!1);n.dropEffect="copy"},onDragleave:function(e){var t=this;Object(dt["f"])(e),this.$nextTick((function(){t.dragging=!1,t.dropAllowed=!t.noDrop}))},onDrop:function(e){var t=this;Object(dt["f"])(e),this.dragging=!1,this.noDrop||this.disabled||!this.dropAllowed?this.$nextTick((function(){t.dropAllowed=!t.noDrop})):this.onChange(e)}},render:function(e){var t=this.custom,n=this.plain,i=this.size,r=this.dragging,o=this.stateClass,a=this.bvAttrs,s=e("input",{class:[{"form-control-file":n,"custom-file-input":t,focus:t&&this.hasFocus},o],style:t?{zIndex:-5}:{},attrs:this.computedAttrs,on:{change:this.onChange,focusin:this.focusHandler,focusout:this.focusHandler,reset:this.reset},ref:"input"});if(n)return s;var c=e("label",{staticClass:"custom-file-label",class:{dragging:r},attrs:{for:this.safeId(),"data-browse":this.browseText||null}},[e("span",{staticClass:"d-block form-file-text",style:{pointerEvents:"none"}},[this.labelContent])]);return e("div",{staticClass:"custom-file b-form-file",class:[hu({},"b-custom-control-".concat(i),i),o,a.class],style:a.style,attrs:{id:this.safeId("_BV_file_outer_")},on:{dragenter:this.onDragenter,dragover:this.onDragover,dragleave:this.onDragleave,drop:this.onDrop}},[s,c])}}),xu=M({components:{BFormFile:Mu,BFile:Mu}}),Lu=n("228e"),Su=function(e){return"\\"+e},Tu=function(e){e=Object(me["g"])(e);var t=e.length,n=e.charCodeAt(0);return e.split("").reduce((function(i,r,o){var a=e.charCodeAt(o);return 0===a?i+"�":127===a||a>=1&&a<=31||0===o&&a>=48&&a<=57||1===o&&a>=48&&a<=57&&45===n?i+Su("".concat(a.toString(16)," ")):0===o&&45===a&&1===t?i+Su(r):a>=128||45===a||95===a||a>=48&&a<=57||a>=65&&a<=90||a>=97&&a<=122?i+r:i+Su(r)}),"")},Du=n("b508");function Au(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function Pu(e){for(var t=1;t0||Object(f["h"])(this.labelColProps).length>0}},watch:{ariaDescribedby:function(e,t){e!==t&&this.updateAriaDescribedby(e,t)}},mounted:function(){var e=this;this.$nextTick((function(){e.updateAriaDescribedby(e.ariaDescribedby)}))},methods:{getAlignClasses:function(e,t){return Object(Lu["b"])().reduce((function(n,i){var r=e[Object(F["g"])(i,"".concat(t,"Align"))]||null;return r&&n.push(["text",i,r].filter(c["a"]).join("-")),n}),[])},getColProps:function(e,t){return Object(Lu["b"])().reduce((function(n,i){var r=e[Object(F["g"])(i,"".concat(t,"Cols"))];return r=""===r||(r||!1),Object(u["b"])(r)||"auto"===r||(r=Object(I["c"])(r,0),r=r>0&&r),r&&(n[i||(Object(u["b"])(r)?"col":"cols")]=r),n}),{})},updateAriaDescribedby:function(e,t){var n=this.labelFor;if(r["i"]&&n){var i=Object(H["E"])("#".concat(Tu(n)),this.$refs.content);if(i){var o="aria-describedby",a=(e||"").split(s["x"]),u=(t||"").split(s["x"]),d=(Object(H["h"])(i,o)||"").split(s["x"]).filter((function(e){return!Object(ut["a"])(u,e)})).concat(a).filter((function(e,t,n){return n.indexOf(e)===t})).filter(c["a"]).join(" ").trim();d?Object(H["G"])(i,o,d):Object(H["z"])(i,o)}}},onLegendClick:function(e){if(!this.labelFor){var t=e.target,n=t?t.tagName:"";if(-1===Wu.indexOf(n)){var i=Object(H["F"])(Vu,this.$refs.content).filter(H["u"]);1===i.length&&Object(H["d"])(i[0])}}}},render:function(e){var t=this.computedState,n=this.feedbackAriaLive,i=this.isHorizontal,r=this.labelFor,o=this.normalizeSlot,a=this.safeId,s=this.tooltip,u=a(),d=!r,l=e(),f=o(E["C"])||this.label,h=f?a("_BV_label_"):null;if(f||i){var p=this.labelSize,m=this.labelColProps,b=d?"legend":"label";this.labelSrOnly?(f&&(l=e(b,{class:"sr-only",attrs:{id:h,for:r||null}},[f])),l=e(i?Fu:"div",{props:i?m:{}},[l])):l=e(i?Fu:b,{on:d?{click:this.onLegendClick}:{},props:i?Nu(Nu({},m),{},{tag:b}):{},attrs:{id:h,for:r||null,tabindex:d?"-1":null},class:[d?"bv-no-focus-ring":"",i||d?"col-form-label":"",!i&&d?"pt-0":"",i||d?"":"d-block",p?"col-form-label-".concat(p):"",this.labelAlignClasses,this.labelClass]},[f])}var g=e(),v=o(E["B"])||this.invalidFeedback,y=v?a("_BV_feedback_invalid_"):null;v&&(g=e(Cs,{props:{ariaLive:n,id:y,role:n?"alert":null,state:t,tooltip:s},attrs:{tabindex:v?"-1":null}},[v]));var _=e(),O=o(E["lb"])||this.validFeedback,j=O?a("_BV_feedback_valid_"):null;O&&(_=e(Hs,{props:{ariaLive:n,id:j,role:n?"alert":null,state:t,tooltip:s},attrs:{tabindex:O?"-1":null}},[O]));var w=e(),k=o(E["j"])||this.description,M=k?a("_BV_description_"):null;k&&(w=e(Ps,{attrs:{id:M,tabindex:"-1"}},[k]));var x=this.ariaDescribedby=[M,!1===t?y:null,!0===t?j:null].filter(c["a"]).join(" ")||null,L=e(i?Fu:"div",{props:i?this.contentColProps:{},ref:"content"},[o(E["i"],{ariaDescribedby:x,descriptionId:M,id:u,labelId:h})||e(),g,_,w]);return e(d?"fieldset":i?Is:"div",{staticClass:"form-group",class:[{"was-validated":this.validated},this.stateClass],attrs:{id:u,disabled:d?this.disabled:null,role:d?null:"group","aria-invalid":this.computedAriaInvalid,"aria-labelledby":d&&i?h:null}},i&&d?[e(Is,[l,L])]:[l,L])}},qu=M({components:{BFormGroup:Gu,BFormFieldset:Gu}}),Ju=i["default"].extend({computed:{selectionStart:{cache:!1,get:function(){return this.$refs.input.selectionStart},set:function(e){this.$refs.input.selectionStart=e}},selectionEnd:{cache:!1,get:function(){return this.$refs.input.selectionEnd},set:function(e){this.$refs.input.selectionEnd=e}},selectionDirection:{cache:!1,get:function(){return this.$refs.input.selectionDirection},set:function(e){this.$refs.input.selectionDirection=e}}},methods:{select:function(){var e;(e=this.$refs.input).select.apply(e,arguments)},setSelectionRange:function(){var e;(e=this.$refs.input).setSelectionRange.apply(e,arguments)},setRangeText:function(){var e;(e=this.$refs.input).setRangeText.apply(e,arguments)}}});function Ku(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function Xu(e){for(var t=1;t2&&void 0!==arguments[2]&&arguments[2];return e=Object(me["g"])(e),!this.hasFormatter||this.lazyFormatter&&!n||(e=this.formatter(e,t)),e},modifyValue:function(e){return e=Object(me["g"])(e),this.trim&&(e=e.trim()),this.number&&(e=Object(I["b"])(e,e)),e},updateValue:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=this.lazy;if(!i||n){this.clearDebounce();var r=function(){if(e=t.modifyValue(e),e!==t.vModelValue)t.vModelValue=e,t.$emit(id,e);else if(t.hasFormatter){var n=t.$refs.input;n&&e!==n.value&&(n.value=e)}},o=this.computedDebounce;o>0&&!i&&!n?this.$_inputDebounceTimer=setTimeout(r,o):r()}},onInput:function(e){if(!e.target.composing){var t=e.target.value,n=this.formatValue(t,e);!1===n||e.defaultPrevented?Object(dt["f"])(e,{propagation:!1}):(this.localValue=n,this.updateValue(n),this.$emit(Y["y"],n))}},onChange:function(e){var t=e.target.value,n=this.formatValue(t,e);!1===n||e.defaultPrevented?Object(dt["f"])(e,{propagation:!1}):(this.localValue=n,this.updateValue(n,!0),this.$emit(Y["d"],n))},onBlur:function(e){var t=e.target.value,n=this.formatValue(t,e,!0);!1!==n&&(this.localValue=Object(me["g"])(this.modifyValue(n)),this.updateValue(n,!0)),this.$emit(Y["b"],e)},focus:function(){this.disabled||Object(H["d"])(this.$el)},blur:function(){this.disabled||Object(H["c"])(this.$el)}}}),ad=i["default"].extend({computed:{validity:{cache:!1,get:function(){return this.$refs.input.validity}},validationMessage:{cache:!1,get:function(){return this.$refs.input.validationMessage}},willValidate:{cache:!1,get:function(){return this.$refs.input.willValidate}}},methods:{setCustomValidity:function(){var e;return(e=this.$refs.input).setCustomValidity.apply(e,arguments)},checkValidity:function(){var e;return(e=this.$refs.input).checkValidity.apply(e,arguments)},reportValidity:function(){var e;return(e=this.$refs.input).reportValidity.apply(e,arguments)}}}),sd=n("bc9a");function cd(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function ud(e){for(var t=1;t=n?"full":t>=n-.5?"half":"empty",d={variant:o,disabled:a,readonly:s};return e("span",{staticClass:"b-rating-star",class:{focused:i&&t===n||!Object(I["c"])(t)&&n===c,"b-rating-star-empty":"empty"===u,"b-rating-star-half":"half"===u,"b-rating-star-full":"full"===u},attrs:{tabindex:a||s?null:"-1"},on:{click:this.onClick}},[e("span",{staticClass:"b-rating-icon"},[this.normalizeSlot(u,d)])])}}),Pd=Object(F["d"])(Object(f["m"])(_d(_d(_d(_d(_d({},ni["b"]),kd),Object(f["j"])(Rs,["required","autofocus"])),Us),{},{color:Object(F["c"])(C["u"]),iconClear:Object(F["c"])(C["u"],"x"),iconEmpty:Object(F["c"])(C["u"],"star"),iconFull:Object(F["c"])(C["u"],"star-fill"),iconHalf:Object(F["c"])(C["u"],"star-half"),inline:Object(F["c"])(C["g"],!1),locale:Object(F["c"])(C["f"]),noBorder:Object(F["c"])(C["g"],!1),precision:Object(F["c"])(C["p"]),readonly:Object(F["c"])(C["g"],!1),showClear:Object(F["c"])(C["g"],!1),showValue:Object(F["c"])(C["g"],!1),showValueMax:Object(F["c"])(C["g"],!1),stars:Object(F["c"])(C["p"],Sd,(function(e){return Object(I["c"])(e)>=Ld})),variant:Object(F["c"])(C["u"])})),P["Y"]),Yd=i["default"].extend({name:P["Y"],components:{BIconStar:Fe,BIconStarHalf:Ne,BIconStarFill:Be,BIconX:Re},mixins:[ni["a"],wd,Gs],props:Pd,data:function(){var e=Object(I["b"])(this[Md],null),t=Td(this.stars);return{localValue:Object(u["g"])(e)?null:Dd(e,0,t),hasFocus:!1}},computed:{computedStars:function(){return Td(this.stars)},computedRating:function(){var e=Object(I["b"])(this.localValue,0),t=Object(I["c"])(this.precision,3);return Dd(Object(I["b"])(e.toFixed(t)),0,this.computedStars)},computedLocale:function(){var e=Object(ut["b"])(this.locale).filter(c["a"]),t=new Intl.NumberFormat(e);return t.resolvedOptions().locale},isInteractive:function(){return!this.disabled&&!this.readonly},isRTL:function(){return Qn(this.computedLocale)},formattedRating:function(){var e=Object(I["c"])(this.precision),t=this.showValueMax,n=this.computedLocale,i={notation:"standard",minimumFractionDigits:isNaN(e)?0:e,maximumFractionDigits:isNaN(e)?3:e},r=this.computedStars.toLocaleString(n),o=this.localValue;return o=Object(u["g"])(o)?t?"-":"":o.toLocaleString(n,i),t?"".concat(o,"/").concat(r):o}},watch:(ld={},Od(ld,Md,(function(e,t){if(e!==t){var n=Object(I["b"])(e,null);this.localValue=Object(u["g"])(n)?null:Dd(n,0,this.computedStars)}})),Od(ld,"localValue",(function(e,t){e!==t&&e!==(this.value||0)&&this.$emit(xd,e||null)})),Od(ld,"disabled",(function(e){e&&(this.hasFocus=!1,this.blur())})),ld),methods:{focus:function(){this.disabled||Object(H["d"])(this.$el)},blur:function(){this.disabled||Object(H["c"])(this.$el)},onKeydown:function(e){var t=e.keyCode;if(this.isInteractive&&Object(ut["a"])([it,Ze,at,ct],t)){Object(dt["f"])(e,{propagation:!1});var n=Object(I["c"])(this.localValue,0),i=this.showClear?0:1,r=this.computedStars,o=this.isRTL?-1:1;t===it?this.localValue=Dd(n-o,i,r)||null:t===at?this.localValue=Dd(n+o,i,r):t===Ze?this.localValue=Dd(n-1,i,r)||null:t===ct&&(this.localValue=Dd(n+1,i,r))}},onSelected:function(e){this.isInteractive&&(this.localValue=e)},onFocus:function(e){this.hasFocus=!!this.isInteractive&&"focus"===e.type},renderIcon:function(e){return this.$createElement(Je,{props:{icon:e,variant:this.disabled||this.color?null:this.variant||null}})},iconEmptyFn:function(){return this.renderIcon(this.iconEmpty)},iconHalfFn:function(){return this.renderIcon(this.iconHalf)},iconFullFn:function(){return this.renderIcon(this.iconFull)},iconClearFn:function(){return this.$createElement(Je,{props:{icon:this.iconClear}})}},render:function(e){var t=this,n=this.disabled,i=this.readonly,r=this.name,o=this.form,a=this.inline,s=this.variant,c=this.color,d=this.noBorder,l=this.hasFocus,f=this.computedRating,h=this.computedStars,p=this.formattedRating,m=this.showClear,b=this.isRTL,g=this.isInteractive,v=this.$scopedSlots,y=[];if(m&&!n&&!i){var _=e("span",{staticClass:"b-rating-icon"},[(v[E["v"]]||this.iconClearFn)()]);y.push(e("span",{staticClass:"b-rating-star b-rating-star-clear flex-grow-1",class:{focused:l&&0===f},attrs:{tabindex:g?"-1":null},on:{click:function(){return t.onSelected(null)}},key:"clear"},[_]))}for(var O=0;O1&&void 0!==arguments[1]?arguments[1]:null;if(Object(u["k"])(e)){var n=l(e,this.valueField),i=l(e,this.textField),r=l(e,this.optionsField,null);return Object(u["g"])(r)?{value:Object(u["o"])(n)?t||i:n,text:String(Object(u["o"])(i)?t:i),html:l(e,this.htmlField),disabled:Boolean(l(e,this.disabledField))}:{label:String(l(e,this.labelField)||i),options:this.normalizeOptions(r)}}return{value:t||e,text:String(e),disabled:!1}}}}),Wd=Object(F["d"])({disabled:Object(F["c"])(C["g"],!1),value:Object(F["c"])(C["a"],void 0,!0)},P["cb"]),Ud=i["default"].extend({name:P["cb"],functional:!0,props:Wd,render:function(e,t){var n=t.props,i=t.data,r=t.children,o=n.value,a=n.disabled;return e("option",Object(pe["a"])(i,{attrs:{disabled:a},domProps:{value:o}}),r)}});function Gd(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function qd(e){for(var t=1;t0?e:bl},computedInterval:function(){var e=Object(I["c"])(this.repeatInterval,0);return e>0?e:gl},computedThreshold:function(){return Object(ne["d"])(Object(I["c"])(this.repeatThreshold,vl),1)},computedStepMultiplier:function(){return Object(ne["d"])(Object(I["c"])(this.repeatStepMultiplier,yl),1)},computedPrecision:function(){var e=this.computedStep;return Object(ne["c"])(e)===e?0:(e.toString().split(".")[1]||"").length},computedMultiplier:function(){return Object(ne["f"])(10,this.computedPrecision||0)},valueAsFixed:function(){var e=this.localValue;return Object(u["g"])(e)?"":e.toFixed(this.computedPrecision)},computedLocale:function(){var e=Object(ut["b"])(this.locale).filter(c["a"]),t=new Intl.NumberFormat(e);return t.resolvedOptions().locale},computedRTL:function(){return Qn(this.computedLocale)},defaultFormatter:function(){var e=this.computedPrecision,t=new Intl.NumberFormat(this.computedLocale,{style:"decimal",useGrouping:!1,minimumIntegerDigits:1,minimumFractionDigits:e,maximumFractionDigits:e,notation:"standard"});return t.format},computedFormatter:function(){var e=this.formatterFn;return Object(F["b"])(e)?e:this.defaultFormatter},computedAttrs:function(){return al(al({},this.bvAttrs),{},{role:"group",lang:this.computedLocale,tabindex:this.disabled?null:"-1",title:this.ariaLabel})},computedSpinAttrs:function(){var e=this.spinId,t=this.localValue,n=this.computedRequired,i=this.disabled,r=this.state,o=this.computedFormatter,a=!Object(u["g"])(t);return al(al({dir:this.computedRTL?"rtl":"ltr"},this.bvAttrs),{},{id:e,role:"spinbutton",tabindex:i?null:"0","aria-live":"off","aria-label":this.ariaLabel||null,"aria-controls":this.ariaControls||null,"aria-invalid":!1===r||!a&&n?"true":null,"aria-required":n?"true":null,"aria-valuemin":Object(me["g"])(this.computedMin),"aria-valuemax":Object(me["g"])(this.computedMax),"aria-valuenow":a?t:null,"aria-valuetext":a?o(t):null})}},watch:(tl={},sl(tl,ll,(function(e){this.localValue=Object(I["b"])(e,null)})),sl(tl,"localValue",(function(e){this.$emit(fl,e)})),sl(tl,"disabled",(function(e){e&&this.clearRepeat()})),sl(tl,"readonly",(function(e){e&&this.clearRepeat()})),tl),created:function(){this.$_autoDelayTimer=null,this.$_autoRepeatTimer=null,this.$_keyIsDown=!1},beforeDestroy:function(){this.clearRepeat()},deactivated:function(){this.clearRepeat()},methods:{focus:function(){this.disabled||Object(H["d"])(this.$refs.spinner)},blur:function(){this.disabled||Object(H["c"])(this.$refs.spinner)},emitChange:function(){this.$emit(Y["d"],this.localValue)},stepValue:function(e){var t=this.localValue;if(!this.disabled&&!Object(u["g"])(t)){var n=this.computedStep*e,i=this.computedMin,r=this.computedMax,o=this.computedMultiplier,a=this.wrap;t=Object(ne["g"])((t-i)/n)*n+i+n,t=Object(ne["g"])(t*o)/o,this.localValue=t>r?a?i:r:t0&&void 0!==arguments[0]?arguments[0]:1,t=this.localValue;Object(u["g"])(t)?this.localValue=this.computedMin:this.stepValue(1*e)},stepDown:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,t=this.localValue;Object(u["g"])(t)?this.localValue=this.wrap?this.computedMax:this.computedMin:this.stepValue(-1*e)},onKeydown:function(e){var t=e.keyCode,n=e.altKey,i=e.ctrlKey,r=e.metaKey;if(!(this.disabled||this.readonly||n||i||r)&&Object(ut["a"])(_l,t)){if(Object(dt["f"])(e,{propagation:!1}),this.$_keyIsDown)return;this.resetTimers(),Object(ut["a"])([ct,Ze],t)?(this.$_keyIsDown=!0,t===ct?this.handleStepRepeat(e,this.stepUp):t===Ze&&this.handleStepRepeat(e,this.stepDown)):t===ot?this.stepUp(this.computedStepMultiplier):t===rt?this.stepDown(this.computedStepMultiplier):t===nt?this.localValue=this.computedMin:t===Qe&&(this.localValue=this.computedMax)}},onKeyup:function(e){var t=e.keyCode,n=e.altKey,i=e.ctrlKey,r=e.metaKey;this.disabled||this.readonly||n||i||r||Object(ut["a"])(_l,t)&&(Object(dt["f"])(e,{propagation:!1}),this.resetTimers(),this.$_keyIsDown=!1,this.emitChange())},handleStepRepeat:function(e,t){var n=this,i=e||{},r=i.type,o=i.button;if(!this.disabled&&!this.readonly){if("mousedown"===r&&o)return;this.resetTimers(),t(1);var a=this.computedThreshold,s=this.computedStepMultiplier,c=this.computedDelay,u=this.computedInterval;this.$_autoDelayTimer=setTimeout((function(){var e=0;n.$_autoRepeatTimer=setInterval((function(){t(ee.length)&&(t=e.length);for(var n=0,i=new Array(t);n0&&n.indexOf(e)===t}))},ql=function(e){return Object(u["n"])(e)?e:Object(u["d"])(e)&&e.target.value||""},Jl=function(){return{all:[],valid:[],invalid:[],duplicate:[]}},Kl=Object(F["d"])(Object(f["m"])($l($l($l($l($l($l({},ni["b"]),Nl),Rs),Us),qs),{},{addButtonText:Object(F["c"])(C["u"],"Add"),addButtonVariant:Object(F["c"])(C["u"],"outline-secondary"),addOnChange:Object(F["c"])(C["g"],!1),duplicateTagText:Object(F["c"])(C["u"],"Duplicate tag(s)"),ignoreInputFocusSelector:Object(F["c"])(C["f"],Wl),inputAttrs:Object(F["c"])(C["q"],{}),inputClass:Object(F["c"])(C["e"]),inputId:Object(F["c"])(C["u"]),inputType:Object(F["c"])(C["u"],"text",(function(e){return Object(ut["a"])(Vl,e)})),invalidTagText:Object(F["c"])(C["u"],"Invalid tag(s)"),limit:Object(F["c"])(C["n"]),limitTagsText:Object(F["c"])(C["u"],"Tag limit reached"),noAddOnEnter:Object(F["c"])(C["g"],!1),noOuterFocus:Object(F["c"])(C["g"],!1),noTagRemove:Object(F["c"])(C["g"],!1),placeholder:Object(F["c"])(C["u"],"Add tag..."),removeOnDelete:Object(F["c"])(C["g"],!1),separator:Object(F["c"])(C["f"]),tagClass:Object(F["c"])(C["e"]),tagPills:Object(F["c"])(C["g"],!1),tagRemoveLabel:Object(F["c"])(C["u"],"Remove tag"),tagRemovedLabel:Object(F["c"])(C["u"],"Tag removed"),tagValidator:Object(F["c"])(C["l"]),tagVariant:Object(F["c"])(C["u"],"secondary")})),P["gb"]),Xl=i["default"].extend({name:P["gb"],mixins:[ni["a"],Bl,zs,Gs,Js,B["a"]],props:Kl,data:function(){return{hasFocus:!1,newTag:"",tags:[],removedTags:[],tagsState:Jl()}},computed:{computedInputId:function(){return this.inputId||this.safeId("__input__")},computedInputType:function(){return Object(ut["a"])(Vl,this.inputType)?this.inputType:"text"},computedInputAttrs:function(){var e=this.disabled,t=this.form;return $l($l({},this.inputAttrs),{},{id:this.computedInputId,value:this.newTag,disabled:e,form:t})},computedInputHandlers:function(){return{input:this.onInputInput,change:this.onInputChange,keydown:this.onInputKeydown,reset:this.reset}},computedSeparator:function(){return Object(ut["b"])(this.separator).filter(u["n"]).filter(c["a"]).join("")},computedSeparatorRegExp:function(){var e=this.computedSeparator;return e?new RegExp("[".concat(Ul(e),"]+")):null},computedJoiner:function(){var e=this.computedSeparator.charAt(0);return" "!==e?"".concat(e," "):e},computeIgnoreInputFocusSelector:function(){return Object(ut["b"])(this.ignoreInputFocusSelector).filter(c["a"]).join(",").trim()},disableAddButton:function(){var e=this,t=Object(me["h"])(this.newTag);return""===t||!this.splitTags(t).some((function(t){return!Object(ut["a"])(e.tags,t)&&e.validateTag(t)}))},duplicateTags:function(){return this.tagsState.duplicate},hasDuplicateTags:function(){return this.duplicateTags.length>0},invalidTags:function(){return this.tagsState.invalid},hasInvalidTags:function(){return this.invalidTags.length>0},isLimitReached:function(){var e=this.limit;return Object(u["h"])(e)&&e>=0&&this.tags.length>=e}},watch:(Ll={},Il(Ll,Rl,(function(e){this.tags=Gl(e)})),Il(Ll,"tags",(function(e,t){Object(ei["a"])(e,this[Rl])||this.$emit(zl,e),Object(ei["a"])(e,t)||(e=Object(ut["b"])(e).filter(c["a"]),t=Object(ut["b"])(t).filter(c["a"]),this.removedTags=t.filter((function(t){return!Object(ut["a"])(e,t)})))})),Il(Ll,"tagsState",(function(e,t){Object(ei["a"])(e,t)||this.$emit(Y["Y"],e.valid,e.invalid,e.duplicate)})),Ll),created:function(){this.tags=Gl(this[Rl])},mounted:function(){var e=this,t=Object(H["e"])("form",this.$el);t&&(Object(dt["b"])(t,"reset",this.reset,Y["db"]),this.$on(Y["eb"],(function(){Object(dt["a"])(t,"reset",e.reset,Y["db"])})))},methods:{addTag:function(e){if(e=Object(u["n"])(e)?e:this.newTag,!this.disabled&&""!==Object(me["h"])(e)&&!this.isLimitReached){var t=this.parseTags(e);if(t.valid.length>0||0===t.all.length)if(Object(H["v"])(this.getInput(),"select"))this.newTag="";else{var n=[].concat(Dl(t.invalid),Dl(t.duplicate));this.newTag=t.all.filter((function(e){return Object(ut["a"])(n,e)})).join(this.computedJoiner).concat(n.length>0?this.computedJoiner.charAt(0):"")}t.valid.length>0&&(this.tags=Object(ut["b"])(this.tags,t.valid)),this.tagsState=t,this.focus()}},removeTag:function(e){var t=this;this.disabled||(this.tags=this.tags.filter((function(t){return t!==e})),this.$nextTick((function(){t.focus()})))},reset:function(){var e=this;this.newTag="",this.tags=[],this.$nextTick((function(){e.removedTags=[],e.tagsState=Jl()}))},onInputInput:function(e){if(!(this.disabled||Object(u["d"])(e)&&e.target.composing)){var t=ql(e),n=this.computedSeparatorRegExp;this.newTag!==t&&(this.newTag=t),t=Object(me["i"])(t),n&&n.test(t.slice(-1))?this.addTag():this.tagsState=""===t?Jl():this.parseTags(t)}},onInputChange:function(e){if(!this.disabled&&this.addOnChange){var t=ql(e);this.newTag!==t&&(this.newTag=t),this.addTag()}},onInputKeydown:function(e){if(!this.disabled&&Object(u["d"])(e)){var t=e.keyCode,n=e.target.value||"";this.noAddOnEnter||t!==et?!this.removeOnDelete||t!==Ke&&t!==Xe||""!==n||(Object(dt["f"])(e,{propagation:!1}),this.tags=this.tags.slice(0,-1)):(Object(dt["f"])(e,{propagation:!1}),this.addTag())}},onClick:function(e){var t=this,n=this.computeIgnoreInputFocusSelector,i=e.target;this.disabled||Object(H["q"])(i)||n&&Object(H["e"])(n,i,!0)||this.$nextTick((function(){t.focus()}))},onFocusin:function(){this.hasFocus=!0},onFocusout:function(){this.hasFocus=!1},handleAutofocus:function(){var e=this;this.$nextTick((function(){Object(H["D"])((function(){e.autofocus&&!e.disabled&&e.focus()}))}))},focus:function(){this.disabled||Object(H["d"])(this.getInput())},blur:function(){this.disabled||Object(H["c"])(this.getInput())},splitTags:function(e){e=Object(me["g"])(e);var t=this.computedSeparatorRegExp;return(t?e.split(t):[e]).map(me["h"]).filter(c["a"])},parseTags:function(e){var t=this,n=this.splitTags(e),i={all:n,valid:[],invalid:[],duplicate:[]};return n.forEach((function(e){Object(ut["a"])(t.tags,e)||Object(ut["a"])(i.valid,e)?Object(ut["a"])(i.duplicate,e)||i.duplicate.push(e):t.validateTag(e)?i.valid.push(e):Object(ut["a"])(i.invalid,e)||i.invalid.push(e)})),i},validateTag:function(e){var t=this.tagValidator;return!Object(F["b"])(t)||t(e)},getInput:function(){return Object(H["E"])("#".concat(Tu(this.computedInputId)),this.$el)},defaultRender:function(e){var t=e.addButtonText,n=e.addButtonVariant,i=e.addTag,r=e.disableAddButton,o=e.disabled,a=e.duplicateTagText,s=e.inputAttrs,u=e.inputClass,d=e.inputHandlers,l=e.inputType,f=e.invalidTagText,h=e.isDuplicate,p=e.isInvalid,m=e.isLimitReached,b=e.limitTagsText,g=e.noTagRemove,v=e.placeholder,y=e.removeTag,_=e.tagClass,O=e.tagPills,j=e.tagRemoveLabel,w=e.tagVariant,k=e.tags,M=this.$createElement,x=k.map((function(e){return e=Object(me["g"])(e),M(Tl,{class:_,props:{disabled:o,noRemove:g,pill:O,removeLabel:j,tag:"li",title:e,variant:w},on:{remove:function(){return y(e)}},key:"tags_".concat(e)},e)})),L=f&&p?this.safeId("__invalid_feedback__"):null,S=a&&h?this.safeId("__duplicate_feedback__"):null,T=b&&m?this.safeId("__limit_feedback__"):null,D=[s["aria-describedby"],L,S,T].filter(c["a"]).join(" "),A=M("input",{staticClass:"b-form-tags-input w-100 flex-grow-1 p-0 m-0 bg-transparent border-0",class:u,style:{outline:0,minWidth:"5rem"},attrs:$l($l({},s),{},{"aria-describedby":D||null,type:l,placeholder:v||null}),domProps:{value:s.value},on:d,directives:[{name:"model",value:s.value}],ref:"input"}),P=M(Mt,{staticClass:"b-form-tags-button py-0",class:{invisible:r},style:{fontSize:"90%"},props:{disabled:r||m,variant:n},on:{click:function(){return i()}},ref:"button"},[this.normalizeSlot(E["a"])||t]),Y=this.safeId("__tag_list__"),C=M("li",{staticClass:"b-from-tags-field flex-grow-1",attrs:{role:"none","aria-live":"off","aria-controls":Y},key:"tags_field"},[M("div",{staticClass:"d-flex",attrs:{role:"group"}},[A,P])]),H=M("ul",{staticClass:"b-form-tags-list list-unstyled mb-0 d-flex flex-wrap align-items-center",attrs:{id:Y},key:"tags_list"},[x,C]),$=M();if(f||a||b){var I=this.computedJoiner,F=M();L&&(F=M(Cs,{props:{id:L,forceShow:!0},key:"tags_invalid_feedback"},[this.invalidTagText,": ",this.invalidTags.join(I)]));var B=M();S&&(B=M(Ps,{props:{id:S},key:"tags_duplicate_feedback"},[this.duplicateTagText,": ",this.duplicateTags.join(I)]));var N=M();T&&(N=M(Ps,{props:{id:T},key:"tags_limit_feedback"},[b])),$=M("div",{attrs:{"aria-live":"polite","aria-atomic":"true"},key:"tags_feedback"},[F,B,N])}return[H,$]}},render:function(e){var t=this.name,n=this.disabled,i=this.required,r=this.form,o=this.tags,a=this.computedInputId,s=this.hasFocus,c=this.noOuterFocus,u=$l({tags:o.slice(),inputAttrs:this.computedInputAttrs,inputType:this.computedInputType,inputHandlers:this.computedInputHandlers,removeTag:this.removeTag,addTag:this.addTag,reset:this.reset,inputId:a,isInvalid:this.hasInvalidTags,invalidTags:this.invalidTags.slice(),isDuplicate:this.hasDuplicateTags,duplicateTags:this.duplicateTags.slice(),isLimitReached:this.isLimitReached,disableAddButton:this.disableAddButton},Object(f["k"])(this.$props,["addButtonText","addButtonVariant","disabled","duplicateTagText","form","inputClass","invalidTagText","limit","limitTagsText","noTagRemove","placeholder","required","separator","size","state","tagClass","tagPills","tagRemoveLabel","tagVariant"])),d=this.normalizeSlot(E["i"],u)||this.defaultRender(u),l=e("output",{staticClass:"sr-only",attrs:{id:this.safeId("__selected_tags__"),role:"status",for:a,"aria-live":s?"polite":"off","aria-atomic":"true","aria-relevant":"additions text"}},this.tags.join(", ")),h=e("div",{staticClass:"sr-only",attrs:{id:this.safeId("__removed_tags__"),role:"status","aria-live":s?"assertive":"off","aria-atomic":"true"}},this.removedTags.length>0?"(".concat(this.tagRemovedLabel,") ").concat(this.removedTags.join(", ")):""),p=e();if(t&&!n){var m=o.length>0;p=(m?o:[""]).map((function(n){return e("input",{class:{"sr-only":!m},attrs:{type:m?"hidden":"text",value:n,required:i,name:t,form:r},key:"tag_input_".concat(n)})}))}return e("div",{staticClass:"b-form-tags form-control h-auto",class:[{focus:s&&!c&&!n,disabled:n},this.sizeFormClass,this.stateClass],attrs:{id:this.safeId(),role:"group",tabindex:n||c?null:"-1","aria-describedby":this.safeId("__selected_tags__")},on:{click:this.onClick,focusin:this.onFocusin,focusout:this.onFocusout}},[l,h,d,p])}}),Zl=M({components:{BFormTags:Xl,BTags:Xl,BFormTag:Tl,BTag:Tl}});function Ql(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function ef(e){for(var t=1;tf?s:"".concat(f,"px")}},render:function(e){return e("textarea",{class:this.computedClass,style:this.computedStyle,directives:[{name:"b-visible",value:this.visibleCallback,modifiers:{640:!0}}],attrs:this.computedAttrs,domProps:{value:this.localValue},on:this.computedListeners,ref:"input"})}}),af=M({components:{BFormTextarea:of,BTextarea:of}});function sf(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function cf(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,i=new Array(t);n1&&void 0!==arguments[1]&&arguments[1];if(Object(u["g"])(t)||Object(u["g"])(n)||r&&Object(u["g"])(i))return"";var o=[t,n,r?i:0];return o.map(wf).join(":")},xf=Object(F["d"])(Object(f["m"])(cf(cf(cf(cf({},ni["b"]),yf),Object(f["k"])(Ol,["labelIncrement","labelDecrement"])),{},{ariaLabelledby:Object(F["c"])(C["u"]),disabled:Object(F["c"])(C["g"],!1),hidden:Object(F["c"])(C["g"],!1),hideHeader:Object(F["c"])(C["g"],!1),hour12:Object(F["c"])(C["g"],null),labelAm:Object(F["c"])(C["u"],"AM"),labelAmpm:Object(F["c"])(C["u"],"AM/PM"),labelHours:Object(F["c"])(C["u"],"Hours"),labelMinutes:Object(F["c"])(C["u"],"Minutes"),labelNoTimeSelected:Object(F["c"])(C["u"],"No time selected"),labelPm:Object(F["c"])(C["u"],"PM"),labelSeconds:Object(F["c"])(C["u"],"Seconds"),labelSelected:Object(F["c"])(C["u"],"Selected time"),locale:Object(F["c"])(C["f"]),minutesStep:Object(F["c"])(C["p"],1),readonly:Object(F["c"])(C["g"],!1),secondsStep:Object(F["c"])(C["p"],1),showSeconds:Object(F["c"])(C["g"],!1)})),P["oc"]),Lf=i["default"].extend({name:P["oc"],mixins:[ni["a"],vf,B["a"]],props:xf,data:function(){var e=kf(this[_f]||"");return{modelHours:e.hours,modelMinutes:e.minutes,modelSeconds:e.seconds,modelAmpm:e.ampm,isLive:!1}},computed:{computedHMS:function(){var e=this.modelHours,t=this.modelMinutes,n=this.modelSeconds;return Mf({hours:e,minutes:t,seconds:n},this.showSeconds)},resolvedOptions:function(){var e=Object(ut["b"])(this.locale).filter(c["a"]),t={hour:jf,minute:jf,second:jf};Object(u["p"])(this.hour12)||(t.hour12=!!this.hour12);var n=new Intl.DateTimeFormat(e,t),i=n.resolvedOptions(),r=i.hour12||!1,o=i.hourCycle||(r?"h12":"h23");return{locale:i.locale,hour12:r,hourCycle:o}},computedLocale:function(){return this.resolvedOptions.locale},computedLang:function(){return(this.computedLocale||"").replace(/-u-.*$/,"")},computedRTL:function(){return Qn(this.computedLang)},computedHourCycle:function(){return this.resolvedOptions.hourCycle},is12Hour:function(){return!!this.resolvedOptions.hour12},context:function(){return{locale:this.computedLocale,isRTL:this.computedRTL,hourCycle:this.computedHourCycle,hour12:this.is12Hour,hours:this.modelHours,minutes:this.modelMinutes,seconds:this.showSeconds?this.modelSeconds:0,value:this.computedHMS,formatted:this.formattedTimeString}},valueId:function(){return this.safeId()||null},computedAriaLabelledby:function(){return[this.ariaLabelledby,this.valueId].filter(c["a"]).join(" ")||null},timeFormatter:function(){var e={hour12:this.is12Hour,hourCycle:this.computedHourCycle,hour:jf,minute:jf,timeZone:"UTC"};return this.showSeconds&&(e.second=jf),Bn(this.computedLocale,e)},numberFormatter:function(){var e=new Intl.NumberFormat(this.computedLocale,{style:"decimal",minimumIntegerDigits:2,minimumFractionDigits:0,maximumFractionDigits:0,notation:"standard"});return e.format},formattedTimeString:function(){var e=this.modelHours,t=this.modelMinutes,n=this.showSeconds&&this.modelSeconds||0;return this.computedHMS?this.timeFormatter(Hn(Date.UTC(0,0,1,e,t,n))):this.labelNoTimeSelected||" "},spinScopedSlots:function(){var e=this.$createElement;return{increment:function(t){var n=t.hasFocus;return e(Pe,{props:{scale:n?1.5:1.25},attrs:{"aria-hidden":"true"}})},decrement:function(t){var n=t.hasFocus;return e(Pe,{props:{flipV:!0,scale:n?1.5:1.25},attrs:{"aria-hidden":"true"}})}}}},watch:(nf={},uf(nf,_f,(function(e,t){if(e!==t&&!Object(ei["a"])(kf(e),kf(this.computedHMS))){var n=kf(e),i=n.hours,r=n.minutes,o=n.seconds,a=n.ampm;this.modelHours=i,this.modelMinutes=r,this.modelSeconds=o,this.modelAmpm=a}})),uf(nf,"computedHMS",(function(e,t){e!==t&&this.$emit(Of,e)})),uf(nf,"context",(function(e,t){Object(ei["a"])(e,t)||this.$emit(Y["h"],e)})),uf(nf,"modelAmpm",(function(e,t){var n=this;if(e!==t){var i=Object(u["g"])(this.modelHours)?0:this.modelHours;this.$nextTick((function(){0===e&&i>11?n.modelHours=i-12:1===e&&i<12&&(n.modelHours=i+12)}))}})),uf(nf,"modelHours",(function(e,t){e!==t&&(this.modelAmpm=e>11?1:0)})),nf),created:function(){var e=this;this.$nextTick((function(){e.$emit(Y["h"],e.context)}))},mounted:function(){this.setLive(!0)},activated:function(){this.setLive(!0)},deactivated:function(){this.setLive(!1)},beforeDestroy:function(){this.setLive(!1)},methods:{focus:function(){this.disabled||Object(H["d"])(this.$refs.spinners[0])},blur:function(){if(!this.disabled){var e=Object(H["g"])();Object(H["f"])(this.$el,e)&&Object(H["c"])(e)}},formatHours:function(e){var t=this.computedHourCycle;return e=this.is12Hour&&e>12?e-12:e,e=0===e&&"h12"===t?12:0===e&&"h24"===t?24:12===e&&"h11"===t?0:e,this.numberFormatter(e)},formatMinutes:function(e){return this.numberFormatter(e)},formatSeconds:function(e){return this.numberFormatter(e)},formatAmpm:function(e){return 0===e?this.labelAm:1===e?this.labelPm:""},setHours:function(e){this.modelHours=e},setMinutes:function(e){this.modelMinutes=e},setSeconds:function(e){this.modelSeconds=e},setAmpm:function(e){this.modelAmpm=e},onSpinLeftRight:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.type,n=e.keyCode;if(!this.disabled&&"keydown"===t&&(n===it||n===at)){Object(dt["f"])(e);var i=this.$refs.spinners||[],r=i.map((function(e){return!!e.hasFocus})).indexOf(!0);r+=n===it?-1:1,r=r>=i.length?0:r<0?i.length-1:r,Object(H["d"])(i[r])}},setLive:function(e){var t=this;e?this.$nextTick((function(){Object(H["D"])((function(){t.isLive=!0}))})):this.isLive=!1}},render:function(e){var t=this;if(this.hidden)return e();var n=this.valueId,i=this.computedAriaLabelledby,r=[],o=function(i,o,a){var s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},c=t.safeId("_spinbutton_".concat(o,"_"))||null;return r.push(c),e(jl,{class:a,props:cf({id:c,placeholder:"--",vertical:!0,required:!0,disabled:t.disabled,readonly:t.readonly,locale:t.computedLocale,labelIncrement:t.labelIncrement,labelDecrement:t.labelDecrement,wrap:!0,ariaControls:n,min:0},s),scopedSlots:t.spinScopedSlots,on:{change:i},key:o,ref:"spinners",refInFor:!0})},a=function(){return e("div",{staticClass:"d-flex flex-column",class:{"text-muted":t.disabled||t.readonly},attrs:{"aria-hidden":"true"}},[e(Ye,{props:{shiftV:4,scale:.5}}),e(Ye,{props:{shiftV:-4,scale:.5}})])},s=[];s.push(o(this.setHours,"hours","b-time-hours",{value:this.modelHours,max:23,step:1,formatterFn:this.formatHours,ariaLabel:this.labelHours})),s.push(a()),s.push(o(this.setMinutes,"minutes","b-time-minutes",{value:this.modelMinutes,max:59,step:this.minutesStep||1,formatterFn:this.formatMinutes,ariaLabel:this.labelMinutes})),this.showSeconds&&(s.push(a()),s.push(o(this.setSeconds,"seconds","b-time-seconds",{value:this.modelSeconds,max:59,step:this.secondsStep||1,formatterFn:this.formatSeconds,ariaLabel:this.labelSeconds}))),this.is12Hour&&s.push(o(this.setAmpm,"ampm","b-time-ampm",{value:this.modelAmpm,max:1,formatterFn:this.formatAmpm,ariaLabel:this.labelAmpm,required:!1})),s=e("div",{staticClass:"d-flex align-items-center justify-content-center mx-auto",attrs:{role:"group",tabindex:this.disabled||this.readonly?null:"-1","aria-labelledby":i},on:{keydown:this.onSpinLeftRight,click:function(e){e.target===e.currentTarget&&t.focus()}}},s);var u=e("output",{staticClass:"form-control form-control-sm text-center",class:{disabled:this.disabled||this.readonly},attrs:{id:n,role:"status",for:r.filter(c["a"]).join(" ")||null,tabindex:this.disabled?null:"-1","aria-live":this.isLive?"polite":"off","aria-atomic":"true"},on:{click:this.focus,focus:this.focus}},[e("bdi",this.formattedTimeString),this.computedHMS?e("span",{staticClass:"sr-only"}," (".concat(this.labelSelected,") ")):""]),d=e("header",{staticClass:"b-time-header",class:{"sr-only":this.hideHeader}},[u]),l=this.normalizeSlot();return l=l?e("footer",{staticClass:"b-time-footer"},l):e(),e("div",{staticClass:"b-time d-inline-flex flex-column text-center",attrs:{role:"group",lang:this.computedLang||null,"aria-labelledby":i||null,"aria-disabled":this.disabled?"true":null,"aria-readonly":this.readonly&&!this.disabled?"true":null}},[d,s,l])}});function Sf(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function Tf(e){for(var t=1;t0&&a.push(e("span"," "));var c=this.labelResetButton;a.push(e(Mt,{props:{size:"sm",disabled:n||i,variant:this.resetButtonVariant},attrs:{"aria-label":c||null},on:{click:this.onResetButton},key:"reset-btn"},c))}if(!this.noCloseButton){a.length>0&&a.push(e("span"," "));var d=this.labelCloseButton;a.push(e(Mt,{props:{size:"sm",disabled:n,variant:this.closeButtonVariant},attrs:{"aria-label":d||null},on:{click:this.onCloseButton},key:"close-btn"},d))}a.length>0&&(a=[e("div",{staticClass:"b-form-date-controls d-flex flex-wrap",class:{"justify-content-between":a.length>1,"justify-content-end":a.length<2}},a)]);var l=e(Lf,{staticClass:"b-form-time-control",props:Tf(Tf({},Object(F["e"])(Hf,r)),{},{value:t,hidden:!this.isVisible}),on:{input:this.onInput,context:this.onContext},ref:"time"},a);return e(Kc,{staticClass:"b-form-timepicker",props:Tf(Tf({},Object(F["e"])($f,r)),{},{id:this.safeId(),value:t,formattedValue:t?this.formattedValue:"",placeholder:o,rtl:this.isRTL,lang:this.computedLang}),on:{show:this.onShow,shown:this.onShown,hidden:this.onHidden},scopedSlots:Df({},E["f"],this.$scopedSlots[E["f"]]||this.defaultButtonFn),ref:"control"},[l])}}),Bf=M({components:{BFormTimepicker:Ff,BTimepicker:Ff}}),Nf=M({components:{BImg:Fi,BImgLazy:mr}}),Rf=Object(F["d"])({tag:Object(F["c"])(C["u"],"div")},P["tb"]),zf=i["default"].extend({name:P["tb"],functional:!0,props:Rf,render:function(e,t){var n=t.props,i=t.data,r=t.children;return e(n.tag,Object(pe["a"])(i,{staticClass:"input-group-text"}),r)}}),Vf=Object(F["d"])({append:Object(F["c"])(C["g"],!1),id:Object(F["c"])(C["u"]),isText:Object(F["c"])(C["g"],!1),tag:Object(F["c"])(C["u"],"div")},P["qb"]),Wf=i["default"].extend({name:P["qb"],functional:!0,props:Vf,render:function(e,t){var n=t.props,i=t.data,r=t.children,o=n.append;return e(n.tag,Object(pe["a"])(i,{class:{"input-group-append":o,"input-group-prepend":!o},attrs:{id:n.id}}),n.isText?[e(zf,r)]:r)}});function Uf(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function Gf(e){for(var t=1;t0&&!n[0].text?n[0]:e()}}),Jh={container:Object(F["c"])([ha["c"],C["u"]],"body"),disabled:Object(F["c"])(C["g"],!1),tag:Object(F["c"])(C["u"],"div")},Kh=i["default"].extend({name:P["xc"],mixins:[B["a"]],props:Jh,watch:{disabled:{immediate:!0,handler:function(e){e?this.unmountTarget():this.$nextTick(this.mountTarget)}}},created:function(){this.$_defaultFn=null,this.$_target=null},beforeMount:function(){this.mountTarget()},updated:function(){this.updateTarget()},beforeDestroy:function(){this.unmountTarget(),this.$_defaultFn=null},methods:{getContainer:function(){if(r["i"]){var e=this.container;return Object(u["n"])(e)?Object(H["E"])(e):e}return null},mountTarget:function(){if(!this.$_target){var e=this.getContainer();if(e){var t=document.createElement("div");e.appendChild(t),this.$_target=new qh({el:t,parent:this,propsData:{nodes:Object(ut["b"])(this.normalizeSlot())}})}}},updateTarget:function(){if(r["i"]&&this.$_target){var e=this.$scopedSlots.default;this.disabled||(e&&this.$_defaultFn!==e?this.$_target.updatedNodes=e:e||(this.$_target.updatedNodes=this.$slots.default)),this.$_defaultFn=e}},unmountTarget:function(){this.$_target&&this.$_target.$destroy(),this.$_target=null}},render:function(e){if(this.disabled){var t=Object(ut["b"])(this.normalizeSlot()).filter(c["a"]);if(t.length>0&&!t[0].text)return t[0]}return e()}});function Xh(e){return Xh="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"===typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Xh(e)}function Zh(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function Qh(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:{};return tp(this,n),i=t.call(this,e,r),Object(f["d"])(dp(i),{trigger:Object(f["l"])()}),i}return ip(n,null,[{key:"Defaults",get:function(){return Qh(Qh({},rp(fp(n),"Defaults",this)),{},{trigger:null})}}]),n}(pa["a"]),pp=1040,mp=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",bp=".sticky-top",gp=".navbar-toggler",vp=i["default"].extend({data:function(){return{modals:[],baseZIndex:null,scrollbarWidth:null,isBodyOverflowing:!1}},computed:{modalCount:function(){return this.modals.length},modalsAreOpen:function(){return this.modalCount>0}},watch:{modalCount:function(e,t){r["i"]&&(this.getScrollbarWidth(),e>0&&0===t?(this.checkScrollbar(),this.setScrollbar(),Object(H["b"])(document.body,"modal-open")):0===e&&t>0&&(this.resetScrollbar(),Object(H["A"])(document.body,"modal-open")),Object(H["G"])(document.body,"data-modal-open-count",String(e)))},modals:function(e){var t=this;this.checkScrollbar(),Object(H["D"])((function(){t.updateModals(e||[])}))}},methods:{registerModal:function(e){var t=this;e&&-1===this.modals.indexOf(e)&&(this.modals.push(e),e.$once(Y["eb"],(function(){t.unregisterModal(e)})))},unregisterModal:function(e){var t=this.modals.indexOf(e);t>-1&&(this.modals.splice(t,1),e._isBeingDestroyed||e._isDestroyed||this.resetModal(e))},getBaseZIndex:function(){if(Object(u["g"])(this.baseZIndex)&&r["i"]){var e=document.createElement("div");Object(H["b"])(e,"modal-backdrop"),Object(H["b"])(e,"d-none"),Object(H["H"])(e,"display","none"),document.body.appendChild(e),this.baseZIndex=Object(I["c"])(Object(H["k"])(e).zIndex,pp),document.body.removeChild(e)}return this.baseZIndex||pp},getScrollbarWidth:function(){if(Object(u["g"])(this.scrollbarWidth)&&r["i"]){var e=document.createElement("div");Object(H["b"])(e,"modal-scrollbar-measure"),document.body.appendChild(e),this.scrollbarWidth=Object(H["i"])(e).width-e.clientWidth,document.body.removeChild(e)}return this.scrollbarWidth||0},updateModals:function(e){var t=this,n=this.getBaseZIndex(),i=this.getScrollbarWidth();e.forEach((function(e,r){e.zIndex=n+r,e.scrollbarWidth=i,e.isTop=r===t.modals.length-1,e.isBodyOverflowing=t.isBodyOverflowing}))},resetModal:function(e){e&&(e.zIndex=this.getBaseZIndex(),e.isTop=!0,e.isBodyOverflowing=!1)},checkScrollbar:function(){var e=Object(H["i"])(document.body),t=e.left,n=e.right;this.isBodyOverflowing=t+n0&&void 0!==arguments[0]&&arguments[0];this.$_observer&&this.$_observer.disconnect(),this.$_observer=null,e&&(this.$_observer=Ar(this.$refs.content,this.checkModalOverflow.bind(this),Hp))},updateModel:function(e){e!==this[xp]&&this.$emit(Lp,e)},buildEvent:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return new hp(e,Op(Op({cancelable:!1,target:this.$refs.modal||this.$el||null,relatedTarget:null,trigger:null},t),{},{vueTarget:this,componentId:this.modalId}))},show:function(){if(!this.isVisible&&!this.isOpening)if(this.isClosing)this.$once(Y["v"],this.show);else{this.isOpening=!0,this.$_returnFocus=this.$_returnFocus||this.getActiveElement();var e=this.buildEvent(Y["T"],{cancelable:!0});if(this.emitEvent(e),e.defaultPrevented||this.isVisible)return this.isOpening=!1,void this.updateModel(!1);this.doShow()}},hide:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";if(this.isVisible&&!this.isClosing){this.isClosing=!0;var t=this.buildEvent(Y["w"],{cancelable:e!==Dp,trigger:e||null});if(e===Cp?this.$emit(Y["D"],t):e===Pp?this.$emit(Y["c"],t):e===Yp&&this.$emit(Y["g"],t),this.emitEvent(t),t.defaultPrevented||!this.isVisible)return this.isClosing=!1,void this.updateModel(!0);this.setObserver(!1),this.isVisible=!1,this.updateModel(!1)}},toggle:function(e){e&&(this.$_returnFocus=e),this.isVisible?this.hide(Ap):this.show()},getActiveElement:function(){var e=Object(H["g"])(r["i"]?[document.body]:[]);return e&&e.focus?e:null},doShow:function(){var e=this;yp.modalsAreOpen&&this.noStacking?this.listenOnRootOnce(Object(dt["e"])(P["Bb"],Y["v"]),this.doShow):(yp.registerModal(this),this.isHidden=!1,this.$nextTick((function(){e.isVisible=!0,e.isOpening=!1,e.updateModel(!0),e.$nextTick((function(){e.setObserver(!0)}))})))},onBeforeEnter:function(){this.isTransitioning=!0,this.setResizeEvent(!0)},onEnter:function(){var e=this;this.isBlock=!0,Object(H["D"])((function(){Object(H["D"])((function(){e.isShow=!0}))}))},onAfterEnter:function(){var e=this;this.checkModalOverflow(),this.isTransitioning=!1,Object(H["D"])((function(){e.emitEvent(e.buildEvent(Y["U"])),e.setEnforceFocus(!0),e.$nextTick((function(){e.focusFirst()}))}))},onBeforeLeave:function(){this.isTransitioning=!0,this.setResizeEvent(!1),this.setEnforceFocus(!1)},onLeave:function(){this.isShow=!1},onAfterLeave:function(){var e=this;this.isBlock=!1,this.isTransitioning=!1,this.isModalOverflowing=!1,this.isHidden=!0,this.$nextTick((function(){e.isClosing=!1,yp.unregisterModal(e),e.returnFocusTo(),e.emitEvent(e.buildEvent(Y["v"]))}))},emitEvent:function(e){var t=e.type;this.emitOnRoot(Object(dt["e"])(P["Bb"],t),e,e.componentId),this.$emit(t,e)},onDialogMousedown:function(){var e=this,t=this.$refs.modal,n=function n(i){Object(dt["a"])(t,"mouseup",n,Y["cb"]),i.target===t&&(e.ignoreBackdropClick=!0)};Object(dt["b"])(t,"mouseup",n,Y["cb"])},onClickOut:function(e){this.ignoreBackdropClick?this.ignoreBackdropClick=!1:this.isVisible&&!this.noCloseOnBackdrop&&Object(H["f"])(document.body,e.target)&&(Object(H["f"])(this.$refs.content,e.target)||this.hide(Sp))},onOk:function(){this.hide(Cp)},onCancel:function(){this.hide(Pp)},onClose:function(){this.hide(Yp)},onEsc:function(e){e.keyCode===tt&&this.isVisible&&!this.noCloseOnEsc&&this.hide(Tp)},focusHandler:function(e){var t=this.$refs.content,n=e.target;if(!(this.noEnforceFocus||!this.isTop||!this.isVisible||!t||document===n||Object(H["f"])(t,n)||this.computeIgnoreEnforceFocusSelector&&Object(H["e"])(this.computeIgnoreEnforceFocusSelector,n,!0))){var i=Object(H["n"])(this.$refs.content),r=this.$refs["bottom-trap"],o=this.$refs["top-trap"];if(r&&n===r){if(Object(H["d"])(i[0]))return}else if(o&&n===o&&Object(H["d"])(i[i.length-1]))return;Object(H["d"])(t,{preventScroll:!0})}},setEnforceFocus:function(e){this.listenDocument(e,"focusin",this.focusHandler)},setResizeEvent:function(e){this.listenWindow(e,"resize",this.checkModalOverflow),this.listenWindow(e,"orientationchange",this.checkModalOverflow)},showHandler:function(e,t){e===this.modalId&&(this.$_returnFocus=t||this.getActiveElement(),this.show())},hideHandler:function(e){e===this.modalId&&this.hide("event")},toggleHandler:function(e,t){e===this.modalId&&this.toggle(t)},modalListener:function(e){this.noStacking&&e.vueTarget!==this&&this.hide()},focusFirst:function(){var e=this;r["i"]&&Object(H["D"])((function(){var t=e.$refs.modal,n=e.$refs.content,i=e.getActiveElement();if(t&&n&&(!i||!Object(H["f"])(n,i))){var r=e.$refs["ok-button"],o=e.$refs["cancel-button"],a=e.$refs["close-button"],s=e.autoFocusButton,c=s===Cp&&r?r.$el||r:s===Pp&&o?o.$el||o:s===Yp&&a?a.$el||a:n;Object(H["d"])(c),c===n&&e.$nextTick((function(){t.scrollTop=0}))}}))},returnFocusTo:function(){var e=this.returnFocus||this.$_returnFocus||null;this.$_returnFocus=null,this.$nextTick((function(){e=Object(u["n"])(e)?Object(H["E"])(e):e,e&&(e=e.$el||e,Object(H["d"])(e))}))},checkModalOverflow:function(){if(this.isVisible){var e=this.$refs.modal;this.isModalOverflowing=e.scrollHeight>document.documentElement.clientHeight}},makeModal:function(e){var t=e();if(!this.hideHeader){var n=this.normalizeSlot(E["J"],this.slotScope);if(!n){var i=e();this.hideHeaderClose||(i=e(N["a"],{props:{content:this.headerCloseContent,disabled:this.isTransitioning,ariaLabel:this.headerCloseLabel,textVariant:this.headerCloseVariant||this.headerTextVariant},on:{click:this.onClose},ref:"close-button"},[this.normalizeSlot(E["K"])])),n=[e(this.titleTag,{staticClass:"modal-title",class:this.titleClasses,attrs:{id:this.modalTitleId},domProps:this.hasNormalizedSlot(E["M"])?{}:qt(this.titleHtml,this.title)},this.normalizeSlot(E["M"],this.slotScope)),i]}t=e("header",{staticClass:"modal-header",class:this.headerClasses,attrs:{id:this.modalHeaderId},ref:"header"},[n])}var r=e("div",{staticClass:"modal-body",class:this.bodyClasses,attrs:{id:this.modalBodyId},ref:"body"},this.normalizeSlot(E["i"],this.slotScope)),o=e();if(!this.hideFooter){var a=this.normalizeSlot(E["I"],this.slotScope);if(!a){var s=e();this.okOnly||(s=e(Mt,{props:{variant:this.cancelVariant,size:this.buttonSize,disabled:this.cancelDisabled||this.busy||this.isTransitioning},domProps:this.hasNormalizedSlot(E["H"])?{}:qt(this.cancelTitleHtml,this.cancelTitle),on:{click:this.onCancel},ref:"cancel-button"},this.normalizeSlot(E["H"])));var c=e(Mt,{props:{variant:this.okVariant,size:this.buttonSize,disabled:this.okDisabled||this.busy||this.isTransitioning},domProps:this.hasNormalizedSlot(E["L"])?{}:qt(this.okTitleHtml,this.okTitle),on:{click:this.onOk},ref:"ok-button"},this.normalizeSlot(E["L"]));a=[s,c]}o=e("footer",{staticClass:"modal-footer",class:this.footerClasses,attrs:{id:this.modalFooterId},ref:"footer"},[a])}var u=e("div",{staticClass:"modal-content",class:this.contentClass,attrs:{id:this.modalContentId,tabindex:"-1"},ref:"content"},[t,r,o]),d=e(),l=e();this.isVisible&&!this.noEnforceFocus&&(d=e("span",{attrs:{tabindex:"0"},ref:"top-trap"}),l=e("span",{attrs:{tabindex:"0"},ref:"bottom-trap"}));var f=e("div",{staticClass:"modal-dialog",class:this.dialogClasses,on:{mousedown:this.onDialogMousedown},ref:"dialog"},[d,u,l]),h=e("div",{staticClass:"modal",class:this.modalClasses,style:this.modalStyles,attrs:this.computedModalAttrs,on:{keydown:this.onEsc,click:this.onClickOut},directives:[{name:"show",value:this.isVisible}],ref:"modal"},[f]);h=e("transition",{props:{enterClass:"",enterToClass:"",enterActiveClass:"",leaveClass:"",leaveActiveClass:"",leaveToClass:""},on:{beforeEnter:this.onBeforeEnter,enter:this.onEnter,afterEnter:this.onAfterEnter,beforeLeave:this.onBeforeLeave,leave:this.onLeave,afterLeave:this.onAfterLeave}},[h]);var p=e();return!this.hideBackdrop&&this.isVisible&&(p=e("div",{staticClass:"modal-backdrop",attrs:{id:this.modalBackdropId}},this.normalizeSlot(E["G"]))),p=e(R["a"],{props:{noFade:this.noFade}},[p]),e("div",{style:this.modalOuterStyle,attrs:this.computedAttrs,key:"modal-outer-".concat(this[A["a"]])},[h,p])}},render:function(e){return this.static?this.lazy&&this.isHidden?e():this.makeModal(e):this.isHidden?e():e(Kh,[this.makeModal(e)])}}),Fp=Object(dt["d"])(P["Bb"],Y["T"]),Bp="__bv_modal_directive__",Np=function(e){var t=e.modifiers,n=void 0===t?{}:t,i=e.arg,r=e.value;return Object(u["n"])(r)?r:Object(u["n"])(i)?i:Object(f["h"])(n).reverse()[0]},Rp=function(e){return e&&Object(H["v"])(e,".dropdown-menu > li, li.nav-item")&&Object(H["E"])("a, button",e)||e},zp=function(e){e&&"BUTTON"!==e.tagName&&(Object(H["o"])(e,"role")||Object(H["G"])(e,"role","button"),"A"===e.tagName||Object(H["o"])(e,"tabindex")||Object(H["G"])(e,"tabindex","0"))},Vp=function(e,t,n){var i=Np(t),r=Rp(e);if(i&&r){var o=function(e){var t=e.currentTarget;if(!Object(H["r"])(t)){var r=e.type,o=e.keyCode;"click"!==r&&("keydown"!==r||o!==et&&o!==st)||n.context.$root.$emit(Fp,i,t)}};e[Bp]={handler:o,target:i,trigger:r},zp(r),Object(dt["b"])(r,"click",o,Y["db"]),"BUTTON"!==r.tagName&&"button"===Object(H["h"])(r,"role")&&Object(dt["b"])(r,"keydown",o,Y["db"])}},Wp=function(e){var t=e[Bp]||{},n=t.trigger,i=t.handler;n&&i&&(Object(dt["a"])(n,"click",i,Y["db"]),Object(dt["a"])(n,"keydown",i,Y["db"]),Object(dt["a"])(e,"click",i,Y["db"]),Object(dt["a"])(e,"keydown",i,Y["db"])),delete e[Bp]},Up=function(e,t,n){var i=e[Bp]||{},r=Np(t),o=Rp(e);r===i.target&&o===i.trigger||(Wp(e,t,n),Vp(e,t,n)),zp(o)},Gp=function(){},qp={inserted:Up,updated:Gp,componentUpdated:Up,unbind:Wp};function Jp(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Kp(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,i=new Array(t);n2&&void 0!==arguments[2]?arguments[2]:dm;if(!Object(h["d"])(sm)&&!Object(h["c"])(sm)){var r=new t({parent:e,propsData:Qp(Qp(Qp({},fm(Object(Lu["c"])(P["Bb"]))),{},{hideHeaderClose:!0,hideHeader:!(n.title||n.titleHtml)},Object(f["j"])(n,Object(f["h"])(lm))),{},{lazy:!1,busy:!1,visible:!1,noStacking:!1,noEnforceFocus:!1})});return Object(f["h"])(lm).forEach((function(e){Object(u["o"])(n[e])||(r.$slots[lm[e]]=Object(ut["b"])(n[e]))})),new Promise((function(e,t){var n=!1;r.$once(Y["fb"],(function(){n||t(new Error("BootstrapVue MsgBox destroyed before resolve"))})),r.$on(Y["w"],(function(t){if(!t.defaultPrevented){var r=i(t);t.defaultPrevented||(n=!0,e(r))}}));var o=document.createElement("div");document.body.appendChild(o),r.$mount(o)}))}},i=function(e,t){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;if(t&&!Object(h["c"])(sm)&&!Object(h["d"])(sm)&&Object(u["f"])(r))return n(e,Qp(Qp({},fm(i)),{},{msgBoxContent:t}),r)},r=function(){function e(t){Jp(this,e),Object(f["a"])(this,{_vm:t,_root:t.$root}),Object(f["d"])(this,{_vm:Object(f["l"])(),_root:Object(f["l"])()})}return Xp(e,[{key:"show",value:function(e){if(e&&this._root){for(var t,n=arguments.length,i=new Array(n>1?n-1:0),r=1;r1?n-1:0),r=1;r1&&void 0!==arguments[1]?arguments[1]:{},n=Qp(Qp({},t),{},{okOnly:!0,okDisabled:!1,hideFooter:!1,msgBoxContent:e});return i(this._vm,e,n,(function(){return!0}))}},{key:"msgBoxConfirm",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=Qp(Qp({},t),{},{okOnly:!1,okDisabled:!1,cancelDisabled:!1,hideFooter:!1});return i(this._vm,e,n,(function(e){var t=e.trigger;return"ok"===t||"cancel"!==t&&null}))}}]),e}();e.mixin({beforeCreate:function(){this[cm]=new r(this)}}),Object(f["g"])(e.prototype,sm)||Object(f["e"])(e.prototype,sm,{get:function(){return this&&this[cm]||Object(h["a"])('"'.concat(sm,'" must be accessed from a Vue instance "this" context.'),P["Bb"]),this[cm]}})},pm=M({plugins:{plugin:hm}}),mm=M({components:{BModal:Ip},directives:{VBModal:qp},plugins:{BVModalPlugin:pm}});function bm(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var gm=function(e){return e="left"===e?"start":"right"===e?"end":e,"justify-content-".concat(e)},vm=Object(F["d"])({align:Object(F["c"])(C["u"]),cardHeader:Object(F["c"])(C["g"],!1),fill:Object(F["c"])(C["g"],!1),justified:Object(F["c"])(C["g"],!1),pills:Object(F["c"])(C["g"],!1),small:Object(F["c"])(C["g"],!1),tabs:Object(F["c"])(C["g"],!1),tag:Object(F["c"])(C["u"],"ul"),vertical:Object(F["c"])(C["g"],!1)},P["Db"]),ym=i["default"].extend({name:P["Db"],functional:!0,props:vm,render:function(e,t){var n,i=t.props,r=t.data,o=t.children,a=i.tabs,s=i.pills,c=i.vertical,u=i.align,d=i.cardHeader;return e(i.tag,Object(pe["a"])(r,{staticClass:"nav",class:(n={"nav-tabs":a,"nav-pills":s&&!a,"card-header-tabs":!c&&d&&a,"card-header-pills":!c&&d&&s&&!a,"flex-column":c,"nav-fill":!c&&i.fill,"nav-justified":!c&&i.justified},bm(n,gm(u),!c&&u),bm(n,"small",i.small),n)}),o)}});function _m(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function Om(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,i=new Array(t);n=0&&t<=1})),overlayTag:Object(F["c"])(C["u"],"div"),rounded:Object(F["c"])(C["j"],!1),show:Object(F["c"])(C["g"],!1),spinnerSmall:Object(F["c"])(C["g"],!1),spinnerType:Object(F["c"])(C["u"],"border"),spinnerVariant:Object(F["c"])(C["u"]),variant:Object(F["c"])(C["u"],"light"),wrapTag:Object(F["c"])(C["u"],"div"),zIndex:Object(F["c"])(C["p"],10)},P["Mb"]),_b=i["default"].extend({name:P["Mb"],mixins:[B["a"]],props:yb,computed:{computedRounded:function(){var e=this.rounded;return!0===e||""===e?"rounded":e?"rounded-".concat(e):""},computedVariant:function(){var e=this.variant;return e&&!this.bgColor?"bg-".concat(e):""},slotScope:function(){return{spinnerType:this.spinnerType||null,spinnerVariant:this.spinnerVariant||null,spinnerSmall:this.spinnerSmall}}},methods:{defaultOverlayFn:function(e){var t=e.spinnerType,n=e.spinnerVariant,i=e.spinnerSmall;return this.$createElement(hb,{props:{type:t,variant:n,small:i}})}},render:function(e){var t=this,n=this.show,i=this.fixed,r=this.noFade,o=this.noWrap,a=this.slotScope,s=e();if(n){var c=e("div",{staticClass:"position-absolute",class:[this.computedVariant,this.computedRounded],style:mb(mb({},vb),{},{opacity:this.opacity,backgroundColor:this.bgColor||null,backdropFilter:this.blur?"blur(".concat(this.blur,")"):null})}),u=e("div",{staticClass:"position-absolute",style:this.noCenter?mb({},vb):{top:"50%",left:"50%",transform:"translateX(-50%) translateY(-50%)"}},[this.normalizeSlot(E["V"],a)||this.defaultOverlayFn(a)]);s=e(this.overlayTag,{staticClass:"b-overlay",class:{"position-absolute":!o||o&&!i,"position-fixed":o&&i},style:mb(mb({},vb),{},{zIndex:this.zIndex||10}),on:{click:function(e){return t.$emit(Y["f"],e)}},key:"overlay"},[c,u])}return s=e(R["a"],{props:{noFade:r,appear:!0},on:{"after-enter":function(){return t.$emit(Y["U"])},"after-leave":function(){return t.$emit(Y["v"])}}},[s]),o?s:e(this.wrapTag,{staticClass:"b-overlay-wrap position-relative",attrs:{"aria-busy":n?"true":null}},o?[s]:[this.normalizeSlot(),s])}}),Ob=M({components:{BOverlay:_b}});function jb(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function wb(e){for(var t=1;tt?t:n<1?1:n},Eb=function(e){if(e.keyCode===st)return Object(dt["f"])(e,{immediatePropagation:!0}),e.currentTarget.click(),!1},Hb=Object(F["d"])(Object(f["m"])(wb(wb({},Lb),{},{align:Object(F["c"])(C["u"],"left"),ariaLabel:Object(F["c"])(C["u"],"Pagination"),disabled:Object(F["c"])(C["g"],!1),ellipsisClass:Object(F["c"])(C["e"]),ellipsisText:Object(F["c"])(C["u"],"…"),firstClass:Object(F["c"])(C["e"]),firstNumber:Object(F["c"])(C["g"],!1),firstText:Object(F["c"])(C["u"],"«"),hideEllipsis:Object(F["c"])(C["g"],!1),hideGotoEndButtons:Object(F["c"])(C["g"],!1),labelFirstPage:Object(F["c"])(C["u"],"Go to first page"),labelLastPage:Object(F["c"])(C["u"],"Go to last page"),labelNextPage:Object(F["c"])(C["u"],"Go to next page"),labelPage:Object(F["c"])(C["m"],"Go to page"),labelPrevPage:Object(F["c"])(C["u"],"Go to previous page"),lastClass:Object(F["c"])(C["e"]),lastNumber:Object(F["c"])(C["g"],!1),lastText:Object(F["c"])(C["u"],"»"),limit:Object(F["c"])(C["p"],Ab,(function(e){return!(Object(I["c"])(e,0)<1)||(Object(h["a"])('Prop "limit" must be a number greater than "0"',P["Nb"]),!1)})),nextClass:Object(F["c"])(C["e"]),nextText:Object(F["c"])(C["u"],"›"),pageClass:Object(F["c"])(C["e"]),pills:Object(F["c"])(C["g"],!1),prevClass:Object(F["c"])(C["e"]),prevText:Object(F["c"])(C["u"],"‹"),size:Object(F["c"])(C["u"])})),"pagination"),$b=i["default"].extend({mixins:[xb,B["a"]],props:Hb,data:function(){var e=Object(I["c"])(this[Sb],0);return e=e>0?e:-1,{currentPage:e,localNumberOfPages:1,localLimit:Ab}},computed:{btnSize:function(){var e=this.size;return e?"pagination-".concat(e):""},alignment:function(){var e=this.align;return"center"===e?"justify-content-center":"end"===e||"right"===e?"justify-content-end":"fill"===e?"text-center":""},styleClass:function(){return this.pills?"b-pagination-pills":""},computedCurrentPage:function(){return Cb(this.currentPage,this.localNumberOfPages)},paginationParams:function(){var e=this.localLimit,t=this.localNumberOfPages,n=this.computedCurrentPage,i=this.hideEllipsis,r=this.firstNumber,o=this.lastNumber,a=!1,s=!1,c=e,u=1;t<=e?c=t:nDb?(i&&!o||(s=!0,c=e-(r?0:1)),c=Object(ne["e"])(c,e)):t-n+2Db?(i&&!r||(a=!0,c=e-(o?0:1)),u=t-c+1):(e>Db&&(c=e-(i?0:2),a=!(i&&!r),s=!(i&&!o)),u=n-Object(ne["c"])(c/2)),u<1?(u=1,a=!1):u>t-c&&(u=t-c+1,s=!1),a&&r&&u<4&&(c+=2,u=1,a=!1);var d=u+c-1;return s&&o&&d>t-3&&(c+=d===t-2?2:3,s=!1),e<=Db&&(r&&1===u?c=Object(ne["e"])(c+1,t,e+1):o&&t===u+c-1&&(u=Object(ne["d"])(u-1,1),c=Object(ne["e"])(t-u+1,t,e+1))),c=Object(ne["e"])(c,t-u+1),{showFirstDots:a,showLastDots:s,numberOfLinks:c,startNumber:u}},pageList:function(){var e=this.paginationParams,t=e.numberOfLinks,n=e.startNumber,i=this.computedCurrentPage,r=Pb(n,t);if(r.length>3){var o=i-n,a="bv-d-xs-down-none";if(0===o)for(var s=3;so+1;d--)r[d].classes=a}}return r}},watch:(gb={},kb(gb,Sb,(function(e,t){e!==t&&(this.currentPage=Cb(e,this.localNumberOfPages))})),kb(gb,"currentPage",(function(e,t){e!==t&&this.$emit(Tb,e>0?e:null)})),kb(gb,"limit",(function(e,t){e!==t&&(this.localLimit=Yb(e))})),gb),created:function(){var e=this;this.localLimit=Yb(this.limit),this.$nextTick((function(){e.currentPage=e.currentPage>e.localNumberOfPages?e.localNumberOfPages:e.currentPage}))},methods:{handleKeyNav:function(e){var t=e.keyCode,n=e.shiftKey;this.isNav||(t===it||t===ct?(Object(dt["f"])(e,{propagation:!1}),n?this.focusFirst():this.focusPrev()):t!==at&&t!==Ze||(Object(dt["f"])(e,{propagation:!1}),n?this.focusLast():this.focusNext()))},getButtons:function(){return Object(H["F"])("button.page-link, a.page-link",this.$el).filter((function(e){return Object(H["u"])(e)}))},focusCurrent:function(){var e=this;this.$nextTick((function(){var t=e.getButtons().find((function(t){return Object(I["c"])(Object(H["h"])(t,"aria-posinset"),0)===e.computedCurrentPage}));Object(H["d"])(t)||e.focusFirst()}))},focusFirst:function(){var e=this;this.$nextTick((function(){var t=e.getButtons().find((function(e){return!Object(H["r"])(e)}));Object(H["d"])(t)}))},focusLast:function(){var e=this;this.$nextTick((function(){var t=e.getButtons().reverse().find((function(e){return!Object(H["r"])(e)}));Object(H["d"])(t)}))},focusPrev:function(){var e=this;this.$nextTick((function(){var t=e.getButtons(),n=t.indexOf(Object(H["g"])());n>0&&!Object(H["r"])(t[n-1])&&Object(H["d"])(t[n-1])}))},focusNext:function(){var e=this;this.$nextTick((function(){var t=e.getButtons(),n=t.indexOf(Object(H["g"])());na,p=i<1?1:i>a?a:i,g={disabled:f,page:p,index:p-1},v=t.normalizeSlot(s,g)||Object(me["g"])(c)||e(),y=e(f?"span":o?lt["a"]:"button",{staticClass:"page-link",class:{"flex-grow-1":!o&&!f&&h},props:f||!o?{}:t.linkProps(i),attrs:{role:o?null:"menuitem",type:o||f?null:"button",tabindex:f||o?null:"-1","aria-label":r,"aria-controls":t.ariaControls||null,"aria-disabled":f?"true":null},on:f?{}:{"!click":function(e){t.onClick(e,i)},keydown:Eb}},[v]);return e("li",{key:l,staticClass:"page-item",class:[{disabled:f,"flex-fill":h,"d-flex":h&&!o&&!f},u],attrs:{role:o?null:"presentation","aria-hidden":f?"true":null}},[y])},v=function(n){return e("li",{staticClass:"page-item",class:["disabled","bv-d-xs-down-none",h?"flex-fill":"",t.ellipsisClass],attrs:{role:"separator"},key:"ellipsis-".concat(n?"last":"first")},[e("span",{staticClass:"page-link"},[t.normalizeSlot(E["m"])||Object(me["g"])(t.ellipsisText)||e()])])},y=function(r,s){var c=r.number,d=m(c)&&!b,l=n?null:d||b&&0===s?"0":"-1",f={role:o?null:"menuitemradio",type:o||n?null:"button","aria-disabled":n?"true":null,"aria-controls":t.ariaControls||null,"aria-label":Object(F["b"])(i)?i(c):"".concat(Object(u["f"])(i)?i():i," ").concat(c),"aria-checked":o?null:d?"true":"false","aria-current":o&&d?"page":null,"aria-posinset":o?null:c,"aria-setsize":o?null:a,tabindex:o?null:l},p=Object(me["g"])(t.makePage(c)),g={page:c,index:c-1,content:p,active:d,disabled:n},v=e(n?"span":o?lt["a"]:"button",{props:n||!o?{}:t.linkProps(c),staticClass:"page-link",class:{"flex-grow-1":!o&&!n&&h},attrs:f,on:n?{}:{"!click":function(e){t.onClick(e,c)},keydown:Eb}},[t.normalizeSlot(E["W"],g)||p]);return e("li",{staticClass:"page-item",class:[{disabled:n,active:d,"flex-fill":h,"d-flex":h&&!o&&!n},r.classes,t.pageClass],attrs:{role:o?null:"presentation"},key:"page-".concat(c)},[v])},_=e();this.firstNumber||this.hideGotoEndButtons||(_=g(1,this.labelFirstPage,E["r"],this.firstText,this.firstClass,1,"pagination-goto-first")),p.push(_),p.push(g(s-1,this.labelPrevPage,E["Z"],this.prevText,this.prevClass,1,"pagination-goto-prev")),p.push(this.firstNumber&&1!==c[0]?y({number:1},0):e()),p.push(l?v(!1):e()),this.pageList.forEach((function(e,n){var i=l&&t.firstNumber&&1!==c[0]?1:0;p.push(y(e,n+i))})),p.push(f?v(!0):e()),p.push(this.lastNumber&&c[c.length-1]!==a?y({number:a},-1):e()),p.push(g(s+1,this.labelNextPage,E["U"],this.nextText,this.nextClass,a,"pagination-goto-next"));var O=e();this.lastNumber||this.hideGotoEndButtons||(O=g(a,this.labelLastPage,E["D"],this.lastText,this.lastClass,a,"pagination-goto-last")),p.push(O);var j=e("ul",{staticClass:"pagination",class:["b-pagination",this.btnSize,this.alignment,this.styleClass],attrs:{role:o?null:"menubar","aria-disabled":n?"true":"false","aria-label":o?null:r||null},on:o?{}:{keydown:this.handleKeyNav},ref:"ul"},p);return o?e("nav",{attrs:{"aria-disabled":n?"true":null,"aria-hidden":n?"true":"false","aria-label":o&&r||null}},[j]):j}});function Ib(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function Fb(e){for(var t=1;te.numberOfPages)&&(this.currentPage=1),this.localNumberOfPages=e.numberOfPages}},created:function(){var e=this;this.localNumberOfPages=this.numberOfPages;var t=Object(I["c"])(this[Sb],0);t>0?this.currentPage=t:this.$nextTick((function(){e.currentPage=0}))},methods:{onClick:function(e,t){var n=this;if(t!==this.currentPage){var i=e.target,r=new pa["a"](Y["F"],{cancelable:!0,vueTarget:this,target:i});this.$emit(r.type,r,t),r.defaultPrevented||(this.currentPage=t,this.$emit(Y["d"],this.currentPage),this.$nextTick((function(){Object(H["u"])(i)&&n.$el.contains(i)?Object(H["d"])(i):n.focusCurrent()})))}},makePage:function(e){return e},linkProps:function(){return{}}}}),Gb=M({components:{BPagination:Ub}});function qb(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function Jb(e){for(var t=1;t0?this.localNumberOfPages=this.pages.length:this.localNumberOfPages=Xb(this.numberOfPages),this.$nextTick((function(){e.guessCurrentPage()}))},onClick:function(e,t){var n=this;if(t!==this.currentPage){var i=e.currentTarget||e.target,r=new pa["a"](Y["F"],{cancelable:!0,vueTarget:this,target:i});this.$emit(r.type,r,t),r.defaultPrevented||(Object(H["D"])((function(){n.currentPage=t,n.$emit(Y["d"],t)})),this.$nextTick((function(){Object(H["c"])(i)})))}},getPageInfo:function(e){if(!Object(u["a"])(this.pages)||0===this.pages.length||Object(u["o"])(this.pages[e-1])){var t="".concat(this.baseUrl).concat(e);return{link:this.useRouter?{path:t}:t,text:Object(me["g"])(e)}}var n=this.pages[e-1];if(Object(u["j"])(n)){var i=n.link;return{link:Object(u["j"])(i)?i:this.useRouter?{path:i}:i,text:Object(me["g"])(n.text||e)}}return{link:Object(me["g"])(n),text:Object(me["g"])(e)}},makePage:function(e){var t=this.pageGen,n=this.getPageInfo(e);return Object(F["b"])(t)?t(e,n):n.text},makeLink:function(e){var t=this.linkGen,n=this.getPageInfo(e);return Object(F["b"])(t)?t(e,n):n.link},linkProps:function(e){var t=Object(F["e"])(Zb,this),n=this.makeLink(e);return this.useRouter||Object(u["j"])(n)?t.to=n:t.href=n,t},resolveLink:function(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";try{e=document.createElement("a"),e.href=Object(he["a"])({to:t},"a","/","/"),document.body.appendChild(e);var n=e,i=n.pathname,r=n.hash,o=n.search;return document.body.removeChild(e),{path:i,hash:r,query:Object(he["f"])(o)}}catch(a){try{e&&e.parentNode&&e.parentNode.removeChild(e)}catch(s){}return{}}},resolveRoute:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";try{var t=this.$router.resolve(e,this.$route).route;return{path:t.path,hash:t.hash,query:t.query}}catch(n){return{}}},guessCurrentPage:function(){var e=this.$router,t=this.$route,n=this.computedValue;if(!this.noPageDetect&&!n&&(r["i"]||!r["i"]&&e))for(var i=e&&t?{path:t.path,hash:t.hash,query:t.query}:{},o=r["i"]?window.location||document.location:null,a=o?{path:o.pathname,hash:o.hash,query:Object(he["f"])(o.search)}:{},s=1;!n&&s<=this.localNumberOfPages;s++){var c=this.makeLink(s);n=e&&(Object(u["j"])(c)||this.useRouter)?Object(ei["a"])(this.resolveRoute(c),i)?s:null:r["i"]?Object(ei["a"])(this.resolveLink(c),a)?s:null:-1}this.currentPage=n>0?n:0}}}),tg=M({components:{BPaginationNav:eg}}),ng=n("be29"),ig={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left",TOPLEFT:"top",TOPRIGHT:"top",RIGHTTOP:"right",RIGHTBOTTOM:"right",BOTTOMLEFT:"bottom",BOTTOMRIGHT:"bottom",LEFTTOP:"left",LEFTBOTTOM:"left"},rg={AUTO:0,TOPLEFT:-1,TOP:0,TOPRIGHT:1,RIGHTTOP:-1,RIGHT:0,RIGHTBOTTOM:1,BOTTOMLEFT:-1,BOTTOM:0,BOTTOMRIGHT:1,LEFTTOP:-1,LEFT:0,LEFTBOTTOM:1},og={arrowPadding:Object(F["c"])(C["p"],6),boundary:Object(F["c"])([ha["c"],C["u"]],"scrollParent"),boundaryPadding:Object(F["c"])(C["p"],5),fallbackPlacement:Object(F["c"])(C["f"],"flip"),offset:Object(F["c"])(C["p"],0),placement:Object(F["c"])(C["u"],"top"),target:Object(F["c"])([ha["c"],ha["d"]])},ag=i["default"].extend({name:P["Sb"],props:og,data:function(){return{noFade:!1,localShow:!0,attachment:this.getAttachment(this.placement)}},computed:{templateType:function(){return"unknown"},popperConfig:function(){var e=this,t=this.placement;return{placement:this.getAttachment(t),modifiers:{offset:{offset:this.getOffset(t)},flip:{behavior:this.fallbackPlacement},arrow:{element:".arrow"},preventOverflow:{padding:this.boundaryPadding,boundariesElement:this.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e.popperPlacementChange(t)},onUpdate:function(t){e.popperPlacementChange(t)}}}},created:function(){var e=this;this.$_popper=null,this.localShow=!0,this.$on(Y["T"],(function(t){e.popperCreate(t)}));var t=function(){e.$nextTick((function(){Object(H["D"])((function(){e.$destroy()}))}))};this.$parent.$once(Y["fb"],t),this.$once(Y["v"],t)},beforeMount:function(){this.attachment=this.getAttachment(this.placement)},updated:function(){this.updatePopper()},beforeDestroy:function(){this.destroyPopper()},destroyed:function(){var e=this.$el;e&&e.parentNode&&e.parentNode.removeChild(e)},methods:{hide:function(){this.localShow=!1},getAttachment:function(e){return ig[String(e).toUpperCase()]||"auto"},getOffset:function(e){if(!this.offset){var t=this.$refs.arrow||Object(H["E"])(".arrow",this.$el),n=Object(I["b"])(Object(H["k"])(t).width,0)+Object(I["b"])(this.arrowPadding,0);switch(rg[String(e).toUpperCase()]||0){case 1:return"+50%p - ".concat(n,"px");case-1:return"-50%p + ".concat(n,"px");default:return 0}}return this.offset},popperCreate:function(e){this.destroyPopper(),this.$_popper=new aa["a"](this.target,e,this.popperConfig)},destroyPopper:function(){this.$_popper&&this.$_popper.destroy(),this.$_popper=null},updatePopper:function(){this.$_popper&&this.$_popper.scheduleUpdate()},popperPlacementChange:function(e){this.attachment=this.getAttachment(e.placement)},renderTemplate:function(e){return e("div")}},render:function(e){var t=this,n=this.noFade;return e(R["a"],{props:{appear:!0,noFade:n},on:{beforeEnter:function(e){return t.$emit(Y["T"],e)},afterEnter:function(e){return t.$emit(Y["U"],e)},beforeLeave:function(e){return t.$emit(Y["w"],e)},afterLeave:function(e){return t.$emit(Y["v"],e)}}},[this.localShow?this.renderTemplate(e):e()])}});function sg(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function cg(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:{},n=!1;Object(f["h"])(kg).forEach((function(i){Object(u["o"])(t[i])||e[i]===t[i]||(e[i]=t[i],"title"===i&&(n=!0))})),n&&this.localShow&&this.fixTitle()},createTemplateAndShow:function(){var e=this.getContainer(),t=this.getTemplate(),n=this.$_tip=new t({parent:this,propsData:{id:this.computedId,html:this.html,placement:this.placement,fallbackPlacement:this.fallbackPlacement,target:this.getPlacementTarget(),boundary:this.getBoundary(),offset:Object(I["c"])(this.offset,0),arrowPadding:Object(I["c"])(this.arrowPadding,0),boundaryPadding:Object(I["c"])(this.boundaryPadding,0)}});this.handleTemplateUpdate(),n.$once(Y["T"],this.onTemplateShow),n.$once(Y["U"],this.onTemplateShown),n.$once(Y["w"],this.onTemplateHide),n.$once(Y["v"],this.onTemplateHidden),n.$once(Y["fb"],this.destroyTemplate),n.$on(Y["s"],this.handleEvent),n.$on(Y["t"],this.handleEvent),n.$on(Y["A"],this.handleEvent),n.$on(Y["B"],this.handleEvent),n.$mount(e.appendChild(document.createElement("div")))},hideTemplate:function(){this.$_tip&&this.$_tip.hide(),this.clearActiveTriggers(),this.$_hoverState=""},destroyTemplate:function(){this.setWhileOpenListeners(!1),this.clearHoverTimeout(),this.$_hoverState="",this.clearActiveTriggers(),this.localPlacementTarget=null;try{this.$_tip.$destroy()}catch(e){}this.$_tip=null,this.removeAriaDescribedby(),this.restoreTitle(),this.localShow=!1},getTemplateElement:function(){return this.$_tip?this.$_tip.$el:null},handleTemplateUpdate:function(){var e=this,t=this.$_tip;if(t){var n=["title","content","variant","customClass","noFade","interactive"];n.forEach((function(n){t[n]!==e[n]&&(t[n]=e[n])}))}},show:function(){var e=this.getTarget();if(e&&Object(H["f"])(document.body,e)&&Object(H["u"])(e)&&!this.dropdownOpen()&&(!Object(u["p"])(this.title)&&""!==this.title||!Object(u["p"])(this.content)&&""!==this.content)&&!this.$_tip&&!this.localShow){this.localShow=!0;var t=this.buildEvent(Y["T"],{cancelable:!0});this.emitEvent(t),t.defaultPrevented?this.destroyTemplate():(this.fixTitle(),this.addAriaDescribedby(),this.createTemplateAndShow())}},hide:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=this.getTemplateElement();if(t&&this.localShow){var n=this.buildEvent(Y["w"],{cancelable:!e});this.emitEvent(n),n.defaultPrevented||this.hideTemplate()}else this.restoreTitle()},forceHide:function(){var e=this.getTemplateElement();e&&this.localShow&&(this.setWhileOpenListeners(!1),this.clearHoverTimeout(),this.$_hoverState="",this.clearActiveTriggers(),this.$_tip&&(this.$_tip.noFade=!0),this.hide(!0))},enable:function(){this.$_enabled=!0,this.emitEvent(this.buildEvent(Y["p"]))},disable:function(){this.$_enabled=!1,this.emitEvent(this.buildEvent(Y["l"]))},onTemplateShow:function(){this.setWhileOpenListeners(!0)},onTemplateShown:function(){var e=this.$_hoverState;this.$_hoverState="","out"===e&&this.leave(null),this.emitEvent(this.buildEvent(Y["U"]))},onTemplateHide:function(){this.setWhileOpenListeners(!1)},onTemplateHidden:function(){this.destroyTemplate(),this.emitEvent(this.buildEvent(Y["v"]))},getTarget:function(){var e=this.target;return Object(u["n"])(e)?e=Object(H["j"])(e.replace(/^#/,"")):Object(u["f"])(e)?e=e():e&&(e=e.$el||e),Object(H["s"])(e)?e:null},getPlacementTarget:function(){return this.getTarget()},getTargetId:function(){var e=this.getTarget();return e&&e.id?e.id:null},getContainer:function(){var e=!!this.container&&(this.container.$el||this.container),t=document.body,n=this.getTarget();return!1===e?Object(H["e"])(_g,n)||t:Object(u["n"])(e)&&Object(H["j"])(e.replace(/^#/,""))||t},getBoundary:function(){return this.boundary?this.boundary.$el||this.boundary:"scrollParent"},isInModal:function(){var e=this.getTarget();return e&&Object(H["e"])(gg,e)},isDropdown:function(){var e=this.getTarget();return e&&Object(H["p"])(e,Og)},dropdownOpen:function(){var e=this.getTarget();return this.isDropdown()&&e&&Object(H["E"])(jg,e)},clearHoverTimeout:function(){clearTimeout(this.$_hoverTimeout),this.$_hoverTimeout=null},clearVisibilityInterval:function(){clearInterval(this.$_visibleInterval),this.$_visibleInterval=null},clearActiveTriggers:function(){for(var e in this.activeTrigger)this.activeTrigger[e]=!1},addAriaDescribedby:function(){var e=this.getTarget(),t=Object(H["h"])(e,"aria-describedby")||"";t=t.split(/\s+/).concat(this.computedId).join(" ").trim(),Object(H["G"])(e,"aria-describedby",t)},removeAriaDescribedby:function(){var e=this,t=this.getTarget(),n=Object(H["h"])(t,"aria-describedby")||"";n=n.split(/\s+/).filter((function(t){return t!==e.computedId})).join(" ").trim(),n?Object(H["G"])(t,"aria-describedby",n):Object(H["z"])(t,"aria-describedby")},fixTitle:function(){var e=this.getTarget();if(Object(H["o"])(e,"title")){var t=Object(H["h"])(e,"title");Object(H["G"])(e,"title",""),t&&Object(H["G"])(e,wg,t)}},restoreTitle:function(){var e=this.getTarget();if(Object(H["o"])(e,wg)){var t=Object(H["h"])(e,wg);Object(H["z"])(e,wg),t&&Object(H["G"])(e,"title",t)}},buildEvent:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return new pa["a"](e,hg({cancelable:!1,target:this.getTarget(),relatedTarget:this.getTemplateElement()||null,componentId:this.computedId,vueTarget:this},t))},emitEvent:function(e){var t=e.type;this.emitOnRoot(Object(dt["e"])(this.templateType,t),e),this.$emit(t,e)},listen:function(){var e=this,t=this.getTarget();t&&(this.setRootListener(!0),this.computedTriggers.forEach((function(n){"click"===n?Object(dt["b"])(t,"click",e.handleEvent,Y["cb"]):"focus"===n?(Object(dt["b"])(t,"focusin",e.handleEvent,Y["cb"]),Object(dt["b"])(t,"focusout",e.handleEvent,Y["cb"])):"blur"===n?Object(dt["b"])(t,"focusout",e.handleEvent,Y["cb"]):"hover"===n&&(Object(dt["b"])(t,"mouseenter",e.handleEvent,Y["cb"]),Object(dt["b"])(t,"mouseleave",e.handleEvent,Y["cb"]))}),this))},unListen:function(){var e=this,t=["click","focusin","focusout","mouseenter","mouseleave"],n=this.getTarget();this.setRootListener(!1),t.forEach((function(t){n&&Object(dt["a"])(n,t,e.handleEvent,Y["cb"])}),this)},setRootListener:function(e){var t=this.$root;if(t){var n=e?"$on":"$off",i=this.templateType;t[n](Object(dt["d"])(i,Y["w"]),this.doHide),t[n](Object(dt["d"])(i,Y["T"]),this.doShow),t[n](Object(dt["d"])(i,Y["k"]),this.doDisable),t[n](Object(dt["d"])(i,Y["o"]),this.doEnable)}},setWhileOpenListeners:function(e){this.setModalListener(e),this.setDropdownListener(e),this.visibleCheck(e),this.setOnTouchStartListener(e)},visibleCheck:function(e){var t=this;this.clearVisibilityInterval();var n=this.getTarget(),i=this.getTemplateElement();e&&(this.$_visibleInterval=setInterval((function(){!i||!t.localShow||n.parentNode&&Object(H["u"])(n)||t.forceHide()}),100))},setModalListener:function(e){this.isInModal()&&this.$root[e?"$on":"$off"](vg,this.forceHide)},setOnTouchStartListener:function(e){var t=this;"ontouchstart"in document.documentElement&&Object(ut["f"])(document.body.children).forEach((function(n){Object(dt["c"])(e,n,"mouseover",t.$_noop)}))},setDropdownListener:function(e){var t=this.getTarget();t&&this.$root&&this.isDropdown&&t.__vue__&&t.__vue__[e?"$on":"$off"](Y["U"],this.forceHide)},handleEvent:function(e){var t=this.getTarget();if(t&&!Object(H["r"])(t)&&this.$_enabled&&!this.dropdownOpen()){var n=e.type,i=this.computedTriggers;if("click"===n&&Object(ut["a"])(i,"click"))this.click(e);else if("mouseenter"===n&&Object(ut["a"])(i,"hover"))this.enter(e);else if("focusin"===n&&Object(ut["a"])(i,"focus"))this.enter(e);else if("focusout"===n&&(Object(ut["a"])(i,"focus")||Object(ut["a"])(i,"blur"))||"mouseleave"===n&&Object(ut["a"])(i,"hover")){var r=this.getTemplateElement(),o=e.target,a=e.relatedTarget;if(r&&Object(H["f"])(r,o)&&Object(H["f"])(t,a)||r&&Object(H["f"])(t,o)&&Object(H["f"])(r,a)||r&&Object(H["f"])(r,o)&&Object(H["f"])(r,a)||Object(H["f"])(t,o)&&Object(H["f"])(t,a))return;this.leave(e)}}},doHide:function(e){e&&this.getTargetId()!==e&&this.computedId!==e||this.forceHide()},doShow:function(e){e&&this.getTargetId()!==e&&this.computedId!==e||this.show()},doDisable:function(e){e&&this.getTargetId()!==e&&this.computedId!==e||this.disable()},doEnable:function(e){e&&this.getTargetId()!==e&&this.computedId!==e||this.enable()},click:function(e){this.$_enabled&&!this.dropdownOpen()&&(Object(H["d"])(e.currentTarget),this.activeTrigger.click=!this.activeTrigger.click,this.isWithActiveTrigger?this.enter(null):this.leave(null))},toggle:function(){this.$_enabled&&!this.dropdownOpen()&&(this.localShow?this.leave(null):this.enter(null))},enter:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;t&&(this.activeTrigger["focusin"===t.type?"focus":"hover"]=!0),this.localShow||"in"===this.$_hoverState?this.$_hoverState="in":(this.clearHoverTimeout(),this.$_hoverState="in",this.computedDelay.show?(this.fixTitle(),this.$_hoverTimeout=setTimeout((function(){"in"===e.$_hoverState?e.show():e.localShow||e.restoreTitle()}),this.computedDelay.show)):this.show())},leave:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;t&&(this.activeTrigger["focusout"===t.type?"focus":"hover"]=!1,"focusout"===t.type&&Object(ut["a"])(this.computedTriggers,"blur")&&(this.activeTrigger.click=!1,this.activeTrigger.hover=!1)),this.isWithActiveTrigger||(this.clearHoverTimeout(),this.$_hoverState="out",this.computedDelay.hide?this.$_hoverTimeout=setTimeout((function(){"out"===e.$_hoverState&&e.hide()}),this.computedDelay.hide):this.hide())}}});function xg(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function Lg(e){for(var t=1;t0&&e[Wg].updateData(t)}))}var a={title:i.title,content:i.content,triggers:i.trigger,placement:i.placement,fallbackPlacement:i.fallbackPlacement,variant:i.variant,customClass:i.customClass,container:i.container,boundary:i.boundary,delay:i.delay,offset:i.offset,noFade:!i.animation,id:i.id,disabled:i.disabled,html:i.html},s=e[Wg].__bv_prev_data__;if(e[Wg].__bv_prev_data__=a,!Object(ei["a"])(a,s)){var c={target:e};Object(f["h"])(a).forEach((function(t){a[t]!==s[t]&&(c[t]="title"!==t&&"content"!==t||!Object(u["f"])(a[t])?a[t]:a[t](e))})),e[Wg].updateData(c)}}},av=function(e){e[Wg]&&(e[Wg].$destroy(),e[Wg]=null),delete e[Wg]},sv={bind:function(e,t,n){ov(e,t,n)},componentUpdated:function(e,t,n){n.context.$nextTick((function(){ov(e,t,n)}))},unbind:function(e){av(e)}},cv=M({directives:{VBPopover:sv}}),uv=M({components:{BPopover:Ng},plugins:{VBPopoverPlugin:cv}}),dv=Object(F["d"])({animated:Object(F["c"])(C["g"],null),label:Object(F["c"])(C["u"]),labelHtml:Object(F["c"])(C["u"]),max:Object(F["c"])(C["p"],null),precision:Object(F["c"])(C["p"],null),showProgress:Object(F["c"])(C["g"],null),showValue:Object(F["c"])(C["g"],null),striped:Object(F["c"])(C["g"],null),value:Object(F["c"])(C["p"],0),variant:Object(F["c"])(C["u"])},P["Ub"]),lv=i["default"].extend({name:P["Ub"],mixins:[B["a"]],inject:{bvProgress:{default:function(){return{}}}},props:dv,computed:{progressBarClasses:function(){var e=this.computedAnimated,t=this.computedVariant;return[t?"bg-".concat(t):"",this.computedStriped||e?"progress-bar-striped":"",e?"progress-bar-animated":""]},progressBarStyles:function(){return{width:this.computedValue/this.computedMax*100+"%"}},computedValue:function(){return Object(I["b"])(this.value,0)},computedMax:function(){var e=Object(I["b"])(this.max)||Object(I["b"])(this.bvProgress.max,0);return e>0?e:100},computedPrecision:function(){return Object(ne["d"])(Object(I["c"])(this.precision,Object(I["c"])(this.bvProgress.precision,0)),0)},computedProgress:function(){var e=this.computedPrecision,t=Object(ne["f"])(10,e);return Object(I["a"])(100*t*this.computedValue/this.computedMax/t,e)},computedVariant:function(){return this.variant||this.bvProgress.variant},computedStriped:function(){return Object(u["b"])(this.striped)?this.striped:this.bvProgress.striped||!1},computedAnimated:function(){return Object(u["b"])(this.animated)?this.animated:this.bvProgress.animated||!1},computedShowProgress:function(){return Object(u["b"])(this.showProgress)?this.showProgress:this.bvProgress.showProgress||!1},computedShowValue:function(){return Object(u["b"])(this.showValue)?this.showValue:this.bvProgress.showValue||!1}},render:function(e){var t,n=this.label,i=this.labelHtml,r=this.computedValue,o=this.computedPrecision,a={};return this.hasNormalizedSlot()?t=this.normalizeSlot():n||i?a=qt(i,n):this.computedShowProgress?t=this.computedProgress:this.computedShowValue&&(t=Object(I["a"])(r,o)),e("div",{staticClass:"progress-bar",class:this.progressBarClasses,style:this.progressBarStyles,attrs:{role:"progressbar","aria-valuemin":"0","aria-valuemax":Object(me["g"])(this.computedMax),"aria-valuenow":Object(I["a"])(r,o)},domProps:a},t)}});function fv(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function hv(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.noCloseOnRouteChange||e.fullPath===t.fullPath||this.hide()})),mv),created:function(){this.$_returnFocusEl=null},mounted:function(){var e=this;this.listenOnRoot(Mv,this.handleToggle),this.listenOnRoot(kv,this.handleSync),this.$nextTick((function(){e.emitState(e.localShow)}))},activated:function(){this.emitSync()},beforeDestroy:function(){this.localShow=!1,this.$_returnFocusEl=null},methods:{hide:function(){this.localShow=!1},emitState:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.localShow;this.emitOnRoot(xv,this.safeId(),e)},emitSync:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.localShow;this.emitOnRoot(Lv,this.safeId(),e)},handleToggle:function(e){e&&e===this.safeId()&&(this.localShow=!this.localShow)},handleSync:function(e){var t=this;e&&e===this.safeId()&&this.$nextTick((function(){t.emitSync(t.localShow)}))},onKeydown:function(e){var t=e.keyCode;!this.noCloseOnEsc&&t===tt&&this.localShow&&this.hide()},onBackdropClick:function(){this.localShow&&!this.noCloseOnBackdrop&&this.hide()},onTopTrapFocus:function(){var e=Object(H["n"])(this.$refs.content);this.enforceFocus(e.reverse()[0])},onBottomTrapFocus:function(){var e=Object(H["n"])(this.$refs.content);this.enforceFocus(e[0])},onBeforeEnter:function(){this.$_returnFocusEl=Object(H["g"])(r["i"]?[document.body]:[]),this.isOpen=!0},onAfterEnter:function(e){Object(H["f"])(e,Object(H["g"])())||this.enforceFocus(e),this.$emit(Y["U"])},onAfterLeave:function(){this.enforceFocus(this.$_returnFocusEl),this.$_returnFocusEl=null,this.isOpen=!1,this.$emit(Y["v"])},enforceFocus:function(e){this.noEnforceFocus||Object(H["d"])(e)}},render:function(e){var t,n=this.bgVariant,i=this.width,r=this.textVariant,o=this.localShow,a=""===this.shadow||this.shadow,s=e(this.tag,{staticClass:wv,class:[(t={shadow:!0===a},jv(t,"shadow-".concat(a),a&&!0!==a),jv(t,"".concat(wv,"-right"),this.right),jv(t,"bg-".concat(n),n),jv(t,"text-".concat(r),r),t),this.sidebarClass],style:{width:i},attrs:this.computedAttrs,directives:[{name:"show",value:o}],ref:"content"},[Fv(e,this)]);s=e("transition",{props:this.transitionProps,on:{beforeEnter:this.onBeforeEnter,afterEnter:this.onAfterEnter,afterLeave:this.onAfterLeave}},[s]);var c=e(R["a"],{props:{noFade:this.noSlide}},[Bv(e,this)]),u=e(),d=e();return this.backdrop&&o&&(u=e("div",{attrs:{tabindex:"0"},on:{focus:this.onTopTrapFocus}}),d=e("div",{attrs:{tabindex:"0"},on:{focus:this.onBottomTrapFocus}})),e("div",{staticClass:"b-sidebar-outer",style:{zIndex:this.zIndex},attrs:{tabindex:"-1"},on:{keydown:this.onKeydown}},[u,s,d,c])}}),Rv=M({components:{BSidebar:Nv},plugins:{VBTogglePlugin:ra}});function zv(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var Vv=Object(F["d"])({animation:Object(F["c"])(C["u"],"wave"),height:Object(F["c"])(C["u"]),size:Object(F["c"])(C["u"]),type:Object(F["c"])(C["u"],"text"),variant:Object(F["c"])(C["u"]),width:Object(F["c"])(C["u"])},P["Xb"]),Wv=i["default"].extend({name:P["Xb"],functional:!0,props:Vv,render:function(e,t){var n,i=t.data,r=t.props,o=r.size,a=r.animation,s=r.variant;return e("div",Object(pe["a"])(i,{staticClass:"b-skeleton",style:{width:o||r.width,height:o||r.height},class:(n={},zv(n,"b-skeleton-".concat(r.type),!0),zv(n,"b-skeleton-animate-".concat(a),a),zv(n,"bg-".concat(s),s),n)}))}});function Uv(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function Gv(e){for(var t=1;t0}}});function ty(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var ny={stacked:Object(F["c"])(C["j"],!1)},iy=i["default"].extend({props:ny,computed:{isStacked:function(){var e=this.stacked;return""===e||e},isStackedAlways:function(){return!0===this.isStacked},stackedTableClasses:function(){var e=this.isStackedAlways;return ty({"b-table-stacked":e},"b-table-stacked-".concat(this.stacked),!e&&this.isStacked)}}});function ry(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function oy(e){for(var t=1;t0&&!this.computedBusy,[this.tableClass,{"table-striped":this.striped,"table-hover":e,"table-dark":this.dark,"table-bordered":this.bordered,"table-borderless":this.borderless,"table-sm":this.small,border:this.outlined,"b-table-fixed":this.fixed,"b-table-caption-top":this.captionTop,"b-table-no-border-collapse":this.noBorderCollapse},t?"".concat(this.dark?"bg":"table","-").concat(t):"",this.stackedTableClasses,this.selectableTableClasses]},tableAttrs:function(){var e=this.computedItems,t=this.filteredItems,n=this.computedFields,i=this.selectableTableAttrs,r=this.isTableSimple?{}:{"aria-busy":this.computedBusy?"true":"false","aria-colcount":Object(me["g"])(n.length),"aria-describedby":this.bvAttrs["aria-describedby"]||this.$refs.caption?this.captionId:null},o=e&&t&&t.length>e.length?Object(me["g"])(t.length):null;return oy(oy(oy({"aria-rowcount":o},this.bvAttrs),{},{id:this.safeId(),role:"table"},r),i)}},render:function(e){var t=this.wrapperClasses,n=this.renderCaption,i=this.renderColgroup,r=this.renderThead,o=this.renderTbody,a=this.renderTfoot,s=[];this.isTableSimple?s.push(this.normalizeSlot()):(s.push(n?n():null),s.push(i?i():null),s.push(r?r():null),s.push(o?o():null),s.push(a?a():null));var u=e("table",{staticClass:"table b-table",class:this.tableClasses,attrs:this.tableAttrs,key:"b-table"},s.filter(c["a"]));return t.length>0?e("div",{class:t,style:this.wrapperStyles,key:"wrap"},[u]):u}});function uy(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function dy(e){for(var t=1;t0},vy=Object(F["d"])({animation:Object(F["c"])(C["u"]),columns:Object(F["c"])(C["n"],5,gy),hideHeader:Object(F["c"])(C["g"],!1),rows:Object(F["c"])(C["n"],3,gy),showFooter:Object(F["c"])(C["g"],!1),tableProps:Object(F["c"])(C["q"],{})},P["ac"]),yy=i["default"].extend({name:P["ac"],functional:!0,props:vy,render:function(e,t){var n=t.props,i=n.animation,r=n.columns,o=e("th",[e(Wv,{props:{animation:i}})]),a=e("tr",Object(ut["c"])(r,o)),s=e("td",[e(Wv,{props:{width:"75%",animation:i}})]),c=e("tr",Object(ut["c"])(r,s)),u=e("tbody",Object(ut["c"])(n.rows,c)),d=n.hideHeader?e():e("thead",[a]),l=n.showFooter?e("tfoot",[a]):e();return e(hy,{props:my({},n.tableProps)},[d,u,l])}}),_y=Object(F["d"])({loading:Object(F["c"])(C["g"],!1)},P["bc"]),Oy=i["default"].extend({name:P["bc"],functional:!0,props:_y,render:function(e,t){var n=t.data,i=t.props,r=t.slots,o=t.scopedSlots,a=r(),s=o||{},c={};return i.loading?e("div",Object(pe["a"])(n,{attrs:{role:"alert","aria-live":"polite","aria-busy":!0},staticClass:"b-skeleton-wrapper",key:"loading"}),Object(pi["b"])(E["F"],c,s,a)):Object(pi["b"])(E["i"],c,s,a)}}),jy=M({components:{BSkeleton:Wv,BSkeletonIcon:Kv,BSkeletonImg:Qv,BSkeletonTable:yy,BSkeletonWrapper:Oy}}),wy=M({components:{BSpinner:hb}});function ky(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function My(e){for(var t=1;t0?e:null},$y=function(e){return Object(u["p"])(e)||Hy(e)>0},Iy=Object(F["d"])({colspan:Object(F["c"])(C["p"],null,$y),rowspan:Object(F["c"])(C["p"],null,$y),stackedHeading:Object(F["c"])(C["u"]),stickyColumn:Object(F["c"])(C["g"],!1),variant:Object(F["c"])(C["u"])},P["fc"]),Fy=i["default"].extend({name:P["fc"],mixins:[ti["a"],sd["a"],B["a"]],inject:{bvTableTr:{default:function(){return{}}}},inheritAttrs:!1,props:Iy,computed:{tag:function(){return"td"},inTbody:function(){return this.bvTableTr.inTbody},inThead:function(){return this.bvTableTr.inThead},inTfoot:function(){return this.bvTableTr.inTfoot},isDark:function(){return this.bvTableTr.isDark},isStacked:function(){return this.bvTableTr.isStacked},isStackedCell:function(){return this.inTbody&&this.isStacked},isResponsive:function(){return this.bvTableTr.isResponsive},isStickyHeader:function(){return this.bvTableTr.isStickyHeader},hasStickyHeader:function(){return this.bvTableTr.hasStickyHeader},isStickyColumn:function(){return!this.isStacked&&(this.isResponsive||this.hasStickyHeader)&&this.stickyColumn},rowVariant:function(){return this.bvTableTr.variant},headVariant:function(){return this.bvTableTr.headVariant},footVariant:function(){return this.bvTableTr.footVariant},tableVariant:function(){return this.bvTableTr.tableVariant},computedColspan:function(){return Hy(this.colspan)},computedRowspan:function(){return Hy(this.rowspan)},cellClasses:function(){var e=this.variant,t=this.headVariant,n=this.isStickyColumn;return(!e&&this.isStickyHeader&&!t||!e&&n&&this.inTfoot&&!this.footVariant||!e&&n&&this.inThead&&!t||!e&&n&&this.inTbody)&&(e=this.rowVariant||this.tableVariant||"b-table-default"),[e?"".concat(this.isDark?"bg":"table","-").concat(e):null,n?"b-table-sticky-column":null]},cellAttrs:function(){var e=this.stackedHeading,t=this.inThead||this.inTfoot,n=this.computedColspan,i=this.computedRowspan,r="cell",o=null;return t?(r="columnheader",o=n>0?"colspan":"col"):Object(H["t"])(this.tag,"th")&&(r="rowheader",o=i>0?"rowgroup":"row"),Cy(Cy({colspan:n,rowspan:i,role:r,scope:o},this.bvAttrs),{},{"data-label":this.isStackedCell&&!Object(u["p"])(e)?Object(me["g"])(e):null})}},render:function(e){var t=[this.normalizeSlot()];return e(this.tag,{class:this.cellClasses,attrs:this.cellAttrs,on:this.bvListeners},[this.isStackedCell?e("div",[t]):t])}});function By(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var Ny="busy",Ry=Y["gb"]+Ny,zy=By({},Ny,Object(F["c"])(C["g"],!1)),Vy=i["default"].extend({props:zy,data:function(){return{localBusy:!1}},computed:{computedBusy:function(){return this[Ny]||this.localBusy}},watch:{localBusy:function(e,t){e!==t&&this.$emit(Ry,e)}},methods:{stopIfBusy:function(e){return!!this.computedBusy&&(Object(dt["f"])(e),!0)},renderBusy:function(){var e=this.tbodyTrClass,t=this.tbodyTrAttr,n=this.$createElement;return this.computedBusy&&this.hasNormalizedSlot(E["bb"])?n(Dy,{staticClass:"b-table-busy-slot",class:[Object(u["f"])(e)?e(null,E["bb"]):e],attrs:Object(u["f"])(t)?t(null,E["bb"]):t,key:"table-busy-slot"},[n(Fy,{props:{colspan:this.computedFields.length||null}},[this.normalizeSlot(E["bb"])])]):null}}}),Wy={caption:Object(F["c"])(C["u"]),captionHtml:Object(F["c"])(C["u"])},Uy=i["default"].extend({props:Wy,computed:{captionId:function(){return this.isStacked?this.safeId("_caption_"):null}},methods:{renderCaption:function(){var e=this.caption,t=this.captionHtml,n=this.$createElement,i=n(),r=this.hasNormalizedSlot(E["cb"]);return(r||e||t)&&(i=n("caption",{attrs:{id:this.captionId},domProps:r?{}:qt(t,e),key:"caption",ref:"caption"},this.normalizeSlot(E["cb"]))),i}}}),Gy={},qy=i["default"].extend({methods:{renderColgroup:function(){var e=this.computedFields,t=this.$createElement,n=t();return this.hasNormalizedSlot(E["db"])&&(n=t("colgroup",{key:"colgroup"},[this.normalizeSlot(E["db"],{columns:e.length,fields:e})])),n}}}),Jy={emptyFilteredHtml:Object(F["c"])(C["u"]),emptyFilteredText:Object(F["c"])(C["u"],"There are no records matching your request"),emptyHtml:Object(F["c"])(C["u"]),emptyText:Object(F["c"])(C["u"],"There are no records to show"),showEmpty:Object(F["c"])(C["g"],!1)},Ky=i["default"].extend({props:Jy,methods:{renderEmpty:function(){var e=this.computedItems,t=this.$createElement,n=t();if(this.showEmpty&&(!e||0===e.length)&&(!this.computedBusy||!this.hasNormalizedSlot(E["bb"]))){var i=this.computedFields,r=this.isFiltered,o=this.emptyText,a=this.emptyHtml,s=this.emptyFilteredText,c=this.emptyFilteredHtml,d=this.tbodyTrClass,l=this.tbodyTrAttr;n=this.normalizeSlot(r?E["o"]:E["n"],{emptyFilteredHtml:c,emptyFilteredText:s,emptyHtml:a,emptyText:o,fields:i,items:e}),n||(n=t("div",{class:["text-center","my-2"],domProps:r?qt(c,s):qt(a,o)})),n=t(Fy,{props:{colspan:i.length||null}},[t("div",{attrs:{role:"alert","aria-live":"polite"}},[n])]),n=t(Dy,{staticClass:"b-table-empty-row",class:[Object(u["f"])(d)?d(null,"row-empty"):d],attrs:Object(u["f"])(l)?l(null,"row-empty"):l,key:r?"b-empty-filtered-row":"b-empty-row"},[n])}return n}}}),Xy=function e(t){return Object(u["p"])(t)?"":Object(u["j"])(t)&&!Object(u["c"])(t)?Object(f["h"])(t).sort().map((function(n){return e(t[n])})).filter((function(e){return!!e})).join(" "):Object(me["g"])(t)};function Zy(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function Qy(e){for(var t=1;t3&&void 0!==arguments[3]?arguments[3]:{},r=Object(f["h"])(i).reduce((function(t,n){var r=i[n],o=r.filterByFormatted,a=Object(u["f"])(o)?o:o?r.formatter:null;return Object(u["f"])(a)&&(t[n]=a(e[n],n,e)),t}),Object(f["b"])(e)),o=Object(f["h"])(r).filter((function(e){return!r_[e]&&!(Object(u["a"])(t)&&t.length>0&&Object(ut["a"])(t,e))&&!(Object(u["a"])(n)&&n.length>0&&!Object(ut["a"])(n,e))}));return Object(f["k"])(r,o)},s_=function(e,t,n,i){return Object(u["j"])(e)?Xy(a_(e,t,n,i)):""};function c_(e){return f_(e)||l_(e)||d_(e)||u_()}function u_(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function d_(e,t){if(e){if("string"===typeof e)return h_(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?h_(e,t):void 0}}function l_(e){if("undefined"!==typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}function f_(e){if(Array.isArray(e))return h_(e)}function h_(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);n0&&Object(h["a"])(p_,P["ec"]),e},localFiltering:function(){return!this.hasProvider||!!this.noProviderFiltering},filteredCheck:function(){var e=this.filteredItems,t=this.localItems,n=this.localFilter;return{filteredItems:e,localItems:t,localFilter:n}},localFilterFn:function(){var e=this.filterFunction;return Object(F["b"])(e)?e:null},filteredItems:function(){var e=this.localItems,t=this.localFilter,n=this.localFiltering?this.filterFnFactory(this.localFilterFn,t)||this.defaultFilterFnFactory(t):null;return n&&e.length>0?e.filter(n):e}},watch:{computedFilterDebounce:function(e){!e&&this.$_filterTimer&&(this.clearFilterTimer(),this.localFilter=this.filterSanitize(this.filter))},filter:{deep:!0,handler:function(e){var t=this,n=this.computedFilterDebounce;this.clearFilterTimer(),n&&n>0?this.$_filterTimer=setTimeout((function(){t.localFilter=t.filterSanitize(e)}),n):this.localFilter=this.filterSanitize(e)}},filteredCheck:function(e){var t=e.filteredItems,n=e.localFilter,i=!1;n?Object(ei["a"])(n,[])||Object(ei["a"])(n,{})?i=!1:n&&(i=!0):i=!1,i&&this.$emit(Y["q"],t,t.length),this.isFiltered=i},isFiltered:function(e,t){if(!1===e&&!0===t){var n=this.localItems;this.$emit(Y["q"],n,n.length)}}},created:function(){var e=this;this.$_filterTimer=null,this.$nextTick((function(){e.isFiltered=Boolean(e.localFilter)}))},beforeDestroy:function(){this.clearFilterTimer()},methods:{clearFilterTimer:function(){clearTimeout(this.$_filterTimer),this.$_filterTimer=null},filterSanitize:function(e){return!this.localFiltering||this.localFilterFn||Object(u["n"])(e)||Object(u["m"])(e)?Object(a["a"])(e):""},filterFnFactory:function(e,t){if(!e||!Object(u["f"])(e)||!t||Object(ei["a"])(t,[])||Object(ei["a"])(t,{}))return null;var n=function(n){return e(n,t)};return n},defaultFilterFnFactory:function(e){var t=this;if(!e||!Object(u["n"])(e)&&!Object(u["m"])(e))return null;var n=e;if(Object(u["n"])(n)){var i=Object(me["a"])(e).replace(s["w"],"\\s+");n=new RegExp(".*".concat(i,".*"),"i")}var r=function(e){return n.lastIndex=0,n.test(s_(e,t.computedFilterIgnored,t.computedFilterIncluded,t.computedFieldsObj))};return r}}}),g_=function(e,t){var n=null;return Object(u["n"])(t)?n={key:e,label:t}:Object(u["f"])(t)?n={key:e,formatter:t}:Object(u["j"])(t)?(n=Object(f["b"])(t),n.key=n.key||e):!1!==t&&(n={key:e}),n},v_=function(e,t){var n=[];if(Object(u["a"])(e)&&e.filter(c["a"]).forEach((function(e){if(Object(u["n"])(e))n.push({key:e,label:Object(me["f"])(e)});else if(Object(u["j"])(e)&&e.key&&Object(u["n"])(e.key))n.push(Object(f["b"])(e));else if(Object(u["j"])(e)&&1===Object(f["h"])(e).length){var t=Object(f["h"])(e)[0],i=g_(t,e[t]);i&&n.push(i)}})),0===n.length&&Object(u["a"])(t)&&t.length>0){var i=t[0];Object(f["h"])(i).forEach((function(e){r_[e]||n.push({key:e,label:Object(me["f"])(e)})}))}var r={};return n.filter((function(e){return!r[e.key]&&(r[e.key]=!0,e.label=Object(u["n"])(e.label)?e.label:Object(me["f"])(e.key),!0)}))};function y_(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function __(e){for(var t=1;t0&&e.some(c["a"])},selectableIsMultiSelect:function(){return this.isSelectable&&Object(ut["a"])(["range","multi"],this.selectMode)},selectableTableClasses:function(){var e,t=this.isSelectable;return e={"b-table-selectable":t},E_(e,"b-table-select-".concat(this.selectMode),t),E_(e,"b-table-selecting",this.selectableHasSelection),E_(e,"b-table-selectable-no-click",t&&!this.hasSelectableRowClick),e},selectableTableAttrs:function(){return{"aria-multiselectable":this.isSelectable?this.selectableIsMultiSelect?"true":"false":null}}},watch:{computedItems:function(e,t){var n=!1;if(this.isSelectable&&this.selectedRows.length>0){n=Object(u["a"])(e)&&Object(u["a"])(t)&&e.length===t.length;for(var i=0;n&&i=0&&e0&&(this.selectedLastClicked=-1,this.selectedRows=this.selectableIsMultiSelect?Object(ut["c"])(e,!0):[!0])},isRowSelected:function(e){return!(!Object(u["h"])(e)||!this.selectedRows[e])},clearSelected:function(){this.selectedLastClicked=-1,this.selectedRows=[]},selectableRowClasses:function(e){if(this.isSelectable&&this.isRowSelected(e)){var t=this.selectedVariant;return E_({"b-table-row-selected":!0},"".concat(this.dark?"bg":"table","-").concat(t),t)}return{}},selectableRowAttrs:function(e){return{"aria-selected":this.isSelectable?this.isRowSelected(e)?"true":"false":null}},setSelectionHandlers:function(e){var t=e&&!this.noSelectOnClick?"$on":"$off";this[t](Y["L"],this.selectionHandler),this[t](Y["q"],this.clearSelected),this[t](Y["i"],this.clearSelected)},selectionHandler:function(e,t,n){if(this.isSelectable&&!this.noSelectOnClick){var i=this.selectMode,r=this.selectedLastRow,o=this.selectedRows.slice(),a=!o[t];if("single"===i)o=[];else if("range"===i)if(r>-1&&n.shiftKey){for(var s=Object(ne["e"])(r,t);s<=Object(ne["d"])(r,t);s++)o[s]=!0;a=!0}else n.ctrlKey||n.metaKey||(o=[],a=!0),this.selectedLastRow=a?t:-1;o[t]=a,this.selectedRows=o}else this.clearSelected()}}}),N_=function(e,t){return e.map((function(e,t){return[t,e]})).sort(function(e,t){return this(e[1],t[1])||e[0]-t[0]}.bind(t)).map((function(e){return e[1]}))},R_=function(e){return Object(u["p"])(e)?"":Object(u["i"])(e)?Object(I["b"])(e,e):e},z_=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=n.sortBy,r=void 0===i?null:i,o=n.formatter,a=void 0===o?null:o,s=n.locale,c=void 0===s?void 0:s,d=n.localeOptions,f=void 0===d?{}:d,h=n.nullLast,p=void 0!==h&&h,m=l(e,r,null),b=l(t,r,null);return Object(u["f"])(a)&&(m=a(m,r,e),b=a(b,r,t)),m=R_(m),b=R_(b),Object(u["c"])(m)&&Object(u["c"])(b)||Object(u["h"])(m)&&Object(u["h"])(b)?mb?1:0:p&&""===m&&""!==b?1:p&&""!==m&&""===b?-1:Xy(m).localeCompare(Xy(b),c,f)};function V_(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function W_(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:document,t=Object(H["l"])();return!!(t&&""!==t.toString().trim()&&t.containsNode&&Object(H["s"])(e))&&t.containsNode(e,!0)},lO=Object(F["d"])(Iy,P["mc"]),fO=i["default"].extend({name:P["mc"],extends:Fy,props:lO,computed:{tag:function(){return"th"}}});function hO(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function pO(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,i=new Array(t);n0&&(y=String((a-1)*s+t+1));var _=Object(me["g"])(l(e,o))||null,O=_||Object(me["g"])(t),j=_?this.safeId("_row_".concat(_)):null,w=this.selectableRowClasses?this.selectableRowClasses(t):{},k=this.selectableRowAttrs?this.selectableRowAttrs(t):{},M=Object(u["f"])(c)?c(e,"row"):c,x=Object(u["f"])(d)?d(e,"row"):d;if(b.push(f(Dy,{class:[M,w,p?"b-table-has-details":""],props:{variant:e[n_]||null},attrs:pO(pO({id:j},x),{},{tabindex:m?"0":null,"data-pk":_||null,"aria-details":g,"aria-owns":g,"aria-rowindex":y},k),on:{mouseenter:this.rowHovered,mouseleave:this.rowUnhovered},key:"__b-table-row-".concat(O,"__"),ref:"item-rows",refInFor:!0},v)),p){var L={item:e,index:t,fields:i,toggleDetails:this.toggleDetailsFactory(h,e)};this.supportsSelectableRows&&(L.rowSelected=this.isRowSelected(t),L.selectRow=function(){return n.selectRow(t)},L.unselectRow=function(){return n.unselectRow(t)});var S=f(Fy,{props:{colspan:i.length},class:this.detailsTdClass},[this.normalizeSlot(E["ab"],L)]);r&&b.push(f("tr",{staticClass:"d-none",attrs:{"aria-hidden":"true",role:"presentation"},key:"__b-table-details-stripe__".concat(O)}));var T=Object(u["f"])(this.tbodyTrClass)?this.tbodyTrClass(e,E["ab"]):this.tbodyTrClass,D=Object(u["f"])(this.tbodyTrAttr)?this.tbodyTrAttr(e,E["ab"]):this.tbodyTrAttr;b.push(f(Dy,{staticClass:"b-table-details",class:[T],props:{variant:e[n_]||null},attrs:pO(pO({},D),{},{id:g,tabindex:"-1"}),key:"__b-table-details__".concat(O)},[S]))}else h&&(b.push(f()),r&&b.push(f()));return b}}});function kO(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function MO(e){for(var t=1;t0&&n&&n.length>0?Object(ut["f"])(t.children).filter((function(e){return Object(ut["a"])(n,e)})):[]},getTbodyTrIndex:function(e){if(!Object(H["s"])(e))return-1;var t="TR"===e.tagName?e:Object(H["e"])("tr",e,!0);return t?this.getTbodyTrs().indexOf(t):-1},emitTbodyRowEvent:function(e,t){if(e&&this.hasListener(e)&&t&&t.target){var n=this.getTbodyTrIndex(t.target);if(n>-1){var i=this.computedItems[n];this.$emit(e,i,n,t)}}},tbodyRowEvtStopped:function(e){return this.stopIfBusy&&this.stopIfBusy(e)},onTbodyRowKeydown:function(e){var t=e.target,n=e.keyCode;if(!this.tbodyRowEvtStopped(e)&&"TR"===t.tagName&&Object(H["q"])(t)&&0===t.tabIndex)if(Object(ut["a"])([et,st],n))Object(dt["f"])(e),this.onTBodyRowClicked(e);else if(Object(ut["a"])([ct,Ze,nt,Qe],n)){var i=this.getTbodyTrIndex(t);if(i>-1){Object(dt["f"])(e);var r=this.getTbodyTrs(),o=e.shiftKey;n===nt||o&&n===ct?Object(H["d"])(r[0]):n===Qe||o&&n===Ze?Object(H["d"])(r[r.length-1]):n===ct&&i>0?Object(H["d"])(r[i-1]):n===Ze&&ie.length)&&(t=e.length);for(var n=0,i=new Array(t);n0&&void 0!==arguments[0]&&arguments[0],n=this.computedFields,i=this.isSortable,r=this.isSelectable,o=this.headVariant,a=this.footVariant,s=this.headRowVariant,d=this.footRowVariant,l=this.$createElement;if(this.isStackedAlways||0===n.length)return l();var f=i||this.hasListener(Y["u"]),h=r?this.selectAllRows:xr,p=r?this.clearSelected:xr,m=function(n,r){var o=n.label,a=n.labelHtml,s=n.variant,u=n.stickyColumn,d=n.key,m=null;n.label.trim()||n.headerTitle||(m=Object(me["f"])(n.key));var b={};f&&(b.click=function(i){e.headClicked(i,n,t)},b.keydown=function(i){var r=i.keyCode;r!==et&&r!==st||e.headClicked(i,n,t)});var g=i?e.sortTheadThAttrs(d,n,t):{},v=i?e.sortTheadThClasses(d,n,t):null,y=i?e.sortTheadThLabel(d,n,t):null,_={class:[e.fieldClasses(n),v],props:{variant:s,stickyColumn:u},style:n.thStyle||{},attrs:JO(JO({tabindex:f&&n.sortable?"0":null,abbr:n.headerAbbr||null,title:n.headerTitle||null,"aria-colindex":r+1,"aria-label":m},e.getThValues(null,d,n.thAttr,t?"foot":"head",{})),g),on:b,key:d},O=[XO(d),XO(d.toLowerCase()),XO()];t&&(O=[ZO(d),ZO(d.toLowerCase()),ZO()].concat(RO(O)));var j={label:o,column:d,field:n,isFoot:t,selectAllRows:h,clearSelected:p},w=e.normalizeSlot(O,j)||l("div",{domProps:qt(a,o)}),k=y?l("span",{staticClass:"sr-only"}," (".concat(y,")")):null;return l(fO,_,[w,k].filter(c["a"]))},b=n.map(m).filter(c["a"]),g=[];if(t)g.push(l(Dy,{class:this.tfootTrClass,props:{variant:Object(u["p"])(d)?s:d}},b));else{var v={columns:n.length,fields:n,selectAllRows:h,clearSelected:p};g.push(this.normalizeSlot(E["hb"],v)||l()),g.push(l(Dy,{class:this.theadTrClass,props:{variant:s}},b))}return l(t?CO:NO,{class:(t?this.tfootClass:this.theadClass)||null,props:t?{footVariant:a||o||null}:{headVariant:o||null},key:t?"bv-tfoot":"bv-thead"},g)}}}),tj={},nj=i["default"].extend({methods:{renderTopRow:function(){var e=this.computedFields,t=this.stacked,n=this.tbodyTrClass,i=this.tbodyTrAttr,r=this.$createElement;return this.hasNormalizedSlot(E["kb"])&&!0!==t&&""!==t?r(Dy,{staticClass:"b-table-top-row",class:[Object(u["f"])(n)?n(null,"row-top"):n],attrs:Object(u["f"])(i)?i(null,"row-top"):i,key:"b-top-row"},[this.normalizeSlot(E["kb"],{columns:e.length,fields:e})]):r()}}});function ij(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function rj(e){for(var t=1;t0&&void 0!==arguments[0])||arguments[0];if(this.$_observer&&this.$_observer.disconnect(),this.$_observer=null,t){var n=function(){e.$nextTick((function(){Object(H["D"])((function(){e.updateTabs()}))}))};this.$_observer=Ar(this.$refs.content,n,{childList:!0,subtree:!1,attributes:!0,attributeFilter:["id"]})}},getTabs:function(){var e=this.registeredTabs.filter((function(e){return 0===e.$children.filter((function(e){return e._isTab})).length})),t=[];if(r["i"]&&e.length>0){var n=e.map((function(e){return"#".concat(e.safeId())})).join(", ");t=Object(H["F"])(n,this.$el).map((function(e){return e.id})).filter(c["a"])}return N_(e,(function(e,n){return t.indexOf(e.safeId())-t.indexOf(n.safeId())}))},updateTabs:function(){var e=this.getTabs(),t=e.indexOf(e.slice().reverse().find((function(e){return e.localActive&&!e.disabled})));if(t<0){var n=this.currentTab;n>=e.length?t=e.indexOf(e.slice().reverse().find(Lj)):e[n]&&!e[n].disabled&&(t=n)}t<0&&(t=e.indexOf(e.find(Lj))),e.forEach((function(e,n){e.localActive=n===t})),this.tabs=e,this.currentTab=t},getButtonForTab:function(e){return(this.$refs.buttons||[]).find((function(t){return t.tab===e}))},updateButton:function(e){var t=this.getButtonForTab(e);t&&t.$forceUpdate&&t.$forceUpdate()},activateTab:function(e){var t=this.currentTab,n=this.tabs,i=!1;if(e){var r=n.indexOf(e);if(r!==t&&r>-1&&!e.disabled){var o=new pa["a"](Y["a"],{cancelable:!0,vueTarget:this,componentId:this.safeId()});this.$emit(o.type,r,t,o),o.defaultPrevented||(this.currentTab=r,i=!0)}}return i||this[Mj]===t||this.$emit(xj,t),i},deactivateTab:function(e){return!!e&&this.activateTab(this.tabs.filter((function(t){return t!==e})).find(Lj))},focusButton:function(e){var t=this;this.$nextTick((function(){Object(H["d"])(t.getButtonForTab(e))}))},emitTabClick:function(e,t){Object(u["d"])(t)&&e&&e.$emit&&!e.disabled&&e.$emit(Y["f"],t)},clickTab:function(e,t){this.activateTab(e),this.emitTabClick(e,t)},firstTab:function(e){var t=this.tabs.find(Lj);this.activateTab(t)&&e&&(this.focusButton(t),this.emitTabClick(t,e))},previousTab:function(e){var t=Object(ne["d"])(this.currentTab,0),n=this.tabs.slice(0,t).reverse().find(Lj);this.activateTab(n)&&e&&(this.focusButton(n),this.emitTabClick(n,e))},nextTab:function(e){var t=Object(ne["d"])(this.currentTab,-1),n=this.tabs.slice(t+1).find(Lj);this.activateTab(n)&&e&&(this.focusButton(n),this.emitTabClick(n,e))},lastTab:function(e){var t=this.tabs.slice().reverse().find(Lj);this.activateTab(t)&&e&&(this.focusButton(t),this.emitTabClick(t,e))}},render:function(e){var t=this,n=this.align,i=this.card,r=this.end,o=this.fill,a=this.firstTab,s=this.justified,c=this.lastTab,u=this.nextTab,d=this.noKeyNav,l=this.noNavStyle,f=this.pills,h=this.previousTab,p=this.small,m=this.tabs,b=this.vertical,g=m.find((function(e){return e.localActive&&!e.disabled})),v=m.find((function(e){return!e.disabled})),y=m.map((function(n,i){var r,o=n.safeId,s=null;return d||(s=-1,(n===g||!g&&n===v)&&(s=null)),e(Sj,{props:{controls:o?o():null,id:n.controlledBy||(o?o("_BV_tab_button_"):null),noKeyNav:d,posInSet:i+1,setSize:m.length,tab:n,tabIndex:s},on:(r={},yj(r,Y["f"],(function(e){t.clickTab(n,e)})),yj(r,Y["r"],a),yj(r,Y["H"],h),yj(r,Y["C"],u),yj(r,Y["z"],c),r),key:n[A["a"]]||i,ref:"buttons",refInFor:!0})})),_=e(ym,{class:this.localNavClass,attrs:{role:"tablist",id:this.safeId("_BV_tab_controls_")},props:{fill:o,justified:s,align:n,tabs:!l&&!f,pills:!l&&f,vertical:b,small:p,cardHeader:i&&!b},ref:"nav"},[this.normalizeSlot(E["fb"])||e(),y,this.normalizeSlot(E["eb"])||e()]);_=e("div",{class:[{"card-header":i&&!b&&!r,"card-footer":i&&!b&&r,"col-auto":b},this.navWrapperClass],key:"bv-tabs-nav"},[_]);var O=this.normalizeSlot()||[],j=e();0===O.length&&(j=e("div",{class:["tab-pane","active",{"card-body":i}],key:"bv-empty-tab"},this.normalizeSlot(E["n"])));var w=e("div",{staticClass:"tab-content",class:[{col:b},this.contentClass],attrs:{id:this.safeId("_BV_tab_container_")},key:"bv-content",ref:"content"},[O,j]);return e(this.tag,{staticClass:"tabs",class:{row:b,"no-gutters":b&&i},attrs:{id:this.safeId()}},[r?w:e(),_,r?e():w])}});function Pj(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function Yj(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,i=new Array(t);n1&&void 0!==arguments[1]?arguments[1]:{};e&&!Object(h["d"])(ew)&&n(Uj(Uj({},rw(t)),{},{toastContent:e}),this._vm)}},{key:"show",value:function(e){e&&this._root.$emit(Object(dt["d"])(P["pc"],Y["T"]),e)}},{key:"hide",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;this._root.$emit(Object(dt["d"])(P["pc"],Y["w"]),e)}}]),e}();e.mixin({beforeCreate:function(){this[tw]=new i(this)}}),Object(f["g"])(e.prototype,ew)||Object(f["e"])(e.prototype,ew,{get:function(){return this&&this[tw]||Object(h["a"])('"'.concat(ew,'" must be accessed from a Vue instance "this" context.'),P["pc"]),this[tw]}})},aw=M({plugins:{plugin:ow}}),sw=n("0f65"),cw=M({components:{BToast:Nj["a"],BToaster:sw["a"]},plugins:{BVToastPlugin:aw}});function uw(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function dw(e){for(var t=1;t=n){var i=this.$targets[this.$targets.length-1];this.$activeTarget!==i&&this.activate(i)}else{if(this.$activeTarget&&e0)return this.$activeTarget=null,void this.clear();for(var r=this.$offsets.length;r--;){var o=this.$activeTarget!==this.$targets[r]&&e>=this.$offsets[r]&&(Object(u["o"])(this.$offsets[r+1])||e0&&this.$root&&this.$root.$emit(Xw,e,n)}},{key:"clear",value:function(){var e=this;Object(H["F"])("".concat(this.$selector,", ").concat(Uw),this.$el).filter((function(e){return Object(H["p"])(e,zw)})).forEach((function(t){return e.setActiveState(t,!1)}))}},{key:"setActiveState",value:function(e,t){e&&(t?Object(H["b"])(e,zw):Object(H["A"])(e,zw))}}],[{key:"Name",get:function(){return Nw}},{key:"Default",get:function(){return ek}},{key:"DefaultType",get:function(){return tk}}]),e}(),ak="__BV_ScrollSpy__",sk=/^\d+$/,ck=/^(auto|position|offset)$/,uk=function(e){var t={};return e.arg&&(t.element="#".concat(e.arg)),Object(f["h"])(e.modifiers).forEach((function(e){sk.test(e)?t.offset=Object(I["c"])(e,0):ck.test(e)&&(t.method=e)})),Object(u["n"])(e.value)?t.element=e.value:Object(u["h"])(e.value)?t.offset=Object(ne["g"])(e.value):Object(u["j"])(e.value)&&Object(f["h"])(e.value).filter((function(e){return!!ok.DefaultType[e]})).forEach((function(n){t[n]=e.value[n]})),t},dk=function(e,t,n){if(r["i"]){var i=uk(t);e[ak]?e[ak].updateConfig(i,n.context.$root):e[ak]=new ok(e,i,n.context.$root)}},lk=function(e){e[ak]&&(e[ak].dispose(),e[ak]=null,delete e[ak])},fk={bind:function(e,t,n){dk(e,t,n)},inserted:function(e,t,n){dk(e,t,n)},update:function(e,t,n){t.value!==t.oldValue&&dk(e,t,n)},componentUpdated:function(e,t,n){t.value!==t.oldValue&&dk(e,t,n)},unbind:function(e){lk(e)}},hk=M({directives:{VBScrollspy:fk}}),pk=M({directives:{VBVisible:sr}}),mk=M({plugins:{VBHoverPlugin:Yw,VBModalPlugin:Cw,VBPopoverPlugin:cv,VBScrollspyPlugin:hk,VBTogglePlugin:ra,VBTooltipPlugin:Dw,VBVisiblePlugin:pk}}),bk="BootstrapVue",gk=k({plugins:{componentsPlugin:Pw,directivesPlugin:mk}}),vk={install:gk,NAME:bk}},"5fb2":function(e,t,n){"use strict";var i=2147483647,r=36,o=1,a=26,s=38,c=700,u=72,d=128,l="-",f=/[^\0-\u007E]/,h=/[.\u3002\uFF0E\uFF61]/g,p="Overflow: input needs wider integers to process",m=r-o,b=Math.floor,g=String.fromCharCode,v=function(e){var t=[],n=0,i=e.length;while(n=55296&&r<=56319&&n>1,e+=b(e/t);e>m*a>>1;i+=r)e=b(e/m);return b(i+(m+1)*e/(e+s))},O=function(e){var t=[];e=v(e);var n,s,c=e.length,f=d,h=0,m=u;for(n=0;n=f&&sb((i-h)/k))throw RangeError(p);for(h+=(w-f)*k,f=w,n=0;ni)throw RangeError(p);if(s==f){for(var M=h,x=r;;x+=r){var L=x<=m?o:x>=m+a?a:x-m;if(M1?n-1:0),r=1;rd){var h,p=u(arguments[d++]),m=l?o(p).concat(l(p)):o(p),b=m.length,g=0;while(b>g)h=m[g++],i&&!f.call(p,h)||(n[h]=p[h])}return n}:d},6117:function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("ug-cn",{months:"يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر".split("_"),monthsShort:"يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر".split("_"),weekdays:"يەكشەنبە_دۈشەنبە_سەيشەنبە_چارشەنبە_پەيشەنبە_جۈمە_شەنبە".split("_"),weekdaysShort:"يە_دۈ_سە_چا_پە_جۈ_شە".split("_"),weekdaysMin:"يە_دۈ_سە_چا_پە_جۈ_شە".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY-يىلىM-ئاينىڭD-كۈنى",LLL:"YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm",LLLL:"dddd، YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm"},meridiemParse:/يېرىم كېچە|سەھەر|چۈشتىن بۇرۇن|چۈش|چۈشتىن كېيىن|كەچ/,meridiemHour:function(e,t){return 12===e&&(e=0),"يېرىم كېچە"===t||"سەھەر"===t||"چۈشتىن بۇرۇن"===t?e:"چۈشتىن كېيىن"===t||"كەچ"===t?e+12:e>=11?e:e+12},meridiem:function(e,t,n){var i=100*e+t;return i<600?"يېرىم كېچە":i<900?"سەھەر":i<1130?"چۈشتىن بۇرۇن":i<1230?"چۈش":i<1800?"چۈشتىن كېيىن":"كەچ"},calendar:{sameDay:"[بۈگۈن سائەت] LT",nextDay:"[ئەتە سائەت] LT",nextWeek:"[كېلەركى] dddd [سائەت] LT",lastDay:"[تۆنۈگۈن] LT",lastWeek:"[ئالدىنقى] dddd [سائەت] LT",sameElse:"L"},relativeTime:{future:"%s كېيىن",past:"%s بۇرۇن",s:"نەچچە سېكونت",ss:"%d سېكونت",m:"بىر مىنۇت",mm:"%d مىنۇت",h:"بىر سائەت",hh:"%d سائەت",d:"بىر كۈن",dd:"%d كۈن",M:"بىر ئاي",MM:"%d ئاي",y:"بىر يىل",yy:"%d يىل"},dayOfMonthOrdinalParse:/\d{1,2}(-كۈنى|-ئاي|-ھەپتە)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"-كۈنى";case"w":case"W":return e+"-ھەپتە";default:return e}},preparse:function(e){return e.replace(/،/g,",")},postformat:function(e){return e.replace(/,/g,"،")},week:{dow:1,doy:7}});return t}))},"62e4":function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},6403:function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(e,t){return 12===e&&(e=0),"pagi"===t?e:"tengahari"===t?e>=11?e:e+12:"petang"===t||"malam"===t?e+12:void 0},meridiem:function(e,t,n){return e<11?"pagi":e<15?"tengahari":e<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}});return t}))},6428:function(e,t,n){var i=n("b4b0"),r=1/0,o=17976931348623157e292;function a(e){if(!e)return 0===e?e:0;if(e=i(e),e===r||e===-r){var t=e<0?-1:1;return t*o}return e===e?e:0}e.exports=a},6547:function(e,t,n){var i=n("a691"),r=n("1d80"),o=function(e){return function(t,n){var o,a,s=String(r(t)),c=i(n),u=s.length;return c<0||c>=u?e?"":void 0:(o=s.charCodeAt(c),o<55296||o>56319||c+1===u||(a=s.charCodeAt(c+1))<56320||a>57343?e?s.charAt(c):o:e?s.slice(c,c+2):a-56320+(o-55296<<10)+65536)}};e.exports={codeAt:o(!1),charAt:o(!0)}},"65db":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mart_apr_maj_jun_jul_aŭg_sept_okt_nov_dec".split("_"),weekdays:"dimanĉo_lundo_mardo_merkredo_ĵaŭdo_vendredo_sabato".split("_"),weekdaysShort:"dim_lun_mard_merk_ĵaŭ_ven_sab".split("_"),weekdaysMin:"di_lu_ma_me_ĵa_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"[la] D[-an de] MMMM, YYYY",LLL:"[la] D[-an de] MMMM, YYYY HH:mm",LLLL:"dddd[n], [la] D[-an de] MMMM, YYYY HH:mm",llll:"ddd, [la] D[-an de] MMM, YYYY HH:mm"},meridiemParse:/[ap]\.t\.m/i,isPM:function(e){return"p"===e.charAt(0).toLowerCase()},meridiem:function(e,t,n){return e>11?n?"p.t.m.":"P.T.M.":n?"a.t.m.":"A.T.M."},calendar:{sameDay:"[Hodiaŭ je] LT",nextDay:"[Morgaŭ je] LT",nextWeek:"dddd[n je] LT",lastDay:"[Hieraŭ je] LT",lastWeek:"[pasintan] dddd[n je] LT",sameElse:"L"},relativeTime:{future:"post %s",past:"antaŭ %s",s:"kelkaj sekundoj",ss:"%d sekundoj",m:"unu minuto",mm:"%d minutoj",h:"unu horo",hh:"%d horoj",d:"unu tago",dd:"%d tagoj",M:"unu monato",MM:"%d monatoj",y:"unu jaro",yy:"%d jaroj"},dayOfMonthOrdinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,doy:7}});return t}))},"65f0":function(e,t,n){var i=n("861d"),r=n("e8b5"),o=n("b622"),a=o("species");e.exports=function(e,t){var n;return r(e)&&(n=e.constructor,"function"!=typeof n||n!==Array&&!r(n.prototype)?i(n)&&(n=n[a],null===n&&(n=void 0)):n=void 0),new(void 0===n?Array:n)(0===t?0:t)}},6613:function(e,t,n){n("fb6a"),n("d3b7"),n("b0c0"),n("a630"),n("3ca3");var i=n("5a43");function r(e,t){if(e){if("string"===typeof e)return i(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?i(e,t):void 0}}e.exports=r,e.exports["default"]=e.exports,e.exports.__esModule=!0},6784:function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=["جنوري","فيبروري","مارچ","اپريل","مئي","جون","جولاءِ","آگسٽ","سيپٽمبر","آڪٽوبر","نومبر","ڊسمبر"],n=["آچر","سومر","اڱارو","اربع","خميس","جمع","ڇنڇر"],i=e.defineLocale("sd",{months:t,monthsShort:t,weekdays:n,weekdaysShort:n,weekdaysMin:n,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd، D MMMM YYYY HH:mm"},meridiemParse:/صبح|شام/,isPM:function(e){return"شام"===e},meridiem:function(e,t,n){return e<12?"صبح":"شام"},calendar:{sameDay:"[اڄ] LT",nextDay:"[سڀاڻي] LT",nextWeek:"dddd [اڳين هفتي تي] LT",lastDay:"[ڪالهه] LT",lastWeek:"[گزريل هفتي] dddd [تي] LT",sameElse:"L"},relativeTime:{future:"%s پوء",past:"%s اڳ",s:"چند سيڪنڊ",ss:"%d سيڪنڊ",m:"هڪ منٽ",mm:"%d منٽ",h:"هڪ ڪلاڪ",hh:"%d ڪلاڪ",d:"هڪ ڏينهن",dd:"%d ڏينهن",M:"هڪ مهينو",MM:"%d مهينا",y:"هڪ سال",yy:"%d سال"},preparse:function(e){return e.replace(/،/g,",")},postformat:function(e){return e.replace(/,/g,"،")},week:{dow:1,doy:4}});return i}))},"686b":function(e,t,n){"use strict";n.d(t,"a",(function(){return o})),n.d(t,"d",(function(){return a})),n.d(t,"c",(function(){return s})),n.d(t,"b",(function(){return c}));var i=n("e863"),r=n("938d"),o=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;Object(r["a"])()||console.warn("[BootstrapVue warn]: ".concat(t?"".concat(t," - "):"").concat(e))},a=function(e){return!i["i"]&&(o("".concat(e,": Can not be called during SSR.")),!0)},s=function(e){return!i["f"]&&(o("".concat(e,": Requires Promise support.")),!0)},c=function(e){return!i["c"]&&(o("".concat(e,": Requires MutationObserver support.")),!0)}},6887:function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -function t(e,t,n){var i={mm:"munutenn",MM:"miz",dd:"devezh"};return e+" "+r(i[n],e)}function n(e){switch(i(e)){case 1:case 3:case 4:case 5:case 9:return e+" bloaz";default:return e+" vloaz"}}function i(e){return e>9?i(e%10):e}function r(e,t){return 2===t?o(e):e}function o(e){var t={m:"v",b:"v",d:"z"};return void 0===t[e.charAt(0)]?e:t[e.charAt(0)]+e.substring(1)}var a=[/^gen/i,/^c[ʼ\']hwe/i,/^meu/i,/^ebr/i,/^mae/i,/^(mez|eve)/i,/^gou/i,/^eos/i,/^gwe/i,/^her/i,/^du/i,/^ker/i],s=/^(genver|c[ʼ\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu|gen|c[ʼ\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,c=/^(genver|c[ʼ\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu)/i,u=/^(gen|c[ʼ\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,d=[/^sul/i,/^lun/i,/^meurzh/i,/^merc[ʼ\']her/i,/^yaou/i,/^gwener/i,/^sadorn/i],l=[/^Sul/i,/^Lun/i,/^Meu/i,/^Mer/i,/^Yao/i,/^Gwe/i,/^Sad/i],f=[/^Su/i,/^Lu/i,/^Me([^r]|$)/i,/^Mer/i,/^Ya/i,/^Gw/i,/^Sa/i],h=e.defineLocale("br",{months:"Genver_Cʼhwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_Cʼhwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Mercʼher_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),weekdaysParse:f,fullWeekdaysParse:d,shortWeekdaysParse:l,minWeekdaysParse:f,monthsRegex:s,monthsShortRegex:s,monthsStrictRegex:c,monthsShortStrictRegex:u,monthsParse:a,longMonthsParse:a,shortMonthsParse:a,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY HH:mm",LLLL:"dddd, D [a viz] MMMM YYYY HH:mm"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warcʼhoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Decʼh da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s ʼzo",s:"un nebeud segondennoù",ss:"%d eilenn",m:"ur vunutenn",mm:t,h:"un eur",hh:"%d eur",d:"un devezh",dd:t,M:"ur miz",MM:t,y:"ur bloaz",yy:n},dayOfMonthOrdinalParse:/\d{1,2}(añ|vet)/,ordinal:function(e){var t=1===e?"añ":"vet";return e+t},week:{dow:1,doy:4},meridiemParse:/a.m.|g.m./,isPM:function(e){return"g.m."===e},meridiem:function(e,t,n){return e<12?"a.m.":"g.m."}});return h}))},"688b":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("mi",{months:"Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea".split("_"),monthsShort:"Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki".split("_"),monthsRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,weekdays:"Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei".split("_"),weekdaysShort:"Ta_Ma_Tū_We_Tāi_Pa_Hā".split("_"),weekdaysMin:"Ta_Ma_Tū_We_Tāi_Pa_Hā".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [i] HH:mm",LLLL:"dddd, D MMMM YYYY [i] HH:mm"},calendar:{sameDay:"[i teie mahana, i] LT",nextDay:"[apopo i] LT",nextWeek:"dddd [i] LT",lastDay:"[inanahi i] LT",lastWeek:"dddd [whakamutunga i] LT",sameElse:"L"},relativeTime:{future:"i roto i %s",past:"%s i mua",s:"te hēkona ruarua",ss:"%d hēkona",m:"he meneti",mm:"%d meneti",h:"te haora",hh:"%d haora",d:"he ra",dd:"%d ra",M:"he marama",MM:"%d marama",y:"he tau",yy:"%d tau"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return t}))},6909:function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("mk",{months:"јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември".split("_"),monthsShort:"јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек".split("_"),weekdays:"недела_понеделник_вторник_среда_четврток_петок_сабота".split("_"),weekdaysShort:"нед_пон_вто_сре_чет_пет_саб".split("_"),weekdaysMin:"нe_пo_вт_ср_че_пе_сa".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[Денес во] LT",nextDay:"[Утре во] LT",nextWeek:"[Во] dddd [во] LT",lastDay:"[Вчера во] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Изминатата] dddd [во] LT";case 1:case 2:case 4:case 5:return"[Изминатиот] dddd [во] LT"}},sameElse:"L"},relativeTime:{future:"за %s",past:"пред %s",s:"неколку секунди",ss:"%d секунди",m:"една минута",mm:"%d минути",h:"еден час",hh:"%d часа",d:"еден ден",dd:"%d дена",M:"еден месец",MM:"%d месеци",y:"една година",yy:"%d години"},dayOfMonthOrdinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(e){var t=e%10,n=e%100;return 0===e?e+"-ев":0===n?e+"-ен":n>10&&n<20?e+"-ти":1===t?e+"-ви":2===t?e+"-ри":7===t||8===t?e+"-ми":e+"-ти"},week:{dow:1,doy:7}});return t}))},"69f3":function(e,t,n){var i,r,o,a=n("7f9a"),s=n("da84"),c=n("861d"),u=n("9112"),d=n("5135"),l=n("c6cd"),f=n("f772"),h=n("d012"),p="Object already initialized",m=s.WeakMap,b=function(e){return o(e)?r(e):i(e,{})},g=function(e){return function(t){var n;if(!c(t)||(n=r(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}};if(a||l.state){var v=l.state||(l.state=new m),y=v.get,_=v.has,O=v.set;i=function(e,t){if(_.call(v,e))throw new TypeError(p);return t.facade=e,O.call(v,e,t),t},r=function(e){return y.call(v,e)||{}},o=function(e){return _.call(v,e)}}else{var j=f("state");h[j]=!0,i=function(e,t){if(d(e,j))throw new TypeError(p);return t.facade=e,u(e,j,t),t},r=function(e){return d(e,j)?e[j]:{}},o=function(e){return d(e,j)}}e.exports={set:i,get:r,has:o,enforce:b,getterFor:g}},"6b77":function(e,t,n){"use strict";n.d(t,"b",(function(){return u})),n.d(t,"a",(function(){return d})),n.d(t,"c",(function(){return l})),n.d(t,"f",(function(){return f})),n.d(t,"e",(function(){return p})),n.d(t,"d",(function(){return m}));var i=n("e863"),r=n("0056"),o=n("992e"),a=n("7b1e"),s=n("fa73"),c=function(e){return i["d"]?Object(a["j"])(e)?e:{capture:!!e||!1}:!!(Object(a["j"])(e)?e.capture:e)},u=function(e,t,n,i){e&&e.addEventListener&&e.addEventListener(t,n,c(i))},d=function(e,t,n,i){e&&e.removeEventListener&&e.removeEventListener(t,n,c(i))},l=function(e){for(var t=e?u:d,n=arguments.length,i=new Array(n>1?n-1:0),r=1;r1&&void 0!==arguments[1]?arguments[1]:{},n=t.preventDefault,i=void 0===n||n,r=t.propagation,o=void 0===r||r,a=t.immediatePropagation,s=void 0!==a&&a;i&&e.preventDefault(),o&&e.stopPropagation(),s&&e.stopImmediatePropagation()},h=function(e){return Object(s["b"])(e.replace(o["d"],""))},p=function(e,t){return[r["hb"],h(e),t].join(r["ib"])},m=function(e,t){return[r["hb"],t,h(e)].join(r["ib"])}},"6c06":function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var i=function(e){return e}},"6ce3":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"sø._ma._ti._on._to._fr._lø.".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i går kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",ss:"%d sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",w:"en uke",ww:"%d uker",M:"en måned",MM:"%d måneder",y:"ett år",yy:"%d år"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return t}))},"6d40":function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var i=n("d82f");function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};if(r(this,e),!t)throw new TypeError("Failed to construct '".concat(this.constructor.name,"'. 1 argument required, ").concat(arguments.length," given."));Object(i["a"])(this,e.Defaults,this.constructor.Defaults,n,{type:t}),Object(i["d"])(this,{type:Object(i["l"])(),cancelable:Object(i["l"])(),nativeEvent:Object(i["l"])(),target:Object(i["l"])(),relatedTarget:Object(i["l"])(),vueTarget:Object(i["l"])(),componentId:Object(i["l"])()});var o=!1;this.preventDefault=function(){this.cancelable&&(o=!0)},Object(i["e"])(this,"defaultPrevented",{enumerable:!0,get:function(){return o}})}return a(e,null,[{key:"Defaults",get:function(){return{type:"",cancelable:!0,nativeEvent:null,target:null,relatedTarget:null,vueTarget:null,componentId:null}}}]),e}()},"6d79":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t={0:"-ші",1:"-ші",2:"-ші",3:"-ші",4:"-ші",5:"-ші",6:"-шы",7:"-ші",8:"-ші",9:"-шы",10:"-шы",20:"-шы",30:"-шы",40:"-шы",50:"-ші",60:"-шы",70:"-ші",80:"-ші",90:"-шы",100:"-ші"},n=e.defineLocale("kk",{months:"қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан".split("_"),monthsShort:"қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел".split("_"),weekdays:"жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі".split("_"),weekdaysShort:"жек_дүй_сей_сәр_бей_жұм_сен".split("_"),weekdaysMin:"жк_дй_сй_ср_бй_жм_сн".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Бүгін сағат] LT",nextDay:"[Ертең сағат] LT",nextWeek:"dddd [сағат] LT",lastDay:"[Кеше сағат] LT",lastWeek:"[Өткен аптаның] dddd [сағат] LT",sameElse:"L"},relativeTime:{future:"%s ішінде",past:"%s бұрын",s:"бірнеше секунд",ss:"%d секунд",m:"бір минут",mm:"%d минут",h:"бір сағат",hh:"%d сағат",d:"бір күн",dd:"%d күн",M:"бір ай",MM:"%d ай",y:"бір жыл",yy:"%d жыл"},dayOfMonthOrdinalParse:/\d{1,2}-(ші|шы)/,ordinal:function(e){var n=e%10,i=e>=100?100:null;return e+(t[e]||t[n]||t[i])},week:{dow:1,doy:7}});return n}))},"6d83":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("ar-tn",{months:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:1,doy:4}});return t}))},"6e98":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:function(){return"[Oggi a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"},nextDay:function(){return"[Domani a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"},nextWeek:function(){return"dddd [a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"},lastDay:function(){return"[Ieri a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"},lastWeek:function(){switch(this.day()){case 0:return"[La scorsa] dddd [a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT";default:return"[Lo scorso] dddd [a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"}},sameElse:"L"},relativeTime:{future:"tra %s",past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",w:"una settimana",ww:"%d settimane",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return t}))},"6eeb":function(e,t,n){var i=n("da84"),r=n("9112"),o=n("5135"),a=n("ce4e"),s=n("8925"),c=n("69f3"),u=c.get,d=c.enforce,l=String(String).split("String");(e.exports=function(e,t,n,s){var c,u=!!s&&!!s.unsafe,f=!!s&&!!s.enumerable,h=!!s&&!!s.noTargetGet;"function"==typeof n&&("string"!=typeof t||o(n,"name")||r(n,"name",t),c=d(n),c.source||(c.source=l.join("string"==typeof t?t:""))),e!==i?(u?!h&&e[t]&&(f=!0):delete e[t],f?e[t]=n:r(e,t,n)):f?e[t]=n:a(t,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&u(this).source||s(this)}))},"6f12":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("it-ch",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(e){return(/^[0-9].+$/.test(e)?"tra":"in")+" "+e},past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return t}))},"6f50":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("en-nz",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10,n=1===~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+n},week:{dow:1,doy:4}});return t}))},7037:function(e,t,n){function i(t){return"function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?(e.exports=i=function(e){return typeof e},e.exports["default"]=e.exports,e.exports.__esModule=!0):(e.exports=i=function(e){return e&&"function"===typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e.exports["default"]=e.exports,e.exports.__esModule=!0),i(t)}n("a4d3"),n("e01a"),n("d3b7"),n("d28b"),n("3ca3"),n("ddb0"),e.exports=i,e.exports["default"]=e.exports,e.exports.__esModule=!0},7118:function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t="jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.".split("_"),n="jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),i=e.defineLocale("fy",{months:"jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber".split("_"),monthsShort:function(e,i){return e?/-MMM-/.test(i)?n[e.month()]:t[e.month()]:t},monthsParseExact:!0,weekdays:"snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon".split("_"),weekdaysShort:"si._mo._ti._wo._to._fr._so.".split("_"),weekdaysMin:"Si_Mo_Ti_Wo_To_Fr_So".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[hjoed om] LT",nextDay:"[moarn om] LT",nextWeek:"dddd [om] LT",lastDay:"[juster om] LT",lastWeek:"[ôfrûne] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oer %s",past:"%s lyn",s:"in pear sekonden",ss:"%d sekonden",m:"ien minút",mm:"%d minuten",h:"ien oere",hh:"%d oeren",d:"ien dei",dd:"%d dagen",M:"ien moanne",MM:"%d moannen",y:"ien jier",yy:"%d jierren"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}});return i}))},7156:function(e,t,n){var i=n("861d"),r=n("d2bb");e.exports=function(e,t,n){var o,a;return r&&"function"==typeof(o=t.constructor)&&o!==n&&i(a=o.prototype)&&a!==n.prototype&&r(e,a),e}},"72f0":function(e,t){function n(e){return function(){return e}}e.exports=n},7333:function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("en-il",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10,n=1===~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+n}});return t}))},7418:function(e,t){t.f=Object.getOwnPropertySymbols},"746f":function(e,t,n){var i=n("428f"),r=n("5135"),o=n("e538"),a=n("9bf2").f;e.exports=function(e){var t=i.Symbol||(i.Symbol={});r(t,e)||a(t,e,{value:o.f(e)})}},"74dc":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("sw",{months:"Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des".split("_"),weekdays:"Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi".split("_"),weekdaysShort:"Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos".split("_"),weekdaysMin:"J2_J3_J4_J5_Al_Ij_J1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"hh:mm A",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[leo saa] LT",nextDay:"[kesho saa] LT",nextWeek:"[wiki ijayo] dddd [saat] LT",lastDay:"[jana] LT",lastWeek:"[wiki iliyopita] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s baadaye",past:"tokea %s",s:"hivi punde",ss:"sekunde %d",m:"dakika moja",mm:"dakika %d",h:"saa limoja",hh:"masaa %d",d:"siku moja",dd:"siku %d",M:"mwezi mmoja",MM:"miezi %d",y:"mwaka mmoja",yy:"miaka %d"},week:{dow:1,doy:7}});return t}))},7839:function(e,t){e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},"7a77":function(e,t,n){"use strict";function i(e){this.message=e}i.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},i.prototype.__CANCEL__=!0,e.exports=i},"7aac":function(e,t,n){"use strict";var i=n("c532");e.exports=i.isStandardBrowserEnv()?function(){return{write:function(e,t,n,r,o,a){var s=[];s.push(e+"="+encodeURIComponent(t)),i.isNumber(n)&&s.push("expires="+new Date(n).toGMTString()),i.isString(r)&&s.push("path="+r),i.isString(o)&&s.push("domain="+o),!0===a&&s.push("secure"),document.cookie=s.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}()},"7b0b":function(e,t,n){var i=n("1d80");e.exports=function(e){return Object(i(e))}},"7b1e":function(e,t,n){"use strict";n.d(t,"o",(function(){return c})),n.d(t,"g",(function(){return u})),n.d(t,"p",(function(){return d})),n.d(t,"f",(function(){return l})),n.d(t,"b",(function(){return f})),n.d(t,"n",(function(){return h})),n.d(t,"h",(function(){return p})),n.d(t,"i",(function(){return m})),n.d(t,"a",(function(){return b})),n.d(t,"j",(function(){return g})),n.d(t,"k",(function(){return v})),n.d(t,"c",(function(){return y})),n.d(t,"d",(function(){return _})),n.d(t,"e",(function(){return O})),n.d(t,"m",(function(){return j})),n.d(t,"l",(function(){return w}));var i=n("992e"),r=n("ca88");function o(e){return o="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"===typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}var a=function(e){return o(e)},s=function(e){return Object.prototype.toString.call(e).slice(8,-1)},c=function(e){return void 0===e},u=function(e){return null===e},d=function(e){return c(e)||u(e)},l=function(e){return"function"===a(e)},f=function(e){return"boolean"===a(e)},h=function(e){return"string"===a(e)},p=function(e){return"number"===a(e)},m=function(e){return i["s"].test(String(e))},b=function(e){return Array.isArray(e)},g=function(e){return null!==e&&"object"===o(e)},v=function(e){return"[object Object]"===Object.prototype.toString.call(e)},y=function(e){return e instanceof Date},_=function(e){return e instanceof Event},O=function(e){return e instanceof r["b"]},j=function(e){return"RegExp"===s(e)},w=function(e){return!d(e)&&l(e.then)&&l(e.catch)}},"7be6":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),n="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");function i(e){return e>1&&e<5}function r(e,t,n,r){var o=e+" ";switch(n){case"s":return t||r?"pár sekúnd":"pár sekundami";case"ss":return t||r?o+(i(e)?"sekundy":"sekúnd"):o+"sekundami";case"m":return t?"minúta":r?"minútu":"minútou";case"mm":return t||r?o+(i(e)?"minúty":"minút"):o+"minútami";case"h":return t?"hodina":r?"hodinu":"hodinou";case"hh":return t||r?o+(i(e)?"hodiny":"hodín"):o+"hodinami";case"d":return t||r?"deň":"dňom";case"dd":return t||r?o+(i(e)?"dni":"dní"):o+"dňami";case"M":return t||r?"mesiac":"mesiacom";case"MM":return t||r?o+(i(e)?"mesiace":"mesiacov"):o+"mesiacmi";case"y":return t||r?"rok":"rokom";case"yy":return t||r?o+(i(e)?"roky":"rokov"):o+"rokmi"}}var o=e.defineLocale("sk",{months:t,monthsShort:n,weekdays:"nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_št_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_št_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo štvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[včera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT";case 1:case 2:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 4:case 5:return"[minulý] dddd [o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:r,ss:r,m:r,mm:r,h:r,hh:r,d:r,dd:r,M:r,MM:r,y:r,yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return o}))},"7c73":function(e,t,n){var i,r=n("825a"),o=n("37e8"),a=n("7839"),s=n("d012"),c=n("1be4"),u=n("cc12"),d=n("f772"),l=">",f="<",h="prototype",p="script",m=d("IE_PROTO"),b=function(){},g=function(e){return f+p+l+e+f+"/"+p+l},v=function(e){e.write(g("")),e.close();var t=e.parentWindow.Object;return e=null,t},y=function(){var e,t=u("iframe"),n="java"+p+":";return t.style.display="none",c.appendChild(t),t.src=String(n),e=t.contentWindow.document,e.open(),e.write(g("document.F=Object")),e.close(),e.F},_=function(){try{i=document.domain&&new ActiveXObject("htmlfile")}catch(t){}_=i?v(i):y();var e=a.length;while(e--)delete _[h][a[e]];return _()};s[m]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(b[h]=r(e),n=new b,b[h]=null,n[m]=e):n=_(),void 0===t?n:o(n,t)}},"7db0":function(e,t,n){"use strict";var i=n("23e7"),r=n("b727").find,o=n("44d2"),a="find",s=!0;a in[]&&Array(1)[a]((function(){s=!1})),i({target:"Array",proto:!0,forced:s},{find:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}}),o(a)},"7dd0":function(e,t,n){"use strict";var i=n("23e7"),r=n("9ed3"),o=n("e163"),a=n("d2bb"),s=n("d44e"),c=n("9112"),u=n("6eeb"),d=n("b622"),l=n("c430"),f=n("3f8c"),h=n("ae93"),p=h.IteratorPrototype,m=h.BUGGY_SAFARI_ITERATORS,b=d("iterator"),g="keys",v="values",y="entries",_=function(){return this};e.exports=function(e,t,n,d,h,O,j){r(n,t,d);var w,k,M,x=function(e){if(e===h&&A)return A;if(!m&&e in T)return T[e];switch(e){case g:return function(){return new n(this,e)};case v:return function(){return new n(this,e)};case y:return function(){return new n(this,e)}}return function(){return new n(this)}},L=t+" Iterator",S=!1,T=e.prototype,D=T[b]||T["@@iterator"]||h&&T[h],A=!m&&D||x(h),P="Array"==t&&T.entries||D;if(P&&(w=o(P.call(new e)),p!==Object.prototype&&w.next&&(l||o(w)===p||(a?a(w,p):"function"!=typeof w[b]&&c(w,b,_)),s(w,L,!0,!0),l&&(f[L]=_))),h==v&&D&&D.name!==v&&(S=!0,A=function(){return D.call(this)}),l&&!j||T[b]===A||c(T,b,A),f[t]=A,h)if(k={values:x(v),keys:O?A:x(g),entries:x(y)},j)for(M in k)(m||S||!(M in T))&&u(T,M,k[M]);else i({target:t,proto:!0,forced:m||S},k);return k}},"7f33":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("yo",{months:"Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀".split("_"),monthsShort:"Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀".split("_"),weekdays:"Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta".split("_"),weekdaysShort:"Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá".split("_"),weekdaysMin:"Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Ònì ni] LT",nextDay:"[Ọ̀la ni] LT",nextWeek:"dddd [Ọsẹ̀ tón'bọ] [ni] LT",lastDay:"[Àna ni] LT",lastWeek:"dddd [Ọsẹ̀ tólọ́] [ni] LT",sameElse:"L"},relativeTime:{future:"ní %s",past:"%s kọjá",s:"ìsẹjú aayá die",ss:"aayá %d",m:"ìsẹjú kan",mm:"ìsẹjú %d",h:"wákati kan",hh:"wákati %d",d:"ọjọ́ kan",dd:"ọjọ́ %d",M:"osù kan",MM:"osù %d",y:"ọdún kan",yy:"ọdún %d"},dayOfMonthOrdinalParse:/ọjọ́\s\d{1,2}/,ordinal:"ọjọ́ %d",week:{dow:1,doy:4}});return t}))},"7f9a":function(e,t,n){var i=n("da84"),r=n("8925"),o=i.WeakMap;e.exports="function"===typeof o&&/native code/.test(r(o))},8155:function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -function t(e,t,n,i){var r=e+" ";switch(n){case"s":return t||i?"nekaj sekund":"nekaj sekundami";case"ss":return r+=1===e?t?"sekundo":"sekundi":2===e?t||i?"sekundi":"sekundah":e<5?t||i?"sekunde":"sekundah":"sekund",r;case"m":return t?"ena minuta":"eno minuto";case"mm":return r+=1===e?t?"minuta":"minuto":2===e?t||i?"minuti":"minutama":e<5?t||i?"minute":"minutami":t||i?"minut":"minutami",r;case"h":return t?"ena ura":"eno uro";case"hh":return r+=1===e?t?"ura":"uro":2===e?t||i?"uri":"urama":e<5?t||i?"ure":"urami":t||i?"ur":"urami",r;case"d":return t||i?"en dan":"enim dnem";case"dd":return r+=1===e?t||i?"dan":"dnem":2===e?t||i?"dni":"dnevoma":t||i?"dni":"dnevi",r;case"M":return t||i?"en mesec":"enim mesecem";case"MM":return r+=1===e?t||i?"mesec":"mesecem":2===e?t||i?"meseca":"mesecema":e<5?t||i?"mesece":"meseci":t||i?"mesecev":"meseci",r;case"y":return t||i?"eno leto":"enim letom";case"yy":return r+=1===e?t||i?"leto":"letom":2===e?t||i?"leti":"letoma":e<5?t||i?"leta":"leti":t||i?"let":"leti",r}}var n=e.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._čet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_če_pe_so".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[včeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prejšnjo] [nedeljo] [ob] LT";case 3:return"[prejšnjo] [sredo] [ob] LT";case 6:return"[prejšnjo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prejšnji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"čez %s",past:"pred %s",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return n}))},"81e9":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),n=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",t[7],t[8],t[9]];function i(e,t,n,i){var o="";switch(n){case"s":return i?"muutaman sekunnin":"muutama sekunti";case"ss":o=i?"sekunnin":"sekuntia";break;case"m":return i?"minuutin":"minuutti";case"mm":o=i?"minuutin":"minuuttia";break;case"h":return i?"tunnin":"tunti";case"hh":o=i?"tunnin":"tuntia";break;case"d":return i?"päivän":"päivä";case"dd":o=i?"päivän":"päivää";break;case"M":return i?"kuukauden":"kuukausi";case"MM":o=i?"kuukauden":"kuukautta";break;case"y":return i?"vuoden":"vuosi";case"yy":o=i?"vuoden":"vuotta";break}return o=r(e,i)+" "+o,o}function r(e,i){return e<10?i?n[e]:t[e]:e}var o=e.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:i,ss:i,m:i,mm:i,h:i,hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return o}))},8230:function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},n={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"},i=e.defineLocale("ar-sa",{months:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(e){return"م"===e},meridiem:function(e,t,n){return e<12?"ص":"م"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(e){return e.replace(/[١٢٣٤٥٦٧٨٩٠]/g,(function(e){return n[e]})).replace(/،/g,",")},postformat:function(e){return e.replace(/\d/g,(function(e){return t[e]})).replace(/,/g,"،")},week:{dow:0,doy:6}});return i}))},"825a":function(e,t,n){var i=n("861d");e.exports=function(e){if(!i(e))throw TypeError(String(e)+" is not an object");return e}},"83ab":function(e,t,n){var i=n("d039");e.exports=!i((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},"83b9":function(e,t,n){"use strict";var i=n("d925"),r=n("e683");e.exports=function(e,t){return e&&!i(t)?r(e,t):t}},8418:function(e,t,n){"use strict";var i=n("c04e"),r=n("9bf2"),o=n("5c6c");e.exports=function(e,t,n){var a=i(t);a in e?r.f(e,a,o(0,n)):e[a]=n}},"841c":function(e,t,n){"use strict";var i=n("d784"),r=n("825a"),o=n("1d80"),a=n("129f"),s=n("14c3");i("search",1,(function(e,t,n){return[function(t){var n=o(this),i=void 0==t?void 0:t[e];return void 0!==i?i.call(t,n):new RegExp(t)[e](String(n))},function(e){var i=n(t,e,this);if(i.done)return i.value;var o=r(e),c=String(this),u=o.lastIndex;a(u,0)||(o.lastIndex=0);var d=s(o,c);return a(o.lastIndex,u)||(o.lastIndex=u),null===d?-1:d.index}]}))},"84aa":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("bg",{months:"януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември".split("_"),monthsShort:"яну_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек".split("_"),weekdays:"неделя_понеделник_вторник_сряда_четвъртък_петък_събота".split("_"),weekdaysShort:"нед_пон_вто_сря_чет_пет_съб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[Днес в] LT",nextDay:"[Утре в] LT",nextWeek:"dddd [в] LT",lastDay:"[Вчера в] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Миналата] dddd [в] LT";case 1:case 2:case 4:case 5:return"[Миналия] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"след %s",past:"преди %s",s:"няколко секунди",ss:"%d секунди",m:"минута",mm:"%d минути",h:"час",hh:"%d часа",d:"ден",dd:"%d дена",w:"седмица",ww:"%d седмици",M:"месец",MM:"%d месеца",y:"година",yy:"%d години"},dayOfMonthOrdinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(e){var t=e%10,n=e%100;return 0===e?e+"-ев":0===n?e+"-ен":n>10&&n<20?e+"-ти":1===t?e+"-ви":2===t?e+"-ри":7===t||8===t?e+"-ми":e+"-ти"},week:{dow:1,doy:7}});return t}))},"857a":function(e,t,n){var i=n("1d80"),r=/"/g;e.exports=function(e,t,n,o){var a=String(i(e)),s="<"+t;return""!==n&&(s+=" "+n+'="'+String(o).replace(r,""")+'"'),s+">"+a+""}},"861d":function(e,t){e.exports=function(e){return"object"===typeof e?null!==e:"function"===typeof e}},8689:function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t={1:"၁",2:"၂",3:"၃",4:"၄",5:"၅",6:"၆",7:"၇",8:"၈",9:"၉",0:"၀"},n={"၁":"1","၂":"2","၃":"3","၄":"4","၅":"5","၆":"6","၇":"7","၈":"8","၉":"9","၀":"0"},i=e.defineLocale("my",{months:"ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ".split("_"),monthsShort:"ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ".split("_"),weekdays:"တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ".split("_"),weekdaysShort:"နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),weekdaysMin:"နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[ယနေ.] LT [မှာ]",nextDay:"[မနက်ဖြန်] LT [မှာ]",nextWeek:"dddd LT [မှာ]",lastDay:"[မနေ.က] LT [မှာ]",lastWeek:"[ပြီးခဲ့သော] dddd LT [မှာ]",sameElse:"L"},relativeTime:{future:"လာမည့် %s မှာ",past:"လွန်ခဲ့သော %s က",s:"စက္ကန်.အနည်းငယ်",ss:"%d စက္ကန့်",m:"တစ်မိနစ်",mm:"%d မိနစ်",h:"တစ်နာရီ",hh:"%d နာရီ",d:"တစ်ရက်",dd:"%d ရက်",M:"တစ်လ",MM:"%d လ",y:"တစ်နှစ်",yy:"%d နှစ်"},preparse:function(e){return e.replace(/[၁၂၃၄၅၆၇၈၉၀]/g,(function(e){return n[e]}))},postformat:function(e){return e.replace(/\d/g,(function(e){return t[e]}))},week:{dow:1,doy:4}});return i}))},8840:function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t=e.defineLocale("gl",{months:"xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro".split("_"),monthsShort:"xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"domingo_luns_martes_mércores_xoves_venres_sábado".split("_"),weekdaysShort:"dom._lun._mar._mér._xov._ven._sáb.".split("_"),weekdaysMin:"do_lu_ma_mé_xo_ve_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"ás":"á")+"] LT"},nextDay:function(){return"[mañá "+(1!==this.hours()?"ás":"á")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"ás":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"á":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"ás":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(e){return 0===e.indexOf("un")?"n"+e:"en "+e},past:"hai %s",s:"uns segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return t}))},8925:function(e,t,n){var i=n("c6cd"),r=Function.toString;"function"!=typeof i.inspectSource&&(i.inspectSource=function(e){return r.call(e)}),e.exports=i.inspectSource},"898b":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),i=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],r=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,o=e.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,i){return e?/-MMM-/.test(i)?n[e.month()]:t[e.month()]:t},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:i,longMonthsParse:i,shortMonthsParse:i,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4},invalidDate:"Fecha inválida"});return o}))},"8aa5":function(e,t,n){"use strict";var i=n("6547").charAt;e.exports=function(e,t,n){return t+(n?i(e,t).length:1)}},"8c18":function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var i=n("a026"),r=n("9b76"),o=n("365c"),a=n("2326"),s=i["default"].extend({methods:{hasNormalizedSlot:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:r["i"],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.$scopedSlots,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.$slots;return Object(o["a"])(e,t,n)},normalizeSlot:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:r["i"],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.$scopedSlots,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:this.$slots,s=Object(o["b"])(e,t,n,i);return s?Object(a["b"])(s):s}}})},"8c4e":function(e,t,n){"use strict";n.d(t,"a",(function(){return d}));var i=n("a026"),r=n("c9a9"),o=n("3c21"),a=n("d82f");function s(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var c=function(e){return!e||0===Object(a["h"])(e).length},u=function(e){return{handler:function(t,n){if(!Object(o["a"])(t,n))if(c(t)||c(n))this[e]=Object(r["a"])(t);else{for(var i in n)Object(a["g"])(t,i)||this.$delete(this.$data[e],i);for(var s in t)this.$set(this.$data[e],s,t[s])}}}},d=function(e,t){return i["default"].extend({data:function(){return s({},t,Object(r["a"])(this[e]))},watch:s({},e,u(t))})}},"8d32":function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n("a026"),r=n("be29");function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var a=i["default"].extend({computed:{scopedStyleAttrs:function(){var e=Object(r["a"])(this.$parent);return e?o({},e,""):{}}}})},"8d47":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -function t(e){return"undefined"!==typeof Function&&e instanceof Function||"[object Function]"===Object.prototype.toString.call(e)}var n=e.defineLocale("el",{monthsNominativeEl:"Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος".split("_"),monthsGenitiveEl:"Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου".split("_"),months:function(e,t){return e?"string"===typeof t&&/D/.test(t.substring(0,t.indexOf("MMMM")))?this._monthsGenitiveEl[e.month()]:this._monthsNominativeEl[e.month()]:this._monthsNominativeEl},monthsShort:"Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ".split("_"),weekdays:"Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο".split("_"),weekdaysShort:"Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_Τρ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(e,t,n){return e>11?n?"μμ":"ΜΜ":n?"πμ":"ΠΜ"},isPM:function(e){return"μ"===(e+"").toLowerCase()[0]},meridiemParse:/[ΠΜ]\.?Μ?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendarEl:{sameDay:"[Σήμερα {}] LT",nextDay:"[Αύριο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[το προηγούμενο] dddd [{}] LT";default:return"[την προηγούμενη] dddd [{}] LT"}},sameElse:"L"},calendar:function(e,n){var i=this._calendarEl[e],r=n&&n.hours();return t(i)&&(i=i.apply(n)),i.replace("{}",r%12===1?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s πριν",s:"λίγα δευτερόλεπτα",ss:"%d δευτερόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ώρα",hh:"%d ώρες",d:"μία μέρα",dd:"%d μέρες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χρόνος",yy:"%d χρόνια"},dayOfMonthOrdinalParse:/\d{1,2}η/,ordinal:"%dη",week:{dow:1,doy:4}});return n}))},"8d57":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t="styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),n="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_"),i=[/^sty/i,/^lut/i,/^mar/i,/^kwi/i,/^maj/i,/^cze/i,/^lip/i,/^sie/i,/^wrz/i,/^paź/i,/^lis/i,/^gru/i];function r(e){return e%10<5&&e%10>1&&~~(e/10)%10!==1}function o(e,t,n){var i=e+" ";switch(n){case"ss":return i+(r(e)?"sekundy":"sekund");case"m":return t?"minuta":"minutę";case"mm":return i+(r(e)?"minuty":"minut");case"h":return t?"godzina":"godzinę";case"hh":return i+(r(e)?"godziny":"godzin");case"ww":return i+(r(e)?"tygodnie":"tygodni");case"MM":return i+(r(e)?"miesiące":"miesięcy");case"yy":return i+(r(e)?"lata":"lat")}}var a=e.defineLocale("pl",{months:function(e,i){return e?/D MMMM/.test(i)?n[e.month()]:t[e.month()]:t},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),monthsParse:i,longMonthsParse:i,shortMonthsParse:i,weekdays:"niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_śr_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_Śr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Dziś o] LT",nextDay:"[Jutro o] LT",nextWeek:function(){switch(this.day()){case 0:return"[W niedzielę o] LT";case 2:return"[We wtorek o] LT";case 3:return"[W środę o] LT";case 6:return"[W sobotę o] LT";default:return"[W] dddd [o] LT"}},lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszłą niedzielę o] LT";case 3:return"[W zeszłą środę o] LT";case 6:return"[W zeszłą sobotę o] LT";default:return"[W zeszły] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",ss:o,m:o,mm:o,h:o,hh:o,d:"1 dzień",dd:"%d dni",w:"tydzień",ww:o,M:"miesiąc",MM:o,y:"rok",yy:o},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return a}))},"8d74":function(e,t,n){var i=n("4cef"),r=/^\s+/;function o(e){return e?e.slice(0,i(e)+1).replace(r,""):e}e.exports=o},"8df4":function(e,t,n){(function(e,t){t(n("c1df"))})(0,(function(e){"use strict"; -//! moment.js locale configuration -var t={1:"۱",2:"۲",3:"۳",4:"۴",5:"۵",6:"۶",7:"۷",8:"۸",9:"۹",0:"۰"},n={"۱":"1","۲":"2","۳":"3","۴":"4","۵":"5","۶":"6","۷":"7","۸":"8","۹":"9","۰":"0"},i=e.defineLocale("fa",{months:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ی_د_س_چ_پ_ج_ش".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/قبل از ظهر|بعد از ظهر/,isPM:function(e){return/بعد از ظهر/.test(e)},meridiem:function(e,t,n){return e<12?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[فردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چند ثانیه",ss:"%d ثانیه",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(e){return e.replace(/[۰-۹]/g,(function(e){return n[e]})).replace(/،/g,",")},postformat:function(e){return e.replace(/\d/g,(function(e){return t[e]})).replace(/,/g,"،")},dayOfMonthOrdinalParse:/\d{1,2}م/,ordinal:"%dم",week:{dow:6,doy:12}});return i}))},"8df4b":function(e,t,n){"use strict";var i=n("7a77");function r(e){if("function"!==typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise((function(e){t=e}));var n=this;e((function(e){n.reason||(n.reason=new i(e),t(n.reason))}))}r.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},r.source=function(){var e,t=new r((function(t){e=t}));return{token:t,cancel:e}},e.exports=r},"8e5f":function(e,t,n){!function(t,n){e.exports=n()}(0,(function(){return function(e){function t(i){if(n[i])return n[i].exports;var r=n[i]={i:i,l:!1,exports:{}};return e[i].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,i){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:i})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="/",t(t.s=60)}([function(e,t){var n=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(e,t,n){var i=n(49)("wks"),r=n(30),o=n(0).Symbol,a="function"==typeof o;(e.exports=function(e){return i[e]||(i[e]=a&&o[e]||(a?o:r)("Symbol."+e))}).store=i},function(e,t,n){var i=n(5);e.exports=function(e){if(!i(e))throw TypeError(e+" is not an object!");return e}},function(e,t,n){var i=n(0),r=n(10),o=n(8),a=n(6),s=n(11),c=function(e,t,n){var u,d,l,f,h=e&c.F,p=e&c.G,m=e&c.S,b=e&c.P,g=e&c.B,v=p?i:m?i[t]||(i[t]={}):(i[t]||{}).prototype,y=p?r:r[t]||(r[t]={}),_=y.prototype||(y.prototype={});for(u in p&&(n=t),n)d=!h&&v&&void 0!==v[u],l=(d?v:n)[u],f=g&&d?s(l,i):b&&"function"==typeof l?s(Function.call,l):l,v&&a(v,u,l,e&c.U),y[u]!=l&&o(y,u,f),b&&_[u]!=l&&(_[u]=l)};i.core=r,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,e.exports=c},function(e,t,n){e.exports=!n(7)((function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}))},function(e,t){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,t,n){var i=n(0),r=n(8),o=n(12),a=n(30)("src"),s=Function.toString,c=(""+s).split("toString");n(10).inspectSource=function(e){return s.call(e)},(e.exports=function(e,t,n,s){var u="function"==typeof n;u&&(o(n,"name")||r(n,"name",t)),e[t]!==n&&(u&&(o(n,a)||r(n,a,e[t]?""+e[t]:c.join(String(t)))),e===i?e[t]=n:s?e[t]?e[t]=n:r(e,t,n):(delete e[t],r(e,t,n)))})(Function.prototype,"toString",(function(){return"function"==typeof this&&this[a]||s.call(this)}))},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t,n){var i=n(13),r=n(25);e.exports=n(4)?function(e,t,n){return i.f(e,t,r(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t){var n=e.exports={version:"2.5.7"};"number"==typeof __e&&(__e=n)},function(e,t,n){var i=n(14);e.exports=function(e,t,n){if(i(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,i){return e.call(t,n,i)};case 3:return function(n,i,r){return e.call(t,n,i,r)}}return function(){return e.apply(t,arguments)}}},function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},function(e,t,n){var i=n(2),r=n(41),o=n(29),a=Object.defineProperty;t.f=n(4)?Object.defineProperty:function(e,t,n){if(i(e),t=o(t,!0),i(n),r)try{return a(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,t){e.exports={}},function(e,t){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,n){"use strict";var i=n(7);e.exports=function(e,t){return!!e&&i((function(){t?e.call(null,(function(){}),1):e.call(null)}))}},function(e,t,n){var i=n(23),r=n(16);e.exports=function(e){return i(r(e))}},function(e,t,n){var i=n(53),r=Math.min;e.exports=function(e){return e>0?r(i(e),9007199254740991):0}},function(e,t,n){var i=n(11),r=n(23),o=n(28),a=n(19),s=n(64);e.exports=function(e,t){var n=1==e,c=2==e,u=3==e,d=4==e,l=6==e,f=5==e||l,h=t||s;return function(t,s,p){for(var m,b,g=o(t),v=r(g),y=i(s,p,3),_=a(v.length),O=0,j=n?h(t,_):c?h(t,0):void 0;_>O;O++)if((f||O in v)&&(m=v[O],b=y(m,O,g),e))if(n)j[O]=b;else if(b)switch(e){case 3:return!0;case 5:return m;case 6:return O;case 2:j.push(m)}else if(d)return!1;return l?-1:u||d?d:j}}},function(e,t,n){var i=n(5),r=n(0).document,o=i(r)&&i(r.createElement);e.exports=function(e){return o?r.createElement(e):{}}},function(e,t){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t,n){var i=n(9);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==i(e)?e.split(""):Object(e)}},function(e,t){e.exports=!1},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){var i=n(13).f,r=n(12),o=n(1)("toStringTag");e.exports=function(e,t,n){e&&!r(e=n?e:e.prototype,o)&&i(e,o,{configurable:!0,value:t})}},function(e,t,n){var i=n(49)("keys"),r=n(30);e.exports=function(e){return i[e]||(i[e]=r(e))}},function(e,t,n){var i=n(16);e.exports=function(e){return Object(i(e))}},function(e,t,n){var i=n(5);e.exports=function(e,t){if(!i(e))return e;var n,r;if(t&&"function"==typeof(n=e.toString)&&!i(r=n.call(e)))return r;if("function"==typeof(n=e.valueOf)&&!i(r=n.call(e)))return r;if(!t&&"function"==typeof(n=e.toString)&&!i(r=n.call(e)))return r;throw TypeError("Can't convert object to primitive value")}},function(e,t){var n=0,i=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++n+i).toString(36))}},function(e,t,n){"use strict";var i=n(0),r=n(12),o=n(9),a=n(67),s=n(29),c=n(7),u=n(77).f,d=n(45).f,l=n(13).f,f=n(51).trim,h=i.Number,p=h,m=h.prototype,b="Number"==o(n(44)(m)),g="trim"in String.prototype,v=function(e){var t=s(e,!1);if("string"==typeof t&&t.length>2){t=g?t.trim():f(t,3);var n,i,r,o=t.charCodeAt(0);if(43===o||45===o){if(88===(n=t.charCodeAt(2))||120===n)return NaN}else if(48===o){switch(t.charCodeAt(1)){case 66:case 98:i=2,r=49;break;case 79:case 111:i=8,r=55;break;default:return+t}for(var a,c=t.slice(2),u=0,d=c.length;ur)return NaN;return parseInt(c,i)}}return+t};if(!h(" 0o1")||!h("0b1")||h("+0x1")){h=function(e){var t=arguments.length<1?0:e,n=this;return n instanceof h&&(b?c((function(){m.valueOf.call(n)})):"Number"!=o(n))?a(new p(v(t)),n,h):v(t)};for(var y,_=n(4)?u(p):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),O=0;_.length>O;O++)r(p,y=_[O])&&!r(h,y)&&l(h,y,d(p,y));h.prototype=m,m.constructor=h,n(6)(i,"Number",h)}},function(e,t,n){"use strict";function i(e){return 0!==e&&(!(!Array.isArray(e)||0!==e.length)||!e)}function r(e){return function(){return!e.apply(void 0,arguments)}}function o(e,t){return void 0===e&&(e="undefined"),null===e&&(e="null"),!1===e&&(e="false"),-1!==e.toString().toLowerCase().indexOf(t.trim())}function a(e,t,n,i){return e.filter((function(e){return o(i(e,n),t)}))}function s(e){return e.filter((function(e){return!e.$isLabel}))}function c(e,t){return function(n){return n.reduce((function(n,i){return i[e]&&i[e].length?(n.push({$groupLabel:i[t],$isLabel:!0}),n.concat(i[e])):n}),[])}}function u(e,t,i,r,o){return function(s){return s.map((function(s){var c;if(!s[i])return console.warn("Options passed to vue-multiselect do not contain groups, despite the config."),[];var u=a(s[i],e,t,o);return u.length?(c={},n.i(p.a)(c,r,s[r]),n.i(p.a)(c,i,u),c):[]}))}}var d=n(59),l=n(54),f=(n.n(l),n(95)),h=(n.n(f),n(31)),p=(n.n(h),n(58)),m=n(91),b=(n.n(m),n(98)),g=(n.n(b),n(92)),v=(n.n(g),n(88)),y=(n.n(v),n(97)),_=(n.n(y),n(89)),O=(n.n(_),n(96)),j=(n.n(O),n(93)),w=(n.n(j),n(90)),k=(n.n(w),function(){for(var e=arguments.length,t=new Array(e),n=0;n-1},isSelected:function(e){var t=this.trackBy?e[this.trackBy]:e;return this.valueKeys.indexOf(t)>-1},isOptionDisabled:function(e){return!!e.$isDisabled},getOptionLabel:function(e){if(i(e))return"";if(e.isTag)return e.label;if(e.$isLabel)return e.$groupLabel;var t=this.customLabel(e,this.label);return i(t)?"":t},select:function(e,t){if(e.$isLabel&&this.groupSelect)this.selectGroup(e);else if(!(-1!==this.blockKeys.indexOf(t)||this.disabled||e.$isDisabled||e.$isLabel)&&(!this.max||!this.multiple||this.internalValue.length!==this.max)&&("Tab"!==t||this.pointerDirty)){if(e.isTag)this.$emit("tag",e.label,this.id),this.search="",this.closeOnSelect&&!this.multiple&&this.deactivate();else{if(this.isSelected(e))return void("Tab"!==t&&this.removeElement(e));this.$emit("select",e,this.id),this.multiple?this.$emit("input",this.internalValue.concat([e]),this.id):this.$emit("input",e,this.id),this.clearOnSelect&&(this.search="")}this.closeOnSelect&&this.deactivate()}},selectGroup:function(e){var t=this,n=this.options.find((function(n){return n[t.groupLabel]===e.$groupLabel}));if(n)if(this.wholeGroupSelected(n)){this.$emit("remove",n[this.groupValues],this.id);var i=this.internalValue.filter((function(e){return-1===n[t.groupValues].indexOf(e)}));this.$emit("input",i,this.id)}else{var r=n[this.groupValues].filter((function(e){return!(t.isOptionDisabled(e)||t.isSelected(e))}));this.$emit("select",r,this.id),this.$emit("input",this.internalValue.concat(r),this.id)}},wholeGroupSelected:function(e){var t=this;return e[this.groupValues].every((function(e){return t.isSelected(e)||t.isOptionDisabled(e)}))},wholeGroupDisabled:function(e){return e[this.groupValues].every(this.isOptionDisabled)},removeElement:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(!this.disabled&&!e.$isDisabled){if(!this.allowEmpty&&this.internalValue.length<=1)return void this.deactivate();var i="object"===n.i(d.a)(e)?this.valueKeys.indexOf(e[this.trackBy]):this.valueKeys.indexOf(e);if(this.$emit("remove",e,this.id),this.multiple){var r=this.internalValue.slice(0,i).concat(this.internalValue.slice(i+1));this.$emit("input",r,this.id)}else this.$emit("input",null,this.id);this.closeOnSelect&&t&&this.deactivate()}},removeLastElement:function(){-1===this.blockKeys.indexOf("Delete")&&0===this.search.length&&Array.isArray(this.internalValue)&&this.internalValue.length&&this.removeElement(this.internalValue[this.internalValue.length-1],!1)},activate:function(){var e=this;this.isOpen||this.disabled||(this.adjustPosition(),this.groupValues&&0===this.pointer&&this.filteredOptions.length&&(this.pointer=1),this.isOpen=!0,this.searchable?(this.preserveSearch||(this.search=""),this.$nextTick((function(){return e.$refs.search.focus()}))):this.$el.focus(),this.$emit("open",this.id))},deactivate:function(){this.isOpen&&(this.isOpen=!1,this.searchable?this.$refs.search.blur():this.$el.blur(),this.preserveSearch||(this.search=""),this.$emit("close",this.getValue(),this.id))},toggle:function(){this.isOpen?this.deactivate():this.activate()},adjustPosition:function(){if("undefined"!=typeof window){var e=this.$el.getBoundingClientRect().top,t=window.innerHeight-this.$el.getBoundingClientRect().bottom;t>this.maxHeight||t>e||"below"===this.openDirection||"bottom"===this.openDirection?(this.preferredOpenDirection="below",this.optimizedHeight=Math.min(t-40,this.maxHeight)):(this.preferredOpenDirection="above",this.optimizedHeight=Math.min(e-40,this.maxHeight))}}}}},function(e,t,n){"use strict";var i=n(54),r=(n.n(i),n(31));n.n(r),t.a={data:function(){return{pointer:0,pointerDirty:!1}},props:{showPointer:{type:Boolean,default:!0},optionHeight:{type:Number,default:40}},computed:{pointerPosition:function(){return this.pointer*this.optionHeight},visibleElements:function(){return this.optimizedHeight/this.optionHeight}},watch:{filteredOptions:function(){this.pointerAdjust()},isOpen:function(){this.pointerDirty=!1}},methods:{optionHighlight:function(e,t){return{"multiselect__option--highlight":e===this.pointer&&this.showPointer,"multiselect__option--selected":this.isSelected(t)}},groupHighlight:function(e,t){var n=this;if(!this.groupSelect)return["multiselect__option--group","multiselect__option--disabled"];var i=this.options.find((function(e){return e[n.groupLabel]===t.$groupLabel}));return i&&!this.wholeGroupDisabled(i)?["multiselect__option--group",{"multiselect__option--highlight":e===this.pointer&&this.showPointer},{"multiselect__option--group-selected":this.wholeGroupSelected(i)}]:"multiselect__option--disabled"},addPointerElement:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"Enter",t=e.key;this.filteredOptions.length>0&&this.select(this.filteredOptions[this.pointer],t),this.pointerReset()},pointerForward:function(){this.pointer0?(this.pointer--,this.$refs.list.scrollTop>=this.pointerPosition&&(this.$refs.list.scrollTop=this.pointerPosition),this.filteredOptions[this.pointer]&&this.filteredOptions[this.pointer].$isLabel&&!this.groupSelect&&this.pointerBackward()):this.filteredOptions[this.pointer]&&this.filteredOptions[0].$isLabel&&!this.groupSelect&&this.pointerForward(),this.pointerDirty=!0},pointerReset:function(){this.closeOnSelect&&(this.pointer=0,this.$refs.list&&(this.$refs.list.scrollTop=0))},pointerAdjust:function(){this.pointer>=this.filteredOptions.length-1&&(this.pointer=this.filteredOptions.length?this.filteredOptions.length-1:0),this.filteredOptions.length>0&&this.filteredOptions[this.pointer].$isLabel&&!this.groupSelect&&this.pointerForward()},pointerSet:function(e){this.pointer=e,this.pointerDirty=!0}}}},function(e,t,n){"use strict";var i=n(36),r=n(74),o=n(15),a=n(18);e.exports=n(72)(Array,"Array",(function(e,t){this._t=a(e),this._i=0,this._k=t}),(function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,r(1)):r(0,"keys"==t?n:"values"==t?e[n]:[n,e[n]])}),"values"),o.Arguments=o.Array,i("keys"),i("values"),i("entries")},function(e,t,n){"use strict";var i=n(31),r=(n.n(i),n(32)),o=n(33);t.a={name:"vue-multiselect",mixins:[r.a,o.a],props:{name:{type:String,default:""},selectLabel:{type:String,default:"Press enter to select"},selectGroupLabel:{type:String,default:"Press enter to select group"},selectedLabel:{type:String,default:"Selected"},deselectLabel:{type:String,default:"Press enter to remove"},deselectGroupLabel:{type:String,default:"Press enter to deselect group"},showLabels:{type:Boolean,default:!0},limit:{type:Number,default:99999},maxHeight:{type:Number,default:300},limitText:{type:Function,default:function(e){return"and ".concat(e," more")}},loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},openDirection:{type:String,default:""},showNoOptions:{type:Boolean,default:!0},showNoResults:{type:Boolean,default:!0},tabindex:{type:Number,default:0}},computed:{isSingleLabelVisible:function(){return(this.singleValue||0===this.singleValue)&&(!this.isOpen||!this.searchable)&&!this.visibleValues.length},isPlaceholderVisible:function(){return!(this.internalValue.length||this.searchable&&this.isOpen)},visibleValues:function(){return this.multiple?this.internalValue.slice(0,this.limit):[]},singleValue:function(){return this.internalValue[0]},deselectLabelText:function(){return this.showLabels?this.deselectLabel:""},deselectGroupLabelText:function(){return this.showLabels?this.deselectGroupLabel:""},selectLabelText:function(){return this.showLabels?this.selectLabel:""},selectGroupLabelText:function(){return this.showLabels?this.selectGroupLabel:""},selectedLabelText:function(){return this.showLabels?this.selectedLabel:""},inputStyle:function(){if(this.searchable||this.multiple&&this.value&&this.value.length)return this.isOpen?{width:"100%"}:{width:"0",position:"absolute",padding:"0"}},contentStyle:function(){return this.options.length?{display:"inline-block"}:{display:"block"}},isAbove:function(){return"above"===this.openDirection||"top"===this.openDirection||"below"!==this.openDirection&&"bottom"!==this.openDirection&&"above"===this.preferredOpenDirection},showSearchInput:function(){return this.searchable&&(!this.hasSingleSelectedSlot||!this.visibleSingleValue&&0!==this.visibleSingleValue||this.isOpen)}}}},function(e,t,n){var i=n(1)("unscopables"),r=Array.prototype;void 0==r[i]&&n(8)(r,i,{}),e.exports=function(e){r[i][e]=!0}},function(e,t,n){var i=n(18),r=n(19),o=n(85);e.exports=function(e){return function(t,n,a){var s,c=i(t),u=r(c.length),d=o(a,u);if(e&&n!=n){for(;u>d;)if((s=c[d++])!=s)return!0}else for(;u>d;d++)if((e||d in c)&&c[d]===n)return e||d||0;return!e&&-1}}},function(e,t,n){var i=n(9),r=n(1)("toStringTag"),o="Arguments"==i(function(){return arguments}()),a=function(e,t){try{return e[t]}catch(e){}};e.exports=function(e){var t,n,s;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=a(t=Object(e),r))?n:o?i(t):"Object"==(s=i(t))&&"function"==typeof t.callee?"Arguments":s}},function(e,t,n){"use strict";var i=n(2);e.exports=function(){var e=i(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t}},function(e,t,n){var i=n(0).document;e.exports=i&&i.documentElement},function(e,t,n){e.exports=!n(4)&&!n(7)((function(){return 7!=Object.defineProperty(n(21)("div"),"a",{get:function(){return 7}}).a}))},function(e,t,n){var i=n(9);e.exports=Array.isArray||function(e){return"Array"==i(e)}},function(e,t,n){"use strict";function i(e){var t,n;this.promise=new e((function(e,i){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=i})),this.resolve=r(t),this.reject=r(n)}var r=n(14);e.exports.f=function(e){return new i(e)}},function(e,t,n){var i=n(2),r=n(76),o=n(22),a=n(27)("IE_PROTO"),s=function(){},c=function(){var e,t=n(21)("iframe"),i=o.length;for(t.style.display="none",n(40).appendChild(t),t.src="javascript:",e=t.contentWindow.document,e.open(),e.write(" \ No newline at end of file diff --git a/cookbook/static/vue/manifest.json b/cookbook/static/vue/manifest.json deleted file mode 100644 index 53e6f136..00000000 --- a/cookbook/static/vue/manifest.json +++ /dev/null @@ -1 +0,0 @@ -{"name":"Recipes","short_name":"Recipes","theme_color":"#4DBA87","icons":[{"src":"./img/icons/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"./img/icons/android-chrome-512x512.png","sizes":"512x512","type":"image/png"},{"src":"./img/icons/android-chrome-maskable-192x192.png","sizes":"192x192","type":"image/png","purpose":"maskable"},{"src":"./img/icons/android-chrome-maskable-512x512.png","sizes":"512x512","type":"image/png","purpose":"maskable"}],"start_url":".","display":"standalone","background_color":"#000000"} \ No newline at end of file diff --git a/cookbook/static/vue/offline_view.html b/cookbook/static/vue/offline_view.html deleted file mode 100644 index d9cd2679..00000000 --- a/cookbook/static/vue/offline_view.html +++ /dev/null @@ -1 +0,0 @@ -Vue App
\ No newline at end of file diff --git a/cookbook/static/vue/recipe_search_view.html b/cookbook/static/vue/recipe_search_view.html deleted file mode 100644 index 328da15e..00000000 --- a/cookbook/static/vue/recipe_search_view.html +++ /dev/null @@ -1 +0,0 @@ -Vue App
\ No newline at end of file diff --git a/cookbook/static/vue/recipe_view.html b/cookbook/static/vue/recipe_view.html deleted file mode 100644 index 6a477fdd..00000000 --- a/cookbook/static/vue/recipe_view.html +++ /dev/null @@ -1 +0,0 @@ -Vue App
\ No newline at end of file diff --git a/cookbook/static/vue/supermarket_view.html b/cookbook/static/vue/supermarket_view.html deleted file mode 100644 index a31f517c..00000000 --- a/cookbook/static/vue/supermarket_view.html +++ /dev/null @@ -1 +0,0 @@ -Vue App
\ No newline at end of file diff --git a/cookbook/static/vue/user_file_view.html b/cookbook/static/vue/user_file_view.html deleted file mode 100644 index e44a7839..00000000 --- a/cookbook/static/vue/user_file_view.html +++ /dev/null @@ -1 +0,0 @@ -Vue App
\ No newline at end of file diff --git a/cookbook/tables.py b/cookbook/tables.py index d5070dba..1829c6f5 100644 --- a/cookbook/tables.py +++ b/cookbook/tables.py @@ -52,13 +52,13 @@ class RecipeTable(tables.Table): ) -class IngredientTable(tables.Table): - id = tables.LinkColumn('edit_food', args=[A('id')]) +# class IngredientTable(tables.Table): +# id = tables.LinkColumn('edit_food', args=[A('id')]) - class Meta: - model = Keyword - template_name = 'generic/table_template.html' - fields = ('id', 'name') +# class Meta: +# model = Keyword +# template_name = 'generic/table_template.html' +# fields = ('id', 'name') class StorageTable(tables.Table): diff --git a/cookbook/templates/account/login.html b/cookbook/templates/account/login.html index fee09f1c..2d5be9a2 100644 --- a/cookbook/templates/account/login.html +++ b/cookbook/templates/account/login.html @@ -19,7 +19,7 @@
-
+
@@ -44,7 +48,7 @@ {% if socialaccount_providers %}
-
+
{% trans "Social Login" %}
{% trans 'You can use any of the following providers to sign in.' %} @@ -62,5 +66,8 @@
{% endif %} + {% endblock %} \ No newline at end of file diff --git a/cookbook/templates/account/password_reset_from_key.html b/cookbook/templates/account/password_reset_from_key.html new file mode 100644 index 00000000..efbe6e13 --- /dev/null +++ b/cookbook/templates/account/password_reset_from_key.html @@ -0,0 +1,42 @@ +{% extends "base.html" %} +{% load crispy_forms_filters %} + +{% load i18n %} +{% load account %} + +{% block head_title %}{% trans "Change Password" %}{% endblock %} + +{% block content %} + +
+
+

{% if token_fail %}{% trans "Bad Token" %}{% else %}{% trans "Change Password" %}{% endif %}

+ {% if user.is_authenticated %} + {% include "account/snippets/already_logged_in.html" %} + {% endif %} +
+
+ +
+
+
+ {% if token_fail %} + {% url 'account_reset_password' as passwd_reset_url %} +

{% blocktrans %}The password reset link was invalid, possibly because it has already been used. + Please request a new password reset.{% endblocktrans %}

+ {% else %} + {% if form %} +
+ {% csrf_token %} + {{ form | crispy }} + +
+ {% else %} +

{% trans 'Your password is now changed.' %}

+ {% endif %} + {% endif %} +
+
+{% endblock %} + diff --git a/cookbook/templates/account/password_reset_from_key_done.html b/cookbook/templates/account/password_reset_from_key_done.html new file mode 100644 index 00000000..cde2cb7b --- /dev/null +++ b/cookbook/templates/account/password_reset_from_key_done.html @@ -0,0 +1,22 @@ +{% extends "base.html" %} + + +{% load i18n %} +{% load account %} + +{% block title %}{% trans "Change Password" %}{% endblock %} + +{% block content %} +
+
+
+

{% trans "Change Password" %}

+ + {% if user.is_authenticated %} + {% include "account/snippets/already_logged_in.html" %} + {% endif %} + +

{% trans 'Your password is now changed.' %}

+
+
+{% endblock %} \ No newline at end of file diff --git a/cookbook/templates/account/signup.html b/cookbook/templates/account/signup.html index 2750af97..baceb2cb 100644 --- a/cookbook/templates/account/signup.html +++ b/cookbook/templates/account/signup.html @@ -71,4 +71,8 @@
+ + {% endblock %} \ No newline at end of file diff --git a/cookbook/templates/base.html b/cookbook/templates/base.html index 45886ae7..4b10cf76 100644 --- a/cookbook/templates/base.html +++ b/cookbook/templates/base.html @@ -67,74 +67,27 @@ {% if not request.user.is_authenticated or request.user.userpreference.theme == request.user.userpreference.TANDOOR %} - + {% endif %}