diff --git a/.eslintrc.js b/.eslintrc.js
deleted file mode 100644
index b0c799d88..000000000
--- a/.eslintrc.js
+++ /dev/null
@@ -1,22 +0,0 @@
-module.exports = {
- root: true,
- "env": {
- "browser": true,
- "es6": true,
- node: true,
- },
- "extends": "eslint:recommended",
- "parserOptions": {
- "ecmaVersion": 6,
- "sourceType": "module"
- },
- "rules": {
- "curly": ["error", "all"],
- "dot-notation": "error",
- "eqeqeq": "error",
- "no-eval": "error",
- "no-var": "error",
- "prefer-const": "error",
- "semi": "error"
- }
-};
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 631ffac41..fd2dc52cb 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -1,4 +1,4 @@
-# Description
+#### Description
Please include a summary of the change and which issue is fixed. Please also
include relevant motivation and context. Your commit message should include
@@ -6,7 +6,7 @@ this information as well.
Fixes # (issue)
-# Checklist:
+#### Checklist:
- [ ] I have added the relevant tests for this change.
- [ ] I have added an item to the Pending section of ``docs/changes.rst``.
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 000000000..be006de9a
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,13 @@
+# Keep GitHub Actions up to date with GitHub's Dependabot...
+# https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot
+# https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#package-ecosystem
+version: 2
+updates:
+ - package-ecosystem: github-actions
+ directory: /
+ groups:
+ github-actions:
+ patterns:
+ - "*" # Group all Actions updates into a single larger pull request
+ schedule:
+ interval: weekly
diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml
new file mode 100644
index 000000000..a0722f0ac
--- /dev/null
+++ b/.github/workflows/coverage.yml
@@ -0,0 +1,33 @@
+# .github/workflows/coverage.yml
+name: Post coverage comment
+
+on:
+ workflow_run:
+ workflows: ["Test"]
+ types:
+ - completed
+
+jobs:
+ test:
+ name: Run tests & display coverage
+ runs-on: ubuntu-latest
+ if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success'
+ permissions:
+ # Gives the action the necessary permissions for publishing new
+ # comments in pull requests.
+ pull-requests: write
+ # Gives the action the necessary permissions for editing existing
+ # comments (to avoid publishing multiple comments in the same PR)
+ contents: write
+ # Gives the action the necessary permissions for looking up the
+ # workflow that launched this workflow, and download the related
+ # artifact that contains the comment to be published
+ actions: read
+ steps:
+ # DO NOT run actions/checkout here, for security reasons
+ # For details, refer to https://securitylab.github.com/research/github-actions-preventing-pwn-requests/
+ - name: Post comment
+ uses: py-cov-action/python-coverage-comment-action@v3
+ with:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ GITHUB_PR_RUN_ID: ${{ github.event.workflow_run.id }}
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 2059d37f8..5e61d05bc 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -1,40 +1,120 @@
-name: Release
+name: Publish Python 🐍 distribution 📦 to PyPI and TestPyPI
-on:
- push:
- tags:
- - '*'
+on: push
+
+env:
+ PYPI_URL: https://pypi.org/p/django-debug-toolbar
+ PYPI_TEST_URL: https://test.pypi.org/p/django-debug-toolbar
jobs:
+
build:
- if: github.repository == 'jazzband/django-debug-toolbar'
+ name: Build distribution 📦
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
+ - name: Set up Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: "3.x"
+ - name: Install pypa/build
+ run:
+ python3 -m pip install build --user
+ - name: Build a binary wheel and a source tarball
+ run: python3 -m build
+ - name: Store the distribution packages
+ uses: actions/upload-artifact@v4
+ with:
+ name: python-package-distributions
+ path: dist/
+
+ publish-to-pypi:
+ name: >-
+ Publish Python 🐍 distribution 📦 to PyPI
+ if: startsWith(github.ref, 'refs/tags/') # only publish to PyPI on tag pushes
+ needs:
+ - build
+ runs-on: ubuntu-latest
+ environment:
+ name: pypi
+ url: ${{ env.PYPI_URL }}
+ permissions:
+ id-token: write # IMPORTANT: mandatory for trusted publishing
+ steps:
+ - name: Download all the dists
+ uses: actions/download-artifact@v4
+ with:
+ name: python-package-distributions
+ path: dist/
+ - name: Publish distribution 📦 to PyPI
+ uses: pypa/gh-action-pypi-publish@release/v1.12
+
+ github-release:
+ name: >-
+ Sign the Python 🐍 distribution 📦 with Sigstore
+ and upload them to GitHub Release
+ needs:
+ - publish-to-pypi
+ runs-on: ubuntu-latest
+
+ permissions:
+ contents: write # IMPORTANT: mandatory for making GitHub Releases
+ id-token: write # IMPORTANT: mandatory for sigstore
+
+ steps:
+ - name: Download all the dists
+ uses: actions/download-artifact@v4
+ with:
+ name: python-package-distributions
+ path: dist/
+ - name: Sign the dists with Sigstore
+ uses: sigstore/gh-action-sigstore-python@v3.0.0
+ with:
+ inputs: >-
+ ./dist/*.tar.gz
+ ./dist/*.whl
+ - name: Create GitHub Release
+ env:
+ GITHUB_TOKEN: ${{ github.token }}
+ run: >-
+ gh release create
+ '${{ github.ref_name }}'
+ --repo '${{ github.repository }}'
+ --notes ""
+ - name: Upload artifact signatures to GitHub Release
+ env:
+ GITHUB_TOKEN: ${{ github.token }}
+ # Upload to GitHub Release using the `gh` CLI.
+ # `dist/` contains the built packages, and the
+ # sigstore-produced signatures and certificates.
+ run: >-
+ gh release upload
+ '${{ github.ref_name }}' dist/**
+ --repo '${{ github.repository }}'
+
+ publish-to-testpypi:
+ name: Publish Python 🐍 distribution 📦 to TestPyPI
+ if: startsWith(github.ref, 'refs/tags/') # only publish to Test PyPI on tag pushes
+ needs:
+ - build
runs-on: ubuntu-latest
+ environment:
+ name: testpypi
+ url: ${{ env.PYPI_TEST_URL }}
+
+ permissions:
+ id-token: write # IMPORTANT: mandatory for trusted publishing
+
steps:
- - uses: actions/checkout@v4
- with:
- fetch-depth: 0
-
- - name: Set up Python
- uses: actions/setup-python@v4
- with:
- python-version: 3.8
-
- - name: Install dependencies
- run: |
- python -m pip install -U pip
- python -m pip install -U build hatchling twine
-
- - name: Build package
- run: |
- hatchling version
- python -m build
- twine check dist/*
-
- - name: Upload packages to Jazzband
- if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags')
- uses: pypa/gh-action-pypi-publish@release/v1
- with:
- user: jazzband
- password: ${{ secrets.JAZZBAND_RELEASE_KEY }}
- repository_url: https://jazzband.co/projects/django-debug-toolbar/upload
+ - name: Download all the dists
+ uses: actions/download-artifact@v4
+ with:
+ name: python-package-distributions
+ path: dist/
+ - name: Publish distribution 📦 to TestPyPI
+ uses: pypa/gh-action-pypi-publish@release/v1.12
+ with:
+ repository-url: https://test.pypi.org/legacy/
+ skip-existing: true
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index cb28e217e..a2ded4678 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -14,7 +14,7 @@ jobs:
fail-fast: false
max-parallel: 5
matrix:
- python-version: ['3.8', '3.9', '3.10', '3.11', '3.12']
+ python-version: ['3.9', '3.10', '3.11', '3.12', '3.13']
services:
mariadb:
@@ -33,7 +33,7 @@ jobs:
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
- uses: actions/setup-python@v4
+ uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
allow-prereleases: true
@@ -44,7 +44,7 @@ jobs:
echo "dir=$(pip cache dir)" >> $GITHUB_OUTPUT
- name: Cache
- uses: actions/cache@v3
+ uses: actions/cache@v4
with:
path: ${{ steps.pip-cache.outputs.dir }}
key:
@@ -66,11 +66,6 @@ jobs:
DB_HOST: 127.0.0.1
DB_PORT: 3306
- - name: Upload coverage data
- uses: actions/upload-artifact@v3
- with:
- name: coverage-data
- path: ".coverage.*"
postgres:
runs-on: ubuntu-latest
@@ -78,7 +73,8 @@ jobs:
fail-fast: false
max-parallel: 5
matrix:
- python-version: ['3.8', '3.9', '3.10', '3.11', '3.12']
+ # Skip 3.13 here, it needs the psycopg3 / postgis3 database
+ python-version: ['3.9', '3.10', '3.11', '3.12']
database: [postgresql, postgis]
# Add psycopg3 to our matrix for modern python versions
include:
@@ -88,6 +84,10 @@ jobs:
database: psycopg3
- python-version: '3.12'
database: psycopg3
+ - python-version: '3.13'
+ database: psycopg3
+ - python-version: '3.13'
+ database: postgis3
services:
postgres:
@@ -108,7 +108,7 @@ jobs:
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
- uses: actions/setup-python@v4
+ uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
allow-prereleases: true
@@ -119,7 +119,7 @@ jobs:
echo "dir=$(pip cache dir)" >> $GITHUB_OUTPUT
- name: Cache
- uses: actions/cache@v3
+ uses: actions/cache@v4
with:
path: ${{ steps.pip-cache.outputs.dir }}
key:
@@ -144,25 +144,19 @@ jobs:
DB_HOST: localhost
DB_PORT: 5432
- - name: Upload coverage data
- uses: actions/upload-artifact@v3
- with:
- name: coverage-data
- path: ".coverage.*"
-
sqlite:
runs-on: ubuntu-latest
strategy:
fail-fast: false
max-parallel: 5
matrix:
- python-version: ['3.8', '3.9', '3.10', '3.11', '3.12']
+ python-version: ['3.9', '3.10', '3.11', '3.12', '3.13']
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
- uses: actions/setup-python@v4
+ uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
allow-prereleases: true
@@ -173,7 +167,7 @@ jobs:
echo "dir=$(pip cache dir)" >> $GITHUB_OUTPUT
- name: Cache
- uses: actions/cache@v3
+ uses: actions/cache@v4
with:
path: ${{ steps.pip-cache.outputs.dir }}
key:
@@ -192,43 +186,6 @@ jobs:
DB_BACKEND: sqlite3
DB_NAME: ":memory:"
- - name: Upload coverage data
- uses: actions/upload-artifact@v3
- with:
- name: coverage-data
- path: ".coverage.*"
-
- coverage:
- name: Check coverage.
- runs-on: "ubuntu-latest"
- needs: [sqlite, mysql, postgres]
- steps:
- - uses: actions/checkout@v4
- - uses: actions/setup-python@v4
- with:
- # Use latest, so it understands all syntax.
- python-version: "3.11"
-
- - run: python -m pip install --upgrade coverage[toml]
-
- - name: Download coverage data.
- uses: actions/download-artifact@v3
- with:
- name: coverage-data
-
- - name: Combine coverage & check percentage
- run: |
- python -m coverage combine
- python -m coverage html
- python -m coverage report
-
- - name: Upload HTML report if check failed.
- uses: actions/upload-artifact@v3
- with:
- name: html-report
- path: htmlcov
- if: ${{ failure() }}
-
lint:
runs-on: ubuntu-latest
strategy:
@@ -238,9 +195,9 @@ jobs:
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
- uses: actions/setup-python@v4
+ uses: actions/setup-python@v5
with:
- python-version: 3.8
+ python-version: 3.9
- name: Get pip cache dir
id: pip-cache
@@ -248,7 +205,7 @@ jobs:
echo "dir=$(pip cache dir)" >> $GITHUB_OUTPUT
- name: Cache
- uses: actions/cache@v3
+ uses: actions/cache@v4
with:
path: ${{ steps.pip-cache.outputs.dir }}
key:
diff --git a/.gitignore b/.gitignore
index ee3559cc4..c89013a11 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,3 +12,6 @@ htmlcov
.tox
geckodriver.log
coverage.xml
+.direnv/
+.envrc
+venv
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index c2f93ac73..8c6115813 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,6 +1,6 @@
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v4.5.0
+ rev: v5.0.0
hooks:
- id: check-toml
- id: check-yaml
@@ -10,46 +10,40 @@ repos:
- id: file-contents-sorter
files: docs/spelling_wordlist.txt
- repo: https://github.com/pycqa/doc8
- rev: v1.1.1
+ rev: v1.1.2
hooks:
- id: doc8
- repo: https://github.com/adamchainz/django-upgrade
- rev: 1.15.0
+ rev: 1.25.0
hooks:
- id: django-upgrade
- args: [--target-version, "3.2"]
+ args: [--target-version, "4.2"]
+- repo: https://github.com/adamchainz/djade-pre-commit
+ rev: "1.4.0"
+ hooks:
+ - id: djade
+ args: [--target-version, "4.2"]
- repo: https://github.com/pre-commit/pygrep-hooks
rev: v1.10.0
hooks:
- id: rst-backticks
- id: rst-directive-colons
-- repo: https://github.com/pre-commit/mirrors-prettier
- rev: v4.0.0-alpha.8
- hooks:
- - id: prettier
- entry: env PRETTIER_LEGACY_CLI=1 prettier
- types_or: [javascript, css]
- args:
- - --trailing-comma=es5
-- repo: https://github.com/pre-commit/mirrors-eslint
- rev: v8.56.0
- hooks:
- - id: eslint
- files: \.js?$
- types: [file]
- args:
- - --fix
+- repo: https://github.com/biomejs/pre-commit
+ rev: v2.0.0-beta.5
+ hooks:
+ - id: biome-check
+ verbose: true
- repo: https://github.com/astral-sh/ruff-pre-commit
- rev: 'v0.1.11'
+ rev: 'v0.11.12'
hooks:
- id: ruff
args: [--fix, --exit-non-zero-on-fix]
- id: ruff-format
- repo: https://github.com/tox-dev/pyproject-fmt
- rev: 1.5.3
+ rev: v2.6.0
hooks:
- id: pyproject-fmt
- repo: https://github.com/abravalheri/validate-pyproject
- rev: v0.15
+ rev: v0.24.1
hooks:
- id: validate-pyproject
diff --git a/.readthedocs.yaml b/.readthedocs.yaml
index 5843d0212..794f8b3ed 100644
--- a/.readthedocs.yaml
+++ b/.readthedocs.yaml
@@ -5,7 +5,7 @@
version: 2
build:
- os: ubuntu-22.04
+ os: ubuntu-24.04
tools:
python: "3.10"
diff --git a/.tx/config b/.tx/config
index 5c9ecc129..15e624db3 100644
--- a/.tx/config
+++ b/.tx/config
@@ -1,8 +1,10 @@
[main]
-host = https://www.transifex.com
-lang_map = sr@latin:sr_Latn
+host = https://www.transifex.com
+lang_map = sr@latin: sr_Latn
-[django-debug-toolbar.main]
-file_filter = debug_toolbar/locale//LC_MESSAGES/django.po
-source_file = debug_toolbar/locale/en/LC_MESSAGES/django.po
-source_lang = en
+[o:django-debug-toolbar:p:django-debug-toolbar:r:main]
+file_filter = debug_toolbar/locale//LC_MESSAGES/django.po
+source_file = debug_toolbar/locale/en/LC_MESSAGES/django.po
+source_lang = en
+replace_edited_strings = false
+keep_translations = false
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
index e0d5efab5..5fedea529 100644
--- a/CODE_OF_CONDUCT.md
+++ b/CODE_OF_CONDUCT.md
@@ -1,46 +1,3 @@
-# Code of Conduct
+# Django Debug Toolbar Code of Conduct
-As contributors and maintainers of the Jazzband projects, and in the interest of
-fostering an open and welcoming community, we pledge to respect all people who
-contribute through reporting issues, posting feature requests, updating documentation,
-submitting pull requests or patches, and other activities.
-
-We are committed to making participation in the Jazzband a harassment-free experience
-for everyone, regardless of the level of experience, gender, gender identity and
-expression, sexual orientation, disability, personal appearance, body size, race,
-ethnicity, age, religion, or nationality.
-
-Examples of unacceptable behavior by participants include:
-
-- The use of sexualized language or imagery
-- Personal attacks
-- Trolling or insulting/derogatory comments
-- Public or private harassment
-- Publishing other's private information, such as physical or electronic addresses,
- without explicit permission
-- Other unethical or unprofessional conduct
-
-The Jazzband roadies have the right and responsibility to remove, edit, or reject
-comments, commits, code, wiki edits, issues, and other contributions that are not
-aligned to this Code of Conduct, or to ban temporarily or permanently any contributor
-for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
-
-By adopting this Code of Conduct, the roadies commit themselves to fairly and
-consistently applying these principles to every aspect of managing the jazzband
-projects. Roadies who do not follow or enforce the Code of Conduct may be permanently
-removed from the Jazzband roadies.
-
-This code of conduct applies both within project spaces and in public spaces when an
-individual is representing the project or its community.
-
-Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by
-contacting the roadies at `roadies@jazzband.co`. All complaints will be reviewed and
-investigated and will result in a response that is deemed necessary and appropriate to
-the circumstances. Roadies are obligated to maintain confidentiality with regard to the
-reporter of an incident.
-
-This Code of Conduct is adapted from the [Contributor Covenant][homepage], version
-1.3.0, available at [https://contributor-covenant.org/version/1/3/0/][version]
-
-[homepage]: https://contributor-covenant.org
-[version]: https://contributor-covenant.org/version/1/3/0/
+The django-debug-toolbar project utilizes the [Django Commons Code of Conduct](https://github.com/django-commons/membership/blob/main/CODE_OF_CONDUCT.md).
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 829a22ace..efc91ec2a 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,7 +1,11 @@
-[](https://jazzband.co/)
+# Contributing to Django Debug Toolbar
-This is a [Jazzband](https://jazzband.co/) project. By contributing you agree to abide by the [Contributor Code of Conduct](https://jazzband.co/about/conduct) and follow the [guidelines](https://jazzband.co/about/guidelines).
+This is a [Django Commons](https://github.com/django-commons/) project. By contributing you agree to abide by the [Contributor Code of Conduct](https://github.com/django-commons/membership/blob/main/CODE_OF_CONDUCT.md).
-Please see the
-[full contributing documentation](https://django-debug-toolbar.readthedocs.io/en/stable/contributing.html)
-for more help.
+## Documentation
+
+For detailed contributing guidelines, please see our [Documentation](https://django-debug-toolbar.readthedocs.io/en/latest/contributing.html).
+
+## Additional Resources
+
+Please see the [README](https://github.com/django-commons/membership/blob/main/README.md) for more help.
diff --git a/Makefile b/Makefile
index 1600496e5..4d2db27af 100644
--- a/Makefile
+++ b/Makefile
@@ -1,20 +1,24 @@
-.PHONY: example test coverage translatable_strings update_translations
+.PHONY: example test coverage translatable_strings update_translations help
+.DEFAULT_GOAL := help
-example:
+example: ## Run the example application
python example/manage.py migrate --noinput
-DJANGO_SUPERUSER_PASSWORD=p python example/manage.py createsuperuser \
--noinput --username="$(USER)" --email="$(USER)@mailinator.com"
python example/manage.py runserver
-test:
+example_test: ## Run the test suite for the example application
+ python example/manage.py test example
+
+test: ## Run the test suite
DJANGO_SETTINGS_MODULE=tests.settings \
python -m django test $${TEST_ARGS:-tests}
-test_selenium:
+test_selenium: ## Run frontend tests written with Selenium
DJANGO_SELENIUM_TESTS=true DJANGO_SETTINGS_MODULE=tests.settings \
python -m django test $${TEST_ARGS:-tests}
-coverage:
+coverage: ## Run the test suite with coverage enabled
python --version
DJANGO_SETTINGS_MODULE=tests.settings \
python -b -W always -m coverage run -m django test -v2 $${TEST_ARGS:-tests}
@@ -22,15 +26,19 @@ coverage:
coverage html
coverage xml
-translatable_strings:
+translatable_strings: ## Update the English '.po' file
cd debug_toolbar && python -m django makemessages -l en --no-obsolete
@echo "Please commit changes and run 'tx push -s' (or wait for Transifex to pick them)"
-update_translations:
+update_translations: ## Download updated '.po' files from Transifex
tx pull -a --minimum-perc=10
cd debug_toolbar && python -m django compilemessages
.PHONY: example/django-debug-toolbar.png
-example/django-debug-toolbar.png: example/screenshot.py
+example/django-debug-toolbar.png: example/screenshot.py ## Update the screenshot in 'README.rst'
python $< --browser firefox --headless -o $@
optipng $@
+
+help: ## Help message for targets
+ @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) \
+ | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
diff --git a/README.rst b/README.rst
index 0eaaa6bd3..6c7da3615 100644
--- a/README.rst
+++ b/README.rst
@@ -2,22 +2,18 @@
Django Debug Toolbar |latest-version|
=====================================
-|jazzband| |build-status| |coverage| |docs| |python-support| |django-support|
+|build-status| |coverage| |docs| |python-support| |django-support|
.. |latest-version| image:: https://img.shields.io/pypi/v/django-debug-toolbar.svg
:target: https://pypi.org/project/django-debug-toolbar/
:alt: Latest version on PyPI
-.. |jazzband| image:: https://jazzband.co/static/img/badge.svg
- :target: https://jazzband.co/
- :alt: Jazzband
-
-.. |build-status| image:: https://github.com/jazzband/django-debug-toolbar/workflows/Test/badge.svg
- :target: https://github.com/jazzband/django-debug-toolbar/actions
+.. |build-status| image:: https://github.com/django-commons/django-debug-toolbar/workflows/Test/badge.svg
+ :target: https://github.com/django-commons/django-debug-toolbar/actions/workflows/test.yml
:alt: Build Status
.. |coverage| image:: https://img.shields.io/badge/Coverage-94%25-green
- :target: https://github.com/jazzband/django-debug-toolbar/actions/workflows/test.yml?query=branch%3Amain
+ :target: https://github.com/django-commons/django-debug-toolbar/actions/workflows/test.yml?query=branch%3Amain
:alt: Test coverage status
.. |docs| image:: https://img.shields.io/readthedocs/django-debug-toolbar/latest.svg
@@ -38,17 +34,19 @@ more details about the panel's content.
Here's a screenshot of the toolbar in action:
-.. image:: https://raw.github.com/jazzband/django-debug-toolbar/main/example/django-debug-toolbar.png
+.. image:: https://raw.github.com/django-commons/django-debug-toolbar/main/example/django-debug-toolbar.png
:alt: Django Debug Toolbar screenshot
In addition to the built-in panels, a number of third-party panels are
contributed by the community.
-The current stable version of the Debug Toolbar is 4.1.0. It works on
-Django ≥ 3.2.4.
+The current stable version of the Debug Toolbar is 5.2.0. It works on
+Django ≥ 4.2.0.
-The Debug Toolbar does not currently support `Django's asynchronous views
- `_.
+The Debug Toolbar has experimental support for `Django's asynchronous views
+ `_. Please note that
+the Debug Toolbar still lacks the capability for handling concurrent requests.
+If you find any issues, please report them on the `issue tracker`_.
Documentation, including installation and configuration instructions, is
available at https://django-debug-toolbar.readthedocs.io/.
@@ -59,4 +57,5 @@ itself. If you like it, please consider contributing!
The Django Debug Toolbar was originally created by Rob Hudson
in August 2008 and was further developed by many contributors_.
-.. _contributors: https://github.com/jazzband/django-debug-toolbar/graphs/contributors
+.. _contributors: https://github.com/django-commons/django-debug-toolbar/graphs/contributors
+.. _issue tracker: https://github.com/django-commons/django-debug-toolbar/issues
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 000000000..31750a749
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,9 @@
+# Security Policy
+
+## Supported Versions
+
+Only the latest version of django-debug-toolbar [](https://pypi.python.org/pypi/django-debug-toolbar) is supported.
+
+## Reporting a Vulnerability
+
+If you think you have found a vulnerability, and even if you are not sure, please [report it to us in private](https://github.com/django-commons/django-debug-toolbar/security/advisories/new). We will review it and get back to you. Please refrain from public discussions of the issue.
diff --git a/biome.json b/biome.json
new file mode 100644
index 000000000..dc2776d79
--- /dev/null
+++ b/biome.json
@@ -0,0 +1,55 @@
+{
+ "$schema": "https://biomejs.dev/schemas/2.0.0-beta.5/schema.json",
+ "formatter": {
+ "enabled": true,
+ "useEditorconfig": true
+ },
+ "assist": {
+ "actions": {
+ "source": {
+ "organizeImports": "on"
+ }
+ }
+ },
+ "linter": {
+ "enabled": true,
+ "rules": {
+ "recommended": true,
+ "style": {
+ "useLiteralEnumMembers": "error",
+ "noCommaOperator": "error",
+ "useNodejsImportProtocol": "error",
+ "useAsConstAssertion": "error",
+ "useEnumInitializers": "error",
+ "useSelfClosingElements": "error",
+ "useConst": "error",
+ "useSingleVarDeclarator": "error",
+ "noUnusedTemplateLiteral": "error",
+ "useNumberNamespace": "error",
+ "noInferrableTypes": "error",
+ "useExponentiationOperator": "error",
+ "useTemplate": "error",
+ "noParameterAssign": "error",
+ "noNonNullAssertion": "error",
+ "useDefaultParameterLast": "error",
+ "noArguments": "error",
+ "useImportType": "error",
+ "useExportType": "error",
+ "noUselessElse": "error",
+ "useShorthandFunctionType": "error"
+ },
+ "suspicious": {
+ "noDocumentCookie": "off"
+ },
+ "complexity": {
+ "useNumericLiterals": "error"
+ }
+ }
+ },
+ "javascript": {
+ "formatter": {
+ "trailingCommas": "es5",
+ "quoteStyle": "double"
+ }
+ }
+}
diff --git a/debug_toolbar/__init__.py b/debug_toolbar/__init__.py
index 9a8c2b24f..770c5eeed 100644
--- a/debug_toolbar/__init__.py
+++ b/debug_toolbar/__init__.py
@@ -4,7 +4,7 @@
# Do not use pkg_resources to find the version but set it here directly!
# see issue #1446
-VERSION = "4.3.0"
+VERSION = "5.2.0"
# Code that discovers files or modules in INSTALLED_APPS imports this module.
urls = "debug_toolbar.urls", APP_NAME
diff --git a/debug_toolbar/_compat.py b/debug_toolbar/_compat.py
new file mode 100644
index 000000000..0e0ab8c1b
--- /dev/null
+++ b/debug_toolbar/_compat.py
@@ -0,0 +1,10 @@
+try:
+ from django.contrib.auth.decorators import login_not_required
+except ImportError:
+ # For Django < 5.1, copy the current Django implementation
+ def login_not_required(view_func):
+ """
+ Decorator for views that allows access to unauthenticated requests.
+ """
+ view_func.login_required = False
+ return view_func
diff --git a/debug_toolbar/_stubs.py b/debug_toolbar/_stubs.py
index 01d0b8637..c536a0fe7 100644
--- a/debug_toolbar/_stubs.py
+++ b/debug_toolbar/_stubs.py
@@ -1,4 +1,6 @@
-from typing import Any, List, NamedTuple, Optional, Tuple
+from __future__ import annotations
+
+from typing import Any, NamedTuple, Optional
from django import template as dj_template
@@ -12,7 +14,7 @@ class InspectStack(NamedTuple):
index: int
-TidyStackTrace = List[Tuple[str, int, str, str, Optional[Any]]]
+TidyStackTrace = list[tuple[str, int, str, str, Optional[Any]]]
class RenderContext(dj_template.context.RenderContext):
diff --git a/debug_toolbar/apps.py b/debug_toolbar/apps.py
index 0a10a4b08..a49875bac 100644
--- a/debug_toolbar/apps.py
+++ b/debug_toolbar/apps.py
@@ -3,12 +3,14 @@
from django.apps import AppConfig
from django.conf import settings
-from django.core.checks import Warning, register
+from django.core.checks import Error, Warning, register
from django.middleware.gzip import GZipMiddleware
+from django.urls import NoReverseMatch, reverse
from django.utils.module_loading import import_string
from django.utils.translation import gettext_lazy as _
-from debug_toolbar import settings as dt_settings
+from debug_toolbar import APP_NAME, settings as dt_settings
+from debug_toolbar.settings import CONFIG_DEFAULTS
class DebugToolbarConfig(AppConfig):
@@ -177,7 +179,7 @@ def check_panels(app_configs, **kwargs):
return errors
-@register()
+@register
def js_mimetype_check(app_configs, **kwargs):
"""
Check that JavaScript files are resolving to the correct content type.
@@ -206,3 +208,66 @@ def js_mimetype_check(app_configs, **kwargs):
)
]
return []
+
+
+@register
+def debug_toolbar_installed_when_running_tests_check(app_configs, **kwargs):
+ """
+ Check that the toolbar is not being used when tests are running
+ """
+ # Check if show toolbar callback has changed
+ show_toolbar_changed = (
+ dt_settings.get_config()["SHOW_TOOLBAR_CALLBACK"]
+ != CONFIG_DEFAULTS["SHOW_TOOLBAR_CALLBACK"]
+ )
+ try:
+ # Check if the toolbar's urls are installed
+ reverse(f"{APP_NAME}:render_panel")
+ toolbar_urls_installed = True
+ except NoReverseMatch:
+ toolbar_urls_installed = False
+
+ # If the user is using the default SHOW_TOOLBAR_CALLBACK,
+ # then the middleware will respect the change to settings.DEBUG.
+ # However, if the user has changed the callback to:
+ # DEBUG_TOOLBAR_CONFIG = {"SHOW_TOOLBAR_CALLBACK": lambda request: DEBUG}
+ # where DEBUG is not settings.DEBUG, then it won't pick up that Django'
+ # test runner has changed the value for settings.DEBUG, and the middleware
+ # will inject the toolbar, while the URLs aren't configured leading to a
+ # NoReverseMatch error.
+ likely_error_setup = show_toolbar_changed and not toolbar_urls_installed
+
+ if (
+ not settings.DEBUG
+ and dt_settings.get_config()["IS_RUNNING_TESTS"]
+ and likely_error_setup
+ ):
+ return [
+ Error(
+ "The Django Debug Toolbar can't be used with tests",
+ hint="Django changes the DEBUG setting to False when running "
+ "tests. By default the Django Debug Toolbar is installed because "
+ "DEBUG is set to True. For most cases, you need to avoid installing "
+ "the toolbar when running tests. If you feel this check is in error, "
+ "you can set `DEBUG_TOOLBAR_CONFIG['IS_RUNNING_TESTS'] = False` to "
+ "bypass this check.",
+ id="debug_toolbar.E001",
+ )
+ ]
+ else:
+ return []
+
+
+@register
+def check_settings(app_configs, **kwargs):
+ errors = []
+ USER_CONFIG = getattr(settings, "DEBUG_TOOLBAR_CONFIG", {})
+ if "OBSERVE_REQUEST_CALLBACK" in USER_CONFIG:
+ errors.append(
+ Warning(
+ "The deprecated OBSERVE_REQUEST_CALLBACK setting is present in DEBUG_TOOLBAR_CONFIG.",
+ hint="Use the UPDATE_ON_FETCH and/or SHOW_TOOLBAR_CALLBACK settings instead.",
+ id="debug_toolbar.W008",
+ )
+ )
+ return errors
diff --git a/debug_toolbar/decorators.py b/debug_toolbar/decorators.py
index 787282706..61e46490d 100644
--- a/debug_toolbar/decorators.py
+++ b/debug_toolbar/decorators.py
@@ -1,5 +1,6 @@
import functools
+from asgiref.sync import iscoroutinefunction
from django.http import Http404
from django.utils.translation import get_language, override as language_override
@@ -7,15 +8,30 @@
def require_show_toolbar(view):
- @functools.wraps(view)
- def inner(request, *args, **kwargs):
- from debug_toolbar.middleware import get_show_toolbar
+ """
+ Async compatible decorator to restrict access to a view
+ based on the Debug Toolbar's visibility settings.
+ """
+ from debug_toolbar.middleware import get_show_toolbar
+
+ if iscoroutinefunction(view):
- show_toolbar = get_show_toolbar()
- if not show_toolbar(request):
- raise Http404
+ @functools.wraps(view)
+ async def inner(request, *args, **kwargs):
+ show_toolbar = get_show_toolbar(async_mode=True)
+ if not await show_toolbar(request):
+ raise Http404
- return view(request, *args, **kwargs)
+ return await view(request, *args, **kwargs)
+ else:
+
+ @functools.wraps(view)
+ def inner(request, *args, **kwargs):
+ show_toolbar = get_show_toolbar(async_mode=False)
+ if not show_toolbar(request):
+ raise Http404
+
+ return view(request, *args, **kwargs)
return inner
diff --git a/debug_toolbar/locale/bg/LC_MESSAGES/django.mo b/debug_toolbar/locale/bg/LC_MESSAGES/django.mo
new file mode 100644
index 000000000..ae59298d5
Binary files /dev/null and b/debug_toolbar/locale/bg/LC_MESSAGES/django.mo differ
diff --git a/debug_toolbar/locale/bg/LC_MESSAGES/django.po b/debug_toolbar/locale/bg/LC_MESSAGES/django.po
new file mode 100644
index 000000000..d9fd766fe
--- /dev/null
+++ b/debug_toolbar/locale/bg/LC_MESSAGES/django.po
@@ -0,0 +1,705 @@
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+#
+# Translators:
+# arneatec , 2022
+msgid ""
+msgstr ""
+"Project-Id-Version: Django Debug Toolbar\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-08-06 07:12-0500\n"
+"PO-Revision-Date: 2010-11-30 00:00+0000\n"
+"Last-Translator: arneatec , 2022\n"
+"Language-Team: Bulgarian (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/bg/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: bg\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: apps.py:18
+msgid "Debug Toolbar"
+msgstr "Debug Toolbar"
+
+#: panels/alerts.py:67
+#, python-brace-format
+msgid ""
+"Form with id \"{form_id}\" contains file input, but does not have the "
+"attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:70
+msgid ""
+"Form contains file input, but does not have the attribute "
+"enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:73
+#, python-brace-format
+msgid ""
+"Input element references form with id \"{form_id}\", but the form does not "
+"have the attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:77
+msgid "Alerts"
+msgstr ""
+
+#: panels/cache.py:168
+msgid "Cache"
+msgstr "Кеш"
+
+#: panels/cache.py:174
+#, python-format
+msgid "%(cache_calls)d call in %(time).2fms"
+msgid_plural "%(cache_calls)d calls in %(time).2fms"
+msgstr[0] "%(cache_calls)d извикване за %(time).2fms"
+msgstr[1] "%(cache_calls)d извиквания за %(time).2fms"
+
+#: panels/cache.py:183
+#, python-format
+msgid "Cache calls from %(count)d backend"
+msgid_plural "Cache calls from %(count)d backends"
+msgstr[0] "Извиквания на кеша от %(count)d бекенд"
+msgstr[1] "Извиквания на кеша от %(count)d бекенда"
+
+#: panels/headers.py:31
+msgid "Headers"
+msgstr "Хедъри"
+
+#: panels/history/panel.py:19 panels/history/panel.py:20
+msgid "History"
+msgstr "История"
+
+#: panels/profiling.py:140
+msgid "Profiling"
+msgstr "Профилиране"
+
+#: panels/redirects.py:17
+msgid "Intercept redirects"
+msgstr "Прехвани пренасочвания"
+
+#: panels/request.py:16
+msgid "Request"
+msgstr "Заявка"
+
+#: panels/request.py:38
+msgid ""
+msgstr ""
+
+#: panels/request.py:55
+msgid ""
+msgstr ""
+
+#: panels/settings.py:17
+msgid "Settings"
+msgstr "Настройки"
+
+#: panels/settings.py:20
+#, python-format
+msgid "Settings from %s"
+msgstr "Настройки от %s"
+
+#: panels/signals.py:57
+#, python-format
+msgid "%(num_receivers)d receiver of 1 signal"
+msgid_plural "%(num_receivers)d receivers of 1 signal"
+msgstr[0] "%(num_receivers)d получател на 1 сигнал"
+msgstr[1] "%(num_receivers)d получатели на 1 сигнал"
+
+#: panels/signals.py:62
+#, python-format
+msgid "%(num_receivers)d receiver of %(num_signals)d signals"
+msgid_plural "%(num_receivers)d receivers of %(num_signals)d signals"
+msgstr[0] "%(num_receivers)d приемник на %(num_signals)d сигнала"
+msgstr[1] "%(num_receivers)d приемника на %(num_signals)d сигнала"
+
+#: panels/signals.py:67
+msgid "Signals"
+msgstr "Сигнали"
+
+#: panels/sql/panel.py:30 panels/sql/panel.py:41
+msgid "Read uncommitted"
+msgstr "Read uncommitted"
+
+#: panels/sql/panel.py:31 panels/sql/panel.py:43
+msgid "Read committed"
+msgstr "Read committed"
+
+#: panels/sql/panel.py:32 panels/sql/panel.py:45
+msgid "Repeatable read"
+msgstr "Repeatable read"
+
+#: panels/sql/panel.py:33 panels/sql/panel.py:47
+msgid "Serializable"
+msgstr "Serializable"
+
+#: panels/sql/panel.py:39
+msgid "Autocommit"
+msgstr "Autocommit"
+
+#: panels/sql/panel.py:61 panels/sql/panel.py:71
+msgid "Idle"
+msgstr "Незает"
+
+#: panels/sql/panel.py:62 panels/sql/panel.py:72
+msgid "Active"
+msgstr "Активен"
+
+#: panels/sql/panel.py:63 panels/sql/panel.py:73
+msgid "In transaction"
+msgstr "В транзакция"
+
+#: panels/sql/panel.py:64 panels/sql/panel.py:74
+msgid "In error"
+msgstr "В грешка"
+
+#: panels/sql/panel.py:65 panels/sql/panel.py:75
+msgid "Unknown"
+msgstr "Непознато"
+
+#: panels/sql/panel.py:162
+msgid "SQL"
+msgstr "SQL"
+
+#: panels/sql/panel.py:168
+#, python-format
+msgid "%(query_count)d query in %(sql_time).2fms"
+msgid_plural "%(query_count)d queries in %(sql_time).2fms"
+msgstr[0] "%(query_count)d заявка за %(sql_time).2fms"
+msgstr[1] "%(query_count)d заявки за %(sql_time).2fms"
+
+#: panels/sql/panel.py:180
+#, python-format
+msgid "SQL queries from %(count)d connection"
+msgid_plural "SQL queries from %(count)d connections"
+msgstr[0] "SQL заявки от %(count)d връзка"
+msgstr[1] "SQL заявки от %(count)d връзки"
+
+#: panels/staticfiles.py:82
+#, python-format
+msgid "Static files (%(num_found)s found, %(num_used)s used)"
+msgstr "Статични файлове (%(num_found)s открити, %(num_used)s използвани)"
+
+#: panels/staticfiles.py:103
+msgid "Static files"
+msgstr "Статични файлове"
+
+#: panels/staticfiles.py:109
+#, python-format
+msgid "%(num_used)s file used"
+msgid_plural "%(num_used)s files used"
+msgstr[0] "%(num_used)s файл използван"
+msgstr[1] "%(num_used)s файла са използвани"
+
+#: panels/templates/panel.py:101
+msgid "Templates"
+msgstr "Шаблони"
+
+#: panels/templates/panel.py:106
+#, python-format
+msgid "Templates (%(num_templates)s rendered)"
+msgstr "Шаблони (%(num_templates)s рендерирани)"
+
+#: panels/templates/panel.py:195
+msgid "No origin"
+msgstr "Няма произход"
+
+#: panels/timer.py:27
+#, python-format
+msgid "CPU: %(cum)0.2fms (%(total)0.2fms)"
+msgstr "Процесор: %(cum)0.2fms (%(total)0.2fms)"
+
+#: panels/timer.py:32
+#, python-format
+msgid "Total: %0.2fms"
+msgstr "Общо: %0.2fms"
+
+#: panels/timer.py:38 templates/debug_toolbar/panels/history.html:9
+#: templates/debug_toolbar/panels/sql_explain.html:11
+#: templates/debug_toolbar/panels/sql_profile.html:12
+#: templates/debug_toolbar/panels/sql_select.html:11
+msgid "Time"
+msgstr "Време"
+
+#: panels/timer.py:46
+msgid "User CPU time"
+msgstr "Потребителско процесорно време "
+
+#: panels/timer.py:46
+#, python-format
+msgid "%(utime)0.3f msec"
+msgstr "%(utime)0.3f msec"
+
+#: panels/timer.py:47
+msgid "System CPU time"
+msgstr "Системно процесорно време"
+
+#: panels/timer.py:47
+#, python-format
+msgid "%(stime)0.3f msec"
+msgstr "%(stime)0.3f msec"
+
+#: panels/timer.py:48
+msgid "Total CPU time"
+msgstr "Общо процесорно време"
+
+#: panels/timer.py:48
+#, python-format
+msgid "%(total)0.3f msec"
+msgstr "%(total)0.3f msec"
+
+#: panels/timer.py:49
+msgid "Elapsed time"
+msgstr "Изминало време"
+
+#: panels/timer.py:49
+#, python-format
+msgid "%(total_time)0.3f msec"
+msgstr "%(total_time)0.3f msec"
+
+#: panels/timer.py:51
+msgid "Context switches"
+msgstr "Контекстни превключвания"
+
+#: panels/timer.py:52
+#, python-format
+msgid "%(vcsw)d voluntary, %(ivcsw)d involuntary"
+msgstr "%(vcsw)d волеви, %(ivcsw)d неволеви"
+
+#: panels/versions.py:19
+msgid "Versions"
+msgstr "Версии"
+
+#: templates/debug_toolbar/base.html:23
+msgid "Hide toolbar"
+msgstr "Скрий лента с инструменти "
+
+#: templates/debug_toolbar/base.html:23
+msgid "Hide"
+msgstr "Скрий"
+
+#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26
+msgid "Toggle Theme"
+msgstr ""
+
+#: templates/debug_toolbar/base.html:35
+msgid "Show toolbar"
+msgstr "Покажи лента с инструменти"
+
+#: templates/debug_toolbar/includes/panel_button.html:4
+msgid "Disable for next and successive requests"
+msgstr "Деактивирай за следващо и всички последващи заявки"
+
+#: templates/debug_toolbar/includes/panel_button.html:4
+msgid "Enable for next and successive requests"
+msgstr "Активирай за следващо и всички последващи заявки"
+
+#: templates/debug_toolbar/panels/alerts.html:4
+msgid "Alerts found"
+msgstr ""
+
+#: templates/debug_toolbar/panels/alerts.html:11
+msgid "No alerts found"
+msgstr ""
+
+#: templates/debug_toolbar/panels/cache.html:2
+msgid "Summary"
+msgstr "Обобщение"
+
+#: templates/debug_toolbar/panels/cache.html:6
+msgid "Total calls"
+msgstr "Общо извиквания"
+
+#: templates/debug_toolbar/panels/cache.html:7
+msgid "Total time"
+msgstr "Общо време"
+
+#: templates/debug_toolbar/panels/cache.html:8
+msgid "Cache hits"
+msgstr "Кеш успехи"
+
+#: templates/debug_toolbar/panels/cache.html:9
+msgid "Cache misses"
+msgstr "Кеш неуспехи"
+
+#: templates/debug_toolbar/panels/cache.html:21
+msgid "Commands"
+msgstr "Команди"
+
+#: templates/debug_toolbar/panels/cache.html:39
+msgid "Calls"
+msgstr "Извиквания"
+
+#: templates/debug_toolbar/panels/cache.html:43
+#: templates/debug_toolbar/panels/sql.html:36
+msgid "Time (ms)"
+msgstr "Време (ms)"
+
+#: templates/debug_toolbar/panels/cache.html:44
+msgid "Type"
+msgstr "Вид"
+
+#: templates/debug_toolbar/panels/cache.html:45
+#: templates/debug_toolbar/panels/request.html:8
+msgid "Arguments"
+msgstr "Аргументи"
+
+#: templates/debug_toolbar/panels/cache.html:46
+#: templates/debug_toolbar/panels/request.html:9
+msgid "Keyword arguments"
+msgstr "Аргументи с ключови думи"
+
+#: templates/debug_toolbar/panels/cache.html:47
+msgid "Backend"
+msgstr "Бекенд"
+
+#: templates/debug_toolbar/panels/headers.html:3
+msgid "Request headers"
+msgstr "Хедъри на заявката"
+
+#: templates/debug_toolbar/panels/headers.html:8
+#: templates/debug_toolbar/panels/headers.html:27
+#: templates/debug_toolbar/panels/headers.html:48
+msgid "Key"
+msgstr "Ключ"
+
+#: templates/debug_toolbar/panels/headers.html:9
+#: templates/debug_toolbar/panels/headers.html:28
+#: templates/debug_toolbar/panels/headers.html:49
+#: templates/debug_toolbar/panels/history_tr.html:23
+#: templates/debug_toolbar/panels/request_variables.html:12
+#: templates/debug_toolbar/panels/settings.html:6
+#: templates/debug_toolbar/panels/timer.html:11
+msgid "Value"
+msgstr "Стойност"
+
+#: templates/debug_toolbar/panels/headers.html:22
+msgid "Response headers"
+msgstr "Хедъри на отговора"
+
+#: templates/debug_toolbar/panels/headers.html:41
+msgid "WSGI environ"
+msgstr "WSGI environ"
+
+#: templates/debug_toolbar/panels/headers.html:43
+msgid ""
+"Since the WSGI environ inherits the environment of the server, only a "
+"significant subset is shown below."
+msgstr "Понеже WSGI environ наследява средата на сървъра, е показана само важната част от него по-долу."
+
+#: templates/debug_toolbar/panels/history.html:10
+msgid "Method"
+msgstr "Метод"
+
+#: templates/debug_toolbar/panels/history.html:11
+#: templates/debug_toolbar/panels/staticfiles.html:43
+msgid "Path"
+msgstr "Път"
+
+#: templates/debug_toolbar/panels/history.html:12
+msgid "Request Variables"
+msgstr "Променливи на зявката"
+
+#: templates/debug_toolbar/panels/history.html:13
+msgid "Status"
+msgstr "Състояние"
+
+#: templates/debug_toolbar/panels/history.html:14
+#: templates/debug_toolbar/panels/sql.html:37
+msgid "Action"
+msgstr "Действие"
+
+#: templates/debug_toolbar/panels/history_tr.html:22
+#: templates/debug_toolbar/panels/request_variables.html:11
+msgid "Variable"
+msgstr "Променлива"
+
+#: templates/debug_toolbar/panels/profiling.html:5
+msgid "Call"
+msgstr "Извикване"
+
+#: templates/debug_toolbar/panels/profiling.html:6
+msgid "CumTime"
+msgstr "КумулативноВреме"
+
+#: templates/debug_toolbar/panels/profiling.html:7
+#: templates/debug_toolbar/panels/profiling.html:9
+msgid "Per"
+msgstr "За"
+
+#: templates/debug_toolbar/panels/profiling.html:8
+msgid "TotTime"
+msgstr "ОбщоВреме"
+
+#: templates/debug_toolbar/panels/profiling.html:10
+msgid "Count"
+msgstr "Брой"
+
+#: templates/debug_toolbar/panels/request.html:3
+msgid "View information"
+msgstr "Информация за изгледа"
+
+#: templates/debug_toolbar/panels/request.html:7
+msgid "View function"
+msgstr "Функция на изгледа"
+
+#: templates/debug_toolbar/panels/request.html:10
+msgid "URL name"
+msgstr "Име на URL"
+
+#: templates/debug_toolbar/panels/request.html:24
+msgid "Cookies"
+msgstr "Бисквитки"
+
+#: templates/debug_toolbar/panels/request.html:27
+msgid "No cookies"
+msgstr "Няма бисквитки"
+
+#: templates/debug_toolbar/panels/request.html:31
+msgid "Session data"
+msgstr "Данни на сесията"
+
+#: templates/debug_toolbar/panels/request.html:34
+msgid "No session data"
+msgstr "Няма данни от сесията"
+
+#: templates/debug_toolbar/panels/request.html:38
+msgid "GET data"
+msgstr "GET данни"
+
+#: templates/debug_toolbar/panels/request.html:41
+msgid "No GET data"
+msgstr "Няма GET данни"
+
+#: templates/debug_toolbar/panels/request.html:45
+msgid "POST data"
+msgstr "POST данни"
+
+#: templates/debug_toolbar/panels/request.html:48
+msgid "No POST data"
+msgstr "Няма POST данни"
+
+#: templates/debug_toolbar/panels/settings.html:5
+msgid "Setting"
+msgstr "Настройка"
+
+#: templates/debug_toolbar/panels/signals.html:5
+msgid "Signal"
+msgstr "Сигнал"
+
+#: templates/debug_toolbar/panels/signals.html:6
+msgid "Receivers"
+msgstr "Получатели"
+
+#: templates/debug_toolbar/panels/sql.html:6
+#, python-format
+msgid "%(num)s query"
+msgid_plural "%(num)s queries"
+msgstr[0] "%(num)s заявка"
+msgstr[1] "%(num)s заявки"
+
+#: templates/debug_toolbar/panels/sql.html:8
+#, python-format
+msgid ""
+"including %(count)s similar "
+msgstr "Включва %(count)s подобни "
+
+#: templates/debug_toolbar/panels/sql.html:12
+#, python-format
+msgid ""
+"and %(dupes)s duplicates "
+msgstr "и %(dupes)s повторени "
+
+#: templates/debug_toolbar/panels/sql.html:34
+msgid "Query"
+msgstr "Заявка"
+
+#: templates/debug_toolbar/panels/sql.html:35
+#: templates/debug_toolbar/panels/timer.html:36
+msgid "Timeline"
+msgstr "Във времето"
+
+#: templates/debug_toolbar/panels/sql.html:52
+#, python-format
+msgid "%(count)s similar queries."
+msgstr "%(count)s подобни заявки."
+
+#: templates/debug_toolbar/panels/sql.html:58
+#, python-format
+msgid "Duplicated %(dupes)s times."
+msgstr "Повторени %(dupes)s пъти."
+
+#: templates/debug_toolbar/panels/sql.html:95
+msgid "Connection:"
+msgstr "Връзка:"
+
+#: templates/debug_toolbar/panels/sql.html:97
+msgid "Isolation level:"
+msgstr "Изолационно ниво:"
+
+#: templates/debug_toolbar/panels/sql.html:100
+msgid "Transaction status:"
+msgstr "Статус на транзакцията:"
+
+#: templates/debug_toolbar/panels/sql.html:114
+msgid "(unknown)"
+msgstr "(неясен)"
+
+#: templates/debug_toolbar/panels/sql.html:123
+msgid "No SQL queries were recorded during this request."
+msgstr "Не са записани никакви SQL заявки по време на тази заявка."
+
+#: templates/debug_toolbar/panels/sql_explain.html:4
+msgid "SQL explained"
+msgstr "SQL разяснен"
+
+#: templates/debug_toolbar/panels/sql_explain.html:9
+#: templates/debug_toolbar/panels/sql_profile.html:10
+#: templates/debug_toolbar/panels/sql_select.html:9
+msgid "Executed SQL"
+msgstr "Изпълнен SQL"
+
+#: templates/debug_toolbar/panels/sql_explain.html:13
+#: templates/debug_toolbar/panels/sql_profile.html:14
+#: templates/debug_toolbar/panels/sql_select.html:13
+msgid "Database"
+msgstr "База данни"
+
+#: templates/debug_toolbar/panels/sql_profile.html:4
+msgid "SQL profiled"
+msgstr "SQL профилиран"
+
+#: templates/debug_toolbar/panels/sql_profile.html:37
+msgid "Error"
+msgstr "Грешка"
+
+#: templates/debug_toolbar/panels/sql_select.html:4
+msgid "SQL selected"
+msgstr "Избран SQL"
+
+#: templates/debug_toolbar/panels/sql_select.html:36
+msgid "Empty set"
+msgstr "Празно множество"
+
+#: templates/debug_toolbar/panels/staticfiles.html:3
+msgid "Static file path"
+msgid_plural "Static file paths"
+msgstr[0] "Път към статичен файл"
+msgstr[1] "Пътища към статични файлове"
+
+#: templates/debug_toolbar/panels/staticfiles.html:7
+#, python-format
+msgid "(prefix %(prefix)s)"
+msgstr "(префикс %(prefix)s)"
+
+#: templates/debug_toolbar/panels/staticfiles.html:11
+#: templates/debug_toolbar/panels/staticfiles.html:22
+#: templates/debug_toolbar/panels/staticfiles.html:34
+#: templates/debug_toolbar/panels/templates.html:10
+#: templates/debug_toolbar/panels/templates.html:30
+#: templates/debug_toolbar/panels/templates.html:47
+msgid "None"
+msgstr "None"
+
+#: templates/debug_toolbar/panels/staticfiles.html:14
+msgid "Static file app"
+msgid_plural "Static file apps"
+msgstr[0] "Приложение статичен файл"
+msgstr[1] "Приложения статично файлове"
+
+#: templates/debug_toolbar/panels/staticfiles.html:25
+msgid "Static file"
+msgid_plural "Static files"
+msgstr[0] "Статичен файл"
+msgstr[1] "Статични файлове"
+
+#: templates/debug_toolbar/panels/staticfiles.html:39
+#, python-format
+msgid "%(payload_count)s file"
+msgid_plural "%(payload_count)s files"
+msgstr[0] "%(payload_count)s файл"
+msgstr[1] "%(payload_count)s файла"
+
+#: templates/debug_toolbar/panels/staticfiles.html:44
+msgid "Location"
+msgstr "Местоположение"
+
+#: templates/debug_toolbar/panels/template_source.html:4
+msgid "Template source:"
+msgstr "Произход на шаблона:"
+
+#: templates/debug_toolbar/panels/templates.html:2
+msgid "Template path"
+msgid_plural "Template paths"
+msgstr[0] "Път към шаблон"
+msgstr[1] "Пътища към шаблони"
+
+#: templates/debug_toolbar/panels/templates.html:13
+msgid "Template"
+msgid_plural "Templates"
+msgstr[0] "Шаблон"
+msgstr[1] "Шаблони"
+
+#: templates/debug_toolbar/panels/templates.html:22
+#: templates/debug_toolbar/panels/templates.html:40
+msgid "Toggle context"
+msgstr "Превключи контекста"
+
+#: templates/debug_toolbar/panels/templates.html:33
+msgid "Context processor"
+msgid_plural "Context processors"
+msgstr[0] "Контекстен процесор"
+msgstr[1] "Контекстни процесори"
+
+#: templates/debug_toolbar/panels/timer.html:2
+msgid "Resource usage"
+msgstr "Използване на ресурси"
+
+#: templates/debug_toolbar/panels/timer.html:10
+msgid "Resource"
+msgstr "Ресурс"
+
+#: templates/debug_toolbar/panels/timer.html:26
+msgid "Browser timing"
+msgstr "Време в браузъра"
+
+#: templates/debug_toolbar/panels/timer.html:35
+msgid "Timing attribute"
+msgstr "Атрибут на измерването"
+
+#: templates/debug_toolbar/panels/timer.html:37
+msgid "Milliseconds since navigation start (+length)"
+msgstr "Милисекунди от началото на навигацията (+дължината)"
+
+#: templates/debug_toolbar/panels/versions.html:10
+msgid "Package"
+msgstr "Пакет"
+
+#: templates/debug_toolbar/panels/versions.html:11
+msgid "Name"
+msgstr "Име"
+
+#: templates/debug_toolbar/panels/versions.html:12
+msgid "Version"
+msgstr "Версия"
+
+#: templates/debug_toolbar/redirect.html:10
+msgid "Location:"
+msgstr "Местоположение:"
+
+#: templates/debug_toolbar/redirect.html:12
+msgid ""
+"The Django Debug Toolbar has intercepted a redirect to the above URL for "
+"debug viewing purposes. You can click the above link to continue with the "
+"redirect as normal."
+msgstr "Django Debug Toolbar прехвана пренасочване към горния URL с цел преглед за отстраняване на грешки /дебъг/. Можете да кликнете върху връзката по-горе, за да продължите с пренасочването по нормалния начин."
+
+#: views.py:16
+msgid ""
+"Data for this panel isn't available anymore. Please reload the page and "
+"retry."
+msgstr "Данните за този панел вече не са налични. Моля, презаредете страницата и опитайте отново. "
diff --git a/debug_toolbar/locale/ca/LC_MESSAGES/django.mo b/debug_toolbar/locale/ca/LC_MESSAGES/django.mo
index fb52f10ea..c7e63dbe4 100644
Binary files a/debug_toolbar/locale/ca/LC_MESSAGES/django.mo and b/debug_toolbar/locale/ca/LC_MESSAGES/django.mo differ
diff --git a/debug_toolbar/locale/ca/LC_MESSAGES/django.po b/debug_toolbar/locale/ca/LC_MESSAGES/django.po
index bdeaffd7e..393b74bc1 100644
--- a/debug_toolbar/locale/ca/LC_MESSAGES/django.po
+++ b/debug_toolbar/locale/ca/LC_MESSAGES/django.po
@@ -3,38 +3,61 @@
#
#
# Translators:
-# Libre El Chaval , 2013
+# el_libre como el chaval , 2013
msgid ""
msgstr ""
"Project-Id-Version: Django Debug Toolbar\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-01-20 17:23+0100\n"
-"PO-Revision-Date: 2014-04-25 19:53+0000\n"
-"Last-Translator: Aymeric Augustin \n"
-"Language-Team: Catalan (http://www.transifex.com/projects/p/django-debug-"
-"toolbar/language/ca/)\n"
-"Language: ca\n"
+"POT-Creation-Date: 2024-08-06 07:12-0500\n"
+"PO-Revision-Date: 2010-11-30 00:00+0000\n"
+"Last-Translator: el_libre como el chaval , 2013\n"
+"Language-Team: Catalan (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/ca/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Language: ca\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: apps.py:15
+#: apps.py:18
msgid "Debug Toolbar"
msgstr ""
-#: panels/cache.py:180
+#: panels/alerts.py:67
+#, python-brace-format
+msgid ""
+"Form with id \"{form_id}\" contains file input, but does not have the "
+"attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:70
+msgid ""
+"Form contains file input, but does not have the attribute "
+"enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:73
+#, python-brace-format
+msgid ""
+"Input element references form with id \"{form_id}\", but the form does not "
+"have the attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:77
+msgid "Alerts"
+msgstr ""
+
+#: panels/cache.py:168
msgid "Cache"
msgstr "Caxè"
-#: panels/cache.py:186
+#: panels/cache.py:174
#, python-format
msgid "%(cache_calls)d call in %(time).2fms"
msgid_plural "%(cache_calls)d calls in %(time).2fms"
msgstr[0] ""
msgstr[1] ""
-#: panels/cache.py:195
+#: panels/cache.py:183
#, python-format
msgid "Cache calls from %(count)d backend"
msgid_plural "Cache calls from %(count)d backends"
@@ -45,7 +68,7 @@ msgstr[1] ""
msgid "Headers"
msgstr "Encapçalaments"
-#: panels/history/panel.py:18 panels/history/panel.py:19
+#: panels/history/panel.py:19 panels/history/panel.py:20
msgid "History"
msgstr ""
@@ -53,7 +76,7 @@ msgstr ""
msgid "Profiling"
msgstr ""
-#: panels/redirects.py:14
+#: panels/redirects.py:17
msgid "Intercept redirects"
msgstr ""
@@ -61,11 +84,11 @@ msgstr ""
msgid "Request"
msgstr "Demanar"
-#: panels/request.py:36
+#: panels/request.py:38
msgid ""
msgstr ""
-#: panels/request.py:53
+#: panels/request.py:55
msgid ""
msgstr ""
@@ -74,10 +97,9 @@ msgid "Settings"
msgstr "Configuració"
#: panels/settings.py:20
-#, fuzzy, python-format
-#| msgid "Settings"
+#, python-format
msgid "Settings from %s"
-msgstr "Configuració"
+msgstr ""
#: panels/signals.py:57
#, python-format
@@ -97,151 +119,151 @@ msgstr[1] ""
msgid "Signals"
msgstr "Senyals"
-#: panels/sql/panel.py:23
-msgid "Autocommit"
-msgstr ""
-
-#: panels/sql/panel.py:24
+#: panels/sql/panel.py:30 panels/sql/panel.py:41
msgid "Read uncommitted"
msgstr ""
-#: panels/sql/panel.py:25
+#: panels/sql/panel.py:31 panels/sql/panel.py:43
msgid "Read committed"
msgstr ""
-#: panels/sql/panel.py:26
+#: panels/sql/panel.py:32 panels/sql/panel.py:45
msgid "Repeatable read"
msgstr ""
-#: panels/sql/panel.py:27
+#: panels/sql/panel.py:33 panels/sql/panel.py:47
msgid "Serializable"
msgstr "Seriable"
#: panels/sql/panel.py:39
+msgid "Autocommit"
+msgstr ""
+
+#: panels/sql/panel.py:61 panels/sql/panel.py:71
msgid "Idle"
msgstr ""
-#: panels/sql/panel.py:40
+#: panels/sql/panel.py:62 panels/sql/panel.py:72
msgid "Active"
msgstr "Actiu"
-#: panels/sql/panel.py:41
+#: panels/sql/panel.py:63 panels/sql/panel.py:73
msgid "In transaction"
msgstr "En transacció"
-#: panels/sql/panel.py:42
+#: panels/sql/panel.py:64 panels/sql/panel.py:74
msgid "In error"
msgstr ""
-#: panels/sql/panel.py:43
+#: panels/sql/panel.py:65 panels/sql/panel.py:75
msgid "Unknown"
msgstr "Desconegut"
-#: panels/sql/panel.py:130
+#: panels/sql/panel.py:162
msgid "SQL"
msgstr "SQL"
-#: panels/sql/panel.py:135
+#: panels/sql/panel.py:168
#, python-format
msgid "%(query_count)d query in %(sql_time).2fms"
msgid_plural "%(query_count)d queries in %(sql_time).2fms"
msgstr[0] ""
msgstr[1] ""
-#: panels/sql/panel.py:147
+#: panels/sql/panel.py:180
#, python-format
msgid "SQL queries from %(count)d connection"
msgid_plural "SQL queries from %(count)d connections"
msgstr[0] ""
msgstr[1] ""
-#: panels/staticfiles.py:84
+#: panels/staticfiles.py:82
#, python-format
msgid "Static files (%(num_found)s found, %(num_used)s used)"
msgstr ""
-#: panels/staticfiles.py:105
+#: panels/staticfiles.py:103
msgid "Static files"
msgstr ""
-#: panels/staticfiles.py:111
+#: panels/staticfiles.py:109
#, python-format
msgid "%(num_used)s file used"
msgid_plural "%(num_used)s files used"
msgstr[0] ""
msgstr[1] ""
-#: panels/templates/panel.py:143
+#: panels/templates/panel.py:101
msgid "Templates"
msgstr "Plantilles"
-#: panels/templates/panel.py:148
+#: panels/templates/panel.py:106
#, python-format
msgid "Templates (%(num_templates)s rendered)"
msgstr ""
-#: panels/templates/panel.py:180
+#: panels/templates/panel.py:195
msgid "No origin"
msgstr ""
-#: panels/timer.py:25
+#: panels/timer.py:27
#, python-format
msgid "CPU: %(cum)0.2fms (%(total)0.2fms)"
msgstr ""
-#: panels/timer.py:30
+#: panels/timer.py:32
#, python-format
msgid "Total: %0.2fms"
msgstr "Total: %0.2fms"
-#: panels/timer.py:36 templates/debug_toolbar/panels/history.html:9
+#: panels/timer.py:38 templates/debug_toolbar/panels/history.html:9
#: templates/debug_toolbar/panels/sql_explain.html:11
#: templates/debug_toolbar/panels/sql_profile.html:12
#: templates/debug_toolbar/panels/sql_select.html:11
msgid "Time"
msgstr "Hora"
-#: panels/timer.py:44
+#: panels/timer.py:46
msgid "User CPU time"
msgstr ""
-#: panels/timer.py:44
+#: panels/timer.py:46
#, python-format
msgid "%(utime)0.3f msec"
msgstr ""
-#: panels/timer.py:45
+#: panels/timer.py:47
msgid "System CPU time"
msgstr ""
-#: panels/timer.py:45
+#: panels/timer.py:47
#, python-format
msgid "%(stime)0.3f msec"
msgstr ""
-#: panels/timer.py:46
+#: panels/timer.py:48
msgid "Total CPU time"
msgstr ""
-#: panels/timer.py:46
+#: panels/timer.py:48
#, python-format
msgid "%(total)0.3f msec"
msgstr ""
-#: panels/timer.py:47
+#: panels/timer.py:49
msgid "Elapsed time"
msgstr "Temps emprat"
-#: panels/timer.py:47
+#: panels/timer.py:49
#, python-format
msgid "%(total_time)0.3f msec"
msgstr ""
-#: panels/timer.py:49
+#: panels/timer.py:51
msgid "Context switches"
msgstr ""
-#: panels/timer.py:50
+#: panels/timer.py:52
#, python-format
msgid "%(vcsw)d voluntary, %(ivcsw)d involuntary"
msgstr ""
@@ -250,15 +272,19 @@ msgstr ""
msgid "Versions"
msgstr "Versions"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide toolbar"
msgstr "Amagar barra d'eina"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide"
msgstr "Amagar"
-#: templates/debug_toolbar/base.html:29
+#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26
+msgid "Toggle Theme"
+msgstr ""
+
+#: templates/debug_toolbar/base.html:35
msgid "Show toolbar"
msgstr "Mostrar barra d'eines"
@@ -270,6 +296,14 @@ msgstr ""
msgid "Enable for next and successive requests"
msgstr ""
+#: templates/debug_toolbar/panels/alerts.html:4
+msgid "Alerts found"
+msgstr ""
+
+#: templates/debug_toolbar/panels/alerts.html:11
+msgid "No alerts found"
+msgstr ""
+
#: templates/debug_toolbar/panels/cache.html:2
msgid "Summary"
msgstr "Resum"
@@ -365,10 +399,8 @@ msgid "Path"
msgstr ""
#: templates/debug_toolbar/panels/history.html:12
-#, fuzzy
-#| msgid "Variable"
msgid "Request Variables"
-msgstr "Variable"
+msgstr ""
#: templates/debug_toolbar/panels/history.html:13
msgid "Status"
diff --git a/debug_toolbar/locale/cs/LC_MESSAGES/django.mo b/debug_toolbar/locale/cs/LC_MESSAGES/django.mo
index 0545db3b5..a0daa392e 100644
Binary files a/debug_toolbar/locale/cs/LC_MESSAGES/django.mo and b/debug_toolbar/locale/cs/LC_MESSAGES/django.mo differ
diff --git a/debug_toolbar/locale/cs/LC_MESSAGES/django.po b/debug_toolbar/locale/cs/LC_MESSAGES/django.po
index 18070ee8e..395b6feca 100644
--- a/debug_toolbar/locale/cs/LC_MESSAGES/django.po
+++ b/debug_toolbar/locale/cs/LC_MESSAGES/django.po
@@ -3,59 +3,87 @@
#
#
# Translators:
-# Vlada Macek , 2013
+# Josef Kolář , 2020
+# kuboja, 2024
+# Vláďa Macek , 2013-2014
+# Vláďa Macek , 2015,2021
msgid ""
msgstr ""
"Project-Id-Version: Django Debug Toolbar\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-01-20 17:23+0100\n"
-"PO-Revision-Date: 2014-04-25 19:53+0000\n"
-"Last-Translator: Aymeric Augustin \n"
-"Language-Team: Czech (http://www.transifex.com/projects/p/django-debug-"
-"toolbar/language/cs/)\n"
-"Language: cs\n"
+"POT-Creation-Date: 2024-08-06 07:12-0500\n"
+"PO-Revision-Date: 2010-11-30 00:00+0000\n"
+"Last-Translator: kuboja, 2024\n"
+"Language-Team: Czech (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/cs/)\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>=2 && n<=4) ? 1 : 2;\n"
+"Language: cs\n"
+"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
-#: apps.py:15
+#: apps.py:18
msgid "Debug Toolbar"
+msgstr "Debug Toolbar"
+
+#: panels/alerts.py:67
+#, python-brace-format
+msgid ""
+"Form with id \"{form_id}\" contains file input, but does not have the "
+"attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:70
+msgid ""
+"Form contains file input, but does not have the attribute "
+"enctype=\"multipart/form-data\"."
msgstr ""
-#: panels/cache.py:180
+#: panels/alerts.py:73
+#, python-brace-format
+msgid ""
+"Input element references form with id \"{form_id}\", but the form does not "
+"have the attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:77
+msgid "Alerts"
+msgstr ""
+
+#: panels/cache.py:168
msgid "Cache"
msgstr "Mezipaměť"
-#: panels/cache.py:186
+#: panels/cache.py:174
#, python-format
msgid "%(cache_calls)d call in %(time).2fms"
msgid_plural "%(cache_calls)d calls in %(time).2fms"
msgstr[0] "%(cache_calls)d volání během %(time).2fms"
msgstr[1] "%(cache_calls)d volání během %(time).2fms"
msgstr[2] "%(cache_calls)d volání během %(time).2fms"
+msgstr[3] "%(cache_calls)d volání během %(time).2fms"
-#: panels/cache.py:195
+#: panels/cache.py:183
#, python-format
msgid "Cache calls from %(count)d backend"
msgid_plural "Cache calls from %(count)d backends"
msgstr[0] "Volání mezipaměti z %(count)d backendu"
msgstr[1] "Volání mezipaměti z %(count)d backendů"
msgstr[2] "Volání mezipaměti z %(count)d backendů"
+msgstr[3] "Volání mezipaměti z %(count)d backendů"
#: panels/headers.py:31
msgid "Headers"
-msgstr "Záhlaví"
+msgstr "Hlavičky"
-#: panels/history/panel.py:18 panels/history/panel.py:19
+#: panels/history/panel.py:19 panels/history/panel.py:20
msgid "History"
-msgstr ""
+msgstr "Historie"
#: panels/profiling.py:140
msgid "Profiling"
msgstr "Profilování"
-#: panels/redirects.py:14
+#: panels/redirects.py:17
msgid "Intercept redirects"
msgstr "Zachycení přesměrování"
@@ -63,23 +91,22 @@ msgstr "Zachycení přesměrování"
msgid "Request"
msgstr "Požadavek"
-#: panels/request.py:36
+#: panels/request.py:38
msgid ""
msgstr "<žádný pohled>"
-#: panels/request.py:53
+#: panels/request.py:55
msgid ""
msgstr ""
#: panels/settings.py:17
msgid "Settings"
-msgstr "Settings"
+msgstr "Nastavení"
#: panels/settings.py:20
-#, fuzzy, python-format
-#| msgid "Settings from %s
"
+#, python-format
msgid "Settings from %s"
-msgstr "Nastavení z modulu %s
"
+msgstr ""
#: panels/signals.py:57
#, python-format
@@ -88,6 +115,7 @@ msgid_plural "%(num_receivers)d receivers of 1 signal"
msgstr[0] "%(num_receivers)d příjemce 1 signálu"
msgstr[1] "%(num_receivers)d příjemci 1 signálu"
msgstr[2] "%(num_receivers)d příjemců 1 signálu"
+msgstr[3] "%(num_receivers)d příjemců 1 signálu"
#: panels/signals.py:62
#, python-format
@@ -96,161 +124,163 @@ msgid_plural "%(num_receivers)d receivers of %(num_signals)d signals"
msgstr[0] "%(num_receivers)d příjemce %(num_signals)d signálů"
msgstr[1] "%(num_receivers)d příjemci %(num_signals)d signálů"
msgstr[2] "%(num_receivers)d příjemců %(num_signals)d signálů"
+msgstr[3] "%(num_receivers)d příjemců %(num_signals)d signálů"
#: panels/signals.py:67
msgid "Signals"
msgstr "Signály"
-#: panels/sql/panel.py:23
-msgid "Autocommit"
-msgstr "Autocommit"
-
-#: panels/sql/panel.py:24
+#: panels/sql/panel.py:30 panels/sql/panel.py:41
msgid "Read uncommitted"
msgstr "Read uncommitted"
-#: panels/sql/panel.py:25
+#: panels/sql/panel.py:31 panels/sql/panel.py:43
msgid "Read committed"
msgstr "Read committed"
-#: panels/sql/panel.py:26
+#: panels/sql/panel.py:32 panels/sql/panel.py:45
msgid "Repeatable read"
msgstr "Repeatable read"
-#: panels/sql/panel.py:27
+#: panels/sql/panel.py:33 panels/sql/panel.py:47
msgid "Serializable"
msgstr "Serializable"
#: panels/sql/panel.py:39
+msgid "Autocommit"
+msgstr "Autocommit"
+
+#: panels/sql/panel.py:61 panels/sql/panel.py:71
msgid "Idle"
msgstr "V klidu (idle)"
-#: panels/sql/panel.py:40
+#: panels/sql/panel.py:62 panels/sql/panel.py:72
msgid "Active"
msgstr "Aktivní"
-#: panels/sql/panel.py:41
+#: panels/sql/panel.py:63 panels/sql/panel.py:73
msgid "In transaction"
msgstr "Uvnitř transakce"
-#: panels/sql/panel.py:42
+#: panels/sql/panel.py:64 panels/sql/panel.py:74
msgid "In error"
msgstr "V chybovém stavu"
-#: panels/sql/panel.py:43
+#: panels/sql/panel.py:65 panels/sql/panel.py:75
msgid "Unknown"
msgstr "Neznámé"
-#: panels/sql/panel.py:130
+#: panels/sql/panel.py:162
msgid "SQL"
msgstr "SQL"
-#: panels/sql/panel.py:135
-#, fuzzy, python-format
-#| msgid "%(cache_calls)d call in %(time).2fms"
-#| msgid_plural "%(cache_calls)d calls in %(time).2fms"
+#: panels/sql/panel.py:168
+#, python-format
msgid "%(query_count)d query in %(sql_time).2fms"
msgid_plural "%(query_count)d queries in %(sql_time).2fms"
-msgstr[0] "%(cache_calls)d volání během %(time).2fms"
-msgstr[1] "%(cache_calls)d volání během %(time).2fms"
-msgstr[2] "%(cache_calls)d volání během %(time).2fms"
+msgstr[0] "%(query_count)ddotaz během %(sql_time).2f ms"
+msgstr[1] "%(query_count)d dotazy během %(sql_time).2f ms"
+msgstr[2] "%(query_count)d dotazů během %(sql_time).2f ms"
+msgstr[3] "%(query_count)d dotazů během %(sql_time).2f ms"
-#: panels/sql/panel.py:147
+#: panels/sql/panel.py:180
#, python-format
msgid "SQL queries from %(count)d connection"
msgid_plural "SQL queries from %(count)d connections"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "SQL dotazy z %(count)d spojení"
+msgstr[1] "SQL dotazy ze %(count)d spojení"
+msgstr[2] "SQL dotazy z %(count)d spojení"
+msgstr[3] "SQL dotazy z %(count)d spojení"
-#: panels/staticfiles.py:84
+#: panels/staticfiles.py:82
#, python-format
msgid "Static files (%(num_found)s found, %(num_used)s used)"
msgstr "Statické soubory (nalezeno: %(num_found)s, použito: %(num_used)s)"
-#: panels/staticfiles.py:105
+#: panels/staticfiles.py:103
msgid "Static files"
msgstr "Statické soubory"
-#: panels/staticfiles.py:111
+#: panels/staticfiles.py:109
#, python-format
msgid "%(num_used)s file used"
msgid_plural "%(num_used)s files used"
msgstr[0] "%(num_used)s soubor použit"
msgstr[1] "%(num_used)s soubory použity"
msgstr[2] "%(num_used)s souborů použito"
+msgstr[3] "%(num_used)s souborů použito"
-#: panels/templates/panel.py:143
+#: panels/templates/panel.py:101
msgid "Templates"
msgstr "Šablony"
-#: panels/templates/panel.py:148
+#: panels/templates/panel.py:106
#, python-format
msgid "Templates (%(num_templates)s rendered)"
msgstr "Šablony (renderovaných: %(num_templates)s)"
-#: panels/templates/panel.py:180
+#: panels/templates/panel.py:195
msgid "No origin"
-msgstr ""
+msgstr "Zdroj chybí"
-#: panels/timer.py:25
+#: panels/timer.py:27
#, python-format
msgid "CPU: %(cum)0.2fms (%(total)0.2fms)"
msgstr "CPU: %(cum)0.2fms (%(total)0.2fms)"
-#: panels/timer.py:30
+#: panels/timer.py:32
#, python-format
msgid "Total: %0.2fms"
msgstr "Celkem: %0.2fms"
-#: panels/timer.py:36 templates/debug_toolbar/panels/history.html:9
+#: panels/timer.py:38 templates/debug_toolbar/panels/history.html:9
#: templates/debug_toolbar/panels/sql_explain.html:11
#: templates/debug_toolbar/panels/sql_profile.html:12
#: templates/debug_toolbar/panels/sql_select.html:11
msgid "Time"
msgstr "Čas"
-#: panels/timer.py:44
+#: panels/timer.py:46
msgid "User CPU time"
msgstr "Uživatelský čas CPU"
-#: panels/timer.py:44
+#: panels/timer.py:46
#, python-format
msgid "%(utime)0.3f msec"
msgstr "%(utime)0.3f msec"
-#: panels/timer.py:45
+#: panels/timer.py:47
msgid "System CPU time"
msgstr "Systémový čas CPU"
-#: panels/timer.py:45
+#: panels/timer.py:47
#, python-format
msgid "%(stime)0.3f msec"
msgstr "%(stime)0.3f msec"
-#: panels/timer.py:46
+#: panels/timer.py:48
msgid "Total CPU time"
msgstr "Celkový čas CPU"
-#: panels/timer.py:46
+#: panels/timer.py:48
#, python-format
msgid "%(total)0.3f msec"
msgstr "%(total)0.3f msec"
-#: panels/timer.py:47
+#: panels/timer.py:49
msgid "Elapsed time"
msgstr "Uplynulý čas"
-#: panels/timer.py:47
+#: panels/timer.py:49
#, python-format
msgid "%(total_time)0.3f msec"
msgstr "%(total_time)0.3f msec"
-#: panels/timer.py:49
+#: panels/timer.py:51
msgid "Context switches"
msgstr "Přepnutí kontextu"
-#: panels/timer.py:50
+#: panels/timer.py:52
#, python-format
msgid "%(vcsw)d voluntary, %(ivcsw)d involuntary"
msgstr "%(vcsw)d dobrovolně, %(ivcsw)d nedobrovolně"
@@ -259,15 +289,19 @@ msgstr "%(vcsw)d dobrovolně, %(ivcsw)d nedobrovolně"
msgid "Versions"
msgstr "Verze"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide toolbar"
msgstr "Skrýt lištu"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide"
msgstr "Skrýt"
-#: templates/debug_toolbar/base.html:29
+#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26
+msgid "Toggle Theme"
+msgstr ""
+
+#: templates/debug_toolbar/base.html:35
msgid "Show toolbar"
msgstr "Zobrazit lištu"
@@ -279,6 +313,14 @@ msgstr "Vypnout pro následné požadavky"
msgid "Enable for next and successive requests"
msgstr "Zapnout pro následné požadavky"
+#: templates/debug_toolbar/panels/alerts.html:4
+msgid "Alerts found"
+msgstr ""
+
+#: templates/debug_toolbar/panels/alerts.html:11
+msgid "No alerts found"
+msgstr ""
+
#: templates/debug_toolbar/panels/cache.html:2
msgid "Summary"
msgstr "Souhrn"
@@ -362,13 +404,11 @@ msgstr "Prostředí WSGI"
msgid ""
"Since the WSGI environ inherits the environment of the server, only a "
"significant subset is shown below."
-msgstr ""
-"Níže je zobrazena pouze podstatná část proměnných prostředí, protože WSGI je "
-"dědí od serveru."
+msgstr "Níže je zobrazena pouze podstatná část proměnných prostředí, protože WSGI je dědí od serveru."
#: templates/debug_toolbar/panels/history.html:10
msgid "Method"
-msgstr ""
+msgstr "Metoda"
#: templates/debug_toolbar/panels/history.html:11
#: templates/debug_toolbar/panels/staticfiles.html:43
@@ -376,14 +416,12 @@ msgid "Path"
msgstr "Cesta"
#: templates/debug_toolbar/panels/history.html:12
-#, fuzzy
-#| msgid "Request headers"
msgid "Request Variables"
-msgstr "Záhlaví požadavku"
+msgstr "Proměnné požadavku"
#: templates/debug_toolbar/panels/history.html:13
msgid "Status"
-msgstr ""
+msgstr "Stav"
#: templates/debug_toolbar/panels/history.html:14
#: templates/debug_toolbar/panels/sql.html:37
@@ -479,20 +517,21 @@ msgid_plural "%(num)s queries"
msgstr[0] "%(num)s dotaz"
msgstr[1] "%(num)s dotazy"
msgstr[2] "%(num)s dotazů"
+msgstr[3] "%(num)s dotazů"
#: templates/debug_toolbar/panels/sql.html:8
#, python-format
msgid ""
"including %(count)s similar "
-msgstr ""
+msgstr "včetně %(count)s podobných "
#: templates/debug_toolbar/panels/sql.html:12
#, python-format
msgid ""
"and %(dupes)s duplicates "
-msgstr ""
+msgstr "a %(dupes)s duplicitních "
#: templates/debug_toolbar/panels/sql.html:34
msgid "Query"
@@ -504,11 +543,9 @@ msgid "Timeline"
msgstr "Časová osa"
#: templates/debug_toolbar/panels/sql.html:52
-#, fuzzy, python-format
-#| msgid "%(count)s message"
-#| msgid_plural "%(count)s messages"
+#, python-format
msgid "%(count)s similar queries."
-msgstr "%(count)s zpráva"
+msgstr "%(count)s podobných dotazů."
#: templates/debug_toolbar/panels/sql.html:58
#, python-format
@@ -573,6 +610,7 @@ msgid_plural "Static file paths"
msgstr[0] "Cesta ke statickým souborům"
msgstr[1] "Cesty ke statickým souborům"
msgstr[2] "Cesty ke statickým souborům"
+msgstr[3] "Cesty ke statickým souborům"
#: templates/debug_toolbar/panels/staticfiles.html:7
#, python-format
@@ -594,6 +632,7 @@ msgid_plural "Static file apps"
msgstr[0] "Aplikace se statickými soubory"
msgstr[1] "Aplikace se statickými soubory"
msgstr[2] "Aplikace se statickými soubory"
+msgstr[3] "Aplikace se statickými soubory"
#: templates/debug_toolbar/panels/staticfiles.html:25
msgid "Static file"
@@ -601,6 +640,7 @@ msgid_plural "Static files"
msgstr[0] "Statický soubor"
msgstr[1] "Statické soubory"
msgstr[2] "Statické soubory"
+msgstr[3] "Statické soubory"
#: templates/debug_toolbar/panels/staticfiles.html:39
#, python-format
@@ -609,6 +649,7 @@ msgid_plural "%(payload_count)s files"
msgstr[0] "%(payload_count)s soubor"
msgstr[1] "%(payload_count)s soubory"
msgstr[2] "%(payload_count)s souborů"
+msgstr[3] "%(payload_count)s souborů"
#: templates/debug_toolbar/panels/staticfiles.html:44
msgid "Location"
@@ -624,6 +665,7 @@ msgid_plural "Template paths"
msgstr[0] "Cesta k šabloně"
msgstr[1] "Cesty k šablonám"
msgstr[2] "Cesty k šablonám"
+msgstr[3] "Cesty k šablonám"
#: templates/debug_toolbar/panels/templates.html:13
msgid "Template"
@@ -631,6 +673,7 @@ msgid_plural "Templates"
msgstr[0] "Šablona"
msgstr[1] "Šablony"
msgstr[2] "Šablony"
+msgstr[3] "Šablony"
#: templates/debug_toolbar/panels/templates.html:22
#: templates/debug_toolbar/panels/templates.html:40
@@ -643,6 +686,7 @@ msgid_plural "Context processors"
msgstr[0] "Procesor kontextu"
msgstr[1] "Procesory kontextu"
msgstr[2] "Procesory kontextu"
+msgstr[3] "Procesory kontextu"
#: templates/debug_toolbar/panels/timer.html:2
msgid "Resource usage"
@@ -666,7 +710,7 @@ msgstr "Milisekund od začátku navigace (+délka)"
#: templates/debug_toolbar/panels/versions.html:10
msgid "Package"
-msgstr ""
+msgstr "Balíček"
#: templates/debug_toolbar/panels/versions.html:11
msgid "Name"
@@ -685,15 +729,10 @@ msgid ""
"The Django Debug Toolbar has intercepted a redirect to the above URL for "
"debug viewing purposes. You can click the above link to continue with the "
"redirect as normal."
-msgstr ""
-"Aplikace Django Debug Toolbar zachytila přesměrování na výše uvedenou adresu "
-"URL za účelem ladicího zobrazení. Chcete-li přesměrování dokončit, klepněte "
-"na odkaz výše."
+msgstr "Aplikace Django Debug Toolbar zachytila přesměrování na výše uvedenou adresu URL za účelem ladicího zobrazení. Chcete-li přesměrování dokončit, klepněte na odkaz výše."
#: views.py:16
msgid ""
"Data for this panel isn't available anymore. Please reload the page and "
"retry."
-msgstr ""
-"Data pro tento panel již nejsou k dispozici. Obnovte stránku a zkuste to "
-"znova."
+msgstr "Data pro tento panel již nejsou k dispozici. Obnovte stránku a zkuste to znova."
diff --git a/debug_toolbar/locale/de/LC_MESSAGES/django.mo b/debug_toolbar/locale/de/LC_MESSAGES/django.mo
index 001276ee5..f62a4baf6 100644
Binary files a/debug_toolbar/locale/de/LC_MESSAGES/django.mo and b/debug_toolbar/locale/de/LC_MESSAGES/django.mo differ
diff --git a/debug_toolbar/locale/de/LC_MESSAGES/django.po b/debug_toolbar/locale/de/LC_MESSAGES/django.po
index 7cd10febe..18a6be6a8 100644
--- a/debug_toolbar/locale/de/LC_MESSAGES/django.po
+++ b/debug_toolbar/locale/de/LC_MESSAGES/django.po
@@ -5,37 +5,61 @@
# Translators:
# Jannis Leidel , 2012-2014,2021
# Matthias Kestenholz , 2021
+# Tim Schilling, 2021
msgid ""
msgstr ""
"Project-Id-Version: Django Debug Toolbar\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-01-20 17:23+0100\n"
-"PO-Revision-Date: 2021-12-04 17:38+0000\n"
-"Last-Translator: Tim Schilling\n"
-"Language-Team: German (http://www.transifex.com/django-debug-toolbar/django-"
-"debug-toolbar/language/de/)\n"
-"Language: de\n"
+"POT-Creation-Date: 2024-08-06 07:12-0500\n"
+"PO-Revision-Date: 2010-11-30 00:00+0000\n"
+"Last-Translator: Tim Schilling, 2021\n"
+"Language-Team: German (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: apps.py:15
+#: apps.py:18
msgid "Debug Toolbar"
msgstr "Debug Toolbar"
-#: panels/cache.py:180
+#: panels/alerts.py:67
+#, python-brace-format
+msgid ""
+"Form with id \"{form_id}\" contains file input, but does not have the "
+"attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:70
+msgid ""
+"Form contains file input, but does not have the attribute "
+"enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:73
+#, python-brace-format
+msgid ""
+"Input element references form with id \"{form_id}\", but the form does not "
+"have the attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:77
+msgid "Alerts"
+msgstr ""
+
+#: panels/cache.py:168
msgid "Cache"
msgstr "Cache"
-#: panels/cache.py:186
+#: panels/cache.py:174
#, python-format
msgid "%(cache_calls)d call in %(time).2fms"
msgid_plural "%(cache_calls)d calls in %(time).2fms"
msgstr[0] "%(cache_calls)d Abfrage in %(time).2fms"
msgstr[1] "%(cache_calls)d Abfragen in %(time).2fms"
-#: panels/cache.py:195
+#: panels/cache.py:183
#, python-format
msgid "Cache calls from %(count)d backend"
msgid_plural "Cache calls from %(count)d backends"
@@ -46,7 +70,7 @@ msgstr[1] "Cache-Aufrufe von %(count)d Backends"
msgid "Headers"
msgstr "Header"
-#: panels/history/panel.py:18 panels/history/panel.py:19
+#: panels/history/panel.py:19 panels/history/panel.py:20
msgid "History"
msgstr "Geschichte"
@@ -54,7 +78,7 @@ msgstr "Geschichte"
msgid "Profiling"
msgstr "Profiling"
-#: panels/redirects.py:14
+#: panels/redirects.py:17
msgid "Intercept redirects"
msgstr "Umleitungen abfangen"
@@ -62,11 +86,11 @@ msgstr "Umleitungen abfangen"
msgid "Request"
msgstr "Anfrage"
-#: panels/request.py:36
+#: panels/request.py:38
msgid ""
msgstr ""
-#: panels/request.py:53
+#: panels/request.py:55
msgid ""
msgstr ""
@@ -97,151 +121,151 @@ msgstr[1] "%(num_receivers)d Empfänger von %(num_signals)d Signalen"
msgid "Signals"
msgstr "Signale"
-#: panels/sql/panel.py:23
-msgid "Autocommit"
-msgstr "Autocommit"
-
-#: panels/sql/panel.py:24
+#: panels/sql/panel.py:30 panels/sql/panel.py:41
msgid "Read uncommitted"
msgstr "Read uncommitted"
-#: panels/sql/panel.py:25
+#: panels/sql/panel.py:31 panels/sql/panel.py:43
msgid "Read committed"
msgstr "Read committed"
-#: panels/sql/panel.py:26
+#: panels/sql/panel.py:32 panels/sql/panel.py:45
msgid "Repeatable read"
msgstr "Repeatable read"
-#: panels/sql/panel.py:27
+#: panels/sql/panel.py:33 panels/sql/panel.py:47
msgid "Serializable"
msgstr "Serializable"
#: panels/sql/panel.py:39
+msgid "Autocommit"
+msgstr "Autocommit"
+
+#: panels/sql/panel.py:61 panels/sql/panel.py:71
msgid "Idle"
msgstr "Wartet"
-#: panels/sql/panel.py:40
+#: panels/sql/panel.py:62 panels/sql/panel.py:72
msgid "Active"
msgstr "Aktiv"
-#: panels/sql/panel.py:41
+#: panels/sql/panel.py:63 panels/sql/panel.py:73
msgid "In transaction"
msgstr "In einer Transaktion"
-#: panels/sql/panel.py:42
+#: panels/sql/panel.py:64 panels/sql/panel.py:74
msgid "In error"
msgstr "Fehler"
-#: panels/sql/panel.py:43
+#: panels/sql/panel.py:65 panels/sql/panel.py:75
msgid "Unknown"
msgstr "Unbekannt"
-#: panels/sql/panel.py:130
+#: panels/sql/panel.py:162
msgid "SQL"
msgstr "SQL"
-#: panels/sql/panel.py:135
+#: panels/sql/panel.py:168
#, python-format
msgid "%(query_count)d query in %(sql_time).2fms"
msgid_plural "%(query_count)d queries in %(sql_time).2fms"
msgstr[0] "%(query_count)d Abfrage in %(sql_time).2f ms"
msgstr[1] "%(query_count)d Abfragen in %(sql_time).2f ms"
-#: panels/sql/panel.py:147
+#: panels/sql/panel.py:180
#, python-format
msgid "SQL queries from %(count)d connection"
msgid_plural "SQL queries from %(count)d connections"
msgstr[0] "SQL-Abfragen von %(count)d Verbindung"
msgstr[1] "SQL-Abfragen von %(count)d Verbindungen"
-#: panels/staticfiles.py:84
+#: panels/staticfiles.py:82
#, python-format
msgid "Static files (%(num_found)s found, %(num_used)s used)"
msgstr "Statische Dateien (%(num_found)s gefunden, %(num_used)s benutzt)"
-#: panels/staticfiles.py:105
+#: panels/staticfiles.py:103
msgid "Static files"
msgstr "Statische Dateien"
-#: panels/staticfiles.py:111
+#: panels/staticfiles.py:109
#, python-format
msgid "%(num_used)s file used"
msgid_plural "%(num_used)s files used"
msgstr[0] "%(num_used)s Datei benutzt"
msgstr[1] "%(num_used)s Dateien benutzt"
-#: panels/templates/panel.py:143
+#: panels/templates/panel.py:101
msgid "Templates"
msgstr "Templates"
-#: panels/templates/panel.py:148
+#: panels/templates/panel.py:106
#, python-format
msgid "Templates (%(num_templates)s rendered)"
msgstr "Templates (%(num_templates)s gerendert)"
-#: panels/templates/panel.py:180
+#: panels/templates/panel.py:195
msgid "No origin"
msgstr "Kein Ursprung"
-#: panels/timer.py:25
+#: panels/timer.py:27
#, python-format
msgid "CPU: %(cum)0.2fms (%(total)0.2fms)"
msgstr "CPU: %(cum)0.2fms (%(total)0.2fms)"
-#: panels/timer.py:30
+#: panels/timer.py:32
#, python-format
msgid "Total: %0.2fms"
msgstr "Gesamt: %0.2fms"
-#: panels/timer.py:36 templates/debug_toolbar/panels/history.html:9
+#: panels/timer.py:38 templates/debug_toolbar/panels/history.html:9
#: templates/debug_toolbar/panels/sql_explain.html:11
#: templates/debug_toolbar/panels/sql_profile.html:12
#: templates/debug_toolbar/panels/sql_select.html:11
msgid "Time"
msgstr "Zeit"
-#: panels/timer.py:44
+#: panels/timer.py:46
msgid "User CPU time"
msgstr "CPU-Zeit Benutzer"
-#: panels/timer.py:44
+#: panels/timer.py:46
#, python-format
msgid "%(utime)0.3f msec"
msgstr "%(utime)0.3f ms"
-#: panels/timer.py:45
+#: panels/timer.py:47
msgid "System CPU time"
msgstr "CPU-Zeit System"
-#: panels/timer.py:45
+#: panels/timer.py:47
#, python-format
msgid "%(stime)0.3f msec"
msgstr "%(stime)0.3f ms"
-#: panels/timer.py:46
+#: panels/timer.py:48
msgid "Total CPU time"
msgstr "CPU-Zeit gesamt"
-#: panels/timer.py:46
+#: panels/timer.py:48
#, python-format
msgid "%(total)0.3f msec"
msgstr "%(total)0.3f ms"
-#: panels/timer.py:47
+#: panels/timer.py:49
msgid "Elapsed time"
msgstr "Verstrichene Zeit"
-#: panels/timer.py:47
+#: panels/timer.py:49
#, python-format
msgid "%(total_time)0.3f msec"
msgstr "%(total_time)0.3f ms"
-#: panels/timer.py:49
+#: panels/timer.py:51
msgid "Context switches"
msgstr "Kontextwechsel"
-#: panels/timer.py:50
+#: panels/timer.py:52
#, python-format
msgid "%(vcsw)d voluntary, %(ivcsw)d involuntary"
msgstr "%(vcsw)d freiwillig, %(ivcsw)d unfreiwillig"
@@ -250,15 +274,19 @@ msgstr "%(vcsw)d freiwillig, %(ivcsw)d unfreiwillig"
msgid "Versions"
msgstr "Versionen"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide toolbar"
msgstr "Toolbar ausblenden"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide"
msgstr "Ausblenden"
-#: templates/debug_toolbar/base.html:29
+#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26
+msgid "Toggle Theme"
+msgstr ""
+
+#: templates/debug_toolbar/base.html:35
msgid "Show toolbar"
msgstr "Toolbar einblenden"
@@ -270,6 +298,14 @@ msgstr "Für nächste und die darauffolgenden Anfragen deaktivieren"
msgid "Enable for next and successive requests"
msgstr "Für nächste und die darauffolgenden Anfragen aktivieren"
+#: templates/debug_toolbar/panels/alerts.html:4
+msgid "Alerts found"
+msgstr ""
+
+#: templates/debug_toolbar/panels/alerts.html:11
+msgid "No alerts found"
+msgstr ""
+
#: templates/debug_toolbar/panels/cache.html:2
msgid "Summary"
msgstr "Zusammenfassung"
@@ -353,9 +389,7 @@ msgstr "WSGI-Umgebung"
msgid ""
"Since the WSGI environ inherits the environment of the server, only a "
"significant subset is shown below."
-msgstr ""
-"Da sich die WSGI-Umgebung von der Umgebung des Servers ableitet, wird nur "
-"eine notwendige Teilmenge dargestellt."
+msgstr "Da sich die WSGI-Umgebung von der Umgebung des Servers ableitet, wird nur eine notwendige Teilmenge dargestellt."
#: templates/debug_toolbar/panels/history.html:10
msgid "Method"
@@ -473,18 +507,14 @@ msgstr[1] "%(num)s Abfragen"
msgid ""
"including %(count)s similar "
-msgstr ""
-"inklusive %(count)s ähnlich "
+msgstr "inklusive %(count)s ähnlich "
#: templates/debug_toolbar/panels/sql.html:12
#, python-format
msgid ""
"and %(dupes)s duplicates "
-msgstr ""
-"und %(dupes)s dupliziert "
+msgstr "und %(dupes)s dupliziert "
#: templates/debug_toolbar/panels/sql.html:34
msgid "Query"
@@ -668,15 +698,10 @@ msgid ""
"The Django Debug Toolbar has intercepted a redirect to the above URL for "
"debug viewing purposes. You can click the above link to continue with the "
"redirect as normal."
-msgstr ""
-"Die Django Debug Toolbar hat eine Weiterleitung an die obenstehende URL zur "
-"weiteren Überprüfung abgefangen. Klicken Sie den Link, um wie gewohnt "
-"weitergeleitet zu werden."
+msgstr "Die Django Debug Toolbar hat eine Weiterleitung an die obenstehende URL zur weiteren Überprüfung abgefangen. Klicken Sie den Link, um wie gewohnt weitergeleitet zu werden."
#: views.py:16
msgid ""
"Data for this panel isn't available anymore. Please reload the page and "
"retry."
-msgstr ""
-"Die Daten für dieses Panel sind nicht mehr verfügbar. Bitte laden Sie die "
-"Seite neu."
+msgstr "Die Daten für dieses Panel sind nicht mehr verfügbar. Bitte laden Sie die Seite neu."
diff --git a/debug_toolbar/locale/en/LC_MESSAGES/django.po b/debug_toolbar/locale/en/LC_MESSAGES/django.po
index 8fafee164..9dc155bef 100644
--- a/debug_toolbar/locale/en/LC_MESSAGES/django.po
+++ b/debug_toolbar/locale/en/LC_MESSAGES/django.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Django Debug Toolbar\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-01-20 17:23+0100\n"
+"POT-Creation-Date: 2024-08-06 07:12-0500\n"
"PO-Revision-Date: 2012-03-31 20:10+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -16,22 +16,46 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: apps.py:15
+#: apps.py:18
msgid "Debug Toolbar"
msgstr ""
-#: panels/cache.py:180
+#: panels/alerts.py:67
+#, python-brace-format
+msgid ""
+"Form with id \"{form_id}\" contains file input, but does not have the "
+"attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:70
+msgid ""
+"Form contains file input, but does not have the attribute "
+"enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:73
+#, python-brace-format
+msgid ""
+"Input element references form with id \"{form_id}\", but the form does not "
+"have the attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:77
+msgid "Alerts"
+msgstr ""
+
+#: panels/cache.py:168
msgid "Cache"
msgstr ""
-#: panels/cache.py:186
+#: panels/cache.py:174
#, python-format
msgid "%(cache_calls)d call in %(time).2fms"
msgid_plural "%(cache_calls)d calls in %(time).2fms"
msgstr[0] ""
msgstr[1] ""
-#: panels/cache.py:195
+#: panels/cache.py:183
#, python-format
msgid "Cache calls from %(count)d backend"
msgid_plural "Cache calls from %(count)d backends"
@@ -42,7 +66,7 @@ msgstr[1] ""
msgid "Headers"
msgstr ""
-#: panels/history/panel.py:18 panels/history/panel.py:19
+#: panels/history/panel.py:19 panels/history/panel.py:20
msgid "History"
msgstr ""
@@ -50,7 +74,7 @@ msgstr ""
msgid "Profiling"
msgstr ""
-#: panels/redirects.py:14
+#: panels/redirects.py:17
msgid "Intercept redirects"
msgstr ""
@@ -58,11 +82,11 @@ msgstr ""
msgid "Request"
msgstr ""
-#: panels/request.py:36
+#: panels/request.py:38
msgid ""
msgstr ""
-#: panels/request.py:53
+#: panels/request.py:55
msgid ""
msgstr ""
@@ -93,151 +117,151 @@ msgstr[1] ""
msgid "Signals"
msgstr ""
-#: panels/sql/panel.py:23
-msgid "Autocommit"
-msgstr ""
-
-#: panels/sql/panel.py:24
+#: panels/sql/panel.py:30 panels/sql/panel.py:41
msgid "Read uncommitted"
msgstr ""
-#: panels/sql/panel.py:25
+#: panels/sql/panel.py:31 panels/sql/panel.py:43
msgid "Read committed"
msgstr ""
-#: panels/sql/panel.py:26
+#: panels/sql/panel.py:32 panels/sql/panel.py:45
msgid "Repeatable read"
msgstr ""
-#: panels/sql/panel.py:27
+#: panels/sql/panel.py:33 panels/sql/panel.py:47
msgid "Serializable"
msgstr ""
#: panels/sql/panel.py:39
+msgid "Autocommit"
+msgstr ""
+
+#: panels/sql/panel.py:61 panels/sql/panel.py:71
msgid "Idle"
msgstr ""
-#: panels/sql/panel.py:40
+#: panels/sql/panel.py:62 panels/sql/panel.py:72
msgid "Active"
msgstr ""
-#: panels/sql/panel.py:41
+#: panels/sql/panel.py:63 panels/sql/panel.py:73
msgid "In transaction"
msgstr ""
-#: panels/sql/panel.py:42
+#: panels/sql/panel.py:64 panels/sql/panel.py:74
msgid "In error"
msgstr ""
-#: panels/sql/panel.py:43
+#: panels/sql/panel.py:65 panels/sql/panel.py:75
msgid "Unknown"
msgstr ""
-#: panels/sql/panel.py:130
+#: panels/sql/panel.py:162
msgid "SQL"
msgstr ""
-#: panels/sql/panel.py:135
+#: panels/sql/panel.py:168
#, python-format
msgid "%(query_count)d query in %(sql_time).2fms"
msgid_plural "%(query_count)d queries in %(sql_time).2fms"
msgstr[0] ""
msgstr[1] ""
-#: panels/sql/panel.py:147
+#: panels/sql/panel.py:180
#, python-format
msgid "SQL queries from %(count)d connection"
msgid_plural "SQL queries from %(count)d connections"
msgstr[0] ""
msgstr[1] ""
-#: panels/staticfiles.py:84
+#: panels/staticfiles.py:82
#, python-format
msgid "Static files (%(num_found)s found, %(num_used)s used)"
msgstr ""
-#: panels/staticfiles.py:105
+#: panels/staticfiles.py:103
msgid "Static files"
msgstr ""
-#: panels/staticfiles.py:111
+#: panels/staticfiles.py:109
#, python-format
msgid "%(num_used)s file used"
msgid_plural "%(num_used)s files used"
msgstr[0] ""
msgstr[1] ""
-#: panels/templates/panel.py:143
+#: panels/templates/panel.py:101
msgid "Templates"
msgstr ""
-#: panels/templates/panel.py:148
+#: panels/templates/panel.py:106
#, python-format
msgid "Templates (%(num_templates)s rendered)"
msgstr ""
-#: panels/templates/panel.py:180
+#: panels/templates/panel.py:195
msgid "No origin"
msgstr ""
-#: panels/timer.py:25
+#: panels/timer.py:27
#, python-format
msgid "CPU: %(cum)0.2fms (%(total)0.2fms)"
msgstr ""
-#: panels/timer.py:30
+#: panels/timer.py:32
#, python-format
msgid "Total: %0.2fms"
msgstr ""
-#: panels/timer.py:36 templates/debug_toolbar/panels/history.html:9
+#: panels/timer.py:38 templates/debug_toolbar/panels/history.html:9
#: templates/debug_toolbar/panels/sql_explain.html:11
#: templates/debug_toolbar/panels/sql_profile.html:12
#: templates/debug_toolbar/panels/sql_select.html:11
msgid "Time"
msgstr ""
-#: panels/timer.py:44
+#: panels/timer.py:46
msgid "User CPU time"
msgstr ""
-#: panels/timer.py:44
+#: panels/timer.py:46
#, python-format
msgid "%(utime)0.3f msec"
msgstr ""
-#: panels/timer.py:45
+#: panels/timer.py:47
msgid "System CPU time"
msgstr ""
-#: panels/timer.py:45
+#: panels/timer.py:47
#, python-format
msgid "%(stime)0.3f msec"
msgstr ""
-#: panels/timer.py:46
+#: panels/timer.py:48
msgid "Total CPU time"
msgstr ""
-#: panels/timer.py:46
+#: panels/timer.py:48
#, python-format
msgid "%(total)0.3f msec"
msgstr ""
-#: panels/timer.py:47
+#: panels/timer.py:49
msgid "Elapsed time"
msgstr ""
-#: panels/timer.py:47
+#: panels/timer.py:49
#, python-format
msgid "%(total_time)0.3f msec"
msgstr ""
-#: panels/timer.py:49
+#: panels/timer.py:51
msgid "Context switches"
msgstr ""
-#: panels/timer.py:50
+#: panels/timer.py:52
#, python-format
msgid "%(vcsw)d voluntary, %(ivcsw)d involuntary"
msgstr ""
@@ -246,15 +270,19 @@ msgstr ""
msgid "Versions"
msgstr ""
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide toolbar"
msgstr ""
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide"
msgstr ""
-#: templates/debug_toolbar/base.html:29
+#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26
+msgid "Toggle Theme"
+msgstr ""
+
+#: templates/debug_toolbar/base.html:35
msgid "Show toolbar"
msgstr ""
@@ -266,6 +294,14 @@ msgstr ""
msgid "Enable for next and successive requests"
msgstr ""
+#: templates/debug_toolbar/panels/alerts.html:4
+msgid "Alerts found"
+msgstr ""
+
+#: templates/debug_toolbar/panels/alerts.html:11
+msgid "No alerts found"
+msgstr ""
+
#: templates/debug_toolbar/panels/cache.html:2
msgid "Summary"
msgstr ""
diff --git a/debug_toolbar/locale/es/LC_MESSAGES/django.mo b/debug_toolbar/locale/es/LC_MESSAGES/django.mo
index e2a8c6cfd..583f88ef9 100644
Binary files a/debug_toolbar/locale/es/LC_MESSAGES/django.mo and b/debug_toolbar/locale/es/LC_MESSAGES/django.mo differ
diff --git a/debug_toolbar/locale/es/LC_MESSAGES/django.po b/debug_toolbar/locale/es/LC_MESSAGES/django.po
index 7babef326..d757cce1f 100644
--- a/debug_toolbar/locale/es/LC_MESSAGES/django.po
+++ b/debug_toolbar/locale/es/LC_MESSAGES/django.po
@@ -12,44 +12,69 @@ msgid ""
msgstr ""
"Project-Id-Version: Django Debug Toolbar\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-01-20 17:23+0100\n"
-"PO-Revision-Date: 2021-10-01 11:10+0000\n"
-"Last-Translator: Daniel Iglesias \n"
-"Language-Team: Spanish (http://www.transifex.com/django-debug-toolbar/django-"
-"debug-toolbar/language/es/)\n"
-"Language: es\n"
+"POT-Creation-Date: 2024-08-06 07:12-0500\n"
+"PO-Revision-Date: 2010-11-30 00:00+0000\n"
+"Last-Translator: Daniel Iglesias , 2021\n"
+"Language-Team: Spanish (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/es/)\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"
+"Language: es\n"
+"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
-#: apps.py:15
+#: apps.py:18
msgid "Debug Toolbar"
msgstr "Barra de herramientas de Depuración"
-#: panels/cache.py:180
+#: panels/alerts.py:67
+#, python-brace-format
+msgid ""
+"Form with id \"{form_id}\" contains file input, but does not have the "
+"attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:70
+msgid ""
+"Form contains file input, but does not have the attribute "
+"enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:73
+#, python-brace-format
+msgid ""
+"Input element references form with id \"{form_id}\", but the form does not "
+"have the attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:77
+msgid "Alerts"
+msgstr ""
+
+#: panels/cache.py:168
msgid "Cache"
msgstr "Cache"
-#: panels/cache.py:186
+#: panels/cache.py:174
#, python-format
msgid "%(cache_calls)d call in %(time).2fms"
msgid_plural "%(cache_calls)d calls in %(time).2fms"
msgstr[0] "%(cache_calls)d llamada en %(time).2fms"
msgstr[1] "%(cache_calls)d llamadas en %(time).2fms"
+msgstr[2] "%(cache_calls)d llamadas en %(time).2fms"
-#: panels/cache.py:195
+#: panels/cache.py:183
#, python-format
msgid "Cache calls from %(count)d backend"
msgid_plural "Cache calls from %(count)d backends"
msgstr[0] "%(count)d llamadas al Cache desde el backend"
msgstr[1] "%(count)d llamadas al Caché desde backends"
+msgstr[2] "%(count)d llamadas al Caché desde backends"
#: panels/headers.py:31
msgid "Headers"
msgstr "Encabezados"
-#: panels/history/panel.py:18 panels/history/panel.py:19
+#: panels/history/panel.py:19 panels/history/panel.py:20
msgid "History"
msgstr "Historial"
@@ -57,7 +82,7 @@ msgstr "Historial"
msgid "Profiling"
msgstr "Análisis de rendimiento"
-#: panels/redirects.py:14
+#: panels/redirects.py:17
msgid "Intercept redirects"
msgstr "Interceptar re-direcionamiento"
@@ -65,11 +90,11 @@ msgstr "Interceptar re-direcionamiento"
msgid "Request"
msgstr "Petición"
-#: panels/request.py:36
+#: panels/request.py:38
msgid ""
msgstr ""
-#: panels/request.py:53
+#: panels/request.py:55
msgid ""
msgstr ""
@@ -88,6 +113,7 @@ msgid "%(num_receivers)d receiver of 1 signal"
msgid_plural "%(num_receivers)d receivers of 1 signal"
msgstr[0] "%(num_receivers)d receptor de 1 señal"
msgstr[1] "%(num_receivers)d receptores de 1 señal"
+msgstr[2] "%(num_receivers)d receptores de 1 señal"
#: panels/signals.py:62
#, python-format
@@ -95,156 +121,160 @@ msgid "%(num_receivers)d receiver of %(num_signals)d signals"
msgid_plural "%(num_receivers)d receivers of %(num_signals)d signals"
msgstr[0] "%(num_receivers)d receptor de %(num_signals)d señales"
msgstr[1] "%(num_receivers)d receptores de %(num_signals)d señales"
+msgstr[2] "%(num_receivers)d receptores de %(num_signals)d señales"
#: panels/signals.py:67
msgid "Signals"
msgstr "Señales"
-#: panels/sql/panel.py:23
-msgid "Autocommit"
-msgstr "Autocommit"
-
-#: panels/sql/panel.py:24
+#: panels/sql/panel.py:30 panels/sql/panel.py:41
msgid "Read uncommitted"
msgstr "Leer cambios tentativos"
-#: panels/sql/panel.py:25
+#: panels/sql/panel.py:31 panels/sql/panel.py:43
msgid "Read committed"
msgstr "Leer cambios permanentes"
-#: panels/sql/panel.py:26
+#: panels/sql/panel.py:32 panels/sql/panel.py:45
msgid "Repeatable read"
msgstr "Lectura repetible"
-#: panels/sql/panel.py:27
+#: panels/sql/panel.py:33 panels/sql/panel.py:47
msgid "Serializable"
msgstr "Serializable"
#: panels/sql/panel.py:39
+msgid "Autocommit"
+msgstr "Autocommit"
+
+#: panels/sql/panel.py:61 panels/sql/panel.py:71
msgid "Idle"
msgstr "Inactivo"
-#: panels/sql/panel.py:40
+#: panels/sql/panel.py:62 panels/sql/panel.py:72
msgid "Active"
msgstr "Activo"
-#: panels/sql/panel.py:41
+#: panels/sql/panel.py:63 panels/sql/panel.py:73
msgid "In transaction"
msgstr "En transacción"
-#: panels/sql/panel.py:42
+#: panels/sql/panel.py:64 panels/sql/panel.py:74
msgid "In error"
msgstr "En error"
-#: panels/sql/panel.py:43
+#: panels/sql/panel.py:65 panels/sql/panel.py:75
msgid "Unknown"
msgstr "Desconocido"
-#: panels/sql/panel.py:130
+#: panels/sql/panel.py:162
msgid "SQL"
msgstr "SQL"
-#: panels/sql/panel.py:135
+#: panels/sql/panel.py:168
#, python-format
msgid "%(query_count)d query in %(sql_time).2fms"
msgid_plural "%(query_count)d queries in %(sql_time).2fms"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
-#: panels/sql/panel.py:147
+#: panels/sql/panel.py:180
#, python-format
msgid "SQL queries from %(count)d connection"
msgid_plural "SQL queries from %(count)d connections"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
-#: panels/staticfiles.py:84
+#: panels/staticfiles.py:82
#, python-format
msgid "Static files (%(num_found)s found, %(num_used)s used)"
msgstr "Archivos estáticos (%(num_found)s encontrados, %(num_used)s en uso)"
-#: panels/staticfiles.py:105
+#: panels/staticfiles.py:103
msgid "Static files"
msgstr "Archivos estáticos"
-#: panels/staticfiles.py:111
+#: panels/staticfiles.py:109
#, python-format
msgid "%(num_used)s file used"
msgid_plural "%(num_used)s files used"
msgstr[0] "%(num_used)s archivo usado"
msgstr[1] "%(num_used)s archivos usados"
+msgstr[2] "%(num_used)s archivos usados"
-#: panels/templates/panel.py:143
+#: panels/templates/panel.py:101
msgid "Templates"
msgstr "Plantillas"
-#: panels/templates/panel.py:148
+#: panels/templates/panel.py:106
#, python-format
msgid "Templates (%(num_templates)s rendered)"
msgstr "Plantillas (%(num_templates)s renderizadas)"
-#: panels/templates/panel.py:180
+#: panels/templates/panel.py:195
msgid "No origin"
msgstr "Sin origen"
-#: panels/timer.py:25
+#: panels/timer.py:27
#, python-format
msgid "CPU: %(cum)0.2fms (%(total)0.2fms)"
msgstr "CPU: %(cum)0.2fms (%(total)0.2fms)"
-#: panels/timer.py:30
+#: panels/timer.py:32
#, python-format
msgid "Total: %0.2fms"
msgstr "Total: %0.2fms"
-#: panels/timer.py:36 templates/debug_toolbar/panels/history.html:9
+#: panels/timer.py:38 templates/debug_toolbar/panels/history.html:9
#: templates/debug_toolbar/panels/sql_explain.html:11
#: templates/debug_toolbar/panels/sql_profile.html:12
#: templates/debug_toolbar/panels/sql_select.html:11
msgid "Time"
msgstr "Tiempo"
-#: panels/timer.py:44
+#: panels/timer.py:46
msgid "User CPU time"
msgstr "Tiempo en CPU de usuario"
-#: panels/timer.py:44
+#: panels/timer.py:46
#, python-format
msgid "%(utime)0.3f msec"
msgstr "%(utime)0.3f mseg"
-#: panels/timer.py:45
+#: panels/timer.py:47
msgid "System CPU time"
msgstr "Tiempo en CPU del sistema"
-#: panels/timer.py:45
+#: panels/timer.py:47
#, python-format
msgid "%(stime)0.3f msec"
msgstr "%(stime)0.3f mseg"
-#: panels/timer.py:46
+#: panels/timer.py:48
msgid "Total CPU time"
msgstr "Tiempo total de CPU"
-#: panels/timer.py:46
+#: panels/timer.py:48
#, python-format
msgid "%(total)0.3f msec"
msgstr "%(total)0.3f mseg"
-#: panels/timer.py:47
+#: panels/timer.py:49
msgid "Elapsed time"
msgstr "Tiempo transcurrido"
-#: panels/timer.py:47
+#: panels/timer.py:49
#, python-format
msgid "%(total_time)0.3f msec"
msgstr "%(total_time)0.3f mseg"
-#: panels/timer.py:49
+#: panels/timer.py:51
msgid "Context switches"
msgstr "Cambios de contexto"
-#: panels/timer.py:50
+#: panels/timer.py:52
#, python-format
msgid "%(vcsw)d voluntary, %(ivcsw)d involuntary"
msgstr "%(vcsw)d voluntario, %(ivcsw)d involuntario"
@@ -253,15 +283,19 @@ msgstr "%(vcsw)d voluntario, %(ivcsw)d involuntario"
msgid "Versions"
msgstr "Versiones"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide toolbar"
msgstr "Ocutar barra de herramientas"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide"
msgstr "Ocultar"
-#: templates/debug_toolbar/base.html:29
+#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26
+msgid "Toggle Theme"
+msgstr ""
+
+#: templates/debug_toolbar/base.html:35
msgid "Show toolbar"
msgstr "Mostrar barra de herramientas"
@@ -273,6 +307,14 @@ msgstr "Deshabilitar para el próximo y sucesivos peticiones"
msgid "Enable for next and successive requests"
msgstr "Habilitar para el próximo y sucesivos peticiones"
+#: templates/debug_toolbar/panels/alerts.html:4
+msgid "Alerts found"
+msgstr ""
+
+#: templates/debug_toolbar/panels/alerts.html:11
+msgid "No alerts found"
+msgstr ""
+
#: templates/debug_toolbar/panels/cache.html:2
msgid "Summary"
msgstr "Resúmen"
@@ -356,9 +398,7 @@ msgstr "Entorno WSGI"
msgid ""
"Since the WSGI environ inherits the environment of the server, only a "
"significant subset is shown below."
-msgstr ""
-"Ya que el entorno WSGI hereda el entorno del servidor, solo un subconjunto "
-"significativo es mostrado más abajo."
+msgstr "Ya que el entorno WSGI hereda el entorno del servidor, solo un subconjunto significativo es mostrado más abajo."
#: templates/debug_toolbar/panels/history.html:10
msgid "Method"
@@ -470,6 +510,7 @@ msgid "%(num)s query"
msgid_plural "%(num)s queries"
msgstr[0] "%(num)s consulta"
msgstr[1] "%(num)s consultas"
+msgstr[2] "%(num)s consultas"
#: templates/debug_toolbar/panels/sql.html:8
#, python-format
@@ -483,9 +524,7 @@ msgstr ""
msgid ""
"and %(dupes)s duplicates "
-msgstr ""
-"y %(dupes)s repetidos "
+msgstr "y %(dupes)s repetidos "
#: templates/debug_toolbar/panels/sql.html:34
msgid "Query"
@@ -563,6 +602,7 @@ msgid "Static file path"
msgid_plural "Static file paths"
msgstr[0] "Ruta a archivos estático"
msgstr[1] "Rutas a archivos estáticos"
+msgstr[2] "Rutas a archivos estáticos"
#: templates/debug_toolbar/panels/staticfiles.html:7
#, python-format
@@ -583,12 +623,14 @@ msgid "Static file app"
msgid_plural "Static file apps"
msgstr[0] "Aplicación a archivos estáticos"
msgstr[1] "Aplicaciones de archivos estáticos"
+msgstr[2] "Aplicaciones de archivos estáticos"
#: templates/debug_toolbar/panels/staticfiles.html:25
msgid "Static file"
msgid_plural "Static files"
msgstr[0] "Archivo estático"
msgstr[1] "Archivos estáticos"
+msgstr[2] "Archivos estáticos"
#: templates/debug_toolbar/panels/staticfiles.html:39
#, python-format
@@ -596,6 +638,7 @@ msgid "%(payload_count)s file"
msgid_plural "%(payload_count)s files"
msgstr[0] "%(payload_count)s archivo"
msgstr[1] "%(payload_count)s archivos"
+msgstr[2] "%(payload_count)s archivos"
#: templates/debug_toolbar/panels/staticfiles.html:44
msgid "Location"
@@ -610,12 +653,14 @@ msgid "Template path"
msgid_plural "Template paths"
msgstr[0] "Ruta de plantilla"
msgstr[1] "Rutas de plantillas"
+msgstr[2] "Rutas de plantillas"
#: templates/debug_toolbar/panels/templates.html:13
msgid "Template"
msgid_plural "Templates"
msgstr[0] "Plantilla"
msgstr[1] "Plantillas"
+msgstr[2] "Plantillas"
#: templates/debug_toolbar/panels/templates.html:22
#: templates/debug_toolbar/panels/templates.html:40
@@ -627,6 +672,7 @@ msgid "Context processor"
msgid_plural "Context processors"
msgstr[0] "Procesador de contexto"
msgstr[1] "Procesadores de contexto"
+msgstr[2] "Procesadores de contexto"
#: templates/debug_toolbar/panels/timer.html:2
msgid "Resource usage"
@@ -669,16 +715,10 @@ msgid ""
"The Django Debug Toolbar has intercepted a redirect to the above URL for "
"debug viewing purposes. You can click the above link to continue with the "
"redirect as normal."
-msgstr ""
-"El Django Debug Toolbar ha interceptado un re-direccionamiento a la "
-"dirección de Internet mostrada arriba, con el propósito de inspeccionarla. "
-"Usted puede hacer clic en el vínculo de arriba para continuar con el re-"
-"direccionamiento normalmente."
+msgstr "El Django Debug Toolbar ha interceptado un re-direccionamiento a la dirección de Internet mostrada arriba, con el propósito de inspeccionarla. Usted puede hacer clic en el vínculo de arriba para continuar con el re-direccionamiento normalmente."
#: views.py:16
msgid ""
"Data for this panel isn't available anymore. Please reload the page and "
"retry."
-msgstr ""
-"La información de este panel ya no se encuentra disponible. Por favor "
-"recargue la página y pruebe nuevamente."
+msgstr "La información de este panel ya no se encuentra disponible. Por favor recargue la página y pruebe nuevamente."
diff --git a/debug_toolbar/locale/fa/LC_MESSAGES/django.mo b/debug_toolbar/locale/fa/LC_MESSAGES/django.mo
index 403810b2c..fa30fd402 100644
Binary files a/debug_toolbar/locale/fa/LC_MESSAGES/django.mo and b/debug_toolbar/locale/fa/LC_MESSAGES/django.mo differ
diff --git a/debug_toolbar/locale/fa/LC_MESSAGES/django.po b/debug_toolbar/locale/fa/LC_MESSAGES/django.po
index 1c9c1b32f..edb202e62 100644
--- a/debug_toolbar/locale/fa/LC_MESSAGES/django.po
+++ b/debug_toolbar/locale/fa/LC_MESSAGES/django.po
@@ -4,48 +4,72 @@
#
# Translators:
# Ali Soltani , 2021
+# Elyas Ebrahimpour , 2024
msgid ""
msgstr ""
"Project-Id-Version: Django Debug Toolbar\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-01-20 17:23+0100\n"
-"PO-Revision-Date: 2021-09-30 18:42+0000\n"
-"Last-Translator: Ali Soltani \n"
-"Language-Team: Persian (http://www.transifex.com/django-debug-toolbar/django-"
-"debug-toolbar/language/fa/)\n"
-"Language: fa\n"
+"POT-Creation-Date: 2024-08-06 07:12-0500\n"
+"PO-Revision-Date: 2010-11-30 00:00+0000\n"
+"Last-Translator: Elyas Ebrahimpour , 2024\n"
+"Language-Team: Persian (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/fa/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Language: fa\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-#: apps.py:15
+#: apps.py:18
msgid "Debug Toolbar"
msgstr "نوار ابزار دیباگ"
-#: panels/cache.py:180
+#: panels/alerts.py:67
+#, python-brace-format
+msgid ""
+"Form with id \"{form_id}\" contains file input, but does not have the "
+"attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:70
+msgid ""
+"Form contains file input, but does not have the attribute "
+"enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:73
+#, python-brace-format
+msgid ""
+"Input element references form with id \"{form_id}\", but the form does not "
+"have the attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:77
+msgid "Alerts"
+msgstr ""
+
+#: panels/cache.py:168
msgid "Cache"
msgstr "Cache"
-#: panels/cache.py:186
+#: panels/cache.py:174
#, python-format
msgid "%(cache_calls)d call in %(time).2fms"
msgid_plural "%(cache_calls)d calls in %(time).2fms"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%(cache_calls)d فراخوان در %(time).2f میلیثانیه"
+msgstr[1] "%(cache_calls)d فراخوان در %(time).2f میلیثانیه"
-#: panels/cache.py:195
+#: panels/cache.py:183
#, python-format
msgid "Cache calls from %(count)d backend"
msgid_plural "Cache calls from %(count)d backends"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "فراخوانهای کش از %(count)d بکاند"
+msgstr[1] "فراخوانهای کش از %(count)d بکاندها"
#: panels/headers.py:31
msgid "Headers"
msgstr "هدر ها"
-#: panels/history/panel.py:18 panels/history/panel.py:19
+#: panels/history/panel.py:19 panels/history/panel.py:20
msgid "History"
msgstr "تاریخچه"
@@ -53,21 +77,21 @@ msgstr "تاریخچه"
msgid "Profiling"
msgstr "نمایه سازی"
-#: panels/redirects.py:14
+#: panels/redirects.py:17
msgid "Intercept redirects"
-msgstr ""
+msgstr "رهگیری تغییر مسیرها"
#: panels/request.py:16
msgid "Request"
msgstr "ریکوئست"
-#: panels/request.py:36
+#: panels/request.py:38
msgid ""
-msgstr ""
+msgstr "<بدون نمایش>"
-#: panels/request.py:53
+#: panels/request.py:55
msgid ""
-msgstr ""
+msgstr "<در دسترس نیست>"
#: panels/settings.py:17
msgid "Settings"
@@ -82,182 +106,186 @@ msgstr "تنظیمات از %s"
#, python-format
msgid "%(num_receivers)d receiver of 1 signal"
msgid_plural "%(num_receivers)d receivers of 1 signal"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%(num_receivers)d گیرنده از 1 سیگنال"
+msgstr[1] "%(num_receivers)d گیرنده از 1 سیگنال"
#: panels/signals.py:62
#, python-format
msgid "%(num_receivers)d receiver of %(num_signals)d signals"
msgid_plural "%(num_receivers)d receivers of %(num_signals)d signals"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%(num_receivers)d گیرنده از %(num_signals)d سیگنال"
+msgstr[1] "%(num_receivers)d گیرنده از %(num_signals)d سیگنال"
#: panels/signals.py:67
msgid "Signals"
-msgstr "signal ها"
+msgstr "سیگنالها"
-#: panels/sql/panel.py:23
-msgid "Autocommit"
-msgstr "کامیت خودکار"
-
-#: panels/sql/panel.py:24
+#: panels/sql/panel.py:30 panels/sql/panel.py:41
msgid "Read uncommitted"
-msgstr ""
+msgstr "خواندن بدون تاثیر"
-#: panels/sql/panel.py:25
+#: panels/sql/panel.py:31 panels/sql/panel.py:43
msgid "Read committed"
-msgstr ""
+msgstr "خواندن با تاثیر"
-#: panels/sql/panel.py:26
+#: panels/sql/panel.py:32 panels/sql/panel.py:45
msgid "Repeatable read"
-msgstr ""
+msgstr "خواندن تکرارپذیر"
-#: panels/sql/panel.py:27
+#: panels/sql/panel.py:33 panels/sql/panel.py:47
msgid "Serializable"
msgstr "قابل سریالایز شدن"
#: panels/sql/panel.py:39
+msgid "Autocommit"
+msgstr "کامیت خودکار"
+
+#: panels/sql/panel.py:61 panels/sql/panel.py:71
msgid "Idle"
msgstr "IDLE"
-#: panels/sql/panel.py:40
+#: panels/sql/panel.py:62 panels/sql/panel.py:72
msgid "Active"
msgstr "فعال"
-#: panels/sql/panel.py:41
+#: panels/sql/panel.py:63 panels/sql/panel.py:73
msgid "In transaction"
msgstr "در تراکنش"
-#: panels/sql/panel.py:42
+#: panels/sql/panel.py:64 panels/sql/panel.py:74
msgid "In error"
msgstr "در خطا"
-#: panels/sql/panel.py:43
+#: panels/sql/panel.py:65 panels/sql/panel.py:75
msgid "Unknown"
msgstr "ناشناخته"
-#: panels/sql/panel.py:130
+#: panels/sql/panel.py:162
msgid "SQL"
msgstr "اس کیو ال"
-#: panels/sql/panel.py:135
+#: panels/sql/panel.py:168
#, python-format
msgid "%(query_count)d query in %(sql_time).2fms"
msgid_plural "%(query_count)d queries in %(sql_time).2fms"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%(query_count)d کوئری در %(sql_time).2f میلیثانیه"
+msgstr[1] "%(query_count)d کوئری در %(sql_time).2f میلیثانیه"
-#: panels/sql/panel.py:147
+#: panels/sql/panel.py:180
#, python-format
msgid "SQL queries from %(count)d connection"
msgid_plural "SQL queries from %(count)d connections"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "کوئریهای SQL از %(count)d اتصال"
+msgstr[1] "کوئریهای SQL از %(count)d اتصال"
-#: panels/staticfiles.py:84
+#: panels/staticfiles.py:82
#, python-format
msgid "Static files (%(num_found)s found, %(num_used)s used)"
-msgstr ""
+msgstr "فایلهای استاتیک (%(num_found)s یافته شده، %(num_used)s استفاده شده)"
-#: panels/staticfiles.py:105
+#: panels/staticfiles.py:103
msgid "Static files"
msgstr "فایل های استاتیک"
-#: panels/staticfiles.py:111
+#: panels/staticfiles.py:109
#, python-format
msgid "%(num_used)s file used"
msgid_plural "%(num_used)s files used"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%(num_used)s فایل استفاده شده"
+msgstr[1] "%(num_used)s فایل استفاده شده"
-#: panels/templates/panel.py:143
+#: panels/templates/panel.py:101
msgid "Templates"
msgstr "تمپلیت ها"
-#: panels/templates/panel.py:148
+#: panels/templates/panel.py:106
#, python-format
msgid "Templates (%(num_templates)s rendered)"
msgstr "تمپلیت ها (%(num_templates)s rendered)"
-#: panels/templates/panel.py:180
+#: panels/templates/panel.py:195
msgid "No origin"
msgstr "بدون origin"
-#: panels/timer.py:25
+#: panels/timer.py:27
#, python-format
msgid "CPU: %(cum)0.2fms (%(total)0.2fms)"
-msgstr ""
+msgstr "پردازنده: %(cum)0.2f میلیثانیه (%(total)0.2f میلیثانیه)"
-#: panels/timer.py:30
+#: panels/timer.py:32
#, python-format
msgid "Total: %0.2fms"
-msgstr ""
+msgstr "مجموع: %0.2f میلیثانیه"
-#: panels/timer.py:36 templates/debug_toolbar/panels/history.html:9
+#: panels/timer.py:38 templates/debug_toolbar/panels/history.html:9
#: templates/debug_toolbar/panels/sql_explain.html:11
#: templates/debug_toolbar/panels/sql_profile.html:12
#: templates/debug_toolbar/panels/sql_select.html:11
msgid "Time"
msgstr "زمان"
-#: panels/timer.py:44
+#: panels/timer.py:46
msgid "User CPU time"
msgstr "زمان سی پی یو کاربر"
-#: panels/timer.py:44
+#: panels/timer.py:46
#, python-format
msgid "%(utime)0.3f msec"
-msgstr ""
+msgstr "%(utime)0.3f میلیثانیه"
-#: panels/timer.py:45
+#: panels/timer.py:47
msgid "System CPU time"
msgstr "زمان CPU سیستم"
-#: panels/timer.py:45
+#: panels/timer.py:47
#, python-format
msgid "%(stime)0.3f msec"
-msgstr ""
+msgstr "%(stime)0.3f میلیثانیه"
-#: panels/timer.py:46
+#: panels/timer.py:48
msgid "Total CPU time"
msgstr "زمان کل سی پی یو"
-#: panels/timer.py:46
+#: panels/timer.py:48
#, python-format
msgid "%(total)0.3f msec"
msgstr "%(total)0.3f میلی ثانیه"
-#: panels/timer.py:47
+#: panels/timer.py:49
msgid "Elapsed time"
msgstr "زمان سپری شده"
-#: panels/timer.py:47
+#: panels/timer.py:49
#, python-format
msgid "%(total_time)0.3f msec"
-msgstr ""
+msgstr "%(total_time)0.3f میلیثانیه"
-#: panels/timer.py:49
+#: panels/timer.py:51
msgid "Context switches"
-msgstr ""
+msgstr "تغییرات زمینه"
-#: panels/timer.py:50
+#: panels/timer.py:52
#, python-format
msgid "%(vcsw)d voluntary, %(ivcsw)d involuntary"
-msgstr ""
+msgstr "%(vcsw)d اختیاری، %(ivcsw)d غیراختیاری"
#: panels/versions.py:19
msgid "Versions"
msgstr "ورژن ها"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide toolbar"
msgstr "پنهان کردن toolbar"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide"
msgstr "پنهان کردن"
-#: templates/debug_toolbar/base.html:29
+#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26
+msgid "Toggle Theme"
+msgstr ""
+
+#: templates/debug_toolbar/base.html:35
msgid "Show toolbar"
msgstr "نمایش toolbar"
@@ -269,6 +297,14 @@ msgstr "غیر فعال کردن برای ریکوئست های پی در پی"
msgid "Enable for next and successive requests"
msgstr "فعال کردن برای ریکوئست های بعدی و پی در پی"
+#: templates/debug_toolbar/panels/alerts.html:4
+msgid "Alerts found"
+msgstr ""
+
+#: templates/debug_toolbar/panels/alerts.html:11
+msgid "No alerts found"
+msgstr ""
+
#: templates/debug_toolbar/panels/cache.html:2
msgid "Summary"
msgstr "خلاصه"
@@ -287,9 +323,7 @@ msgstr "Cache hits"
#: templates/debug_toolbar/panels/cache.html:9
msgid "Cache misses"
-msgstr ""
-"Cache misses\n"
-" "
+msgstr "عدم دسترسی به کش"
#: templates/debug_toolbar/panels/cache.html:21
msgid "Commands"
@@ -297,7 +331,7 @@ msgstr "دستورات"
#: templates/debug_toolbar/panels/cache.html:39
msgid "Calls"
-msgstr "call ها"
+msgstr "فراخوانی ها"
#: templates/debug_toolbar/panels/cache.html:43
#: templates/debug_toolbar/panels/sql.html:36
@@ -354,9 +388,7 @@ msgstr "محیط WSGI"
msgid ""
"Since the WSGI environ inherits the environment of the server, only a "
"significant subset is shown below."
-msgstr ""
-"از آنجا که محیط WSGI محیط سرور را به ارث می برد ، فقط یک زیر مجموعه مهم در "
-"زیر نشان داده شده است."
+msgstr "از آنجا که محیط WSGI محیط سرور را به ارث می برد ، فقط یک زیر مجموعه مهم در زیر نشان داده شده است."
#: templates/debug_toolbar/panels/history.html:10
msgid "Method"
@@ -524,7 +556,7 @@ msgstr "کوئری SQL ای در این ریکوئست ثبت نشده است"
#: templates/debug_toolbar/panels/sql_explain.html:4
msgid "SQL explained"
-msgstr ""
+msgstr "توضیح SQL"
#: templates/debug_toolbar/panels/sql_explain.html:9
#: templates/debug_toolbar/panels/sql_profile.html:10
@@ -548,7 +580,7 @@ msgstr "خطا"
#: templates/debug_toolbar/panels/sql_select.html:4
msgid "SQL selected"
-msgstr ""
+msgstr "انتخاب شده SQL"
#: templates/debug_toolbar/panels/sql_select.html:36
msgid "Empty set"
@@ -616,13 +648,13 @@ msgstr[1] ""
#: templates/debug_toolbar/panels/templates.html:22
#: templates/debug_toolbar/panels/templates.html:40
msgid "Toggle context"
-msgstr ""
+msgstr "تغییر متن"
#: templates/debug_toolbar/panels/templates.html:33
msgid "Context processor"
msgid_plural "Context processors"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "پردازشگر محیط"
+msgstr[1] "پردازشگرهای محیط"
#: templates/debug_toolbar/panels/timer.html:2
msgid "Resource usage"
@@ -642,7 +674,7 @@ msgstr "ویژگی زمان بندی"
#: templates/debug_toolbar/panels/timer.html:37
msgid "Milliseconds since navigation start (+length)"
-msgstr ""
+msgstr "میلیثانیه از آغاز ناوبری (+length)"
#: templates/debug_toolbar/panels/versions.html:10
msgid "Package"
@@ -665,7 +697,7 @@ msgid ""
"The Django Debug Toolbar has intercepted a redirect to the above URL for "
"debug viewing purposes. You can click the above link to continue with the "
"redirect as normal."
-msgstr ""
+msgstr "نوار ابزار اشکالزدای Django یک هدایت به URL بالا را به منظور مشاهده اشکال توسط ابزار اشکالزدای افزونه کرده است. میتوانید بر روی پیوند بالا کلیک کنید تا با هدایت به صورت عادی ادامه دهید."
#: views.py:16
msgid ""
diff --git a/debug_toolbar/locale/fi/LC_MESSAGES/django.mo b/debug_toolbar/locale/fi/LC_MESSAGES/django.mo
index e0126d2b4..3c0054dc7 100644
Binary files a/debug_toolbar/locale/fi/LC_MESSAGES/django.mo and b/debug_toolbar/locale/fi/LC_MESSAGES/django.mo differ
diff --git a/debug_toolbar/locale/fi/LC_MESSAGES/django.po b/debug_toolbar/locale/fi/LC_MESSAGES/django.po
index 271fe51dc..fed2c9759 100644
--- a/debug_toolbar/locale/fi/LC_MESSAGES/django.po
+++ b/debug_toolbar/locale/fi/LC_MESSAGES/django.po
@@ -3,38 +3,61 @@
#
#
# Translators:
-# nanook , 2012
+# Klaus Dahlén, 2012
msgid ""
msgstr ""
"Project-Id-Version: Django Debug Toolbar\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-01-20 17:23+0100\n"
-"PO-Revision-Date: 2014-04-25 19:53+0000\n"
-"Last-Translator: Aymeric Augustin \n"
-"Language-Team: Finnish (http://www.transifex.com/projects/p/django-debug-"
-"toolbar/language/fi/)\n"
-"Language: fi\n"
+"POT-Creation-Date: 2024-08-06 07:12-0500\n"
+"PO-Revision-Date: 2010-11-30 00:00+0000\n"
+"Last-Translator: Klaus Dahlén, 2012\n"
+"Language-Team: Finnish (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/fi/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Language: fi\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: apps.py:15
+#: apps.py:18
msgid "Debug Toolbar"
msgstr ""
-#: panels/cache.py:180
+#: panels/alerts.py:67
+#, python-brace-format
+msgid ""
+"Form with id \"{form_id}\" contains file input, but does not have the "
+"attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:70
+msgid ""
+"Form contains file input, but does not have the attribute "
+"enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:73
+#, python-brace-format
+msgid ""
+"Input element references form with id \"{form_id}\", but the form does not "
+"have the attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:77
+msgid "Alerts"
+msgstr ""
+
+#: panels/cache.py:168
msgid "Cache"
msgstr "Välimuisti"
-#: panels/cache.py:186
+#: panels/cache.py:174
#, python-format
msgid "%(cache_calls)d call in %(time).2fms"
msgid_plural "%(cache_calls)d calls in %(time).2fms"
msgstr[0] "%(cache_calls)d kutsu %(time).2fms"
msgstr[1] "%(cache_calls)d kutsua %(time).2fms"
-#: panels/cache.py:195
+#: panels/cache.py:183
#, python-format
msgid "Cache calls from %(count)d backend"
msgid_plural "Cache calls from %(count)d backends"
@@ -45,7 +68,7 @@ msgstr[1] ""
msgid "Headers"
msgstr ""
-#: panels/history/panel.py:18 panels/history/panel.py:19
+#: panels/history/panel.py:19 panels/history/panel.py:20
msgid "History"
msgstr ""
@@ -53,7 +76,7 @@ msgstr ""
msgid "Profiling"
msgstr "Profilointi"
-#: panels/redirects.py:14
+#: panels/redirects.py:17
msgid "Intercept redirects"
msgstr ""
@@ -61,11 +84,11 @@ msgstr ""
msgid "Request"
msgstr ""
-#: panels/request.py:36
+#: panels/request.py:38
msgid ""
msgstr ""
-#: panels/request.py:53
+#: panels/request.py:55
msgid ""
msgstr ""
@@ -74,10 +97,9 @@ msgid "Settings"
msgstr "Asetukset"
#: panels/settings.py:20
-#, fuzzy, python-format
-#| msgid "Settings from %s
"
+#, python-format
msgid "Settings from %s"
-msgstr "Asetukset tiedostosta %s
"
+msgstr ""
#: panels/signals.py:57
#, python-format
@@ -97,153 +119,151 @@ msgstr[1] "%(num_receivers)d vastaanotinta %(num_signals)d signaalille"
msgid "Signals"
msgstr "Signaalit"
-#: panels/sql/panel.py:23
-msgid "Autocommit"
-msgstr "Autocommit"
-
-#: panels/sql/panel.py:24
+#: panels/sql/panel.py:30 panels/sql/panel.py:41
msgid "Read uncommitted"
msgstr ""
-#: panels/sql/panel.py:25
+#: panels/sql/panel.py:31 panels/sql/panel.py:43
msgid "Read committed"
msgstr ""
-#: panels/sql/panel.py:26
+#: panels/sql/panel.py:32 panels/sql/panel.py:45
msgid "Repeatable read"
msgstr ""
-#: panels/sql/panel.py:27
+#: panels/sql/panel.py:33 panels/sql/panel.py:47
msgid "Serializable"
msgstr "Muuttuja"
#: panels/sql/panel.py:39
+msgid "Autocommit"
+msgstr "Autocommit"
+
+#: panels/sql/panel.py:61 panels/sql/panel.py:71
msgid "Idle"
msgstr ""
-#: panels/sql/panel.py:40
+#: panels/sql/panel.py:62 panels/sql/panel.py:72
msgid "Active"
msgstr "Tapahtuma"
-#: panels/sql/panel.py:41
+#: panels/sql/panel.py:63 panels/sql/panel.py:73
msgid "In transaction"
msgstr "Tapahtuman tila:"
-#: panels/sql/panel.py:42
+#: panels/sql/panel.py:64 panels/sql/panel.py:74
msgid "In error"
msgstr "Virhe"
-#: panels/sql/panel.py:43
+#: panels/sql/panel.py:65 panels/sql/panel.py:75
msgid "Unknown"
msgstr "(tuntematon)"
-#: panels/sql/panel.py:130
+#: panels/sql/panel.py:162
msgid "SQL"
msgstr "SQL"
-#: panels/sql/panel.py:135
-#, fuzzy, python-format
-#| msgid "%(cache_calls)d call in %(time).2fms"
-#| msgid_plural "%(cache_calls)d calls in %(time).2fms"
+#: panels/sql/panel.py:168
+#, python-format
msgid "%(query_count)d query in %(sql_time).2fms"
msgid_plural "%(query_count)d queries in %(sql_time).2fms"
-msgstr[0] "%(cache_calls)d kutsu %(time).2fms"
-msgstr[1] "%(cache_calls)d kutsua %(time).2fms"
+msgstr[0] ""
+msgstr[1] ""
-#: panels/sql/panel.py:147
+#: panels/sql/panel.py:180
#, python-format
msgid "SQL queries from %(count)d connection"
msgid_plural "SQL queries from %(count)d connections"
msgstr[0] ""
msgstr[1] ""
-#: panels/staticfiles.py:84
+#: panels/staticfiles.py:82
#, python-format
msgid "Static files (%(num_found)s found, %(num_used)s used)"
msgstr ""
-#: panels/staticfiles.py:105
+#: panels/staticfiles.py:103
msgid "Static files"
msgstr "Staattiset tiedostot"
-#: panels/staticfiles.py:111
+#: panels/staticfiles.py:109
#, python-format
msgid "%(num_used)s file used"
msgid_plural "%(num_used)s files used"
msgstr[0] ""
msgstr[1] ""
-#: panels/templates/panel.py:143
+#: panels/templates/panel.py:101
msgid "Templates"
msgstr "Asettelupohjat"
-#: panels/templates/panel.py:148
+#: panels/templates/panel.py:106
#, python-format
msgid "Templates (%(num_templates)s rendered)"
msgstr "Asetttelupohjat (%(num_templates)s renderöity)"
-#: panels/templates/panel.py:180
+#: panels/templates/panel.py:195
msgid "No origin"
msgstr ""
-#: panels/timer.py:25
+#: panels/timer.py:27
#, python-format
msgid "CPU: %(cum)0.2fms (%(total)0.2fms)"
msgstr "CPU: %(cum)0.2fms (%(total)0.2fms)"
-#: panels/timer.py:30
+#: panels/timer.py:32
#, python-format
msgid "Total: %0.2fms"
msgstr ""
-#: panels/timer.py:36 templates/debug_toolbar/panels/history.html:9
+#: panels/timer.py:38 templates/debug_toolbar/panels/history.html:9
#: templates/debug_toolbar/panels/sql_explain.html:11
#: templates/debug_toolbar/panels/sql_profile.html:12
#: templates/debug_toolbar/panels/sql_select.html:11
msgid "Time"
msgstr "Aika"
-#: panels/timer.py:44
+#: panels/timer.py:46
msgid "User CPU time"
msgstr "Käyttäjän CPU-aika"
-#: panels/timer.py:44
+#: panels/timer.py:46
#, python-format
msgid "%(utime)0.3f msec"
msgstr "%(utime)0.3f msek"
-#: panels/timer.py:45
+#: panels/timer.py:47
msgid "System CPU time"
msgstr "Järjestelmän CPU-aika"
-#: panels/timer.py:45
+#: panels/timer.py:47
#, python-format
msgid "%(stime)0.3f msec"
msgstr "%(stime)0.3f msek"
-#: panels/timer.py:46
+#: panels/timer.py:48
msgid "Total CPU time"
msgstr "CPU-aika yhteensä"
-#: panels/timer.py:46
+#: panels/timer.py:48
#, python-format
msgid "%(total)0.3f msec"
msgstr "%(total)0.3f msek"
-#: panels/timer.py:47
+#: panels/timer.py:49
msgid "Elapsed time"
msgstr "Kulunut aika"
-#: panels/timer.py:47
+#: panels/timer.py:49
#, python-format
msgid "%(total_time)0.3f msec"
msgstr "%(total_time)0.3f msek"
-#: panels/timer.py:49
+#: panels/timer.py:51
msgid "Context switches"
msgstr "Kontekstin vivut"
-#: panels/timer.py:50
+#: panels/timer.py:52
#, python-format
msgid "%(vcsw)d voluntary, %(ivcsw)d involuntary"
msgstr ""
@@ -252,15 +272,19 @@ msgstr ""
msgid "Versions"
msgstr "Versiot"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide toolbar"
msgstr ""
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide"
msgstr "Piilota"
-#: templates/debug_toolbar/base.html:29
+#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26
+msgid "Toggle Theme"
+msgstr ""
+
+#: templates/debug_toolbar/base.html:35
msgid "Show toolbar"
msgstr ""
@@ -272,6 +296,14 @@ msgstr ""
msgid "Enable for next and successive requests"
msgstr ""
+#: templates/debug_toolbar/panels/alerts.html:4
+msgid "Alerts found"
+msgstr ""
+
+#: templates/debug_toolbar/panels/alerts.html:11
+msgid "No alerts found"
+msgstr ""
+
#: templates/debug_toolbar/panels/cache.html:2
msgid "Summary"
msgstr ""
@@ -367,10 +399,8 @@ msgid "Path"
msgstr "Polku"
#: templates/debug_toolbar/panels/history.html:12
-#, fuzzy
-#| msgid "Variable"
msgid "Request Variables"
-msgstr "Muuttuja"
+msgstr ""
#: templates/debug_toolbar/panels/history.html:13
msgid "Status"
@@ -494,11 +524,9 @@ msgid "Timeline"
msgstr "Aikajana"
#: templates/debug_toolbar/panels/sql.html:52
-#, fuzzy, python-format
-#| msgid "%(count)s message"
-#| msgid_plural "%(count)s messages"
+#, python-format
msgid "%(count)s similar queries."
-msgstr "%(count)s viesti"
+msgstr ""
#: templates/debug_toolbar/panels/sql.html:58
#, python-format
diff --git a/debug_toolbar/locale/fr/LC_MESSAGES/django.mo b/debug_toolbar/locale/fr/LC_MESSAGES/django.mo
index ec52a9eba..559e2d847 100644
Binary files a/debug_toolbar/locale/fr/LC_MESSAGES/django.mo and b/debug_toolbar/locale/fr/LC_MESSAGES/django.mo differ
diff --git a/debug_toolbar/locale/fr/LC_MESSAGES/django.po b/debug_toolbar/locale/fr/LC_MESSAGES/django.po
index d376231ed..88c04b0c5 100644
--- a/debug_toolbar/locale/fr/LC_MESSAGES/django.po
+++ b/debug_toolbar/locale/fr/LC_MESSAGES/django.po
@@ -4,7 +4,7 @@
#
# Translators:
# Anthony Jorion , 2013
-# Aymeric Augustin , 2014
+# c1b16e6c929c50740e884a23aafc8829_00449d9 , 2014
# Claude Paroz , 2013
# Colin O'Brien , 2021
# David Paccoud, 2009
@@ -14,44 +14,69 @@ msgid ""
msgstr ""
"Project-Id-Version: Django Debug Toolbar\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-01-20 17:23+0100\n"
-"PO-Revision-Date: 2021-09-30 09:21+0000\n"
-"Last-Translator: Colin O'Brien \n"
-"Language-Team: French (http://www.transifex.com/django-debug-toolbar/django-"
-"debug-toolbar/language/fr/)\n"
-"Language: fr\n"
+"POT-Creation-Date: 2024-08-06 07:12-0500\n"
+"PO-Revision-Date: 2010-11-30 00:00+0000\n"
+"Last-Translator: Colin O'Brien , 2021\n"
+"Language-Team: French (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"Language: fr\n"
+"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
-#: apps.py:15
+#: apps.py:18
msgid "Debug Toolbar"
msgstr "Barre d'outils de débogage"
-#: panels/cache.py:180
+#: panels/alerts.py:67
+#, python-brace-format
+msgid ""
+"Form with id \"{form_id}\" contains file input, but does not have the "
+"attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:70
+msgid ""
+"Form contains file input, but does not have the attribute "
+"enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:73
+#, python-brace-format
+msgid ""
+"Input element references form with id \"{form_id}\", but the form does not "
+"have the attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:77
+msgid "Alerts"
+msgstr ""
+
+#: panels/cache.py:168
msgid "Cache"
msgstr "Cache"
-#: panels/cache.py:186
+#: panels/cache.py:174
#, python-format
msgid "%(cache_calls)d call in %(time).2fms"
msgid_plural "%(cache_calls)d calls in %(time).2fms"
msgstr[0] "%(cache_calls)d appel en %(time).2fms"
msgstr[1] "%(cache_calls)d appels en %(time).2fms"
+msgstr[2] "%(cache_calls)d appels en %(time).2fms"
-#: panels/cache.py:195
+#: panels/cache.py:183
#, python-format
msgid "Cache calls from %(count)d backend"
msgid_plural "Cache calls from %(count)d backends"
msgstr[0] "Appels au cache depuis %(count)d moteur"
msgstr[1] "Appels au cache depuis %(count)d moteurs"
+msgstr[2] "Appels au cache depuis %(count)d moteurs"
#: panels/headers.py:31
msgid "Headers"
msgstr "En-têtes"
-#: panels/history/panel.py:18 panels/history/panel.py:19
+#: panels/history/panel.py:19 panels/history/panel.py:20
msgid "History"
msgstr "Historique"
@@ -59,7 +84,7 @@ msgstr "Historique"
msgid "Profiling"
msgstr "Profilage"
-#: panels/redirects.py:14
+#: panels/redirects.py:17
msgid "Intercept redirects"
msgstr "Interception des redirections"
@@ -67,11 +92,11 @@ msgstr "Interception des redirections"
msgid "Request"
msgstr "Requête"
-#: panels/request.py:36
+#: panels/request.py:38
msgid ""
msgstr ""
-#: panels/request.py:53
+#: panels/request.py:55
msgid ""
msgstr ""
@@ -90,6 +115,7 @@ msgid "%(num_receivers)d receiver of 1 signal"
msgid_plural "%(num_receivers)d receivers of 1 signal"
msgstr[0] "%(num_receivers)d receveur d'un signal"
msgstr[1] "%(num_receivers)d receveurs d'un signal"
+msgstr[2] "%(num_receivers)d receveurs d'un signal"
#: panels/signals.py:62
#, python-format
@@ -97,156 +123,160 @@ msgid "%(num_receivers)d receiver of %(num_signals)d signals"
msgid_plural "%(num_receivers)d receivers of %(num_signals)d signals"
msgstr[0] "%(num_receivers)d receveur de %(num_signals)d signaux"
msgstr[1] "%(num_receivers)d receveurs de %(num_signals)d signaux"
+msgstr[2] "%(num_receivers)d receveurs de %(num_signals)d signaux"
#: panels/signals.py:67
msgid "Signals"
msgstr "Signaux"
-#: panels/sql/panel.py:23
-msgid "Autocommit"
-msgstr "Auto validation"
-
-#: panels/sql/panel.py:24
+#: panels/sql/panel.py:30 panels/sql/panel.py:41
msgid "Read uncommitted"
msgstr "Lecture non validée"
-#: panels/sql/panel.py:25
+#: panels/sql/panel.py:31 panels/sql/panel.py:43
msgid "Read committed"
msgstr "Lecture validée"
-#: panels/sql/panel.py:26
+#: panels/sql/panel.py:32 panels/sql/panel.py:45
msgid "Repeatable read"
msgstr "Lecture répétable"
-#: panels/sql/panel.py:27
+#: panels/sql/panel.py:33 panels/sql/panel.py:47
msgid "Serializable"
msgstr "Sérialisable"
#: panels/sql/panel.py:39
+msgid "Autocommit"
+msgstr "Auto validation"
+
+#: panels/sql/panel.py:61 panels/sql/panel.py:71
msgid "Idle"
msgstr "Inactif"
-#: panels/sql/panel.py:40
+#: panels/sql/panel.py:62 panels/sql/panel.py:72
msgid "Active"
msgstr "Actif"
-#: panels/sql/panel.py:41
+#: panels/sql/panel.py:63 panels/sql/panel.py:73
msgid "In transaction"
msgstr "Transaction en cours"
-#: panels/sql/panel.py:42
+#: panels/sql/panel.py:64 panels/sql/panel.py:74
msgid "In error"
msgstr "Erreur"
-#: panels/sql/panel.py:43
+#: panels/sql/panel.py:65 panels/sql/panel.py:75
msgid "Unknown"
msgstr "Indéterminé"
-#: panels/sql/panel.py:130
+#: panels/sql/panel.py:162
msgid "SQL"
msgstr "SQL"
-#: panels/sql/panel.py:135
+#: panels/sql/panel.py:168
#, python-format
msgid "%(query_count)d query in %(sql_time).2fms"
msgid_plural "%(query_count)d queries in %(sql_time).2fms"
msgstr[0] "%(query_count)d requête en %(sql_time).2f ms"
msgstr[1] "%(query_count)d requêtes en %(sql_time).2f ms"
+msgstr[2] "%(query_count)d requêtes en %(sql_time).2f ms"
-#: panels/sql/panel.py:147
+#: panels/sql/panel.py:180
#, python-format
msgid "SQL queries from %(count)d connection"
msgid_plural "SQL queries from %(count)d connections"
msgstr[0] "requêtes SQL venant de %(count)d connexion"
msgstr[1] "Requêtes SQL venant de %(count)d connexions"
+msgstr[2] "Requêtes SQL venant de %(count)d connexions"
-#: panels/staticfiles.py:84
+#: panels/staticfiles.py:82
#, python-format
msgid "Static files (%(num_found)s found, %(num_used)s used)"
msgstr "Fichiers statiques (%(num_found)s trouvé(s), %(num_used)s utilisé(s))"
-#: panels/staticfiles.py:105
+#: panels/staticfiles.py:103
msgid "Static files"
msgstr "Fichiers statiques"
-#: panels/staticfiles.py:111
+#: panels/staticfiles.py:109
#, python-format
msgid "%(num_used)s file used"
msgid_plural "%(num_used)s files used"
msgstr[0] "%(num_used)s fichier utilisé"
msgstr[1] "%(num_used)s fichiers utilisés"
+msgstr[2] "%(num_used)s fichiers utilisés"
-#: panels/templates/panel.py:143
+#: panels/templates/panel.py:101
msgid "Templates"
msgstr "Gabarits"
-#: panels/templates/panel.py:148
+#: panels/templates/panel.py:106
#, python-format
msgid "Templates (%(num_templates)s rendered)"
msgstr "Gabarits (%(num_templates)s affichés)"
-#: panels/templates/panel.py:180
+#: panels/templates/panel.py:195
msgid "No origin"
msgstr "Sans Origine"
-#: panels/timer.py:25
+#: panels/timer.py:27
#, python-format
msgid "CPU: %(cum)0.2fms (%(total)0.2fms)"
msgstr "CPU: %(cum)0.2fms (%(total)0.2fms)"
-#: panels/timer.py:30
+#: panels/timer.py:32
#, python-format
msgid "Total: %0.2fms"
msgstr "Total : %0.2fms"
-#: panels/timer.py:36 templates/debug_toolbar/panels/history.html:9
+#: panels/timer.py:38 templates/debug_toolbar/panels/history.html:9
#: templates/debug_toolbar/panels/sql_explain.html:11
#: templates/debug_toolbar/panels/sql_profile.html:12
#: templates/debug_toolbar/panels/sql_select.html:11
msgid "Time"
msgstr "Temps"
-#: panels/timer.py:44
+#: panels/timer.py:46
msgid "User CPU time"
msgstr "Temps CPU de l'utilisateur"
-#: panels/timer.py:44
+#: panels/timer.py:46
#, python-format
msgid "%(utime)0.3f msec"
msgstr "%(utime)0.3f ms"
-#: panels/timer.py:45
+#: panels/timer.py:47
msgid "System CPU time"
msgstr "Temps CPU du système"
-#: panels/timer.py:45
+#: panels/timer.py:47
#, python-format
msgid "%(stime)0.3f msec"
msgstr "%(stime)0.3f ms"
-#: panels/timer.py:46
+#: panels/timer.py:48
msgid "Total CPU time"
msgstr "Temps total du CPU"
-#: panels/timer.py:46
+#: panels/timer.py:48
#, python-format
msgid "%(total)0.3f msec"
msgstr "%(total)0.3f ms"
-#: panels/timer.py:47
+#: panels/timer.py:49
msgid "Elapsed time"
msgstr "Temps écoulé"
-#: panels/timer.py:47
+#: panels/timer.py:49
#, python-format
msgid "%(total_time)0.3f msec"
msgstr "%(total_time)0.3f ms"
-#: panels/timer.py:49
+#: panels/timer.py:51
msgid "Context switches"
msgstr "Basculements de contexte"
-#: panels/timer.py:50
+#: panels/timer.py:52
#, python-format
msgid "%(vcsw)d voluntary, %(ivcsw)d involuntary"
msgstr "%(vcsw)d volontaire, %(ivcsw)d involontaire"
@@ -255,15 +285,19 @@ msgstr "%(vcsw)d volontaire, %(ivcsw)d involontaire"
msgid "Versions"
msgstr "Versions"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide toolbar"
msgstr "Masquer la barre d'outils"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide"
msgstr "Masquer"
-#: templates/debug_toolbar/base.html:29
+#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26
+msgid "Toggle Theme"
+msgstr ""
+
+#: templates/debug_toolbar/base.html:35
msgid "Show toolbar"
msgstr "Afficher la barre d'outils"
@@ -275,6 +309,14 @@ msgstr "Désactiver pour les requêtes suivantes"
msgid "Enable for next and successive requests"
msgstr "Activer pour les requêtes suivantes"
+#: templates/debug_toolbar/panels/alerts.html:4
+msgid "Alerts found"
+msgstr ""
+
+#: templates/debug_toolbar/panels/alerts.html:11
+msgid "No alerts found"
+msgstr ""
+
#: templates/debug_toolbar/panels/cache.html:2
msgid "Summary"
msgstr "Résumé"
@@ -358,9 +400,7 @@ msgstr "Environnement WSGI"
msgid ""
"Since the WSGI environ inherits the environment of the server, only a "
"significant subset is shown below."
-msgstr ""
-"Comme l'environnement WSGI hérite de celui du serveur, seul un sous-ensemble "
-"pertinent est affiché ci-dessous."
+msgstr "Comme l'environnement WSGI hérite de celui du serveur, seul un sous-ensemble pertinent est affiché ci-dessous."
#: templates/debug_toolbar/panels/history.html:10
msgid "Method"
@@ -472,24 +512,21 @@ msgid "%(num)s query"
msgid_plural "%(num)s queries"
msgstr[0] "%(num)s requête"
msgstr[1] "%(num)s requêtes"
+msgstr[2] "%(num)s requêtes"
#: templates/debug_toolbar/panels/sql.html:8
#, python-format
msgid ""
"including %(count)s similar "
-msgstr ""
-"comprenant %(count)s similaires "
+msgstr "comprenant %(count)s similaires "
#: templates/debug_toolbar/panels/sql.html:12
#, python-format
msgid ""
"and %(dupes)s duplicates "
-msgstr ""
-"et %(dupes)s en double "
+msgstr "et %(dupes)s en double "
#: templates/debug_toolbar/panels/sql.html:34
msgid "Query"
@@ -567,6 +604,7 @@ msgid "Static file path"
msgid_plural "Static file paths"
msgstr[0] "Chemin de fichier statique"
msgstr[1] "Chemins de fichiers statiques"
+msgstr[2] "Chemins de fichiers statiques"
#: templates/debug_toolbar/panels/staticfiles.html:7
#, python-format
@@ -587,12 +625,14 @@ msgid "Static file app"
msgid_plural "Static file apps"
msgstr[0] "Application de fichiers statiques"
msgstr[1] "Applications de fichiers statiques"
+msgstr[2] "Applications de fichiers statiques"
#: templates/debug_toolbar/panels/staticfiles.html:25
msgid "Static file"
msgid_plural "Static files"
msgstr[0] ""
msgstr[1] "Fichiers statiques"
+msgstr[2] "Fichiers statiques"
#: templates/debug_toolbar/panels/staticfiles.html:39
#, python-format
@@ -600,6 +640,7 @@ msgid "%(payload_count)s file"
msgid_plural "%(payload_count)s files"
msgstr[0] "%(payload_count)s fichier"
msgstr[1] "%(payload_count)s fichiers"
+msgstr[2] "%(payload_count)s fichiers"
#: templates/debug_toolbar/panels/staticfiles.html:44
msgid "Location"
@@ -614,12 +655,14 @@ msgid "Template path"
msgid_plural "Template paths"
msgstr[0] ""
msgstr[1] "Chemin du gabarit"
+msgstr[2] "Chemin du gabarit"
#: templates/debug_toolbar/panels/templates.html:13
msgid "Template"
msgid_plural "Templates"
msgstr[0] ""
msgstr[1] "Gabarit"
+msgstr[2] "Gabarit"
#: templates/debug_toolbar/panels/templates.html:22
#: templates/debug_toolbar/panels/templates.html:40
@@ -631,6 +674,7 @@ msgid "Context processor"
msgid_plural "Context processors"
msgstr[0] "Processeur de contexte"
msgstr[1] "Processeurs de contexte"
+msgstr[2] "Processeurs de contexte"
#: templates/debug_toolbar/panels/timer.html:2
msgid "Resource usage"
@@ -673,16 +717,10 @@ msgid ""
"The Django Debug Toolbar has intercepted a redirect to the above URL for "
"debug viewing purposes. You can click the above link to continue with the "
"redirect as normal."
-msgstr ""
-"La barre de débogage Django a intercepté une redirection vers l'URL ci-"
-"dessus afin de permettre la consultation des messages de débogage. Vous "
-"pouvez cliquer sur le lien ci-dessus pour continuer normalement avec la "
-"redirection."
+msgstr "La barre de débogage Django a intercepté une redirection vers l'URL ci-dessus afin de permettre la consultation des messages de débogage. Vous pouvez cliquer sur le lien ci-dessus pour continuer normalement avec la redirection."
#: views.py:16
msgid ""
"Data for this panel isn't available anymore. Please reload the page and "
"retry."
-msgstr ""
-"Les données de ce panneau ne sont plus disponibles. Rechargez la page et "
-"essayez à nouveau."
+msgstr "Les données de ce panneau ne sont plus disponibles. Rechargez la page et essayez à nouveau."
diff --git a/debug_toolbar/locale/he/LC_MESSAGES/django.mo b/debug_toolbar/locale/he/LC_MESSAGES/django.mo
index ec3adbbea..4f680148c 100644
Binary files a/debug_toolbar/locale/he/LC_MESSAGES/django.mo and b/debug_toolbar/locale/he/LC_MESSAGES/django.mo differ
diff --git a/debug_toolbar/locale/he/LC_MESSAGES/django.po b/debug_toolbar/locale/he/LC_MESSAGES/django.po
index fe4a4d772..c766a77a7 100644
--- a/debug_toolbar/locale/he/LC_MESSAGES/django.po
+++ b/debug_toolbar/locale/he/LC_MESSAGES/django.po
@@ -8,44 +8,69 @@ msgid ""
msgstr ""
"Project-Id-Version: Django Debug Toolbar\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-01-20 17:23+0100\n"
-"PO-Revision-Date: 2014-04-25 19:53+0000\n"
-"Last-Translator: Aymeric Augustin \n"
-"Language-Team: Hebrew (http://www.transifex.com/projects/p/django-debug-"
-"toolbar/language/he/)\n"
-"Language: he\n"
+"POT-Creation-Date: 2024-08-06 07:12-0500\n"
+"PO-Revision-Date: 2010-11-30 00:00+0000\n"
+"Last-Translator: shaib , 2012\n"
+"Language-Team: Hebrew (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/he/)\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"
+"Language: he\n"
+"Plural-Forms: nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: 2;\n"
-#: apps.py:15
+#: apps.py:18
msgid "Debug Toolbar"
msgstr ""
-#: panels/cache.py:180
+#: panels/alerts.py:67
+#, python-brace-format
+msgid ""
+"Form with id \"{form_id}\" contains file input, but does not have the "
+"attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:70
+msgid ""
+"Form contains file input, but does not have the attribute "
+"enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:73
+#, python-brace-format
+msgid ""
+"Input element references form with id \"{form_id}\", but the form does not "
+"have the attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:77
+msgid "Alerts"
+msgstr ""
+
+#: panels/cache.py:168
msgid "Cache"
msgstr ""
-#: panels/cache.py:186
+#: panels/cache.py:174
#, python-format
msgid "%(cache_calls)d call in %(time).2fms"
msgid_plural "%(cache_calls)d calls in %(time).2fms"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
-#: panels/cache.py:195
+#: panels/cache.py:183
#, python-format
msgid "Cache calls from %(count)d backend"
msgid_plural "Cache calls from %(count)d backends"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
#: panels/headers.py:31
msgid "Headers"
msgstr ""
-#: panels/history/panel.py:18 panels/history/panel.py:19
+#: panels/history/panel.py:19 panels/history/panel.py:20
msgid "History"
msgstr ""
@@ -53,7 +78,7 @@ msgstr ""
msgid "Profiling"
msgstr ""
-#: panels/redirects.py:14
+#: panels/redirects.py:17
msgid "Intercept redirects"
msgstr ""
@@ -61,11 +86,11 @@ msgstr ""
msgid "Request"
msgstr ""
-#: panels/request.py:36
+#: panels/request.py:38
msgid ""
msgstr ""
-#: panels/request.py:53
+#: panels/request.py:55
msgid ""
msgstr ""
@@ -84,6 +109,7 @@ msgid "%(num_receivers)d receiver of 1 signal"
msgid_plural "%(num_receivers)d receivers of 1 signal"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
#: panels/signals.py:62
#, python-format
@@ -91,156 +117,160 @@ msgid "%(num_receivers)d receiver of %(num_signals)d signals"
msgid_plural "%(num_receivers)d receivers of %(num_signals)d signals"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
#: panels/signals.py:67
msgid "Signals"
msgstr "סיגנלים"
-#: panels/sql/panel.py:23
-msgid "Autocommit"
-msgstr ""
-
-#: panels/sql/panel.py:24
+#: panels/sql/panel.py:30 panels/sql/panel.py:41
msgid "Read uncommitted"
msgstr ""
-#: panels/sql/panel.py:25
+#: panels/sql/panel.py:31 panels/sql/panel.py:43
msgid "Read committed"
msgstr ""
-#: panels/sql/panel.py:26
+#: panels/sql/panel.py:32 panels/sql/panel.py:45
msgid "Repeatable read"
msgstr ""
-#: panels/sql/panel.py:27
+#: panels/sql/panel.py:33 panels/sql/panel.py:47
msgid "Serializable"
msgstr "משתנה"
#: panels/sql/panel.py:39
+msgid "Autocommit"
+msgstr ""
+
+#: panels/sql/panel.py:61 panels/sql/panel.py:71
msgid "Idle"
msgstr ""
-#: panels/sql/panel.py:40
+#: panels/sql/panel.py:62 panels/sql/panel.py:72
msgid "Active"
msgstr "פעילות"
-#: panels/sql/panel.py:41
+#: panels/sql/panel.py:63 panels/sql/panel.py:73
msgid "In transaction"
msgstr ""
-#: panels/sql/panel.py:42
+#: panels/sql/panel.py:64 panels/sql/panel.py:74
msgid "In error"
msgstr "שגיאה"
-#: panels/sql/panel.py:43
+#: panels/sql/panel.py:65 panels/sql/panel.py:75
msgid "Unknown"
msgstr ""
-#: panels/sql/panel.py:130
+#: panels/sql/panel.py:162
msgid "SQL"
msgstr ""
-#: panels/sql/panel.py:135
+#: panels/sql/panel.py:168
#, python-format
msgid "%(query_count)d query in %(sql_time).2fms"
msgid_plural "%(query_count)d queries in %(sql_time).2fms"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
-#: panels/sql/panel.py:147
+#: panels/sql/panel.py:180
#, python-format
msgid "SQL queries from %(count)d connection"
msgid_plural "SQL queries from %(count)d connections"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
-#: panels/staticfiles.py:84
+#: panels/staticfiles.py:82
#, python-format
msgid "Static files (%(num_found)s found, %(num_used)s used)"
msgstr ""
-#: panels/staticfiles.py:105
+#: panels/staticfiles.py:103
msgid "Static files"
msgstr ""
-#: panels/staticfiles.py:111
+#: panels/staticfiles.py:109
#, python-format
msgid "%(num_used)s file used"
msgid_plural "%(num_used)s files used"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
-#: panels/templates/panel.py:143
+#: panels/templates/panel.py:101
msgid "Templates"
msgstr "תבניות"
-#: panels/templates/panel.py:148
+#: panels/templates/panel.py:106
#, python-format
msgid "Templates (%(num_templates)s rendered)"
msgstr ""
-#: panels/templates/panel.py:180
+#: panels/templates/panel.py:195
msgid "No origin"
msgstr ""
-#: panels/timer.py:25
+#: panels/timer.py:27
#, python-format
msgid "CPU: %(cum)0.2fms (%(total)0.2fms)"
msgstr ""
-#: panels/timer.py:30
+#: panels/timer.py:32
#, python-format
msgid "Total: %0.2fms"
msgstr ""
-#: panels/timer.py:36 templates/debug_toolbar/panels/history.html:9
+#: panels/timer.py:38 templates/debug_toolbar/panels/history.html:9
#: templates/debug_toolbar/panels/sql_explain.html:11
#: templates/debug_toolbar/panels/sql_profile.html:12
#: templates/debug_toolbar/panels/sql_select.html:11
msgid "Time"
msgstr "זמן"
-#: panels/timer.py:44
+#: panels/timer.py:46
msgid "User CPU time"
msgstr ""
-#: panels/timer.py:44
+#: panels/timer.py:46
#, python-format
msgid "%(utime)0.3f msec"
msgstr ""
-#: panels/timer.py:45
+#: panels/timer.py:47
msgid "System CPU time"
msgstr ""
-#: panels/timer.py:45
+#: panels/timer.py:47
#, python-format
msgid "%(stime)0.3f msec"
msgstr ""
-#: panels/timer.py:46
+#: panels/timer.py:48
msgid "Total CPU time"
msgstr ""
-#: panels/timer.py:46
+#: panels/timer.py:48
#, python-format
msgid "%(total)0.3f msec"
msgstr ""
-#: panels/timer.py:47
+#: panels/timer.py:49
msgid "Elapsed time"
msgstr ""
-#: panels/timer.py:47
+#: panels/timer.py:49
#, python-format
msgid "%(total_time)0.3f msec"
msgstr ""
-#: panels/timer.py:49
+#: panels/timer.py:51
msgid "Context switches"
msgstr ""
-#: panels/timer.py:50
+#: panels/timer.py:52
#, python-format
msgid "%(vcsw)d voluntary, %(ivcsw)d involuntary"
msgstr ""
@@ -249,15 +279,19 @@ msgstr ""
msgid "Versions"
msgstr "גירסאות"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide toolbar"
msgstr ""
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide"
msgstr "הסתר"
-#: templates/debug_toolbar/base.html:29
+#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26
+msgid "Toggle Theme"
+msgstr ""
+
+#: templates/debug_toolbar/base.html:35
msgid "Show toolbar"
msgstr ""
@@ -269,6 +303,14 @@ msgstr ""
msgid "Enable for next and successive requests"
msgstr ""
+#: templates/debug_toolbar/panels/alerts.html:4
+msgid "Alerts found"
+msgstr ""
+
+#: templates/debug_toolbar/panels/alerts.html:11
+msgid "No alerts found"
+msgstr ""
+
#: templates/debug_toolbar/panels/cache.html:2
msgid "Summary"
msgstr ""
@@ -364,10 +406,8 @@ msgid "Path"
msgstr ""
#: templates/debug_toolbar/panels/history.html:12
-#, fuzzy
-#| msgid "Variable"
msgid "Request Variables"
-msgstr "משתנה"
+msgstr ""
#: templates/debug_toolbar/panels/history.html:13
msgid "Status"
@@ -466,6 +506,7 @@ msgid "%(num)s query"
msgid_plural "%(num)s queries"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
#: templates/debug_toolbar/panels/sql.html:8
#, python-format
@@ -557,6 +598,7 @@ msgid "Static file path"
msgid_plural "Static file paths"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
#: templates/debug_toolbar/panels/staticfiles.html:7
#, python-format
@@ -577,12 +619,14 @@ msgid "Static file app"
msgid_plural "Static file apps"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
#: templates/debug_toolbar/panels/staticfiles.html:25
msgid "Static file"
msgid_plural "Static files"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
#: templates/debug_toolbar/panels/staticfiles.html:39
#, python-format
@@ -590,6 +634,7 @@ msgid "%(payload_count)s file"
msgid_plural "%(payload_count)s files"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
#: templates/debug_toolbar/panels/staticfiles.html:44
msgid "Location"
@@ -604,12 +649,14 @@ msgid "Template path"
msgid_plural "Template paths"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
#: templates/debug_toolbar/panels/templates.html:13
msgid "Template"
msgid_plural "Templates"
msgstr[0] ""
msgstr[1] "תבנית"
+msgstr[2] "תבנית"
#: templates/debug_toolbar/panels/templates.html:22
#: templates/debug_toolbar/panels/templates.html:40
@@ -621,6 +668,7 @@ msgid "Context processor"
msgid_plural "Context processors"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
#: templates/debug_toolbar/panels/timer.html:2
msgid "Resource usage"
diff --git a/debug_toolbar/locale/id/LC_MESSAGES/django.mo b/debug_toolbar/locale/id/LC_MESSAGES/django.mo
index 5c6f07c85..4439e2c4d 100644
Binary files a/debug_toolbar/locale/id/LC_MESSAGES/django.mo and b/debug_toolbar/locale/id/LC_MESSAGES/django.mo differ
diff --git a/debug_toolbar/locale/id/LC_MESSAGES/django.po b/debug_toolbar/locale/id/LC_MESSAGES/django.po
index bef59b4f1..f206c0b61 100644
--- a/debug_toolbar/locale/id/LC_MESSAGES/django.po
+++ b/debug_toolbar/locale/id/LC_MESSAGES/django.po
@@ -8,32 +8,55 @@ msgid ""
msgstr ""
"Project-Id-Version: Django Debug Toolbar\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-01-20 17:23+0100\n"
-"PO-Revision-Date: 2014-04-25 19:53+0000\n"
-"Last-Translator: Aymeric Augustin \n"
-"Language-Team: Indonesian (http://www.transifex.com/projects/p/django-debug-"
-"toolbar/language/id/)\n"
-"Language: id\n"
+"POT-Creation-Date: 2024-08-06 07:12-0500\n"
+"PO-Revision-Date: 2010-11-30 00:00+0000\n"
+"Last-Translator: Muhammad Panji , 2012\n"
+"Language-Team: Indonesian (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/id/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Language: id\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: apps.py:15
+#: apps.py:18
msgid "Debug Toolbar"
msgstr ""
-#: panels/cache.py:180
+#: panels/alerts.py:67
+#, python-brace-format
+msgid ""
+"Form with id \"{form_id}\" contains file input, but does not have the "
+"attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:70
+msgid ""
+"Form contains file input, but does not have the attribute "
+"enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:73
+#, python-brace-format
+msgid ""
+"Input element references form with id \"{form_id}\", but the form does not "
+"have the attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:77
+msgid "Alerts"
+msgstr ""
+
+#: panels/cache.py:168
msgid "Cache"
msgstr ""
-#: panels/cache.py:186
+#: panels/cache.py:174
#, python-format
msgid "%(cache_calls)d call in %(time).2fms"
msgid_plural "%(cache_calls)d calls in %(time).2fms"
msgstr[0] ""
-#: panels/cache.py:195
+#: panels/cache.py:183
#, python-format
msgid "Cache calls from %(count)d backend"
msgid_plural "Cache calls from %(count)d backends"
@@ -43,7 +66,7 @@ msgstr[0] ""
msgid "Headers"
msgstr ""
-#: panels/history/panel.py:18 panels/history/panel.py:19
+#: panels/history/panel.py:19 panels/history/panel.py:20
msgid "History"
msgstr ""
@@ -51,7 +74,7 @@ msgstr ""
msgid "Profiling"
msgstr ""
-#: panels/redirects.py:14
+#: panels/redirects.py:17
msgid "Intercept redirects"
msgstr ""
@@ -59,11 +82,11 @@ msgstr ""
msgid "Request"
msgstr ""
-#: panels/request.py:36
+#: panels/request.py:38
msgid ""
msgstr ""
-#: panels/request.py:53
+#: panels/request.py:55
msgid ""
msgstr ""
@@ -72,10 +95,9 @@ msgid "Settings"
msgstr "Pengaturan"
#: panels/settings.py:20
-#, fuzzy, python-format
-#| msgid "Settings from %s
"
+#, python-format
msgid "Settings from %s"
-msgstr "Pengaturan dari %s
"
+msgstr ""
#: panels/signals.py:57
#, python-format
@@ -93,148 +115,148 @@ msgstr[0] ""
msgid "Signals"
msgstr "Sinyal"
-#: panels/sql/panel.py:23
-msgid "Autocommit"
-msgstr ""
-
-#: panels/sql/panel.py:24
+#: panels/sql/panel.py:30 panels/sql/panel.py:41
msgid "Read uncommitted"
msgstr ""
-#: panels/sql/panel.py:25
+#: panels/sql/panel.py:31 panels/sql/panel.py:43
msgid "Read committed"
msgstr ""
-#: panels/sql/panel.py:26
+#: panels/sql/panel.py:32 panels/sql/panel.py:45
msgid "Repeatable read"
msgstr ""
-#: panels/sql/panel.py:27
+#: panels/sql/panel.py:33 panels/sql/panel.py:47
msgid "Serializable"
msgstr "Variabel"
#: panels/sql/panel.py:39
+msgid "Autocommit"
+msgstr ""
+
+#: panels/sql/panel.py:61 panels/sql/panel.py:71
msgid "Idle"
msgstr ""
-#: panels/sql/panel.py:40
+#: panels/sql/panel.py:62 panels/sql/panel.py:72
msgid "Active"
msgstr "Aksi"
-#: panels/sql/panel.py:41
+#: panels/sql/panel.py:63 panels/sql/panel.py:73
msgid "In transaction"
msgstr "Status transaksi:"
-#: panels/sql/panel.py:42
+#: panels/sql/panel.py:64 panels/sql/panel.py:74
msgid "In error"
msgstr ""
-#: panels/sql/panel.py:43
+#: panels/sql/panel.py:65 panels/sql/panel.py:75
msgid "Unknown"
msgstr "(tidak diketahui)"
-#: panels/sql/panel.py:130
+#: panels/sql/panel.py:162
msgid "SQL"
msgstr "SQL"
-#: panels/sql/panel.py:135
+#: panels/sql/panel.py:168
#, python-format
msgid "%(query_count)d query in %(sql_time).2fms"
msgid_plural "%(query_count)d queries in %(sql_time).2fms"
msgstr[0] ""
-#: panels/sql/panel.py:147
+#: panels/sql/panel.py:180
#, python-format
msgid "SQL queries from %(count)d connection"
msgid_plural "SQL queries from %(count)d connections"
msgstr[0] ""
-#: panels/staticfiles.py:84
+#: panels/staticfiles.py:82
#, python-format
msgid "Static files (%(num_found)s found, %(num_used)s used)"
msgstr ""
-#: panels/staticfiles.py:105
+#: panels/staticfiles.py:103
msgid "Static files"
msgstr "Berkas statik"
-#: panels/staticfiles.py:111
+#: panels/staticfiles.py:109
#, python-format
msgid "%(num_used)s file used"
msgid_plural "%(num_used)s files used"
msgstr[0] ""
-#: panels/templates/panel.py:143
+#: panels/templates/panel.py:101
msgid "Templates"
msgstr "Template"
-#: panels/templates/panel.py:148
+#: panels/templates/panel.py:106
#, python-format
msgid "Templates (%(num_templates)s rendered)"
msgstr ""
-#: panels/templates/panel.py:180
+#: panels/templates/panel.py:195
msgid "No origin"
msgstr ""
-#: panels/timer.py:25
+#: panels/timer.py:27
#, python-format
msgid "CPU: %(cum)0.2fms (%(total)0.2fms)"
msgstr "CPU: %(cum)0.2fms (%(total)0.2fms)"
-#: panels/timer.py:30
+#: panels/timer.py:32
#, python-format
msgid "Total: %0.2fms"
msgstr ""
-#: panels/timer.py:36 templates/debug_toolbar/panels/history.html:9
+#: panels/timer.py:38 templates/debug_toolbar/panels/history.html:9
#: templates/debug_toolbar/panels/sql_explain.html:11
#: templates/debug_toolbar/panels/sql_profile.html:12
#: templates/debug_toolbar/panels/sql_select.html:11
msgid "Time"
msgstr "Waktu"
-#: panels/timer.py:44
+#: panels/timer.py:46
msgid "User CPU time"
msgstr "CPU time pengguna"
-#: panels/timer.py:44
+#: panels/timer.py:46
#, python-format
msgid "%(utime)0.3f msec"
msgstr ""
-#: panels/timer.py:45
+#: panels/timer.py:47
msgid "System CPU time"
msgstr "CPU time sistem"
-#: panels/timer.py:45
+#: panels/timer.py:47
#, python-format
msgid "%(stime)0.3f msec"
msgstr ""
-#: panels/timer.py:46
+#: panels/timer.py:48
msgid "Total CPU time"
msgstr "CPU time total"
-#: panels/timer.py:46
+#: panels/timer.py:48
#, python-format
msgid "%(total)0.3f msec"
msgstr ""
-#: panels/timer.py:47
+#: panels/timer.py:49
msgid "Elapsed time"
msgstr "Waktu terlampaui"
-#: panels/timer.py:47
+#: panels/timer.py:49
#, python-format
msgid "%(total_time)0.3f msec"
msgstr ""
-#: panels/timer.py:49
+#: panels/timer.py:51
msgid "Context switches"
msgstr ""
-#: panels/timer.py:50
+#: panels/timer.py:52
#, python-format
msgid "%(vcsw)d voluntary, %(ivcsw)d involuntary"
msgstr ""
@@ -243,15 +265,19 @@ msgstr ""
msgid "Versions"
msgstr "Versi"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide toolbar"
msgstr ""
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide"
msgstr "Menyembunyikan"
-#: templates/debug_toolbar/base.html:29
+#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26
+msgid "Toggle Theme"
+msgstr ""
+
+#: templates/debug_toolbar/base.html:35
msgid "Show toolbar"
msgstr ""
@@ -263,6 +289,14 @@ msgstr ""
msgid "Enable for next and successive requests"
msgstr ""
+#: templates/debug_toolbar/panels/alerts.html:4
+msgid "Alerts found"
+msgstr ""
+
+#: templates/debug_toolbar/panels/alerts.html:11
+msgid "No alerts found"
+msgstr ""
+
#: templates/debug_toolbar/panels/cache.html:2
msgid "Summary"
msgstr ""
@@ -358,10 +392,8 @@ msgid "Path"
msgstr ""
#: templates/debug_toolbar/panels/history.html:12
-#, fuzzy
-#| msgid "Variable"
msgid "Request Variables"
-msgstr "Variabel"
+msgstr ""
#: templates/debug_toolbar/panels/history.html:13
msgid "Status"
@@ -484,11 +516,9 @@ msgid "Timeline"
msgstr ""
#: templates/debug_toolbar/panels/sql.html:52
-#, fuzzy, python-format
-#| msgid "%(count)s message"
-#| msgid_plural "%(count)s messages"
+#, python-format
msgid "%(count)s similar queries."
-msgstr "%(count)s pesan"
+msgstr ""
#: templates/debug_toolbar/panels/sql.html:58
#, python-format
diff --git a/debug_toolbar/locale/it/LC_MESSAGES/django.mo b/debug_toolbar/locale/it/LC_MESSAGES/django.mo
index 005af0e6e..4294f8993 100644
Binary files a/debug_toolbar/locale/it/LC_MESSAGES/django.mo and b/debug_toolbar/locale/it/LC_MESSAGES/django.mo differ
diff --git a/debug_toolbar/locale/it/LC_MESSAGES/django.po b/debug_toolbar/locale/it/LC_MESSAGES/django.po
index 17c8347c1..97ee9c3e4 100644
--- a/debug_toolbar/locale/it/LC_MESSAGES/django.po
+++ b/debug_toolbar/locale/it/LC_MESSAGES/django.po
@@ -10,44 +10,69 @@ msgid ""
msgstr ""
"Project-Id-Version: Django Debug Toolbar\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-01-20 17:23+0100\n"
-"PO-Revision-Date: 2021-08-14 15:25+0000\n"
-"Last-Translator: Tim Schilling\n"
-"Language-Team: Italian (http://www.transifex.com/django-debug-toolbar/django-"
-"debug-toolbar/language/it/)\n"
-"Language: it\n"
+"POT-Creation-Date: 2024-08-06 07:12-0500\n"
+"PO-Revision-Date: 2010-11-30 00:00+0000\n"
+"Last-Translator: yakky , 2013-2014\n"
+"Language-Team: Italian (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/it/)\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"
+"Language: it\n"
+"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
-#: apps.py:15
+#: apps.py:18
msgid "Debug Toolbar"
msgstr ""
-#: panels/cache.py:180
+#: panels/alerts.py:67
+#, python-brace-format
+msgid ""
+"Form with id \"{form_id}\" contains file input, but does not have the "
+"attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:70
+msgid ""
+"Form contains file input, but does not have the attribute "
+"enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:73
+#, python-brace-format
+msgid ""
+"Input element references form with id \"{form_id}\", but the form does not "
+"have the attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:77
+msgid "Alerts"
+msgstr ""
+
+#: panels/cache.py:168
msgid "Cache"
msgstr "Cache"
-#: panels/cache.py:186
+#: panels/cache.py:174
#, python-format
msgid "%(cache_calls)d call in %(time).2fms"
msgid_plural "%(cache_calls)d calls in %(time).2fms"
msgstr[0] "%(cache_calls)d chiamata in %(time).2fms"
msgstr[1] "%(cache_calls)d chiamate in %(time).2fms"
+msgstr[2] "%(cache_calls)d chiamate in %(time).2fms"
-#: panels/cache.py:195
+#: panels/cache.py:183
#, python-format
msgid "Cache calls from %(count)d backend"
msgid_plural "Cache calls from %(count)d backends"
msgstr[0] "Chiamate alla cache da %(count)d backend"
msgstr[1] "Chiamate alla cache da %(count)d backend"
+msgstr[2] "Chiamate alla cache da %(count)d backend"
#: panels/headers.py:31
msgid "Headers"
msgstr "Intestazioni"
-#: panels/history/panel.py:18 panels/history/panel.py:19
+#: panels/history/panel.py:19 panels/history/panel.py:20
msgid "History"
msgstr ""
@@ -55,7 +80,7 @@ msgstr ""
msgid "Profiling"
msgstr "Profilazione"
-#: panels/redirects.py:14
+#: panels/redirects.py:17
msgid "Intercept redirects"
msgstr "Intercetta ridirezioni"
@@ -63,11 +88,11 @@ msgstr "Intercetta ridirezioni"
msgid "Request"
msgstr "Request"
-#: panels/request.py:36
+#: panels/request.py:38
msgid ""
msgstr ""
-#: panels/request.py:53
+#: panels/request.py:55
msgid ""
msgstr ""
@@ -86,6 +111,7 @@ msgid "%(num_receivers)d receiver of 1 signal"
msgid_plural "%(num_receivers)d receivers of 1 signal"
msgstr[0] "%(num_receivers)d ricevitore di 1 segnale"
msgstr[1] "%(num_receivers)d ricevitori di 1 segnale"
+msgstr[2] "%(num_receivers)d ricevitori di 1 segnale"
#: panels/signals.py:62
#, python-format
@@ -93,156 +119,160 @@ msgid "%(num_receivers)d receiver of %(num_signals)d signals"
msgid_plural "%(num_receivers)d receivers of %(num_signals)d signals"
msgstr[0] "%(num_receivers)d ricevitore di %(num_signals)d segnali"
msgstr[1] "%(num_receivers)d ricevitori di %(num_signals)d segnali"
+msgstr[2] "%(num_receivers)d ricevitori di %(num_signals)d segnali"
#: panels/signals.py:67
msgid "Signals"
msgstr "Segnali"
-#: panels/sql/panel.py:23
-msgid "Autocommit"
-msgstr "Autocommit"
-
-#: panels/sql/panel.py:24
+#: panels/sql/panel.py:30 panels/sql/panel.py:41
msgid "Read uncommitted"
msgstr "Read uncommitted"
-#: panels/sql/panel.py:25
+#: panels/sql/panel.py:31 panels/sql/panel.py:43
msgid "Read committed"
msgstr "Read committed"
-#: panels/sql/panel.py:26
+#: panels/sql/panel.py:32 panels/sql/panel.py:45
msgid "Repeatable read"
msgstr "Repeatable read"
-#: panels/sql/panel.py:27
+#: panels/sql/panel.py:33 panels/sql/panel.py:47
msgid "Serializable"
msgstr "Serializable"
#: panels/sql/panel.py:39
+msgid "Autocommit"
+msgstr "Autocommit"
+
+#: panels/sql/panel.py:61 panels/sql/panel.py:71
msgid "Idle"
msgstr "Idle"
-#: panels/sql/panel.py:40
+#: panels/sql/panel.py:62 panels/sql/panel.py:72
msgid "Active"
msgstr "Azione"
-#: panels/sql/panel.py:41
+#: panels/sql/panel.py:63 panels/sql/panel.py:73
msgid "In transaction"
msgstr "Stato transazione:"
-#: panels/sql/panel.py:42
+#: panels/sql/panel.py:64 panels/sql/panel.py:74
msgid "In error"
msgstr "Errore"
-#: panels/sql/panel.py:43
+#: panels/sql/panel.py:65 panels/sql/panel.py:75
msgid "Unknown"
msgstr "(sconosciuto)"
-#: panels/sql/panel.py:130
+#: panels/sql/panel.py:162
msgid "SQL"
msgstr "SQL"
-#: panels/sql/panel.py:135
+#: panels/sql/panel.py:168
#, python-format
msgid "%(query_count)d query in %(sql_time).2fms"
msgid_plural "%(query_count)d queries in %(sql_time).2fms"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
-#: panels/sql/panel.py:147
+#: panels/sql/panel.py:180
#, python-format
msgid "SQL queries from %(count)d connection"
msgid_plural "SQL queries from %(count)d connections"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
-#: panels/staticfiles.py:84
+#: panels/staticfiles.py:82
#, python-format
msgid "Static files (%(num_found)s found, %(num_used)s used)"
msgstr "File statici (%(num_found)s trovati, %(num_used)s usati)"
-#: panels/staticfiles.py:105
+#: panels/staticfiles.py:103
msgid "Static files"
msgstr "Files statici"
-#: panels/staticfiles.py:111
+#: panels/staticfiles.py:109
#, python-format
msgid "%(num_used)s file used"
msgid_plural "%(num_used)s files used"
msgstr[0] "%(num_used)s file usato"
msgstr[1] "%(num_used)s file usati"
+msgstr[2] "%(num_used)s file usati"
-#: panels/templates/panel.py:143
+#: panels/templates/panel.py:101
msgid "Templates"
msgstr "Template"
-#: panels/templates/panel.py:148
+#: panels/templates/panel.py:106
#, python-format
msgid "Templates (%(num_templates)s rendered)"
msgstr "Templates (%(num_templates)s rendered)"
-#: panels/templates/panel.py:180
+#: panels/templates/panel.py:195
msgid "No origin"
msgstr ""
-#: panels/timer.py:25
+#: panels/timer.py:27
#, python-format
msgid "CPU: %(cum)0.2fms (%(total)0.2fms)"
msgstr "CPU: %(cum)0.2fms (%(total)0.2fms)"
-#: panels/timer.py:30
+#: panels/timer.py:32
#, python-format
msgid "Total: %0.2fms"
msgstr "Totale: %0.2fms"
-#: panels/timer.py:36 templates/debug_toolbar/panels/history.html:9
+#: panels/timer.py:38 templates/debug_toolbar/panels/history.html:9
#: templates/debug_toolbar/panels/sql_explain.html:11
#: templates/debug_toolbar/panels/sql_profile.html:12
#: templates/debug_toolbar/panels/sql_select.html:11
msgid "Time"
msgstr "Tempo"
-#: panels/timer.py:44
+#: panels/timer.py:46
msgid "User CPU time"
msgstr "Tempo CPU utente"
-#: panels/timer.py:44
+#: panels/timer.py:46
#, python-format
msgid "%(utime)0.3f msec"
msgstr "%(utime)0.3f msec"
-#: panels/timer.py:45
+#: panels/timer.py:47
msgid "System CPU time"
msgstr "Tempo CPU sistema"
-#: panels/timer.py:45
+#: panels/timer.py:47
#, python-format
msgid "%(stime)0.3f msec"
msgstr "%(stime)0.3f msec"
-#: panels/timer.py:46
+#: panels/timer.py:48
msgid "Total CPU time"
msgstr "Tempo Totale CPU"
-#: panels/timer.py:46
+#: panels/timer.py:48
#, python-format
msgid "%(total)0.3f msec"
msgstr "%(total)0.3f msec"
-#: panels/timer.py:47
+#: panels/timer.py:49
msgid "Elapsed time"
msgstr "Tempo Trascorso"
-#: panels/timer.py:47
+#: panels/timer.py:49
#, python-format
msgid "%(total_time)0.3f msec"
msgstr "%(total_time)0.3f msec"
-#: panels/timer.py:49
+#: panels/timer.py:51
msgid "Context switches"
msgstr "Cambi di contesto"
-#: panels/timer.py:50
+#: panels/timer.py:52
#, python-format
msgid "%(vcsw)d voluntary, %(ivcsw)d involuntary"
msgstr "%(vcsw)d volontario, %(ivcsw)d involontario"
@@ -251,15 +281,19 @@ msgstr "%(vcsw)d volontario, %(ivcsw)d involontario"
msgid "Versions"
msgstr "Versioni"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide toolbar"
msgstr "Nascondi Toolbar"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide"
msgstr "Nascondi"
-#: templates/debug_toolbar/base.html:29
+#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26
+msgid "Toggle Theme"
+msgstr ""
+
+#: templates/debug_toolbar/base.html:35
msgid "Show toolbar"
msgstr "Mostra Toolbar"
@@ -271,6 +305,14 @@ msgstr "Disattiva per la prossima requests e le successive"
msgid "Enable for next and successive requests"
msgstr "Abilita per la prossima requests e le successive"
+#: templates/debug_toolbar/panels/alerts.html:4
+msgid "Alerts found"
+msgstr ""
+
+#: templates/debug_toolbar/panels/alerts.html:11
+msgid "No alerts found"
+msgstr ""
+
#: templates/debug_toolbar/panels/cache.html:2
msgid "Summary"
msgstr "Sommario"
@@ -354,9 +396,7 @@ msgstr "Ambiente WSGI"
msgid ""
"Since the WSGI environ inherits the environment of the server, only a "
"significant subset is shown below."
-msgstr ""
-"Visto che l'ambiente WSGI è ereditato dal server, sotto è mostrata solo la "
-"parte significativa."
+msgstr "Visto che l'ambiente WSGI è ereditato dal server, sotto è mostrata solo la parte significativa."
#: templates/debug_toolbar/panels/history.html:10
msgid "Method"
@@ -468,6 +508,7 @@ msgid "%(num)s query"
msgid_plural "%(num)s queries"
msgstr[0] "%(num)s query"
msgstr[1] "%(num)s query"
+msgstr[2] "%(num)s query"
#: templates/debug_toolbar/panels/sql.html:8
#, python-format
@@ -559,6 +600,7 @@ msgid "Static file path"
msgid_plural "Static file paths"
msgstr[0] "Percorso file statici"
msgstr[1] "Percorsi file statici"
+msgstr[2] "Percorsi file statici"
#: templates/debug_toolbar/panels/staticfiles.html:7
#, python-format
@@ -579,12 +621,14 @@ msgid "Static file app"
msgid_plural "Static file apps"
msgstr[0] "App file statici"
msgstr[1] "App file statici"
+msgstr[2] "App file statici"
#: templates/debug_toolbar/panels/staticfiles.html:25
msgid "Static file"
msgid_plural "Static files"
msgstr[0] ""
msgstr[1] "Files statici"
+msgstr[2] "Files statici"
#: templates/debug_toolbar/panels/staticfiles.html:39
#, python-format
@@ -592,6 +636,7 @@ msgid "%(payload_count)s file"
msgid_plural "%(payload_count)s files"
msgstr[0] "%(payload_count)s file"
msgstr[1] "%(payload_count)s file"
+msgstr[2] "%(payload_count)s file"
#: templates/debug_toolbar/panels/staticfiles.html:44
msgid "Location"
@@ -606,12 +651,14 @@ msgid "Template path"
msgid_plural "Template paths"
msgstr[0] "Percorso dei template"
msgstr[1] "Percorsi dei template"
+msgstr[2] "Percorsi dei template"
#: templates/debug_toolbar/panels/templates.html:13
msgid "Template"
msgid_plural "Templates"
msgstr[0] ""
msgstr[1] "Template"
+msgstr[2] "Template"
#: templates/debug_toolbar/panels/templates.html:22
#: templates/debug_toolbar/panels/templates.html:40
@@ -623,6 +670,7 @@ msgid "Context processor"
msgid_plural "Context processors"
msgstr[0] "Context processor"
msgstr[1] "Context processors"
+msgstr[2] "Context processors"
#: templates/debug_toolbar/panels/timer.html:2
msgid "Resource usage"
@@ -665,15 +713,10 @@ msgid ""
"The Django Debug Toolbar has intercepted a redirect to the above URL for "
"debug viewing purposes. You can click the above link to continue with the "
"redirect as normal."
-msgstr ""
-"Django Debug Toolbar ha intercettato un redirect verso la URL indicata per "
-"visualizzare il debug, Puoi cliccare sul link sopra per continuare "
-"normalmente con la redirezione."
+msgstr "Django Debug Toolbar ha intercettato un redirect verso la URL indicata per visualizzare il debug, Puoi cliccare sul link sopra per continuare normalmente con la redirezione."
#: views.py:16
msgid ""
"Data for this panel isn't available anymore. Please reload the page and "
"retry."
-msgstr ""
-"Non sono più disponibili dati per questo pannello. Ricarica la pagina e "
-"riprova."
+msgstr "Non sono più disponibili dati per questo pannello. Ricarica la pagina e riprova."
diff --git a/debug_toolbar/locale/ja/LC_MESSAGES/django.mo b/debug_toolbar/locale/ja/LC_MESSAGES/django.mo
index 2d2528f29..55377e981 100644
Binary files a/debug_toolbar/locale/ja/LC_MESSAGES/django.mo and b/debug_toolbar/locale/ja/LC_MESSAGES/django.mo differ
diff --git a/debug_toolbar/locale/ja/LC_MESSAGES/django.po b/debug_toolbar/locale/ja/LC_MESSAGES/django.po
index 69a059666..e985d55f5 100644
--- a/debug_toolbar/locale/ja/LC_MESSAGES/django.po
+++ b/debug_toolbar/locale/ja/LC_MESSAGES/django.po
@@ -8,32 +8,55 @@ msgid ""
msgstr ""
"Project-Id-Version: Django Debug Toolbar\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-01-20 17:23+0100\n"
-"PO-Revision-Date: 2021-08-14 15:25+0000\n"
-"Last-Translator: Tim Schilling\n"
-"Language-Team: Japanese (http://www.transifex.com/django-debug-toolbar/"
-"django-debug-toolbar/language/ja/)\n"
-"Language: ja\n"
+"POT-Creation-Date: 2024-08-06 07:12-0500\n"
+"PO-Revision-Date: 2010-11-30 00:00+0000\n"
+"Last-Translator: Shinya Okano , 2012,2014,2020\n"
+"Language-Team: Japanese (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/ja/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Language: ja\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: apps.py:15
+#: apps.py:18
msgid "Debug Toolbar"
msgstr "デバッグツールバー"
-#: panels/cache.py:180
+#: panels/alerts.py:67
+#, python-brace-format
+msgid ""
+"Form with id \"{form_id}\" contains file input, but does not have the "
+"attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:70
+msgid ""
+"Form contains file input, but does not have the attribute "
+"enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:73
+#, python-brace-format
+msgid ""
+"Input element references form with id \"{form_id}\", but the form does not "
+"have the attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:77
+msgid "Alerts"
+msgstr ""
+
+#: panels/cache.py:168
msgid "Cache"
msgstr "キャッシュ"
-#: panels/cache.py:186
+#: panels/cache.py:174
#, python-format
msgid "%(cache_calls)d call in %(time).2fms"
msgid_plural "%(cache_calls)d calls in %(time).2fms"
msgstr[0] ""
-#: panels/cache.py:195
+#: panels/cache.py:183
#, python-format
msgid "Cache calls from %(count)d backend"
msgid_plural "Cache calls from %(count)d backends"
@@ -43,7 +66,7 @@ msgstr[0] ""
msgid "Headers"
msgstr "ヘッダー"
-#: panels/history/panel.py:18 panels/history/panel.py:19
+#: panels/history/panel.py:19 panels/history/panel.py:20
msgid "History"
msgstr ""
@@ -51,7 +74,7 @@ msgstr ""
msgid "Profiling"
msgstr "プロファイル"
-#: panels/redirects.py:14
+#: panels/redirects.py:17
msgid "Intercept redirects"
msgstr "リダイレクトに割込み"
@@ -59,11 +82,11 @@ msgstr "リダイレクトに割込み"
msgid "Request"
msgstr "リクエスト"
-#: panels/request.py:36
+#: panels/request.py:38
msgid ""
msgstr ""
-#: panels/request.py:53
+#: panels/request.py:55
msgid ""
msgstr "<利用不可>"
@@ -92,148 +115,148 @@ msgstr[0] ""
msgid "Signals"
msgstr "シグナル"
-#: panels/sql/panel.py:23
-msgid "Autocommit"
-msgstr ""
-
-#: panels/sql/panel.py:24
+#: panels/sql/panel.py:30 panels/sql/panel.py:41
msgid "Read uncommitted"
msgstr ""
-#: panels/sql/panel.py:25
+#: panels/sql/panel.py:31 panels/sql/panel.py:43
msgid "Read committed"
msgstr ""
-#: panels/sql/panel.py:26
+#: panels/sql/panel.py:32 panels/sql/panel.py:45
msgid "Repeatable read"
msgstr ""
-#: panels/sql/panel.py:27
+#: panels/sql/panel.py:33 panels/sql/panel.py:47
msgid "Serializable"
msgstr ""
#: panels/sql/panel.py:39
+msgid "Autocommit"
+msgstr ""
+
+#: panels/sql/panel.py:61 panels/sql/panel.py:71
msgid "Idle"
msgstr ""
-#: panels/sql/panel.py:40
+#: panels/sql/panel.py:62 panels/sql/panel.py:72
msgid "Active"
msgstr ""
-#: panels/sql/panel.py:41
+#: panels/sql/panel.py:63 panels/sql/panel.py:73
msgid "In transaction"
msgstr ""
-#: panels/sql/panel.py:42
+#: panels/sql/panel.py:64 panels/sql/panel.py:74
msgid "In error"
msgstr ""
-#: panels/sql/panel.py:43
+#: panels/sql/panel.py:65 panels/sql/panel.py:75
msgid "Unknown"
msgstr ""
-#: panels/sql/panel.py:130
+#: panels/sql/panel.py:162
msgid "SQL"
msgstr "SQL"
-#: panels/sql/panel.py:135
+#: panels/sql/panel.py:168
#, python-format
msgid "%(query_count)d query in %(sql_time).2fms"
msgid_plural "%(query_count)d queries in %(sql_time).2fms"
msgstr[0] ""
-#: panels/sql/panel.py:147
+#: panels/sql/panel.py:180
#, python-format
msgid "SQL queries from %(count)d connection"
msgid_plural "SQL queries from %(count)d connections"
msgstr[0] ""
-#: panels/staticfiles.py:84
+#: panels/staticfiles.py:82
#, python-format
msgid "Static files (%(num_found)s found, %(num_used)s used)"
msgstr ""
-#: panels/staticfiles.py:105
+#: panels/staticfiles.py:103
msgid "Static files"
msgstr "静的ファイル"
-#: panels/staticfiles.py:111
+#: panels/staticfiles.py:109
#, python-format
msgid "%(num_used)s file used"
msgid_plural "%(num_used)s files used"
msgstr[0] ""
-#: panels/templates/panel.py:143
+#: panels/templates/panel.py:101
msgid "Templates"
msgstr "テンプレート"
-#: panels/templates/panel.py:148
+#: panels/templates/panel.py:106
#, python-format
msgid "Templates (%(num_templates)s rendered)"
msgstr ""
-#: panels/templates/panel.py:180
+#: panels/templates/panel.py:195
msgid "No origin"
msgstr ""
-#: panels/timer.py:25
+#: panels/timer.py:27
#, python-format
msgid "CPU: %(cum)0.2fms (%(total)0.2fms)"
msgstr ""
-#: panels/timer.py:30
+#: panels/timer.py:32
#, python-format
msgid "Total: %0.2fms"
msgstr ""
-#: panels/timer.py:36 templates/debug_toolbar/panels/history.html:9
+#: panels/timer.py:38 templates/debug_toolbar/panels/history.html:9
#: templates/debug_toolbar/panels/sql_explain.html:11
#: templates/debug_toolbar/panels/sql_profile.html:12
#: templates/debug_toolbar/panels/sql_select.html:11
msgid "Time"
msgstr "時間"
-#: panels/timer.py:44
+#: panels/timer.py:46
msgid "User CPU time"
msgstr ""
-#: panels/timer.py:44
+#: panels/timer.py:46
#, python-format
msgid "%(utime)0.3f msec"
msgstr ""
-#: panels/timer.py:45
+#: panels/timer.py:47
msgid "System CPU time"
msgstr ""
-#: panels/timer.py:45
+#: panels/timer.py:47
#, python-format
msgid "%(stime)0.3f msec"
msgstr ""
-#: panels/timer.py:46
+#: panels/timer.py:48
msgid "Total CPU time"
msgstr ""
-#: panels/timer.py:46
+#: panels/timer.py:48
#, python-format
msgid "%(total)0.3f msec"
msgstr ""
-#: panels/timer.py:47
+#: panels/timer.py:49
msgid "Elapsed time"
msgstr ""
-#: panels/timer.py:47
+#: panels/timer.py:49
#, python-format
msgid "%(total_time)0.3f msec"
msgstr ""
-#: panels/timer.py:49
+#: panels/timer.py:51
msgid "Context switches"
msgstr ""
-#: panels/timer.py:50
+#: panels/timer.py:52
#, python-format
msgid "%(vcsw)d voluntary, %(ivcsw)d involuntary"
msgstr ""
@@ -242,15 +265,19 @@ msgstr ""
msgid "Versions"
msgstr "バージョン"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide toolbar"
msgstr "ツールバーを隠す"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide"
msgstr "隠す"
-#: templates/debug_toolbar/base.html:29
+#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26
+msgid "Toggle Theme"
+msgstr ""
+
+#: templates/debug_toolbar/base.html:35
msgid "Show toolbar"
msgstr "ツールバーを表示"
@@ -262,6 +289,14 @@ msgstr ""
msgid "Enable for next and successive requests"
msgstr ""
+#: templates/debug_toolbar/panels/alerts.html:4
+msgid "Alerts found"
+msgstr ""
+
+#: templates/debug_toolbar/panels/alerts.html:11
+msgid "No alerts found"
+msgstr ""
+
#: templates/debug_toolbar/panels/cache.html:2
msgid "Summary"
msgstr ""
diff --git a/debug_toolbar/locale/ko/LC_MESSAGES/django.mo b/debug_toolbar/locale/ko/LC_MESSAGES/django.mo
new file mode 100644
index 000000000..592198de1
Binary files /dev/null and b/debug_toolbar/locale/ko/LC_MESSAGES/django.mo differ
diff --git a/debug_toolbar/locale/ko/LC_MESSAGES/django.po b/debug_toolbar/locale/ko/LC_MESSAGES/django.po
new file mode 100644
index 000000000..97cdf8c61
--- /dev/null
+++ b/debug_toolbar/locale/ko/LC_MESSAGES/django.po
@@ -0,0 +1,690 @@
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+#
+# Translators:
+# yeongkwang, 2022
+msgid ""
+msgstr ""
+"Project-Id-Version: Django Debug Toolbar\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-08-06 07:12-0500\n"
+"PO-Revision-Date: 2010-11-30 00:00+0000\n"
+"Last-Translator: yeongkwang, 2022\n"
+"Language-Team: Korean (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/ko/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ko\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: apps.py:18
+msgid "Debug Toolbar"
+msgstr "Debug Toolbar"
+
+#: panels/alerts.py:67
+#, python-brace-format
+msgid ""
+"Form with id \"{form_id}\" contains file input, but does not have the "
+"attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:70
+msgid ""
+"Form contains file input, but does not have the attribute "
+"enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:73
+#, python-brace-format
+msgid ""
+"Input element references form with id \"{form_id}\", but the form does not "
+"have the attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:77
+msgid "Alerts"
+msgstr ""
+
+#: panels/cache.py:168
+msgid "Cache"
+msgstr "캐시"
+
+#: panels/cache.py:174
+#, python-format
+msgid "%(cache_calls)d call in %(time).2fms"
+msgid_plural "%(cache_calls)d calls in %(time).2fms"
+msgstr[0] "%(time).2f 밀리초 동안 %(cache_calls)d번 호출"
+
+#: panels/cache.py:183
+#, python-format
+msgid "Cache calls from %(count)d backend"
+msgid_plural "Cache calls from %(count)d backends"
+msgstr[0] "백엔드에서 %(count)d개의 캐시 호출"
+
+#: panels/headers.py:31
+msgid "Headers"
+msgstr "헤더"
+
+#: panels/history/panel.py:19 panels/history/panel.py:20
+msgid "History"
+msgstr "히스토리"
+
+#: panels/profiling.py:140
+msgid "Profiling"
+msgstr "프로파일링"
+
+#: panels/redirects.py:17
+msgid "Intercept redirects"
+msgstr "리다이렉션 가로채기"
+
+#: panels/request.py:16
+msgid "Request"
+msgstr "요청"
+
+#: panels/request.py:38
+msgid ""
+msgstr ""
+
+#: panels/request.py:55
+msgid ""
+msgstr "<사용할 수 없음>"
+
+#: panels/settings.py:17
+msgid "Settings"
+msgstr "설정"
+
+#: panels/settings.py:20
+#, python-format
+msgid "Settings from %s"
+msgstr "설정 %s"
+
+#: panels/signals.py:57
+#, python-format
+msgid "%(num_receivers)d receiver of 1 signal"
+msgid_plural "%(num_receivers)d receivers of 1 signal"
+msgstr[0] "1개의 시그널 %(num_receivers)d개의 리시버"
+
+#: panels/signals.py:62
+#, python-format
+msgid "%(num_receivers)d receiver of %(num_signals)d signals"
+msgid_plural "%(num_receivers)d receivers of %(num_signals)d signals"
+msgstr[0] "%(num_signals)d개의 시그널 %(num_receivers)d개의 리시버"
+
+#: panels/signals.py:67
+msgid "Signals"
+msgstr "시그널"
+
+#: panels/sql/panel.py:30 panels/sql/panel.py:41
+msgid "Read uncommitted"
+msgstr ""
+
+#: panels/sql/panel.py:31 panels/sql/panel.py:43
+msgid "Read committed"
+msgstr ""
+
+#: panels/sql/panel.py:32 panels/sql/panel.py:45
+msgid "Repeatable read"
+msgstr ""
+
+#: panels/sql/panel.py:33 panels/sql/panel.py:47
+msgid "Serializable"
+msgstr ""
+
+#: panels/sql/panel.py:39
+msgid "Autocommit"
+msgstr ""
+
+#: panels/sql/panel.py:61 panels/sql/panel.py:71
+msgid "Idle"
+msgstr "유휴"
+
+#: panels/sql/panel.py:62 panels/sql/panel.py:72
+msgid "Active"
+msgstr "활성"
+
+#: panels/sql/panel.py:63 panels/sql/panel.py:73
+msgid "In transaction"
+msgstr "트랜잭션"
+
+#: panels/sql/panel.py:64 panels/sql/panel.py:74
+msgid "In error"
+msgstr "에러"
+
+#: panels/sql/panel.py:65 panels/sql/panel.py:75
+msgid "Unknown"
+msgstr "알 수 없음"
+
+#: panels/sql/panel.py:162
+msgid "SQL"
+msgstr "SQL"
+
+#: panels/sql/panel.py:168
+#, python-format
+msgid "%(query_count)d query in %(sql_time).2fms"
+msgid_plural "%(query_count)d queries in %(sql_time).2fms"
+msgstr[0] "%(sql_time).2f 밀리초 동안 %(query_count)d개의 쿼리"
+
+#: panels/sql/panel.py:180
+#, python-format
+msgid "SQL queries from %(count)d connection"
+msgid_plural "SQL queries from %(count)d connections"
+msgstr[0] "SQL 쿼리 %(count)d개의 커넥션"
+
+#: panels/staticfiles.py:82
+#, python-format
+msgid "Static files (%(num_found)s found, %(num_used)s used)"
+msgstr "정적 파일 (%(num_found)s개 찾음, %(num_used)s개 사용됨)"
+
+#: panels/staticfiles.py:103
+msgid "Static files"
+msgstr "정적 파일"
+
+#: panels/staticfiles.py:109
+#, python-format
+msgid "%(num_used)s file used"
+msgid_plural "%(num_used)s files used"
+msgstr[0] "%(num_used)s개의 파일 사용됨"
+
+#: panels/templates/panel.py:101
+msgid "Templates"
+msgstr "템플릿"
+
+#: panels/templates/panel.py:106
+#, python-format
+msgid "Templates (%(num_templates)s rendered)"
+msgstr "템플릿 (%(num_templates)s개 렌더링)"
+
+#: panels/templates/panel.py:195
+msgid "No origin"
+msgstr ""
+
+#: panels/timer.py:27
+#, python-format
+msgid "CPU: %(cum)0.2fms (%(total)0.2fms)"
+msgstr ""
+
+#: panels/timer.py:32
+#, python-format
+msgid "Total: %0.2fms"
+msgstr ""
+
+#: panels/timer.py:38 templates/debug_toolbar/panels/history.html:9
+#: templates/debug_toolbar/panels/sql_explain.html:11
+#: templates/debug_toolbar/panels/sql_profile.html:12
+#: templates/debug_toolbar/panels/sql_select.html:11
+msgid "Time"
+msgstr "시각"
+
+#: panels/timer.py:46
+msgid "User CPU time"
+msgstr ""
+
+#: panels/timer.py:46
+#, python-format
+msgid "%(utime)0.3f msec"
+msgstr ""
+
+#: panels/timer.py:47
+msgid "System CPU time"
+msgstr ""
+
+#: panels/timer.py:47
+#, python-format
+msgid "%(stime)0.3f msec"
+msgstr ""
+
+#: panels/timer.py:48
+msgid "Total CPU time"
+msgstr ""
+
+#: panels/timer.py:48
+#, python-format
+msgid "%(total)0.3f msec"
+msgstr ""
+
+#: panels/timer.py:49
+msgid "Elapsed time"
+msgstr "경과 시간"
+
+#: panels/timer.py:49
+#, python-format
+msgid "%(total_time)0.3f msec"
+msgstr ""
+
+#: panels/timer.py:51
+msgid "Context switches"
+msgstr "컨텍스트 스위치"
+
+#: panels/timer.py:52
+#, python-format
+msgid "%(vcsw)d voluntary, %(ivcsw)d involuntary"
+msgstr ""
+
+#: panels/versions.py:19
+msgid "Versions"
+msgstr "버전"
+
+#: templates/debug_toolbar/base.html:23
+msgid "Hide toolbar"
+msgstr "툴바 숨기기"
+
+#: templates/debug_toolbar/base.html:23
+msgid "Hide"
+msgstr "숨기기"
+
+#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26
+msgid "Toggle Theme"
+msgstr ""
+
+#: templates/debug_toolbar/base.html:35
+msgid "Show toolbar"
+msgstr "툴바 열기"
+
+#: templates/debug_toolbar/includes/panel_button.html:4
+msgid "Disable for next and successive requests"
+msgstr "다음 요청부터 비활성화 됩니다."
+
+#: templates/debug_toolbar/includes/panel_button.html:4
+msgid "Enable for next and successive requests"
+msgstr "다음 요청부터 활성화 됩니다."
+
+#: templates/debug_toolbar/panels/alerts.html:4
+msgid "Alerts found"
+msgstr ""
+
+#: templates/debug_toolbar/panels/alerts.html:11
+msgid "No alerts found"
+msgstr ""
+
+#: templates/debug_toolbar/panels/cache.html:2
+msgid "Summary"
+msgstr "개요"
+
+#: templates/debug_toolbar/panels/cache.html:6
+msgid "Total calls"
+msgstr "총 요청 개수"
+
+#: templates/debug_toolbar/panels/cache.html:7
+msgid "Total time"
+msgstr "총 소요 시간"
+
+#: templates/debug_toolbar/panels/cache.html:8
+msgid "Cache hits"
+msgstr "캐시 적중"
+
+#: templates/debug_toolbar/panels/cache.html:9
+msgid "Cache misses"
+msgstr "캐시 비적중"
+
+#: templates/debug_toolbar/panels/cache.html:21
+msgid "Commands"
+msgstr "명령"
+
+#: templates/debug_toolbar/panels/cache.html:39
+msgid "Calls"
+msgstr "호출"
+
+#: templates/debug_toolbar/panels/cache.html:43
+#: templates/debug_toolbar/panels/sql.html:36
+msgid "Time (ms)"
+msgstr "시간 (ms)"
+
+#: templates/debug_toolbar/panels/cache.html:44
+msgid "Type"
+msgstr "타입"
+
+#: templates/debug_toolbar/panels/cache.html:45
+#: templates/debug_toolbar/panels/request.html:8
+msgid "Arguments"
+msgstr "매개변수"
+
+#: templates/debug_toolbar/panels/cache.html:46
+#: templates/debug_toolbar/panels/request.html:9
+msgid "Keyword arguments"
+msgstr "키워드 매개변수"
+
+#: templates/debug_toolbar/panels/cache.html:47
+msgid "Backend"
+msgstr "백엔드"
+
+#: templates/debug_toolbar/panels/headers.html:3
+msgid "Request headers"
+msgstr "요청 헤더"
+
+#: templates/debug_toolbar/panels/headers.html:8
+#: templates/debug_toolbar/panels/headers.html:27
+#: templates/debug_toolbar/panels/headers.html:48
+msgid "Key"
+msgstr "키"
+
+#: templates/debug_toolbar/panels/headers.html:9
+#: templates/debug_toolbar/panels/headers.html:28
+#: templates/debug_toolbar/panels/headers.html:49
+#: templates/debug_toolbar/panels/history_tr.html:23
+#: templates/debug_toolbar/panels/request_variables.html:12
+#: templates/debug_toolbar/panels/settings.html:6
+#: templates/debug_toolbar/panels/timer.html:11
+msgid "Value"
+msgstr "값"
+
+#: templates/debug_toolbar/panels/headers.html:22
+msgid "Response headers"
+msgstr "응답 헤더"
+
+#: templates/debug_toolbar/panels/headers.html:41
+msgid "WSGI environ"
+msgstr "WSGI 환경"
+
+#: templates/debug_toolbar/panels/headers.html:43
+msgid ""
+"Since the WSGI environ inherits the environment of the server, only a "
+"significant subset is shown below."
+msgstr "WSGI 환경이 서버 환경을 상속하므로 아래에는 중요한 하위 집합만 표시됩니다."
+
+#: templates/debug_toolbar/panels/history.html:10
+msgid "Method"
+msgstr "메서드"
+
+#: templates/debug_toolbar/panels/history.html:11
+#: templates/debug_toolbar/panels/staticfiles.html:43
+msgid "Path"
+msgstr "경로"
+
+#: templates/debug_toolbar/panels/history.html:12
+msgid "Request Variables"
+msgstr "요청 변수"
+
+#: templates/debug_toolbar/panels/history.html:13
+msgid "Status"
+msgstr "상태 코드"
+
+#: templates/debug_toolbar/panels/history.html:14
+#: templates/debug_toolbar/panels/sql.html:37
+msgid "Action"
+msgstr "액션"
+
+#: templates/debug_toolbar/panels/history_tr.html:22
+#: templates/debug_toolbar/panels/request_variables.html:11
+msgid "Variable"
+msgstr "변수"
+
+#: templates/debug_toolbar/panels/profiling.html:5
+msgid "Call"
+msgstr "호출"
+
+#: templates/debug_toolbar/panels/profiling.html:6
+msgid "CumTime"
+msgstr ""
+
+#: templates/debug_toolbar/panels/profiling.html:7
+#: templates/debug_toolbar/panels/profiling.html:9
+msgid "Per"
+msgstr ""
+
+#: templates/debug_toolbar/panels/profiling.html:8
+msgid "TotTime"
+msgstr ""
+
+#: templates/debug_toolbar/panels/profiling.html:10
+msgid "Count"
+msgstr "개수"
+
+#: templates/debug_toolbar/panels/request.html:3
+msgid "View information"
+msgstr "View 정보"
+
+#: templates/debug_toolbar/panels/request.html:7
+msgid "View function"
+msgstr "View 함수"
+
+#: templates/debug_toolbar/panels/request.html:10
+msgid "URL name"
+msgstr "URL 명칭"
+
+#: templates/debug_toolbar/panels/request.html:24
+msgid "Cookies"
+msgstr "쿠키"
+
+#: templates/debug_toolbar/panels/request.html:27
+msgid "No cookies"
+msgstr "쿠키 없음"
+
+#: templates/debug_toolbar/panels/request.html:31
+msgid "Session data"
+msgstr "세션 데이터"
+
+#: templates/debug_toolbar/panels/request.html:34
+msgid "No session data"
+msgstr "세션 데이터 없음"
+
+#: templates/debug_toolbar/panels/request.html:38
+msgid "GET data"
+msgstr "GET 요청 데이터"
+
+#: templates/debug_toolbar/panels/request.html:41
+msgid "No GET data"
+msgstr "GET 요청 데이터 없음"
+
+#: templates/debug_toolbar/panels/request.html:45
+msgid "POST data"
+msgstr "POST 요청 데이터"
+
+#: templates/debug_toolbar/panels/request.html:48
+msgid "No POST data"
+msgstr "POST 요청 데이터 없음"
+
+#: templates/debug_toolbar/panels/settings.html:5
+msgid "Setting"
+msgstr "설정"
+
+#: templates/debug_toolbar/panels/signals.html:5
+msgid "Signal"
+msgstr "시그널"
+
+#: templates/debug_toolbar/panels/signals.html:6
+msgid "Receivers"
+msgstr "리시버"
+
+#: templates/debug_toolbar/panels/sql.html:6
+#, python-format
+msgid "%(num)s query"
+msgid_plural "%(num)s queries"
+msgstr[0] "%(num)s개의 쿼리"
+
+#: templates/debug_toolbar/panels/sql.html:8
+#, python-format
+msgid ""
+"including %(count)s similar "
+msgstr "%(count)s 개의 유사한 쿼리 포함"
+
+#: templates/debug_toolbar/panels/sql.html:12
+#, python-format
+msgid ""
+"and %(dupes)s duplicates "
+msgstr "그리고 %(dupes)s개의 중복 "
+
+#: templates/debug_toolbar/panels/sql.html:34
+msgid "Query"
+msgstr "쿼리"
+
+#: templates/debug_toolbar/panels/sql.html:35
+#: templates/debug_toolbar/panels/timer.html:36
+msgid "Timeline"
+msgstr "타임라인"
+
+#: templates/debug_toolbar/panels/sql.html:52
+#, python-format
+msgid "%(count)s similar queries."
+msgstr "%(count)s개의 유사한 쿼리"
+
+#: templates/debug_toolbar/panels/sql.html:58
+#, python-format
+msgid "Duplicated %(dupes)s times."
+msgstr "%(dupes)s번 중복됩니다."
+
+#: templates/debug_toolbar/panels/sql.html:95
+msgid "Connection:"
+msgstr "커넥션:"
+
+#: templates/debug_toolbar/panels/sql.html:97
+msgid "Isolation level:"
+msgstr "격리 수준:"
+
+#: templates/debug_toolbar/panels/sql.html:100
+msgid "Transaction status:"
+msgstr "트랜잭션 상태:"
+
+#: templates/debug_toolbar/panels/sql.html:114
+msgid "(unknown)"
+msgstr "(알 수 없음)"
+
+#: templates/debug_toolbar/panels/sql.html:123
+msgid "No SQL queries were recorded during this request."
+msgstr "이 요청을 처리하는 동안 기록된 SQL 쿼리가 없습니다."
+
+#: templates/debug_toolbar/panels/sql_explain.html:4
+msgid "SQL explained"
+msgstr "SQL 설명"
+
+#: templates/debug_toolbar/panels/sql_explain.html:9
+#: templates/debug_toolbar/panels/sql_profile.html:10
+#: templates/debug_toolbar/panels/sql_select.html:9
+msgid "Executed SQL"
+msgstr "실행된 SQL 구문"
+
+#: templates/debug_toolbar/panels/sql_explain.html:13
+#: templates/debug_toolbar/panels/sql_profile.html:14
+#: templates/debug_toolbar/panels/sql_select.html:13
+msgid "Database"
+msgstr "데이터베이스"
+
+#: templates/debug_toolbar/panels/sql_profile.html:4
+msgid "SQL profiled"
+msgstr "SQL 성능 분석"
+
+#: templates/debug_toolbar/panels/sql_profile.html:37
+msgid "Error"
+msgstr "에러"
+
+#: templates/debug_toolbar/panels/sql_select.html:4
+msgid "SQL selected"
+msgstr "선택된 SQL 구문"
+
+#: templates/debug_toolbar/panels/sql_select.html:36
+msgid "Empty set"
+msgstr "빈 셋"
+
+#: templates/debug_toolbar/panels/staticfiles.html:3
+msgid "Static file path"
+msgid_plural "Static file paths"
+msgstr[0] "정적 파일 경로"
+
+#: templates/debug_toolbar/panels/staticfiles.html:7
+#, python-format
+msgid "(prefix %(prefix)s)"
+msgstr ""
+
+#: templates/debug_toolbar/panels/staticfiles.html:11
+#: templates/debug_toolbar/panels/staticfiles.html:22
+#: templates/debug_toolbar/panels/staticfiles.html:34
+#: templates/debug_toolbar/panels/templates.html:10
+#: templates/debug_toolbar/panels/templates.html:30
+#: templates/debug_toolbar/panels/templates.html:47
+msgid "None"
+msgstr ""
+
+#: templates/debug_toolbar/panels/staticfiles.html:14
+msgid "Static file app"
+msgid_plural "Static file apps"
+msgstr[0] "정적 파일 앱"
+
+#: templates/debug_toolbar/panels/staticfiles.html:25
+msgid "Static file"
+msgid_plural "Static files"
+msgstr[0] "정적 파일"
+
+#: templates/debug_toolbar/panels/staticfiles.html:39
+#, python-format
+msgid "%(payload_count)s file"
+msgid_plural "%(payload_count)s files"
+msgstr[0] "%(payload_count)s개 파일"
+
+#: templates/debug_toolbar/panels/staticfiles.html:44
+msgid "Location"
+msgstr "위치"
+
+#: templates/debug_toolbar/panels/template_source.html:4
+msgid "Template source:"
+msgstr "템플릿 소스:"
+
+#: templates/debug_toolbar/panels/templates.html:2
+msgid "Template path"
+msgid_plural "Template paths"
+msgstr[0] "템플릿 경로"
+
+#: templates/debug_toolbar/panels/templates.html:13
+msgid "Template"
+msgid_plural "Templates"
+msgstr[0] "템플릿"
+
+#: templates/debug_toolbar/panels/templates.html:22
+#: templates/debug_toolbar/panels/templates.html:40
+msgid "Toggle context"
+msgstr "컨텍스트 토글"
+
+#: templates/debug_toolbar/panels/templates.html:33
+msgid "Context processor"
+msgid_plural "Context processors"
+msgstr[0] "컨텍스트 프로세서"
+
+#: templates/debug_toolbar/panels/timer.html:2
+msgid "Resource usage"
+msgstr "리소스 사용량"
+
+#: templates/debug_toolbar/panels/timer.html:10
+msgid "Resource"
+msgstr "리소스"
+
+#: templates/debug_toolbar/panels/timer.html:26
+msgid "Browser timing"
+msgstr "브라우저 타이밍"
+
+#: templates/debug_toolbar/panels/timer.html:35
+msgid "Timing attribute"
+msgstr "타이밍 속성"
+
+#: templates/debug_toolbar/panels/timer.html:37
+msgid "Milliseconds since navigation start (+length)"
+msgstr "탐색 시작후 밀리초 소요 (+길이)"
+
+#: templates/debug_toolbar/panels/versions.html:10
+msgid "Package"
+msgstr "패키지"
+
+#: templates/debug_toolbar/panels/versions.html:11
+msgid "Name"
+msgstr "이름"
+
+#: templates/debug_toolbar/panels/versions.html:12
+msgid "Version"
+msgstr "버전"
+
+#: templates/debug_toolbar/redirect.html:10
+msgid "Location:"
+msgstr "위치:"
+
+#: templates/debug_toolbar/redirect.html:12
+msgid ""
+"The Django Debug Toolbar has intercepted a redirect to the above URL for "
+"debug viewing purposes. You can click the above link to continue with the "
+"redirect as normal."
+msgstr "Django Debug Toolbar는 디버그 보기를 제공하기 위해 위 URL으로 리다이렉션을 가로챘습니다. 위 링크를 클릭하여 정상적으로 리다이렉션을 계속 할수 있습니다."
+
+#: views.py:16
+msgid ""
+"Data for this panel isn't available anymore. Please reload the page and "
+"retry."
+msgstr "이 패널의 데이터는 더이상 사용할 수 없습니다. 페이지를 새로고침한 뒤 다시 시도하십시오."
diff --git a/debug_toolbar/locale/nl/LC_MESSAGES/django.mo b/debug_toolbar/locale/nl/LC_MESSAGES/django.mo
index 012fecbf7..173e26b10 100644
Binary files a/debug_toolbar/locale/nl/LC_MESSAGES/django.mo and b/debug_toolbar/locale/nl/LC_MESSAGES/django.mo differ
diff --git a/debug_toolbar/locale/nl/LC_MESSAGES/django.po b/debug_toolbar/locale/nl/LC_MESSAGES/django.po
index c786c936f..b7a9bd730 100644
--- a/debug_toolbar/locale/nl/LC_MESSAGES/django.po
+++ b/debug_toolbar/locale/nl/LC_MESSAGES/django.po
@@ -8,33 +8,56 @@ msgid ""
msgstr ""
"Project-Id-Version: Django Debug Toolbar\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-01-20 17:23+0100\n"
-"PO-Revision-Date: 2014-04-25 19:53+0000\n"
-"Last-Translator: Aymeric Augustin \n"
-"Language-Team: Dutch (http://www.transifex.com/projects/p/django-debug-"
-"toolbar/language/nl/)\n"
-"Language: nl\n"
+"POT-Creation-Date: 2024-08-06 07:12-0500\n"
+"PO-Revision-Date: 2010-11-30 00:00+0000\n"
+"Last-Translator: Ingo Berben , 2012-2013\n"
+"Language-Team: Dutch (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/nl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Language: nl\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: apps.py:15
+#: apps.py:18
msgid "Debug Toolbar"
msgstr ""
-#: panels/cache.py:180
+#: panels/alerts.py:67
+#, python-brace-format
+msgid ""
+"Form with id \"{form_id}\" contains file input, but does not have the "
+"attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:70
+msgid ""
+"Form contains file input, but does not have the attribute "
+"enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:73
+#, python-brace-format
+msgid ""
+"Input element references form with id \"{form_id}\", but the form does not "
+"have the attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:77
+msgid "Alerts"
+msgstr ""
+
+#: panels/cache.py:168
msgid "Cache"
msgstr "Cache"
-#: panels/cache.py:186
+#: panels/cache.py:174
#, python-format
msgid "%(cache_calls)d call in %(time).2fms"
msgid_plural "%(cache_calls)d calls in %(time).2fms"
msgstr[0] ""
msgstr[1] ""
-#: panels/cache.py:195
+#: panels/cache.py:183
#, python-format
msgid "Cache calls from %(count)d backend"
msgid_plural "Cache calls from %(count)d backends"
@@ -45,7 +68,7 @@ msgstr[1] ""
msgid "Headers"
msgstr ""
-#: panels/history/panel.py:18 panels/history/panel.py:19
+#: panels/history/panel.py:19 panels/history/panel.py:20
msgid "History"
msgstr ""
@@ -53,7 +76,7 @@ msgstr ""
msgid "Profiling"
msgstr "Profilering"
-#: panels/redirects.py:14
+#: panels/redirects.py:17
msgid "Intercept redirects"
msgstr ""
@@ -61,11 +84,11 @@ msgstr ""
msgid "Request"
msgstr ""
-#: panels/request.py:36
+#: panels/request.py:38
msgid ""
msgstr ""
-#: panels/request.py:53
+#: panels/request.py:55
msgid ""
msgstr ""
@@ -74,10 +97,9 @@ msgid "Settings"
msgstr "Instellingen"
#: panels/settings.py:20
-#, fuzzy, python-format
-#| msgid "Settings from %s
"
+#, python-format
msgid "Settings from %s"
-msgstr "Instellingen van %s
"
+msgstr ""
#: panels/signals.py:57
#, python-format
@@ -97,151 +119,151 @@ msgstr[1] "%(num_receivers)d ontvangers van %(num_signals)d signalen"
msgid "Signals"
msgstr "Signalen"
-#: panels/sql/panel.py:23
-msgid "Autocommit"
-msgstr ""
-
-#: panels/sql/panel.py:24
+#: panels/sql/panel.py:30 panels/sql/panel.py:41
msgid "Read uncommitted"
msgstr ""
-#: panels/sql/panel.py:25
+#: panels/sql/panel.py:31 panels/sql/panel.py:43
msgid "Read committed"
msgstr ""
-#: panels/sql/panel.py:26
+#: panels/sql/panel.py:32 panels/sql/panel.py:45
msgid "Repeatable read"
msgstr ""
-#: panels/sql/panel.py:27
+#: panels/sql/panel.py:33 panels/sql/panel.py:47
msgid "Serializable"
msgstr "Serializeerbaar"
#: panels/sql/panel.py:39
+msgid "Autocommit"
+msgstr ""
+
+#: panels/sql/panel.py:61 panels/sql/panel.py:71
msgid "Idle"
msgstr ""
-#: panels/sql/panel.py:40
+#: panels/sql/panel.py:62 panels/sql/panel.py:72
msgid "Active"
msgstr "Actief"
-#: panels/sql/panel.py:41
+#: panels/sql/panel.py:63 panels/sql/panel.py:73
msgid "In transaction"
msgstr ""
-#: panels/sql/panel.py:42
+#: panels/sql/panel.py:64 panels/sql/panel.py:74
msgid "In error"
msgstr "Foutief"
-#: panels/sql/panel.py:43
+#: panels/sql/panel.py:65 panels/sql/panel.py:75
msgid "Unknown"
msgstr "Niet gekend"
-#: panels/sql/panel.py:130
+#: panels/sql/panel.py:162
msgid "SQL"
msgstr "SQL"
-#: panels/sql/panel.py:135
+#: panels/sql/panel.py:168
#, python-format
msgid "%(query_count)d query in %(sql_time).2fms"
msgid_plural "%(query_count)d queries in %(sql_time).2fms"
msgstr[0] ""
msgstr[1] ""
-#: panels/sql/panel.py:147
+#: panels/sql/panel.py:180
#, python-format
msgid "SQL queries from %(count)d connection"
msgid_plural "SQL queries from %(count)d connections"
msgstr[0] ""
msgstr[1] ""
-#: panels/staticfiles.py:84
+#: panels/staticfiles.py:82
#, python-format
msgid "Static files (%(num_found)s found, %(num_used)s used)"
msgstr ""
-#: panels/staticfiles.py:105
+#: panels/staticfiles.py:103
msgid "Static files"
msgstr ""
-#: panels/staticfiles.py:111
+#: panels/staticfiles.py:109
#, python-format
msgid "%(num_used)s file used"
msgid_plural "%(num_used)s files used"
msgstr[0] ""
msgstr[1] ""
-#: panels/templates/panel.py:143
+#: panels/templates/panel.py:101
msgid "Templates"
msgstr "Templates"
-#: panels/templates/panel.py:148
+#: panels/templates/panel.py:106
#, python-format
msgid "Templates (%(num_templates)s rendered)"
msgstr "Templates (%(num_templates)s gerenderd)"
-#: panels/templates/panel.py:180
+#: panels/templates/panel.py:195
msgid "No origin"
msgstr ""
-#: panels/timer.py:25
+#: panels/timer.py:27
#, python-format
msgid "CPU: %(cum)0.2fms (%(total)0.2fms)"
msgstr "CPU: %(cum)0.2fms (%(total)0.2fms)"
-#: panels/timer.py:30
+#: panels/timer.py:32
#, python-format
msgid "Total: %0.2fms"
msgstr "Totaal: %0.2fms"
-#: panels/timer.py:36 templates/debug_toolbar/panels/history.html:9
+#: panels/timer.py:38 templates/debug_toolbar/panels/history.html:9
#: templates/debug_toolbar/panels/sql_explain.html:11
#: templates/debug_toolbar/panels/sql_profile.html:12
#: templates/debug_toolbar/panels/sql_select.html:11
msgid "Time"
msgstr "Tijd"
-#: panels/timer.py:44
+#: panels/timer.py:46
msgid "User CPU time"
msgstr "Gebruikers CPU tijd"
-#: panels/timer.py:44
+#: panels/timer.py:46
#, python-format
msgid "%(utime)0.3f msec"
msgstr "%(utime)0.3f msec"
-#: panels/timer.py:45
+#: panels/timer.py:47
msgid "System CPU time"
msgstr "Systeem CPU tijd"
-#: panels/timer.py:45
+#: panels/timer.py:47
#, python-format
msgid "%(stime)0.3f msec"
msgstr "%(stime)0.3f msec"
-#: panels/timer.py:46
+#: panels/timer.py:48
msgid "Total CPU time"
msgstr "Totaal CPU tijd"
-#: panels/timer.py:46
+#: panels/timer.py:48
#, python-format
msgid "%(total)0.3f msec"
msgstr "%(total)0.3f msec"
-#: panels/timer.py:47
+#: panels/timer.py:49
msgid "Elapsed time"
msgstr "Verlopen tijd"
-#: panels/timer.py:47
+#: panels/timer.py:49
#, python-format
msgid "%(total_time)0.3f msec"
msgstr "%(total_time)0.3f msec"
-#: panels/timer.py:49
+#: panels/timer.py:51
msgid "Context switches"
msgstr ""
-#: panels/timer.py:50
+#: panels/timer.py:52
#, python-format
msgid "%(vcsw)d voluntary, %(ivcsw)d involuntary"
msgstr "%(vcsw)d vrijwillig, %(ivcsw)d niet vrijwillig"
@@ -250,15 +272,19 @@ msgstr "%(vcsw)d vrijwillig, %(ivcsw)d niet vrijwillig"
msgid "Versions"
msgstr "Versies"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide toolbar"
msgstr "Verberg toolbar"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide"
msgstr "Verbergen"
-#: templates/debug_toolbar/base.html:29
+#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26
+msgid "Toggle Theme"
+msgstr ""
+
+#: templates/debug_toolbar/base.html:35
msgid "Show toolbar"
msgstr "Bekijk toolbar"
@@ -270,6 +296,14 @@ msgstr ""
msgid "Enable for next and successive requests"
msgstr ""
+#: templates/debug_toolbar/panels/alerts.html:4
+msgid "Alerts found"
+msgstr ""
+
+#: templates/debug_toolbar/panels/alerts.html:11
+msgid "No alerts found"
+msgstr ""
+
#: templates/debug_toolbar/panels/cache.html:2
msgid "Summary"
msgstr "Samenvatting"
@@ -357,7 +391,7 @@ msgstr ""
#: templates/debug_toolbar/panels/history.html:10
msgid "Method"
-msgstr ""
+msgstr "Methode"
#: templates/debug_toolbar/panels/history.html:11
#: templates/debug_toolbar/panels/staticfiles.html:43
@@ -365,10 +399,8 @@ msgid "Path"
msgstr ""
#: templates/debug_toolbar/panels/history.html:12
-#, fuzzy
-#| msgid "Variable"
msgid "Request Variables"
-msgstr "Parameter"
+msgstr ""
#: templates/debug_toolbar/panels/history.html:13
msgid "Status"
@@ -492,11 +524,9 @@ msgid "Timeline"
msgstr "Tijdslijn"
#: templates/debug_toolbar/panels/sql.html:52
-#, fuzzy, python-format
-#| msgid "%(count)s message"
-#| msgid_plural "%(count)s messages"
+#, python-format
msgid "%(count)s similar queries."
-msgstr "%(count)s bericht"
+msgstr ""
#: templates/debug_toolbar/panels/sql.html:58
#, python-format
@@ -647,7 +677,7 @@ msgstr ""
#: templates/debug_toolbar/panels/versions.html:10
msgid "Package"
-msgstr ""
+msgstr "Pakket"
#: templates/debug_toolbar/panels/versions.html:11
msgid "Name"
diff --git a/debug_toolbar/locale/pl/LC_MESSAGES/django.mo b/debug_toolbar/locale/pl/LC_MESSAGES/django.mo
index 1e065d08e..839619342 100644
Binary files a/debug_toolbar/locale/pl/LC_MESSAGES/django.mo and b/debug_toolbar/locale/pl/LC_MESSAGES/django.mo differ
diff --git a/debug_toolbar/locale/pl/LC_MESSAGES/django.po b/debug_toolbar/locale/pl/LC_MESSAGES/django.po
index 1e33de287..337ad376e 100644
--- a/debug_toolbar/locale/pl/LC_MESSAGES/django.po
+++ b/debug_toolbar/locale/pl/LC_MESSAGES/django.po
@@ -3,52 +3,76 @@
#
#
# Translators:
-# Konrad Mosoń , 2013
+# Konrad Mosoń , 2013,2015
msgid ""
msgstr ""
"Project-Id-Version: Django Debug Toolbar\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-01-20 17:23+0100\n"
-"PO-Revision-Date: 2014-04-25 19:53+0000\n"
-"Last-Translator: Aymeric Augustin \n"
-"Language-Team: Polish (http://www.transifex.com/projects/p/django-debug-"
-"toolbar/language/pl/)\n"
-"Language: pl\n"
+"POT-Creation-Date: 2024-08-06 07:12-0500\n"
+"PO-Revision-Date: 2010-11-30 00:00+0000\n"
+"Last-Translator: Konrad Mosoń , 2013,2015\n"
+"Language-Team: Polish (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/pl/)\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%10>=2 && n%10<=4 && (n%100<10 "
-"|| n%100>=20) ? 1 : 2);\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"
-#: apps.py:15
+#: apps.py:18
msgid "Debug Toolbar"
+msgstr "Debug Toolbar"
+
+#: panels/alerts.py:67
+#, python-brace-format
+msgid ""
+"Form with id \"{form_id}\" contains file input, but does not have the "
+"attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:70
+msgid ""
+"Form contains file input, but does not have the attribute "
+"enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:73
+#, python-brace-format
+msgid ""
+"Input element references form with id \"{form_id}\", but the form does not "
+"have the attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:77
+msgid "Alerts"
msgstr ""
-#: panels/cache.py:180
+#: panels/cache.py:168
msgid "Cache"
msgstr "Cache"
-#: panels/cache.py:186
+#: panels/cache.py:174
#, python-format
msgid "%(cache_calls)d call in %(time).2fms"
msgid_plural "%(cache_calls)d calls in %(time).2fms"
msgstr[0] "%(cache_calls)d wywołanie w %(time).2fms"
msgstr[1] "%(cache_calls)d wywołania w %(time).2fms"
msgstr[2] "%(cache_calls)d wywołań w %(time).2fms"
+msgstr[3] "%(cache_calls)d wywołań w %(time).2fms"
-#: panels/cache.py:195
+#: panels/cache.py:183
#, python-format
msgid "Cache calls from %(count)d backend"
msgid_plural "Cache calls from %(count)d backends"
msgstr[0] "Wywołań z cache z %(count)d backendu"
msgstr[1] "Wywołań z cache z %(count)d backendów"
msgstr[2] "Wywołań z cache z %(count)d backendów"
+msgstr[3] "Wywołań z cache z %(count)d backendów"
#: panels/headers.py:31
msgid "Headers"
-msgstr ""
+msgstr "Nagłówki"
-#: panels/history/panel.py:18 panels/history/panel.py:19
+#: panels/history/panel.py:19 panels/history/panel.py:20
msgid "History"
msgstr ""
@@ -56,19 +80,19 @@ msgstr ""
msgid "Profiling"
msgstr "Profilowanie"
-#: panels/redirects.py:14
+#: panels/redirects.py:17
msgid "Intercept redirects"
-msgstr ""
+msgstr "Przechwycone przekierowania"
#: panels/request.py:16
msgid "Request"
-msgstr ""
+msgstr "Zapytania"
-#: panels/request.py:36
+#: panels/request.py:38
msgid ""
msgstr ""
-#: panels/request.py:53
+#: panels/request.py:55
msgid ""
msgstr ""
@@ -77,10 +101,9 @@ msgid "Settings"
msgstr "Ustawienia"
#: panels/settings.py:20
-#, fuzzy, python-format
-#| msgid "Settings from %s
"
+#, python-format
msgid "Settings from %s"
-msgstr "Ustawienia z %s
"
+msgstr ""
#: panels/signals.py:57
#, python-format
@@ -89,6 +112,7 @@ msgid_plural "%(num_receivers)d receivers of 1 signal"
msgstr[0] "%(num_receivers)d orbiorca 1 sygnału"
msgstr[1] "%(num_receivers)d odbiorców 1 sygnału"
msgstr[2] "%(num_receivers)d odbiorców 1 sygnału"
+msgstr[3] "%(num_receivers)d odbiorców 1 sygnału"
#: panels/signals.py:62
#, python-format
@@ -97,161 +121,163 @@ msgid_plural "%(num_receivers)d receivers of %(num_signals)d signals"
msgstr[0] "%(num_receivers)d odbiora %(num_signals)d sygnału"
msgstr[1] "%(num_receivers)d odbiorców %(num_signals)d sygnałów"
msgstr[2] "%(num_receivers)d odbiorców %(num_signals)d sygnałów"
+msgstr[3] "%(num_receivers)d odbiorców %(num_signals)d sygnałów"
#: panels/signals.py:67
msgid "Signals"
msgstr "Sygnały"
-#: panels/sql/panel.py:23
-msgid "Autocommit"
-msgstr "Autocommit"
-
-#: panels/sql/panel.py:24
+#: panels/sql/panel.py:30 panels/sql/panel.py:41
msgid "Read uncommitted"
-msgstr ""
+msgstr "Przeczaj niepopełnione"
-#: panels/sql/panel.py:25
+#: panels/sql/panel.py:31 panels/sql/panel.py:43
msgid "Read committed"
-msgstr ""
+msgstr "Przeczytaj popełnione"
-#: panels/sql/panel.py:26
+#: panels/sql/panel.py:32 panels/sql/panel.py:45
msgid "Repeatable read"
msgstr ""
-#: panels/sql/panel.py:27
+#: panels/sql/panel.py:33 panels/sql/panel.py:47
msgid "Serializable"
msgstr ""
#: panels/sql/panel.py:39
+msgid "Autocommit"
+msgstr "Autocommit"
+
+#: panels/sql/panel.py:61 panels/sql/panel.py:71
msgid "Idle"
-msgstr ""
+msgstr "Bezczynny"
-#: panels/sql/panel.py:40
+#: panels/sql/panel.py:62 panels/sql/panel.py:72
msgid "Active"
msgstr "Aktywne"
-#: panels/sql/panel.py:41
+#: panels/sql/panel.py:63 panels/sql/panel.py:73
msgid "In transaction"
msgstr "W transakcji"
-#: panels/sql/panel.py:42
+#: panels/sql/panel.py:64 panels/sql/panel.py:74
msgid "In error"
msgstr "W błędzie"
-#: panels/sql/panel.py:43
+#: panels/sql/panel.py:65 panels/sql/panel.py:75
msgid "Unknown"
msgstr "Nieznane"
-#: panels/sql/panel.py:130
+#: panels/sql/panel.py:162
msgid "SQL"
msgstr "SQL"
-#: panels/sql/panel.py:135
-#, fuzzy, python-format
-#| msgid "%(cache_calls)d call in %(time).2fms"
-#| msgid_plural "%(cache_calls)d calls in %(time).2fms"
+#: panels/sql/panel.py:168
+#, python-format
msgid "%(query_count)d query in %(sql_time).2fms"
msgid_plural "%(query_count)d queries in %(sql_time).2fms"
-msgstr[0] "%(cache_calls)d wywołanie w %(time).2fms"
-msgstr[1] "%(cache_calls)d wywołania w %(time).2fms"
-msgstr[2] "%(cache_calls)d wywołań w %(time).2fms"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
-#: panels/sql/panel.py:147
+#: panels/sql/panel.py:180
#, python-format
msgid "SQL queries from %(count)d connection"
msgid_plural "SQL queries from %(count)d connections"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgstr[3] ""
-#: panels/staticfiles.py:84
+#: panels/staticfiles.py:82
#, python-format
msgid "Static files (%(num_found)s found, %(num_used)s used)"
-msgstr ""
+msgstr "Pliki statyczne (znaleziono %(num_found)s, użyto %(num_used)s)"
-#: panels/staticfiles.py:105
+#: panels/staticfiles.py:103
msgid "Static files"
-msgstr ""
+msgstr "Pliki statyczne"
-#: panels/staticfiles.py:111
+#: panels/staticfiles.py:109
#, python-format
msgid "%(num_used)s file used"
msgid_plural "%(num_used)s files used"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%(num_used)s użyty plików"
+msgstr[1] "%(num_used)s użyte plików"
+msgstr[2] "%(num_used)s użytych plików"
+msgstr[3] "%(num_used)s użytych plików"
-#: panels/templates/panel.py:143
+#: panels/templates/panel.py:101
msgid "Templates"
msgstr "Templatki"
-#: panels/templates/panel.py:148
+#: panels/templates/panel.py:106
#, python-format
msgid "Templates (%(num_templates)s rendered)"
msgstr "Templatki (%(num_templates)s wyrenderowano)"
-#: panels/templates/panel.py:180
+#: panels/templates/panel.py:195
msgid "No origin"
msgstr ""
-#: panels/timer.py:25
+#: panels/timer.py:27
#, python-format
msgid "CPU: %(cum)0.2fms (%(total)0.2fms)"
msgstr "CPU: %(cum)0.2fms (%(total)0.2fms)"
-#: panels/timer.py:30
+#: panels/timer.py:32
#, python-format
msgid "Total: %0.2fms"
-msgstr ""
+msgstr "Całkowity czas: %0.2fms"
-#: panels/timer.py:36 templates/debug_toolbar/panels/history.html:9
+#: panels/timer.py:38 templates/debug_toolbar/panels/history.html:9
#: templates/debug_toolbar/panels/sql_explain.html:11
#: templates/debug_toolbar/panels/sql_profile.html:12
#: templates/debug_toolbar/panels/sql_select.html:11
msgid "Time"
msgstr "Czas"
-#: panels/timer.py:44
+#: panels/timer.py:46
msgid "User CPU time"
msgstr ""
-#: panels/timer.py:44
+#: panels/timer.py:46
#, python-format
msgid "%(utime)0.3f msec"
msgstr "%(utime)0.3f msec"
-#: panels/timer.py:45
+#: panels/timer.py:47
msgid "System CPU time"
msgstr ""
-#: panels/timer.py:45
+#: panels/timer.py:47
#, python-format
msgid "%(stime)0.3f msec"
msgstr "%(stime)0.3f msec"
-#: panels/timer.py:46
+#: panels/timer.py:48
msgid "Total CPU time"
msgstr ""
-#: panels/timer.py:46
+#: panels/timer.py:48
#, python-format
msgid "%(total)0.3f msec"
msgstr "%(total)0.3f msec"
-#: panels/timer.py:47
+#: panels/timer.py:49
msgid "Elapsed time"
-msgstr ""
+msgstr "Całkowity czas"
-#: panels/timer.py:47
+#: panels/timer.py:49
#, python-format
msgid "%(total_time)0.3f msec"
msgstr "%(total_time)0.3f msec"
-#: panels/timer.py:49
+#: panels/timer.py:51
msgid "Context switches"
-msgstr ""
+msgstr "Przełączenia kontekstu"
-#: panels/timer.py:50
+#: panels/timer.py:52
#, python-format
msgid "%(vcsw)d voluntary, %(ivcsw)d involuntary"
msgstr ""
@@ -260,15 +286,19 @@ msgstr ""
msgid "Versions"
msgstr "Wersje"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide toolbar"
-msgstr ""
+msgstr "Ukryj toolbar"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide"
msgstr "Ukryj"
-#: templates/debug_toolbar/base.html:29
+#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26
+msgid "Toggle Theme"
+msgstr ""
+
+#: templates/debug_toolbar/base.html:35
msgid "Show toolbar"
msgstr ""
@@ -280,6 +310,14 @@ msgstr ""
msgid "Enable for next and successive requests"
msgstr ""
+#: templates/debug_toolbar/panels/alerts.html:4
+msgid "Alerts found"
+msgstr ""
+
+#: templates/debug_toolbar/panels/alerts.html:11
+msgid "No alerts found"
+msgstr ""
+
#: templates/debug_toolbar/panels/cache.html:2
msgid "Summary"
msgstr "Podsumowanie"
@@ -375,10 +413,8 @@ msgid "Path"
msgstr ""
#: templates/debug_toolbar/panels/history.html:12
-#, fuzzy
-#| msgid "Variable"
msgid "Request Variables"
-msgstr "Zmienna"
+msgstr ""
#: templates/debug_toolbar/panels/history.html:13
msgid "Status"
@@ -478,6 +514,7 @@ msgid_plural "%(num)s queries"
msgstr[0] "%(num)s zapytanie"
msgstr[1] "%(num)s zapytania"
msgstr[2] "%(num)s zapytań"
+msgstr[3] "%(num)s zapytań"
#: templates/debug_toolbar/panels/sql.html:8
#, python-format
@@ -503,11 +540,9 @@ msgid "Timeline"
msgstr "Oś czasu"
#: templates/debug_toolbar/panels/sql.html:52
-#, fuzzy, python-format
-#| msgid "%(count)s message"
-#| msgid_plural "%(count)s messages"
+#, python-format
msgid "%(count)s similar queries."
-msgstr "%(count)s wiadomość"
+msgstr ""
#: templates/debug_toolbar/panels/sql.html:58
#, python-format
@@ -572,6 +607,7 @@ msgid_plural "Static file paths"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgstr[3] ""
#: templates/debug_toolbar/panels/staticfiles.html:7
#, python-format
@@ -593,6 +629,7 @@ msgid_plural "Static file apps"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgstr[3] ""
#: templates/debug_toolbar/panels/staticfiles.html:25
msgid "Static file"
@@ -600,6 +637,7 @@ msgid_plural "Static files"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgstr[3] ""
#: templates/debug_toolbar/panels/staticfiles.html:39
#, python-format
@@ -608,6 +646,7 @@ msgid_plural "%(payload_count)s files"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgstr[3] ""
#: templates/debug_toolbar/panels/staticfiles.html:44
msgid "Location"
@@ -623,6 +662,7 @@ msgid_plural "Template paths"
msgstr[0] "Ścieżka templatki"
msgstr[1] "Ścieżki templatek"
msgstr[2] "Ścieżki templatek"
+msgstr[3] "Ścieżki templatek"
#: templates/debug_toolbar/panels/templates.html:13
msgid "Template"
@@ -630,6 +670,7 @@ msgid_plural "Templates"
msgstr[0] "Templatki"
msgstr[1] "Templatki"
msgstr[2] "Templatki"
+msgstr[3] "Templatki"
#: templates/debug_toolbar/panels/templates.html:22
#: templates/debug_toolbar/panels/templates.html:40
@@ -642,6 +683,7 @@ msgid_plural "Context processors"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgstr[3] ""
#: templates/debug_toolbar/panels/timer.html:2
msgid "Resource usage"
diff --git a/debug_toolbar/locale/pt/LC_MESSAGES/django.mo b/debug_toolbar/locale/pt/LC_MESSAGES/django.mo
index f48a9b893..b08e0d39d 100644
Binary files a/debug_toolbar/locale/pt/LC_MESSAGES/django.mo and b/debug_toolbar/locale/pt/LC_MESSAGES/django.mo differ
diff --git a/debug_toolbar/locale/pt/LC_MESSAGES/django.po b/debug_toolbar/locale/pt/LC_MESSAGES/django.po
index 2231187b7..b1b0f5b77 100644
--- a/debug_toolbar/locale/pt/LC_MESSAGES/django.po
+++ b/debug_toolbar/locale/pt/LC_MESSAGES/django.po
@@ -3,49 +3,74 @@
#
#
# Translators:
-# joseduraes , 2014
+# José Durães , 2014
msgid ""
msgstr ""
"Project-Id-Version: Django Debug Toolbar\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-01-20 17:23+0100\n"
-"PO-Revision-Date: 2014-04-25 19:53+0000\n"
-"Last-Translator: Aymeric Augustin \n"
-"Language-Team: Portuguese (http://www.transifex.com/projects/p/django-debug-"
-"toolbar/language/pt/)\n"
-"Language: pt\n"
+"POT-Creation-Date: 2024-08-06 07:12-0500\n"
+"PO-Revision-Date: 2010-11-30 00:00+0000\n"
+"Last-Translator: José Durães , 2014\n"
+"Language-Team: Portuguese (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/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"
+"Language: pt\n"
+"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
-#: apps.py:15
+#: apps.py:18
msgid "Debug Toolbar"
msgstr ""
-#: panels/cache.py:180
+#: panels/alerts.py:67
+#, python-brace-format
+msgid ""
+"Form with id \"{form_id}\" contains file input, but does not have the "
+"attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:70
+msgid ""
+"Form contains file input, but does not have the attribute "
+"enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:73
+#, python-brace-format
+msgid ""
+"Input element references form with id \"{form_id}\", but the form does not "
+"have the attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:77
+msgid "Alerts"
+msgstr ""
+
+#: panels/cache.py:168
msgid "Cache"
msgstr ""
-#: panels/cache.py:186
+#: panels/cache.py:174
#, python-format
msgid "%(cache_calls)d call in %(time).2fms"
msgid_plural "%(cache_calls)d calls in %(time).2fms"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
-#: panels/cache.py:195
+#: panels/cache.py:183
#, python-format
msgid "Cache calls from %(count)d backend"
msgid_plural "Cache calls from %(count)d backends"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
#: panels/headers.py:31
msgid "Headers"
msgstr ""
-#: panels/history/panel.py:18 panels/history/panel.py:19
+#: panels/history/panel.py:19 panels/history/panel.py:20
msgid "History"
msgstr ""
@@ -53,7 +78,7 @@ msgstr ""
msgid "Profiling"
msgstr ""
-#: panels/redirects.py:14
+#: panels/redirects.py:17
msgid "Intercept redirects"
msgstr "Intercetar redirecionamentos"
@@ -61,11 +86,11 @@ msgstr "Intercetar redirecionamentos"
msgid "Request"
msgstr "Pedido"
-#: panels/request.py:36
+#: panels/request.py:38
msgid ""
msgstr ""
-#: panels/request.py:53
+#: panels/request.py:55
msgid ""
msgstr ""
@@ -74,10 +99,9 @@ msgid "Settings"
msgstr "Configurações"
#: panels/settings.py:20
-#, fuzzy, python-format
-#| msgid "Settings"
+#, python-format
msgid "Settings from %s"
-msgstr "Configurações"
+msgstr ""
#: panels/signals.py:57
#, python-format
@@ -85,6 +109,7 @@ msgid "%(num_receivers)d receiver of 1 signal"
msgid_plural "%(num_receivers)d receivers of 1 signal"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
#: panels/signals.py:62
#, python-format
@@ -92,156 +117,160 @@ msgid "%(num_receivers)d receiver of %(num_signals)d signals"
msgid_plural "%(num_receivers)d receivers of %(num_signals)d signals"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
#: panels/signals.py:67
msgid "Signals"
msgstr "Sinais"
-#: panels/sql/panel.py:23
-msgid "Autocommit"
-msgstr ""
-
-#: panels/sql/panel.py:24
+#: panels/sql/panel.py:30 panels/sql/panel.py:41
msgid "Read uncommitted"
msgstr ""
-#: panels/sql/panel.py:25
+#: panels/sql/panel.py:31 panels/sql/panel.py:43
msgid "Read committed"
msgstr ""
-#: panels/sql/panel.py:26
+#: panels/sql/panel.py:32 panels/sql/panel.py:45
msgid "Repeatable read"
msgstr ""
-#: panels/sql/panel.py:27
+#: panels/sql/panel.py:33 panels/sql/panel.py:47
msgid "Serializable"
msgstr "Variável"
#: panels/sql/panel.py:39
+msgid "Autocommit"
+msgstr ""
+
+#: panels/sql/panel.py:61 panels/sql/panel.py:71
msgid "Idle"
msgstr ""
-#: panels/sql/panel.py:40
+#: panels/sql/panel.py:62 panels/sql/panel.py:72
msgid "Active"
msgstr "Acção"
-#: panels/sql/panel.py:41
+#: panels/sql/panel.py:63 panels/sql/panel.py:73
msgid "In transaction"
msgstr ""
-#: panels/sql/panel.py:42
+#: panels/sql/panel.py:64 panels/sql/panel.py:74
msgid "In error"
msgstr "Erro"
-#: panels/sql/panel.py:43
+#: panels/sql/panel.py:65 panels/sql/panel.py:75
msgid "Unknown"
msgstr "Desconhecido"
-#: panels/sql/panel.py:130
+#: panels/sql/panel.py:162
msgid "SQL"
msgstr ""
-#: panels/sql/panel.py:135
+#: panels/sql/panel.py:168
#, python-format
msgid "%(query_count)d query in %(sql_time).2fms"
msgid_plural "%(query_count)d queries in %(sql_time).2fms"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
-#: panels/sql/panel.py:147
+#: panels/sql/panel.py:180
#, python-format
msgid "SQL queries from %(count)d connection"
msgid_plural "SQL queries from %(count)d connections"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
-#: panels/staticfiles.py:84
+#: panels/staticfiles.py:82
#, python-format
msgid "Static files (%(num_found)s found, %(num_used)s used)"
msgstr ""
-#: panels/staticfiles.py:105
+#: panels/staticfiles.py:103
msgid "Static files"
msgstr "Ficheiros estáticos"
-#: panels/staticfiles.py:111
+#: panels/staticfiles.py:109
#, python-format
msgid "%(num_used)s file used"
msgid_plural "%(num_used)s files used"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
-#: panels/templates/panel.py:143
+#: panels/templates/panel.py:101
msgid "Templates"
msgstr "Templates"
-#: panels/templates/panel.py:148
+#: panels/templates/panel.py:106
#, python-format
msgid "Templates (%(num_templates)s rendered)"
msgstr "Templates (%(num_templates)s renderizados)"
-#: panels/templates/panel.py:180
+#: panels/templates/panel.py:195
msgid "No origin"
msgstr ""
-#: panels/timer.py:25
+#: panels/timer.py:27
#, python-format
msgid "CPU: %(cum)0.2fms (%(total)0.2fms)"
msgstr ""
-#: panels/timer.py:30
+#: panels/timer.py:32
#, python-format
msgid "Total: %0.2fms"
msgstr "Total: %0.2fms"
-#: panels/timer.py:36 templates/debug_toolbar/panels/history.html:9
+#: panels/timer.py:38 templates/debug_toolbar/panels/history.html:9
#: templates/debug_toolbar/panels/sql_explain.html:11
#: templates/debug_toolbar/panels/sql_profile.html:12
#: templates/debug_toolbar/panels/sql_select.html:11
msgid "Time"
msgstr "Tempo"
-#: panels/timer.py:44
+#: panels/timer.py:46
msgid "User CPU time"
msgstr ""
-#: panels/timer.py:44
+#: panels/timer.py:46
#, python-format
msgid "%(utime)0.3f msec"
msgstr ""
-#: panels/timer.py:45
+#: panels/timer.py:47
msgid "System CPU time"
msgstr ""
-#: panels/timer.py:45
+#: panels/timer.py:47
#, python-format
msgid "%(stime)0.3f msec"
msgstr ""
-#: panels/timer.py:46
+#: panels/timer.py:48
msgid "Total CPU time"
msgstr ""
-#: panels/timer.py:46
+#: panels/timer.py:48
#, python-format
msgid "%(total)0.3f msec"
msgstr ""
-#: panels/timer.py:47
+#: panels/timer.py:49
msgid "Elapsed time"
msgstr ""
-#: panels/timer.py:47
+#: panels/timer.py:49
#, python-format
msgid "%(total_time)0.3f msec"
msgstr ""
-#: panels/timer.py:49
+#: panels/timer.py:51
msgid "Context switches"
msgstr ""
-#: panels/timer.py:50
+#: panels/timer.py:52
#, python-format
msgid "%(vcsw)d voluntary, %(ivcsw)d involuntary"
msgstr ""
@@ -250,15 +279,19 @@ msgstr ""
msgid "Versions"
msgstr "Versões"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide toolbar"
msgstr "Ocultar barra"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide"
msgstr "Ocultar"
-#: templates/debug_toolbar/base.html:29
+#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26
+msgid "Toggle Theme"
+msgstr ""
+
+#: templates/debug_toolbar/base.html:35
msgid "Show toolbar"
msgstr "Mostrar barra"
@@ -270,6 +303,14 @@ msgstr "Desactivar para o seguinte e sucessivos pedidos"
msgid "Enable for next and successive requests"
msgstr "Activar para o próximo e sucessivos pedidos"
+#: templates/debug_toolbar/panels/alerts.html:4
+msgid "Alerts found"
+msgstr ""
+
+#: templates/debug_toolbar/panels/alerts.html:11
+msgid "No alerts found"
+msgstr ""
+
#: templates/debug_toolbar/panels/cache.html:2
msgid "Summary"
msgstr "Resumo"
@@ -357,7 +398,7 @@ msgstr ""
#: templates/debug_toolbar/panels/history.html:10
msgid "Method"
-msgstr ""
+msgstr "Método"
#: templates/debug_toolbar/panels/history.html:11
#: templates/debug_toolbar/panels/staticfiles.html:43
@@ -365,10 +406,8 @@ msgid "Path"
msgstr ""
#: templates/debug_toolbar/panels/history.html:12
-#, fuzzy
-#| msgid "Variable"
msgid "Request Variables"
-msgstr "Variável"
+msgstr ""
#: templates/debug_toolbar/panels/history.html:13
msgid "Status"
@@ -467,6 +506,7 @@ msgid "%(num)s query"
msgid_plural "%(num)s queries"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
#: templates/debug_toolbar/panels/sql.html:8
#, python-format
@@ -558,6 +598,7 @@ msgid "Static file path"
msgid_plural "Static file paths"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
#: templates/debug_toolbar/panels/staticfiles.html:7
#, python-format
@@ -578,12 +619,14 @@ msgid "Static file app"
msgid_plural "Static file apps"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
#: templates/debug_toolbar/panels/staticfiles.html:25
msgid "Static file"
msgid_plural "Static files"
msgstr[0] "Ficheiro estático"
msgstr[1] "Ficheiros estáticos"
+msgstr[2] "Ficheiros estáticos"
#: templates/debug_toolbar/panels/staticfiles.html:39
#, python-format
@@ -591,6 +634,7 @@ msgid "%(payload_count)s file"
msgid_plural "%(payload_count)s files"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
#: templates/debug_toolbar/panels/staticfiles.html:44
msgid "Location"
@@ -605,12 +649,14 @@ msgid "Template path"
msgid_plural "Template paths"
msgstr[0] ""
msgstr[1] "Caminho da Template"
+msgstr[2] "Caminho da Template"
#: templates/debug_toolbar/panels/templates.html:13
msgid "Template"
msgid_plural "Templates"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
#: templates/debug_toolbar/panels/templates.html:22
#: templates/debug_toolbar/panels/templates.html:40
@@ -622,6 +668,7 @@ msgid "Context processor"
msgid_plural "Context processors"
msgstr[0] ""
msgstr[1] "Processador de Contexto"
+msgstr[2] "Processador de Contexto"
#: templates/debug_toolbar/panels/timer.html:2
msgid "Resource usage"
@@ -645,7 +692,7 @@ msgstr ""
#: templates/debug_toolbar/panels/versions.html:10
msgid "Package"
-msgstr ""
+msgstr "Pacote"
#: templates/debug_toolbar/panels/versions.html:11
msgid "Name"
diff --git a/debug_toolbar/locale/pt_BR/LC_MESSAGES/django.mo b/debug_toolbar/locale/pt_BR/LC_MESSAGES/django.mo
index a78c8475e..24c3060e6 100644
Binary files a/debug_toolbar/locale/pt_BR/LC_MESSAGES/django.mo and b/debug_toolbar/locale/pt_BR/LC_MESSAGES/django.mo differ
diff --git a/debug_toolbar/locale/pt_BR/LC_MESSAGES/django.po b/debug_toolbar/locale/pt_BR/LC_MESSAGES/django.po
index a4721e07e..2ec8be420 100644
--- a/debug_toolbar/locale/pt_BR/LC_MESSAGES/django.po
+++ b/debug_toolbar/locale/pt_BR/LC_MESSAGES/django.po
@@ -3,50 +3,76 @@
#
#
# Translators:
-# Fábio , 2013-2014
+# Fábio C. Barrionuevo da Luz , 2013-2014
+# Gladson , 2017
# Percy Pérez-Pinedo, 2009
msgid ""
msgstr ""
"Project-Id-Version: Django Debug Toolbar\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-01-20 17:23+0100\n"
-"PO-Revision-Date: 2014-04-25 19:53+0000\n"
-"Last-Translator: Aymeric Augustin \n"
-"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/"
-"django-debug-toolbar/language/pt_BR/)\n"
-"Language: pt_BR\n"
+"POT-Creation-Date: 2024-08-06 07:12-0500\n"
+"PO-Revision-Date: 2010-11-30 00:00+0000\n"
+"Last-Translator: Gladson , 2017\n"
+"Language-Team: Portuguese (Brazil) (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/pt_BR/)\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"
+"Language: pt_BR\n"
+"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
-#: apps.py:15
+#: apps.py:18
msgid "Debug Toolbar"
+msgstr "Debug Toolbar"
+
+#: panels/alerts.py:67
+#, python-brace-format
+msgid ""
+"Form with id \"{form_id}\" contains file input, but does not have the "
+"attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:70
+msgid ""
+"Form contains file input, but does not have the attribute "
+"enctype=\"multipart/form-data\"."
msgstr ""
-#: panels/cache.py:180
+#: panels/alerts.py:73
+#, python-brace-format
+msgid ""
+"Input element references form with id \"{form_id}\", but the form does not "
+"have the attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:77
+msgid "Alerts"
+msgstr ""
+
+#: panels/cache.py:168
msgid "Cache"
msgstr "Cache"
-#: panels/cache.py:186
+#: panels/cache.py:174
#, python-format
msgid "%(cache_calls)d call in %(time).2fms"
msgid_plural "%(cache_calls)d calls in %(time).2fms"
msgstr[0] "%(cache_calls)d chamada em %(time).2fms"
msgstr[1] "%(cache_calls)d chamadas em %(time).2fms"
+msgstr[2] "%(cache_calls)d chamadas em %(time).2fms"
-#: panels/cache.py:195
+#: panels/cache.py:183
#, python-format
msgid "Cache calls from %(count)d backend"
msgid_plural "Cache calls from %(count)d backends"
msgstr[0] "Chamadas ao cache de %(count)d backend"
msgstr[1] "Chamadas ao cache de %(count)d backends"
+msgstr[2] "Chamadas ao cache de %(count)d backends"
#: panels/headers.py:31
msgid "Headers"
msgstr "Cabeçalhos"
-#: panels/history/panel.py:18 panels/history/panel.py:19
+#: panels/history/panel.py:19 panels/history/panel.py:20
msgid "History"
msgstr ""
@@ -54,7 +80,7 @@ msgstr ""
msgid "Profiling"
msgstr "Profiling"
-#: panels/redirects.py:14
+#: panels/redirects.py:17
msgid "Intercept redirects"
msgstr "Interceptar redirecionamentos"
@@ -62,11 +88,11 @@ msgstr "Interceptar redirecionamentos"
msgid "Request"
msgstr "Requisição"
-#: panels/request.py:36
+#: panels/request.py:38
msgid ""
msgstr ""
-#: panels/request.py:53
+#: panels/request.py:55
msgid ""
msgstr ""
@@ -75,10 +101,9 @@ msgid "Settings"
msgstr "Configurações"
#: panels/settings.py:20
-#, fuzzy, python-format
-#| msgid "Settings from %s
"
+#, python-format
msgid "Settings from %s"
-msgstr "Configurações em: %s
"
+msgstr ""
#: panels/signals.py:57
#, python-format
@@ -86,6 +111,7 @@ msgid "%(num_receivers)d receiver of 1 signal"
msgid_plural "%(num_receivers)d receivers of 1 signal"
msgstr[0] "%(num_receivers)d receptor de 1 sinal"
msgstr[1] "%(num_receivers)d receptores de 1 sinal"
+msgstr[2] "%(num_receivers)d receptores de 1 sinal"
#: panels/signals.py:62
#, python-format
@@ -93,159 +119,160 @@ msgid "%(num_receivers)d receiver of %(num_signals)d signals"
msgid_plural "%(num_receivers)d receivers of %(num_signals)d signals"
msgstr[0] "%(num_receivers)d receptor de %(num_signals)d sinais"
msgstr[1] "%(num_receivers)d receptores de %(num_signals)d sinais"
+msgstr[2] "%(num_receivers)d receptores de %(num_signals)d sinais"
#: panels/signals.py:67
msgid "Signals"
msgstr "Sinais"
-#: panels/sql/panel.py:23
-msgid "Autocommit"
-msgstr "Autocommit"
-
-#: panels/sql/panel.py:24
+#: panels/sql/panel.py:30 panels/sql/panel.py:41
msgid "Read uncommitted"
msgstr "Read uncommitted"
-#: panels/sql/panel.py:25
+#: panels/sql/panel.py:31 panels/sql/panel.py:43
msgid "Read committed"
msgstr "Read committed"
-#: panels/sql/panel.py:26
+#: panels/sql/panel.py:32 panels/sql/panel.py:45
msgid "Repeatable read"
msgstr "Leitura repetida"
-#: panels/sql/panel.py:27
+#: panels/sql/panel.py:33 panels/sql/panel.py:47
msgid "Serializable"
msgstr "Variável"
#: panels/sql/panel.py:39
+msgid "Autocommit"
+msgstr "Autocommit"
+
+#: panels/sql/panel.py:61 panels/sql/panel.py:71
msgid "Idle"
msgstr "Ocioso"
-#: panels/sql/panel.py:40
+#: panels/sql/panel.py:62 panels/sql/panel.py:72
msgid "Active"
msgstr "Ação"
-#: panels/sql/panel.py:41
+#: panels/sql/panel.py:63 panels/sql/panel.py:73
msgid "In transaction"
msgstr "Na transação"
-#: panels/sql/panel.py:42
+#: panels/sql/panel.py:64 panels/sql/panel.py:74
msgid "In error"
msgstr "Erro"
-#: panels/sql/panel.py:43
+#: panels/sql/panel.py:65 panels/sql/panel.py:75
msgid "Unknown"
msgstr "Desconhecido"
-#: panels/sql/panel.py:130
+#: panels/sql/panel.py:162
msgid "SQL"
msgstr "SQL"
-#: panels/sql/panel.py:135
-#, fuzzy, python-format
-#| msgid "%(cache_calls)d call in %(time).2fms"
-#| msgid_plural "%(cache_calls)d calls in %(time).2fms"
+#: panels/sql/panel.py:168
+#, python-format
msgid "%(query_count)d query in %(sql_time).2fms"
msgid_plural "%(query_count)d queries in %(sql_time).2fms"
-msgstr[0] "%(cache_calls)d chamada em %(time).2fms"
-msgstr[1] "%(cache_calls)d chamadas em %(time).2fms"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
-#: panels/sql/panel.py:147
+#: panels/sql/panel.py:180
#, python-format
msgid "SQL queries from %(count)d connection"
msgid_plural "SQL queries from %(count)d connections"
msgstr[0] ""
msgstr[1] ""
+msgstr[2] ""
-#: panels/staticfiles.py:84
+#: panels/staticfiles.py:82
#, python-format
msgid "Static files (%(num_found)s found, %(num_used)s used)"
-msgstr ""
-"Arquivos estáticos (%(num_found)s encontrados, %(num_used)s sendo utilizados)"
+msgstr "Arquivos estáticos (%(num_found)s encontrados, %(num_used)s sendo utilizados)"
-#: panels/staticfiles.py:105
+#: panels/staticfiles.py:103
msgid "Static files"
msgstr "Arquivos estáticos"
-#: panels/staticfiles.py:111
+#: panels/staticfiles.py:109
#, python-format
msgid "%(num_used)s file used"
msgid_plural "%(num_used)s files used"
msgstr[0] "%(num_used)s arquivo utilizado"
msgstr[1] "%(num_used)s arquivos utilizados"
+msgstr[2] "%(num_used)s arquivos utilizados"
-#: panels/templates/panel.py:143
+#: panels/templates/panel.py:101
msgid "Templates"
msgstr "Templates"
-#: panels/templates/panel.py:148
+#: panels/templates/panel.py:106
#, python-format
msgid "Templates (%(num_templates)s rendered)"
msgstr "Templates (%(num_templates)s renderizados)"
-#: panels/templates/panel.py:180
+#: panels/templates/panel.py:195
msgid "No origin"
-msgstr ""
+msgstr "Sem origem"
-#: panels/timer.py:25
+#: panels/timer.py:27
#, python-format
msgid "CPU: %(cum)0.2fms (%(total)0.2fms)"
msgstr "CPU: %(cum)0.2fms (%(total)0.2fms)"
-#: panels/timer.py:30
+#: panels/timer.py:32
#, python-format
msgid "Total: %0.2fms"
msgstr "Total: %0.2fms"
-#: panels/timer.py:36 templates/debug_toolbar/panels/history.html:9
+#: panels/timer.py:38 templates/debug_toolbar/panels/history.html:9
#: templates/debug_toolbar/panels/sql_explain.html:11
#: templates/debug_toolbar/panels/sql_profile.html:12
#: templates/debug_toolbar/panels/sql_select.html:11
msgid "Time"
msgstr "Tempo"
-#: panels/timer.py:44
+#: panels/timer.py:46
msgid "User CPU time"
msgstr "Tempo de CPU do usuário"
-#: panels/timer.py:44
+#: panels/timer.py:46
#, python-format
msgid "%(utime)0.3f msec"
msgstr "%(utime)0.3f ms"
-#: panels/timer.py:45
+#: panels/timer.py:47
msgid "System CPU time"
msgstr "Tempo de CPU do sistema"
-#: panels/timer.py:45
+#: panels/timer.py:47
#, python-format
msgid "%(stime)0.3f msec"
msgstr "%(stime)0.3f ms"
-#: panels/timer.py:46
+#: panels/timer.py:48
msgid "Total CPU time"
msgstr "Tempo total de CPU"
-#: panels/timer.py:46
+#: panels/timer.py:48
#, python-format
msgid "%(total)0.3f msec"
msgstr "%(total)0.3f ms"
-#: panels/timer.py:47
+#: panels/timer.py:49
msgid "Elapsed time"
msgstr "Tempo decorrido"
-#: panels/timer.py:47
+#: panels/timer.py:49
#, python-format
msgid "%(total_time)0.3f msec"
msgstr "%(total_time)0.3f ms"
-#: panels/timer.py:49
+#: panels/timer.py:51
msgid "Context switches"
msgstr "Mudanças de contexto"
-#: panels/timer.py:50
+#: panels/timer.py:52
#, python-format
msgid "%(vcsw)d voluntary, %(ivcsw)d involuntary"
msgstr "%(vcsw)d voluntário, %(ivcsw)d involuntário"
@@ -254,15 +281,19 @@ msgstr "%(vcsw)d voluntário, %(ivcsw)d involuntário"
msgid "Versions"
msgstr "Versões"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide toolbar"
msgstr "Ocultar barra de ferramentas"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide"
msgstr "Esconder"
-#: templates/debug_toolbar/base.html:29
+#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26
+msgid "Toggle Theme"
+msgstr ""
+
+#: templates/debug_toolbar/base.html:35
msgid "Show toolbar"
msgstr "Mostrar barra de ferramentas"
@@ -274,6 +305,14 @@ msgstr "Desativar para próximas requisições"
msgid "Enable for next and successive requests"
msgstr "Habilitar para próximas requisições"
+#: templates/debug_toolbar/panels/alerts.html:4
+msgid "Alerts found"
+msgstr ""
+
+#: templates/debug_toolbar/panels/alerts.html:11
+msgid "No alerts found"
+msgstr ""
+
#: templates/debug_toolbar/panels/cache.html:2
msgid "Summary"
msgstr "Resumo"
@@ -357,9 +396,7 @@ msgstr "Ambiente WSGI"
msgid ""
"Since the WSGI environ inherits the environment of the server, only a "
"significant subset is shown below."
-msgstr ""
-"Uma vez que o ambiente WSGI herda o ambiente do servidor, apenas um "
-"subconjunto significativo é mostrado abaixo."
+msgstr "Uma vez que o ambiente WSGI herda o ambiente do servidor, apenas um subconjunto significativo é mostrado abaixo."
#: templates/debug_toolbar/panels/history.html:10
msgid "Method"
@@ -371,10 +408,8 @@ msgid "Path"
msgstr "Caminho"
#: templates/debug_toolbar/panels/history.html:12
-#, fuzzy
-#| msgid "Request headers"
msgid "Request Variables"
-msgstr "Cabeçalhos de Requisição"
+msgstr ""
#: templates/debug_toolbar/panels/history.html:13
msgid "Status"
@@ -473,6 +508,7 @@ msgid "%(num)s query"
msgid_plural "%(num)s queries"
msgstr[0] "%(num)s consulta"
msgstr[1] "%(num)s consultas"
+msgstr[2] "%(num)s consultas"
#: templates/debug_toolbar/panels/sql.html:8
#, python-format
@@ -498,11 +534,9 @@ msgid "Timeline"
msgstr "Linha do tempo"
#: templates/debug_toolbar/panels/sql.html:52
-#, fuzzy, python-format
-#| msgid "%(count)s message"
-#| msgid_plural "%(count)s messages"
+#, python-format
msgid "%(count)s similar queries."
-msgstr "%(count)s mensagem"
+msgstr ""
#: templates/debug_toolbar/panels/sql.html:58
#, python-format
@@ -566,6 +600,7 @@ msgid "Static file path"
msgid_plural "Static file paths"
msgstr[0] "Caminho do arquivo estático"
msgstr[1] "Caminho dos arquivos estáticos"
+msgstr[2] "Caminho dos arquivos estáticos"
#: templates/debug_toolbar/panels/staticfiles.html:7
#, python-format
@@ -586,12 +621,14 @@ msgid "Static file app"
msgid_plural "Static file apps"
msgstr[0] "Arquivo estático de app"
msgstr[1] "Arquivos estáticos de apps"
+msgstr[2] "Arquivos estáticos de apps"
#: templates/debug_toolbar/panels/staticfiles.html:25
msgid "Static file"
msgid_plural "Static files"
msgstr[0] "Arquivo estático"
msgstr[1] "Arquivos estáticos"
+msgstr[2] "Arquivos estáticos"
#: templates/debug_toolbar/panels/staticfiles.html:39
#, python-format
@@ -599,6 +636,7 @@ msgid "%(payload_count)s file"
msgid_plural "%(payload_count)s files"
msgstr[0] "%(payload_count)s arquivo"
msgstr[1] "%(payload_count)s arquivos"
+msgstr[2] "%(payload_count)s arquivos"
#: templates/debug_toolbar/panels/staticfiles.html:44
msgid "Location"
@@ -613,12 +651,14 @@ msgid "Template path"
msgid_plural "Template paths"
msgstr[0] "Caminho do Template"
msgstr[1] "Caminho do Templates"
+msgstr[2] "Caminho do Templates"
#: templates/debug_toolbar/panels/templates.html:13
msgid "Template"
msgid_plural "Templates"
msgstr[0] "Template"
msgstr[1] "Templates"
+msgstr[2] "Templates"
#: templates/debug_toolbar/panels/templates.html:22
#: templates/debug_toolbar/panels/templates.html:40
@@ -630,6 +670,7 @@ msgid "Context processor"
msgid_plural "Context processors"
msgstr[0] ""
msgstr[1] "Processador do Contexto"
+msgstr[2] "Processador do Contexto"
#: templates/debug_toolbar/panels/timer.html:2
msgid "Resource usage"
@@ -653,7 +694,7 @@ msgstr "Milissegundos desde início de navegação (+length)"
#: templates/debug_toolbar/panels/versions.html:10
msgid "Package"
-msgstr ""
+msgstr "Pacote"
#: templates/debug_toolbar/panels/versions.html:11
msgid "Name"
@@ -672,15 +713,10 @@ msgid ""
"The Django Debug Toolbar has intercepted a redirect to the above URL for "
"debug viewing purposes. You can click the above link to continue with the "
"redirect as normal."
-msgstr ""
-"O Django Debug Toolbar interceptou um redirecionamento para a URL acima para "
-"fins de visualização de depuração. Você pode clicar no link acima para "
-"continuar com o redirecionamento normalmente."
+msgstr "O Django Debug Toolbar interceptou um redirecionamento para a URL acima para fins de visualização de depuração. Você pode clicar no link acima para continuar com o redirecionamento normalmente."
#: views.py:16
msgid ""
"Data for this panel isn't available anymore. Please reload the page and "
"retry."
-msgstr ""
-"Os dados para este painel não está mais disponível. Por favor, recarregue a "
-"página e tente novamente."
+msgstr "Os dados para este painel não está mais disponível. Por favor, recarregue a página e tente novamente."
diff --git a/debug_toolbar/locale/ru/LC_MESSAGES/django.mo b/debug_toolbar/locale/ru/LC_MESSAGES/django.mo
index 2e69a35ae..b388ed98d 100644
Binary files a/debug_toolbar/locale/ru/LC_MESSAGES/django.mo and b/debug_toolbar/locale/ru/LC_MESSAGES/django.mo differ
diff --git a/debug_toolbar/locale/ru/LC_MESSAGES/django.po b/debug_toolbar/locale/ru/LC_MESSAGES/django.po
index fbec67100..28cc6b947 100644
--- a/debug_toolbar/locale/ru/LC_MESSAGES/django.po
+++ b/debug_toolbar/locale/ru/LC_MESSAGES/django.po
@@ -3,36 +3,58 @@
#
#
# Translators:
+# Andrei Satsevich, 2025
# Dmitri Bogomolov <4glitch@gmail.com>, 2014
# Ilya Baryshev , 2013
# Mikhail Korobov, 2009
-# Алексей Борискин , 2013,2015
+# Алексей Борискин , 2013,2015,2024
msgid ""
msgstr ""
"Project-Id-Version: Django Debug Toolbar\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-01-20 17:23+0100\n"
-"PO-Revision-Date: 2021-08-14 15:25+0000\n"
-"Last-Translator: Tim Schilling\n"
-"Language-Team: Russian (http://www.transifex.com/django-debug-toolbar/django-"
-"debug-toolbar/language/ru/)\n"
-"Language: ru\n"
+"POT-Creation-Date: 2024-08-06 07:12-0500\n"
+"PO-Revision-Date: 2010-11-30 00:00+0000\n"
+"Last-Translator: Andrei Satsevich, 2025\n"
+"Language-Team: Russian (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/ru/)\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%10==1 && n%100!=11 ? 0 : n%10>=2 && "
-"n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || "
-"(n%100>=11 && n%100<=14)? 2 : 3);\n"
+"Language: ru\n"
+"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
-#: apps.py:15
+#: apps.py:18
msgid "Debug Toolbar"
msgstr "Панель отладки"
-#: panels/cache.py:180
+#: panels/alerts.py:67
+#, python-brace-format
+msgid ""
+"Form with id \"{form_id}\" contains file input, but does not have the "
+"attribute enctype=\"multipart/form-data\"."
+msgstr "Форма с идентификатором \"{form_id}\" содержит файл, но не имеет атрибута enctype=\"multipart/form-data\"."
+
+#: panels/alerts.py:70
+msgid ""
+"Form contains file input, but does not have the attribute "
+"enctype=\"multipart/form-data\"."
+msgstr "Форма содержит файл, но не имеет атрибута enctype=\"multipart/form-data\"."
+
+#: panels/alerts.py:73
+#, python-brace-format
+msgid ""
+"Input element references form with id \"{form_id}\", but the form does not "
+"have the attribute enctype=\"multipart/form-data\"."
+msgstr "Элемент ввода ссылается на форму с id \"{form_id}\", но форма не имеет атрибута enctype=\"multipart/form-data\"."
+
+#: panels/alerts.py:77
+msgid "Alerts"
+msgstr "Оповещения"
+
+#: panels/cache.py:168
msgid "Cache"
msgstr "Кэш"
-#: panels/cache.py:186
+#: panels/cache.py:174
#, python-format
msgid "%(cache_calls)d call in %(time).2fms"
msgid_plural "%(cache_calls)d calls in %(time).2fms"
@@ -41,7 +63,7 @@ msgstr[1] "%(cache_calls)d обращения за %(time).2fms"
msgstr[2] "%(cache_calls)d обращений за %(time).2fms"
msgstr[3] "%(cache_calls)d обращений за %(time).2fms"
-#: panels/cache.py:195
+#: panels/cache.py:183
#, python-format
msgid "Cache calls from %(count)d backend"
msgid_plural "Cache calls from %(count)d backends"
@@ -54,15 +76,15 @@ msgstr[3] "Обращения к кэшу от %(count)d бэкендов"
msgid "Headers"
msgstr "Заголовки"
-#: panels/history/panel.py:18 panels/history/panel.py:19
+#: panels/history/panel.py:19 panels/history/panel.py:20
msgid "History"
-msgstr ""
+msgstr "История"
#: panels/profiling.py:140
msgid "Profiling"
msgstr "Профилирование"
-#: panels/redirects.py:14
+#: panels/redirects.py:17
msgid "Intercept redirects"
msgstr "Перехват редиректов"
@@ -70,11 +92,11 @@ msgstr "Перехват редиректов"
msgid "Request"
msgstr "Запрос"
-#: panels/request.py:36
+#: panels/request.py:38
msgid ""
msgstr "<нет view>"
-#: panels/request.py:53
+#: panels/request.py:55
msgid ""
msgstr "<недоступно>"
@@ -85,7 +107,7 @@ msgstr "Настройки"
#: panels/settings.py:20
#, python-format
msgid "Settings from %s"
-msgstr ""
+msgstr "Настройки из %s"
#: panels/signals.py:57
#, python-format
@@ -109,78 +131,78 @@ msgstr[3] "%(num_receivers)d получателей %(num_signals)d сигнал
msgid "Signals"
msgstr "Сигналы"
-#: panels/sql/panel.py:23
-msgid "Autocommit"
-msgstr "Autocommit"
-
-#: panels/sql/panel.py:24
+#: panels/sql/panel.py:30 panels/sql/panel.py:41
msgid "Read uncommitted"
msgstr "Read uncommitted"
-#: panels/sql/panel.py:25
+#: panels/sql/panel.py:31 panels/sql/panel.py:43
msgid "Read committed"
msgstr "Read committed"
-#: panels/sql/panel.py:26
+#: panels/sql/panel.py:32 panels/sql/panel.py:45
msgid "Repeatable read"
msgstr "Repeatable read"
-#: panels/sql/panel.py:27
+#: panels/sql/panel.py:33 panels/sql/panel.py:47
msgid "Serializable"
msgstr "Serializable"
#: panels/sql/panel.py:39
+msgid "Autocommit"
+msgstr "Autocommit"
+
+#: panels/sql/panel.py:61 panels/sql/panel.py:71
msgid "Idle"
msgstr "Ожидание"
-#: panels/sql/panel.py:40
+#: panels/sql/panel.py:62 panels/sql/panel.py:72
msgid "Active"
msgstr "Действие"
-#: panels/sql/panel.py:41
+#: panels/sql/panel.py:63 panels/sql/panel.py:73
msgid "In transaction"
msgstr "В транзакции"
-#: panels/sql/panel.py:42
+#: panels/sql/panel.py:64 panels/sql/panel.py:74
msgid "In error"
msgstr "Ошибка"
-#: panels/sql/panel.py:43
+#: panels/sql/panel.py:65 panels/sql/panel.py:75
msgid "Unknown"
msgstr "Неизвестно"
-#: panels/sql/panel.py:130
+#: panels/sql/panel.py:162
msgid "SQL"
msgstr "SQL"
-#: panels/sql/panel.py:135
+#: panels/sql/panel.py:168
#, python-format
msgid "%(query_count)d query in %(sql_time).2fms"
msgid_plural "%(query_count)d queries in %(sql_time).2fms"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%(query_count)d запрос за %(sql_time).2f мс "
+msgstr[1] "%(query_count)d запросов за %(sql_time).2f мс"
+msgstr[2] "%(query_count)d запросов за %(sql_time).2f мс"
+msgstr[3] "%(query_count)d запросов за %(sql_time).2f мс"
-#: panels/sql/panel.py:147
+#: panels/sql/panel.py:180
#, python-format
msgid "SQL queries from %(count)d connection"
msgid_plural "SQL queries from %(count)d connections"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "SQL-запросы из %(count)d соединения"
+msgstr[1] "SQL-запросы из %(count)d соединений"
+msgstr[2] "SQL-запросы из %(count)d соединений"
+msgstr[3] "SQL-запросы из %(count)d соединений"
-#: panels/staticfiles.py:84
+#: panels/staticfiles.py:82
#, python-format
msgid "Static files (%(num_found)s found, %(num_used)s used)"
msgstr "Статические файлы (найдено %(num_found)s, используется %(num_used)s)"
-#: panels/staticfiles.py:105
+#: panels/staticfiles.py:103
msgid "Static files"
msgstr "Статические файлы"
-#: panels/staticfiles.py:111
+#: panels/staticfiles.py:109
#, python-format
msgid "%(num_used)s file used"
msgid_plural "%(num_used)s files used"
@@ -189,77 +211,77 @@ msgstr[1] " %(num_used)s файла используется"
msgstr[2] "%(num_used)s файлов используется"
msgstr[3] "%(num_used)s файлов используется"
-#: panels/templates/panel.py:143
+#: panels/templates/panel.py:101
msgid "Templates"
msgstr "Шаблоны"
-#: panels/templates/panel.py:148
+#: panels/templates/panel.py:106
#, python-format
msgid "Templates (%(num_templates)s rendered)"
msgstr "Шаблоны (обработано %(num_templates)s)"
-#: panels/templates/panel.py:180
+#: panels/templates/panel.py:195
msgid "No origin"
-msgstr ""
+msgstr "Без происхождения"
-#: panels/timer.py:25
+#: panels/timer.py:27
#, python-format
msgid "CPU: %(cum)0.2fms (%(total)0.2fms)"
msgstr "CPU: %(cum)0.2fms (%(total)0.2fms)"
-#: panels/timer.py:30
+#: panels/timer.py:32
#, python-format
msgid "Total: %0.2fms"
msgstr "Итого: %0.2fms"
-#: panels/timer.py:36 templates/debug_toolbar/panels/history.html:9
+#: panels/timer.py:38 templates/debug_toolbar/panels/history.html:9
#: templates/debug_toolbar/panels/sql_explain.html:11
#: templates/debug_toolbar/panels/sql_profile.html:12
#: templates/debug_toolbar/panels/sql_select.html:11
msgid "Time"
msgstr "Время"
-#: panels/timer.py:44
+#: panels/timer.py:46
msgid "User CPU time"
msgstr "User CPU time"
-#: panels/timer.py:44
+#: panels/timer.py:46
#, python-format
msgid "%(utime)0.3f msec"
msgstr "%(utime)0.3f мс"
-#: panels/timer.py:45
+#: panels/timer.py:47
msgid "System CPU time"
msgstr "System CPU time"
-#: panels/timer.py:45
+#: panels/timer.py:47
#, python-format
msgid "%(stime)0.3f msec"
msgstr "%(stime)0.3f мс"
-#: panels/timer.py:46
+#: panels/timer.py:48
msgid "Total CPU time"
msgstr "Total CPU time"
-#: panels/timer.py:46
+#: panels/timer.py:48
#, python-format
msgid "%(total)0.3f msec"
msgstr "%(total)0.3f мс"
-#: panels/timer.py:47
+#: panels/timer.py:49
msgid "Elapsed time"
msgstr "Затраченное время"
-#: panels/timer.py:47
+#: panels/timer.py:49
#, python-format
msgid "%(total_time)0.3f msec"
msgstr "%(total_time)0.3f мс"
-#: panels/timer.py:49
+#: panels/timer.py:51
msgid "Context switches"
msgstr "Переключений контекста"
-#: panels/timer.py:50
+#: panels/timer.py:52
#, python-format
msgid "%(vcsw)d voluntary, %(ivcsw)d involuntary"
msgstr "%(vcsw)d намеренных, %(ivcsw)d вынужденных"
@@ -268,15 +290,19 @@ msgstr "%(vcsw)d намеренных, %(ivcsw)d вынужденных"
msgid "Versions"
msgstr "Версии"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide toolbar"
msgstr "Скрыть панель"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide"
msgstr "Скрыть"
-#: templates/debug_toolbar/base.html:29
+#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26
+msgid "Toggle Theme"
+msgstr "Переключатель темы"
+
+#: templates/debug_toolbar/base.html:35
msgid "Show toolbar"
msgstr "Показать панель"
@@ -288,6 +314,14 @@ msgstr "Отключить для последующих запросов"
msgid "Enable for next and successive requests"
msgstr "Включить для последующих запросов"
+#: templates/debug_toolbar/panels/alerts.html:4
+msgid "Alerts found"
+msgstr "Найдены оповещения"
+
+#: templates/debug_toolbar/panels/alerts.html:11
+msgid "No alerts found"
+msgstr "Оповещения не найдены"
+
#: templates/debug_toolbar/panels/cache.html:2
msgid "Summary"
msgstr "Сводка"
@@ -371,9 +405,7 @@ msgstr "WSGI-окружение"
msgid ""
"Since the WSGI environ inherits the environment of the server, only a "
"significant subset is shown below."
-msgstr ""
-"Так как WSGI-окружение наследует окружение сервера, ниже отображены лишь те "
-"из переменных, которые важны для нужд отладки."
+msgstr "Так как WSGI-окружение наследует окружение сервера, ниже отображены лишь те из переменных, которые важны для нужд отладки."
#: templates/debug_toolbar/panels/history.html:10
msgid "Method"
@@ -386,11 +418,11 @@ msgstr "Путь"
#: templates/debug_toolbar/panels/history.html:12
msgid "Request Variables"
-msgstr ""
+msgstr "Запрос переменных"
#: templates/debug_toolbar/panels/history.html:13
msgid "Status"
-msgstr ""
+msgstr "Статус"
#: templates/debug_toolbar/panels/history.html:14
#: templates/debug_toolbar/panels/sql.html:37
@@ -493,14 +525,14 @@ msgstr[3] "%(num)s запросов"
msgid ""
"including %(count)s similar "
-msgstr ""
+msgstr "включая %(count)s похожий "
#: templates/debug_toolbar/panels/sql.html:12
#, python-format
msgid ""
"and %(dupes)s duplicates "
-msgstr ""
+msgstr "и %(dupes)s дубликаты "
#: templates/debug_toolbar/panels/sql.html:34
msgid "Query"
@@ -514,12 +546,12 @@ msgstr "Временная диаграмма"
#: templates/debug_toolbar/panels/sql.html:52
#, python-format
msgid "%(count)s similar queries."
-msgstr ""
+msgstr "%(count)s похожих запросов."
#: templates/debug_toolbar/panels/sql.html:58
#, python-format
msgid "Duplicated %(dupes)s times."
-msgstr ""
+msgstr "Дублируется %(dupes)s раз."
#: templates/debug_toolbar/panels/sql.html:95
msgid "Connection:"
@@ -539,8 +571,7 @@ msgstr "(неизвестно)"
#: templates/debug_toolbar/panels/sql.html:123
msgid "No SQL queries were recorded during this request."
-msgstr ""
-"Во время обработки этого HTTP-запроса не было записано ни одного SQL-запроса."
+msgstr "Во время обработки этого HTTP-запроса не было записано ни одного SQL-запроса."
#: templates/debug_toolbar/panels/sql_explain.html:4
msgid "SQL explained"
@@ -680,7 +711,7 @@ msgstr "С начала навигации в мс (+продолжительн
#: templates/debug_toolbar/panels/versions.html:10
msgid "Package"
-msgstr ""
+msgstr "Пакет"
#: templates/debug_toolbar/panels/versions.html:11
msgid "Name"
@@ -699,14 +730,10 @@ msgid ""
"The Django Debug Toolbar has intercepted a redirect to the above URL for "
"debug viewing purposes. You can click the above link to continue with the "
"redirect as normal."
-msgstr ""
-"Django Debug Toolbar в перехватил редирект на адрес, указанный выше. Вы "
-"можете нажать на ссылку, чтобы выполнить переход самостоятельно."
+msgstr "Django Debug Toolbar в перехватил редирект на адрес, указанный выше. Вы можете нажать на ссылку, чтобы выполнить переход самостоятельно."
#: views.py:16
msgid ""
"Data for this panel isn't available anymore. Please reload the page and "
"retry."
-msgstr ""
-"Данные этой панели больше недоступны. Пожалуйста, перезагрузите страницу и "
-"попробуйте ещё раз."
+msgstr "Данные этой панели больше недоступны. Пожалуйста, перезагрузите страницу и попробуйте ещё раз."
diff --git a/debug_toolbar/locale/sk/LC_MESSAGES/django.mo b/debug_toolbar/locale/sk/LC_MESSAGES/django.mo
index e6af7c505..52934bf7a 100644
Binary files a/debug_toolbar/locale/sk/LC_MESSAGES/django.mo and b/debug_toolbar/locale/sk/LC_MESSAGES/django.mo differ
diff --git a/debug_toolbar/locale/sk/LC_MESSAGES/django.po b/debug_toolbar/locale/sk/LC_MESSAGES/django.po
index 52c8ef386..d5c5b722b 100644
--- a/debug_toolbar/locale/sk/LC_MESSAGES/django.po
+++ b/debug_toolbar/locale/sk/LC_MESSAGES/django.po
@@ -3,57 +3,78 @@
#
#
# Translators:
-# Juraj Bubniak , 2012
-# Juraj Bubniak , 2013
+# 18f25ad6fa9930fc67cb11aca9d16a27, 2012
+# 18f25ad6fa9930fc67cb11aca9d16a27, 2013
# Rastislav Kober , 2012
msgid ""
msgstr ""
"Project-Id-Version: Django Debug Toolbar\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-01-20 17:23+0100\n"
-"PO-Revision-Date: 2021-06-24 13:37+0200\n"
-"Last-Translator: Aymeric Augustin \n"
-"Language-Team: Slovak (http://www.transifex.com/projects/p/django-debug-"
-"toolbar/language/sk/)\n"
-"Language: sk\n"
+"POT-Creation-Date: 2024-08-06 07:12-0500\n"
+"PO-Revision-Date: 2010-11-30 00:00+0000\n"
+"Last-Translator: 18f25ad6fa9930fc67cb11aca9d16a27, 2013\n"
+"Language-Team: Slovak (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/sk/)\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 % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n "
-">= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n"
-"X-Generator: Poedit 2.4.2\n"
+"Language: sk\n"
+"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n"
-#: apps.py:15
+#: apps.py:18
msgid "Debug Toolbar"
-msgstr "Debug Toolbar"
+msgstr ""
+
+#: panels/alerts.py:67
+#, python-brace-format
+msgid ""
+"Form with id \"{form_id}\" contains file input, but does not have the "
+"attribute enctype=\"multipart/form-data\"."
+msgstr ""
-#: panels/cache.py:180
+#: panels/alerts.py:70
+msgid ""
+"Form contains file input, but does not have the attribute "
+"enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:73
+#, python-brace-format
+msgid ""
+"Input element references form with id \"{form_id}\", but the form does not "
+"have the attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:77
+msgid "Alerts"
+msgstr ""
+
+#: panels/cache.py:168
msgid "Cache"
msgstr "Cache"
-#: panels/cache.py:186
+#: panels/cache.py:174
#, python-format
msgid "%(cache_calls)d call in %(time).2fms"
msgid_plural "%(cache_calls)d calls in %(time).2fms"
msgstr[0] "%(cache_calls)d volanie za %(time).2fms"
-msgstr[1] "%(cache_calls)d volania za %(time).2fms"
+msgstr[1] "%(cache_calls)d volaní za %(time).2fms"
msgstr[2] "%(cache_calls)d volaní za %(time).2fms"
msgstr[3] "%(cache_calls)d volaní za %(time).2fms"
-#: panels/cache.py:195
+#: panels/cache.py:183
#, python-format
msgid "Cache calls from %(count)d backend"
msgid_plural "Cache calls from %(count)d backends"
msgstr[0] "Cache volania z %(count)d backendu"
msgstr[1] "Cache volania z %(count)d backendov"
-msgstr[2] "Cache volania z %(count)d backendu"
+msgstr[2] "Cache volania z %(count)d backendov"
msgstr[3] "Cache volania z %(count)d backendov"
#: panels/headers.py:31
msgid "Headers"
msgstr "Hlavičky"
-#: panels/history/panel.py:18 panels/history/panel.py:19
+#: panels/history/panel.py:19 panels/history/panel.py:20
msgid "History"
msgstr ""
@@ -61,7 +82,7 @@ msgstr ""
msgid "Profiling"
msgstr "Analýza"
-#: panels/redirects.py:14
+#: panels/redirects.py:17
msgid "Intercept redirects"
msgstr "Zachytiť presmerovania"
@@ -69,11 +90,11 @@ msgstr "Zachytiť presmerovania"
msgid "Request"
msgstr "Požiadavka"
-#: panels/request.py:36
+#: panels/request.py:38
msgid ""
msgstr ""
-#: panels/request.py:53
+#: panels/request.py:55
msgid ""
msgstr ""
@@ -82,17 +103,16 @@ msgid "Settings"
msgstr "Nastavenia"
#: panels/settings.py:20
-#, fuzzy, python-format
-#| msgid "Settings from %s
"
+#, python-format
msgid "Settings from %s"
-msgstr "Nastavenia z %s
"
+msgstr ""
#: panels/signals.py:57
#, python-format
msgid "%(num_receivers)d receiver of 1 signal"
msgid_plural "%(num_receivers)d receivers of 1 signal"
msgstr[0] "%(num_receivers)d príjemca 1 signálu"
-msgstr[1] "%(num_receivers)d príjemcovia 1 signálu"
+msgstr[1] "%(num_receivers)d príjemcov 1 signálu"
msgstr[2] "%(num_receivers)d príjemcov 1 signálu"
msgstr[3] "%(num_receivers)d príjemcov 1 signálu"
@@ -100,71 +120,69 @@ msgstr[3] "%(num_receivers)d príjemcov 1 signálu"
#, python-format
msgid "%(num_receivers)d receiver of %(num_signals)d signals"
msgid_plural "%(num_receivers)d receivers of %(num_signals)d signals"
-msgstr[0] "%(num_receivers)d príjemca %(num_signals)d signálu"
+msgstr[0] "%(num_receivers)d príjemca %(num_signals)d signálov"
msgstr[1] "%(num_receivers)d príjemcov %(num_signals)d signálov"
-msgstr[2] "%(num_receivers)d príjemcu %(num_signals)d signálu"
+msgstr[2] "%(num_receivers)d príjemcov %(num_signals)d signálov"
msgstr[3] "%(num_receivers)d príjemcov %(num_signals)d signálov"
#: panels/signals.py:67
msgid "Signals"
msgstr "Signály"
-#: panels/sql/panel.py:23
-msgid "Autocommit"
-msgstr "Autocommit"
-
-#: panels/sql/panel.py:24
+#: panels/sql/panel.py:30 panels/sql/panel.py:41
msgid "Read uncommitted"
msgstr "Read uncommitted"
-#: panels/sql/panel.py:25
+#: panels/sql/panel.py:31 panels/sql/panel.py:43
msgid "Read committed"
msgstr "Read committed"
-#: panels/sql/panel.py:26
+#: panels/sql/panel.py:32 panels/sql/panel.py:45
msgid "Repeatable read"
msgstr "Opakovateľné čítanie"
-#: panels/sql/panel.py:27
+#: panels/sql/panel.py:33 panels/sql/panel.py:47
msgid "Serializable"
msgstr "Premenná"
#: panels/sql/panel.py:39
+msgid "Autocommit"
+msgstr "Autocommit"
+
+#: panels/sql/panel.py:61 panels/sql/panel.py:71
msgid "Idle"
msgstr "Nečinný"
-#: panels/sql/panel.py:40
+#: panels/sql/panel.py:62 panels/sql/panel.py:72
msgid "Active"
-msgstr "Aktívne"
+msgstr "Akcia"
-#: panels/sql/panel.py:41
+#: panels/sql/panel.py:63 panels/sql/panel.py:73
msgid "In transaction"
-msgstr "V transakcii"
+msgstr "Stav transakcie:"
-#: panels/sql/panel.py:42
+#: panels/sql/panel.py:64 panels/sql/panel.py:74
msgid "In error"
msgstr "Chyba"
-#: panels/sql/panel.py:43
+#: panels/sql/panel.py:65 panels/sql/panel.py:75
msgid "Unknown"
msgstr "(neznámy)"
-#: panels/sql/panel.py:130
+#: panels/sql/panel.py:162
msgid "SQL"
msgstr "SQL"
-#: panels/sql/panel.py:135
-#, fuzzy, python-format
-#| msgid "%(cache_calls)d call in %(time).2fms"
-#| msgid_plural "%(cache_calls)d calls in %(time).2fms"
+#: panels/sql/panel.py:168
+#, python-format
msgid "%(query_count)d query in %(sql_time).2fms"
msgid_plural "%(query_count)d queries in %(sql_time).2fms"
-msgstr[0] "%(cache_calls)d volanie za %(time).2fms"
-msgstr[1] "%(cache_calls)d volania za %(time).2fms"
-msgstr[2] "%(cache_calls)d volaní za %(time).2fms"
-msgstr[3] "%(cache_calls)d volaní za %(time).2fms"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
-#: panels/sql/panel.py:147
+#: panels/sql/panel.py:180
#, python-format
msgid "SQL queries from %(count)d connection"
msgid_plural "SQL queries from %(count)d connections"
@@ -173,95 +191,95 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: panels/staticfiles.py:84
+#: panels/staticfiles.py:82
#, python-format
msgid "Static files (%(num_found)s found, %(num_used)s used)"
msgstr "Statické súbory (%(num_found)s nájdených, %(num_used)s použitých)"
-#: panels/staticfiles.py:105
+#: panels/staticfiles.py:103
msgid "Static files"
msgstr "Statické súbory"
-#: panels/staticfiles.py:111
+#: panels/staticfiles.py:109
#, python-format
msgid "%(num_used)s file used"
msgid_plural "%(num_used)s files used"
msgstr[0] "%(num_used)s použitý súbor"
-msgstr[1] "%(num_used)s použité súbory"
+msgstr[1] "%(num_used)s použitých súborov"
msgstr[2] "%(num_used)s použitých súborov"
msgstr[3] "%(num_used)s použitých súborov"
-#: panels/templates/panel.py:143
+#: panels/templates/panel.py:101
msgid "Templates"
msgstr "Šablóny"
-#: panels/templates/panel.py:148
+#: panels/templates/panel.py:106
#, python-format
msgid "Templates (%(num_templates)s rendered)"
msgstr "Šablóny (%(num_templates)s spracovaných)"
-#: panels/templates/panel.py:180
+#: panels/templates/panel.py:195
msgid "No origin"
msgstr ""
-#: panels/timer.py:25
+#: panels/timer.py:27
#, python-format
msgid "CPU: %(cum)0.2fms (%(total)0.2fms)"
msgstr "CPU: %(cum)0.2fms (%(total)0.2fms)"
-#: panels/timer.py:30
+#: panels/timer.py:32
#, python-format
msgid "Total: %0.2fms"
msgstr "Celkovo: %0.2fms"
-#: panels/timer.py:36 templates/debug_toolbar/panels/history.html:9
+#: panels/timer.py:38 templates/debug_toolbar/panels/history.html:9
#: templates/debug_toolbar/panels/sql_explain.html:11
#: templates/debug_toolbar/panels/sql_profile.html:12
#: templates/debug_toolbar/panels/sql_select.html:11
msgid "Time"
msgstr "Čas"
-#: panels/timer.py:44
+#: panels/timer.py:46
msgid "User CPU time"
msgstr "Užívateľský čas CPU"
-#: panels/timer.py:44
+#: panels/timer.py:46
#, python-format
msgid "%(utime)0.3f msec"
msgstr "%(utime)0.3f msek"
-#: panels/timer.py:45
+#: panels/timer.py:47
msgid "System CPU time"
msgstr "Systémový čas CPU"
-#: panels/timer.py:45
+#: panels/timer.py:47
#, python-format
msgid "%(stime)0.3f msec"
msgstr "%(stime)0.3f msek"
-#: panels/timer.py:46
+#: panels/timer.py:48
msgid "Total CPU time"
msgstr "Celkový čas CPU"
-#: panels/timer.py:46
+#: panels/timer.py:48
#, python-format
msgid "%(total)0.3f msec"
msgstr "%(total)0.3f msek"
-#: panels/timer.py:47
+#: panels/timer.py:49
msgid "Elapsed time"
msgstr "Uplynutý čas"
-#: panels/timer.py:47
+#: panels/timer.py:49
#, python-format
msgid "%(total_time)0.3f msec"
msgstr "%(total_time)0.3f msek"
-#: panels/timer.py:49
+#: panels/timer.py:51
msgid "Context switches"
msgstr "Prepnutí kontextu"
-#: panels/timer.py:50
+#: panels/timer.py:52
#, python-format
msgid "%(vcsw)d voluntary, %(ivcsw)d involuntary"
msgstr "%(vcsw)d dobrovoľných, %(ivcsw)d nedobrovoľných"
@@ -270,15 +288,19 @@ msgstr "%(vcsw)d dobrovoľných, %(ivcsw)d nedobrovoľných"
msgid "Versions"
msgstr "Verzie"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide toolbar"
msgstr "Skryť panel nástrojov"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide"
msgstr "Skryť"
-#: templates/debug_toolbar/base.html:29
+#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26
+msgid "Toggle Theme"
+msgstr ""
+
+#: templates/debug_toolbar/base.html:35
msgid "Show toolbar"
msgstr "Zobraziť panel nástrojov"
@@ -290,6 +312,14 @@ msgstr "Zakázať pre ďalšie a nasledujúce požiadavky"
msgid "Enable for next and successive requests"
msgstr "Povoliť pre ďalšie a nasledujúce požiadavky"
+#: templates/debug_toolbar/panels/alerts.html:4
+msgid "Alerts found"
+msgstr ""
+
+#: templates/debug_toolbar/panels/alerts.html:11
+msgid "No alerts found"
+msgstr ""
+
#: templates/debug_toolbar/panels/cache.html:2
msgid "Summary"
msgstr "Zhrnutie"
@@ -373,9 +403,7 @@ msgstr "WSGI prostredie"
msgid ""
"Since the WSGI environ inherits the environment of the server, only a "
"significant subset is shown below."
-msgstr ""
-"Keďže WSGI prostredie dedí z prostredia servera, je nižšie zobrazená iba "
-"významná podmnožina."
+msgstr "Keďže WSGI prostredie dedí z prostredia servera, je nižšie zobrazená iba významná podmnožina."
#: templates/debug_toolbar/panels/history.html:10
msgid "Method"
@@ -387,10 +415,8 @@ msgid "Path"
msgstr "Cesta"
#: templates/debug_toolbar/panels/history.html:12
-#, fuzzy
-#| msgid "Request headers"
msgid "Request Variables"
-msgstr "Hlavičky požiadavky"
+msgstr ""
#: templates/debug_toolbar/panels/history.html:13
msgid "Status"
@@ -488,8 +514,8 @@ msgstr "Príjemcovia"
msgid "%(num)s query"
msgid_plural "%(num)s queries"
msgstr[0] "%(num)s dopyt"
-msgstr[1] "%(num)s dopyty"
-msgstr[2] "%(num)s dopytu"
+msgstr[1] "%(num)s dopytov"
+msgstr[2] "%(num)s dopytov"
msgstr[3] "%(num)s dopytov"
#: templates/debug_toolbar/panels/sql.html:8
@@ -516,11 +542,9 @@ msgid "Timeline"
msgstr "Časová os"
#: templates/debug_toolbar/panels/sql.html:52
-#, fuzzy, python-format
-#| msgid "%(count)s message"
-#| msgid_plural "%(count)s messages"
+#, python-format
msgid "%(count)s similar queries."
-msgstr "%(count)s správa"
+msgstr ""
#: templates/debug_toolbar/panels/sql.html:58
#, python-format
@@ -585,7 +609,7 @@ msgid_plural "Static file paths"
msgstr[0] "Cesta k statickému súboru"
msgstr[1] "Cesty k statickým súborom"
msgstr[2] "Cesty k statickým súborom"
-msgstr[3] "Ciest k statickým súborom"
+msgstr[3] "Cesty k statickým súborom"
#: templates/debug_toolbar/panels/staticfiles.html:7
#, python-format
@@ -607,23 +631,23 @@ msgid_plural "Static file apps"
msgstr[0] "Aplikácia pre statické súbory"
msgstr[1] "Aplikácie pre statické súbory"
msgstr[2] "Aplikácie pre statické súbory"
-msgstr[3] "Aplikácií pre statické súbory"
+msgstr[3] "Aplikácie pre statické súbory"
#: templates/debug_toolbar/panels/staticfiles.html:25
msgid "Static file"
msgid_plural "Static files"
-msgstr[0] "Statický súbor"
-msgstr[1] "Statické súbory"
-msgstr[2] "Statického súbora"
-msgstr[3] "Statických súborov"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] "Statické súbory"
+msgstr[3] "Statické súbory"
#: templates/debug_toolbar/panels/staticfiles.html:39
#, python-format
msgid "%(payload_count)s file"
msgid_plural "%(payload_count)s files"
msgstr[0] "%(payload_count)s súbor"
-msgstr[1] "%(payload_count)s súbory"
-msgstr[2] "%(payload_count)s súbora"
+msgstr[1] "%(payload_count)s súborov"
+msgstr[2] "%(payload_count)s súborov"
msgstr[3] "%(payload_count)s súborov"
#: templates/debug_toolbar/panels/staticfiles.html:44
@@ -638,17 +662,17 @@ msgstr "Zdrojový kód šablóny:"
msgid "Template path"
msgid_plural "Template paths"
msgstr[0] "Cesta k šablóne"
-msgstr[1] "Cesty k šablóne"
-msgstr[2] "Cesty k šablóne"
-msgstr[3] "Ciest k šablóne"
+msgstr[1] "Cesta k šablóne"
+msgstr[2] "Cesta k šablóne"
+msgstr[3] "Cesta k šablóne"
#: templates/debug_toolbar/panels/templates.html:13
msgid "Template"
msgid_plural "Templates"
msgstr[0] "Šablóna"
-msgstr[1] "Šablóny"
-msgstr[2] "Šablóny"
-msgstr[3] "Šablón"
+msgstr[1] "Šablóna"
+msgstr[2] "Šablóna"
+msgstr[3] "Šablóna"
#: templates/debug_toolbar/panels/templates.html:22
#: templates/debug_toolbar/panels/templates.html:40
@@ -659,9 +683,9 @@ msgstr "Prepnúť kontext"
msgid "Context processor"
msgid_plural "Context processors"
msgstr[0] "Spracovateľ kontextu"
-msgstr[1] "Spracovatelia kontextu"
-msgstr[2] "Spracovateľa kontextu"
-msgstr[3] "Spracovateľov kontextu"
+msgstr[1] "Spracovateľ kontextu"
+msgstr[2] "Spracovateľ kontextu"
+msgstr[3] "Spracovateľ kontextu"
#: templates/debug_toolbar/panels/timer.html:2
msgid "Resource usage"
@@ -704,14 +728,10 @@ msgid ""
"The Django Debug Toolbar has intercepted a redirect to the above URL for "
"debug viewing purposes. You can click the above link to continue with the "
"redirect as normal."
-msgstr ""
-"Django Debug Toolbar zachytil presmerovanie na vyššie uvedenú URL pre účely "
-"ladenia. Pre normálne presmerovanie môžete kliknúť na vyššie uvedený odkaz."
+msgstr "Django Debug Toolbar zachytil presmerovanie na vyššie uvedenú URL pre účely ladenia. Pre normálne presmerovanie môžete kliknúť na vyššie uvedený odkaz."
#: views.py:16
msgid ""
"Data for this panel isn't available anymore. Please reload the page and "
"retry."
-msgstr ""
-"Dáta pre tento panel už nie sú k dispozícii. Načítajte si prosím stránku a "
-"skúste to znova."
+msgstr "Dáta pre tento panel už nie sú k dispozícii. Načítajte si prosím stránku a skúste to znova."
diff --git a/debug_toolbar/locale/sv_SE/LC_MESSAGES/django.mo b/debug_toolbar/locale/sv_SE/LC_MESSAGES/django.mo
index aa8f87478..849592ff0 100644
Binary files a/debug_toolbar/locale/sv_SE/LC_MESSAGES/django.mo and b/debug_toolbar/locale/sv_SE/LC_MESSAGES/django.mo differ
diff --git a/debug_toolbar/locale/sv_SE/LC_MESSAGES/django.po b/debug_toolbar/locale/sv_SE/LC_MESSAGES/django.po
index fce9878ab..5848929d1 100644
--- a/debug_toolbar/locale/sv_SE/LC_MESSAGES/django.po
+++ b/debug_toolbar/locale/sv_SE/LC_MESSAGES/django.po
@@ -9,33 +9,56 @@ msgid ""
msgstr ""
"Project-Id-Version: Django Debug Toolbar\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-01-20 17:23+0100\n"
-"PO-Revision-Date: 2014-04-25 19:53+0000\n"
-"Last-Translator: Aymeric Augustin \n"
-"Language-Team: Swedish (Sweden) (http://www.transifex.com/projects/p/django-"
-"debug-toolbar/language/sv_SE/)\n"
-"Language: sv_SE\n"
+"POT-Creation-Date: 2024-08-06 07:12-0500\n"
+"PO-Revision-Date: 2010-11-30 00:00+0000\n"
+"Last-Translator: Alex Nordlund , 2012-2013\n"
+"Language-Team: Swedish (Sweden) (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/sv_SE/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Language: sv_SE\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: apps.py:15
+#: apps.py:18
msgid "Debug Toolbar"
msgstr ""
-#: panels/cache.py:180
+#: panels/alerts.py:67
+#, python-brace-format
+msgid ""
+"Form with id \"{form_id}\" contains file input, but does not have the "
+"attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:70
+msgid ""
+"Form contains file input, but does not have the attribute "
+"enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:73
+#, python-brace-format
+msgid ""
+"Input element references form with id \"{form_id}\", but the form does not "
+"have the attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:77
+msgid "Alerts"
+msgstr ""
+
+#: panels/cache.py:168
msgid "Cache"
msgstr "Cache"
-#: panels/cache.py:186
+#: panels/cache.py:174
#, python-format
msgid "%(cache_calls)d call in %(time).2fms"
msgid_plural "%(cache_calls)d calls in %(time).2fms"
msgstr[0] ""
msgstr[1] ""
-#: panels/cache.py:195
+#: panels/cache.py:183
#, python-format
msgid "Cache calls from %(count)d backend"
msgid_plural "Cache calls from %(count)d backends"
@@ -46,7 +69,7 @@ msgstr[1] ""
msgid "Headers"
msgstr ""
-#: panels/history/panel.py:18 panels/history/panel.py:19
+#: panels/history/panel.py:19 panels/history/panel.py:20
msgid "History"
msgstr ""
@@ -54,7 +77,7 @@ msgstr ""
msgid "Profiling"
msgstr "Profilering"
-#: panels/redirects.py:14
+#: panels/redirects.py:17
msgid "Intercept redirects"
msgstr ""
@@ -62,11 +85,11 @@ msgstr ""
msgid "Request"
msgstr ""
-#: panels/request.py:36
+#: panels/request.py:38
msgid ""
msgstr ""
-#: panels/request.py:53
+#: panels/request.py:55
msgid ""
msgstr ""
@@ -75,10 +98,9 @@ msgid "Settings"
msgstr "Inställningar"
#: panels/settings.py:20
-#, fuzzy, python-format
-#| msgid "Settings"
+#, python-format
msgid "Settings from %s"
-msgstr "Inställningar"
+msgstr ""
#: panels/signals.py:57
#, python-format
@@ -98,151 +120,151 @@ msgstr[1] ""
msgid "Signals"
msgstr "Signaler"
-#: panels/sql/panel.py:23
-msgid "Autocommit"
-msgstr ""
-
-#: panels/sql/panel.py:24
+#: panels/sql/panel.py:30 panels/sql/panel.py:41
msgid "Read uncommitted"
msgstr ""
-#: panels/sql/panel.py:25
+#: panels/sql/panel.py:31 panels/sql/panel.py:43
msgid "Read committed"
msgstr ""
-#: panels/sql/panel.py:26
+#: panels/sql/panel.py:32 panels/sql/panel.py:45
msgid "Repeatable read"
msgstr ""
-#: panels/sql/panel.py:27
+#: panels/sql/panel.py:33 panels/sql/panel.py:47
msgid "Serializable"
msgstr "Variabel"
#: panels/sql/panel.py:39
+msgid "Autocommit"
+msgstr ""
+
+#: panels/sql/panel.py:61 panels/sql/panel.py:71
msgid "Idle"
msgstr ""
-#: panels/sql/panel.py:40
+#: panels/sql/panel.py:62 panels/sql/panel.py:72
msgid "Active"
msgstr "Åtgärd"
-#: panels/sql/panel.py:41
+#: panels/sql/panel.py:63 panels/sql/panel.py:73
msgid "In transaction"
msgstr ""
-#: panels/sql/panel.py:42
+#: panels/sql/panel.py:64 panels/sql/panel.py:74
msgid "In error"
msgstr "Felmeddelande"
-#: panels/sql/panel.py:43
+#: panels/sql/panel.py:65 panels/sql/panel.py:75
msgid "Unknown"
msgstr "(okänd)"
-#: panels/sql/panel.py:130
+#: panels/sql/panel.py:162
msgid "SQL"
msgstr "SQL"
-#: panels/sql/panel.py:135
+#: panels/sql/panel.py:168
#, python-format
msgid "%(query_count)d query in %(sql_time).2fms"
msgid_plural "%(query_count)d queries in %(sql_time).2fms"
msgstr[0] ""
msgstr[1] ""
-#: panels/sql/panel.py:147
+#: panels/sql/panel.py:180
#, python-format
msgid "SQL queries from %(count)d connection"
msgid_plural "SQL queries from %(count)d connections"
msgstr[0] ""
msgstr[1] ""
-#: panels/staticfiles.py:84
+#: panels/staticfiles.py:82
#, python-format
msgid "Static files (%(num_found)s found, %(num_used)s used)"
msgstr ""
-#: panels/staticfiles.py:105
+#: panels/staticfiles.py:103
msgid "Static files"
msgstr "Statiska filer"
-#: panels/staticfiles.py:111
+#: panels/staticfiles.py:109
#, python-format
msgid "%(num_used)s file used"
msgid_plural "%(num_used)s files used"
msgstr[0] ""
msgstr[1] ""
-#: panels/templates/panel.py:143
+#: panels/templates/panel.py:101
msgid "Templates"
msgstr "Mallar"
-#: panels/templates/panel.py:148
+#: panels/templates/panel.py:106
#, python-format
msgid "Templates (%(num_templates)s rendered)"
msgstr ""
-#: panels/templates/panel.py:180
+#: panels/templates/panel.py:195
msgid "No origin"
msgstr ""
-#: panels/timer.py:25
+#: panels/timer.py:27
#, python-format
msgid "CPU: %(cum)0.2fms (%(total)0.2fms)"
msgstr ""
-#: panels/timer.py:30
+#: panels/timer.py:32
#, python-format
msgid "Total: %0.2fms"
msgstr ""
-#: panels/timer.py:36 templates/debug_toolbar/panels/history.html:9
+#: panels/timer.py:38 templates/debug_toolbar/panels/history.html:9
#: templates/debug_toolbar/panels/sql_explain.html:11
#: templates/debug_toolbar/panels/sql_profile.html:12
#: templates/debug_toolbar/panels/sql_select.html:11
msgid "Time"
msgstr "Tid"
-#: panels/timer.py:44
+#: panels/timer.py:46
msgid "User CPU time"
msgstr ""
-#: panels/timer.py:44
+#: panels/timer.py:46
#, python-format
msgid "%(utime)0.3f msec"
msgstr ""
-#: panels/timer.py:45
+#: panels/timer.py:47
msgid "System CPU time"
msgstr ""
-#: panels/timer.py:45
+#: panels/timer.py:47
#, python-format
msgid "%(stime)0.3f msec"
msgstr ""
-#: panels/timer.py:46
+#: panels/timer.py:48
msgid "Total CPU time"
msgstr ""
-#: panels/timer.py:46
+#: panels/timer.py:48
#, python-format
msgid "%(total)0.3f msec"
msgstr ""
-#: panels/timer.py:47
+#: panels/timer.py:49
msgid "Elapsed time"
msgstr ""
-#: panels/timer.py:47
+#: panels/timer.py:49
#, python-format
msgid "%(total_time)0.3f msec"
msgstr ""
-#: panels/timer.py:49
+#: panels/timer.py:51
msgid "Context switches"
msgstr ""
-#: panels/timer.py:50
+#: panels/timer.py:52
#, python-format
msgid "%(vcsw)d voluntary, %(ivcsw)d involuntary"
msgstr ""
@@ -251,15 +273,19 @@ msgstr ""
msgid "Versions"
msgstr "Versioner"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide toolbar"
msgstr ""
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide"
msgstr "Dölj"
-#: templates/debug_toolbar/base.html:29
+#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26
+msgid "Toggle Theme"
+msgstr ""
+
+#: templates/debug_toolbar/base.html:35
msgid "Show toolbar"
msgstr ""
@@ -271,6 +297,14 @@ msgstr ""
msgid "Enable for next and successive requests"
msgstr ""
+#: templates/debug_toolbar/panels/alerts.html:4
+msgid "Alerts found"
+msgstr ""
+
+#: templates/debug_toolbar/panels/alerts.html:11
+msgid "No alerts found"
+msgstr ""
+
#: templates/debug_toolbar/panels/cache.html:2
msgid "Summary"
msgstr "Sammanfattning"
@@ -366,10 +400,8 @@ msgid "Path"
msgstr "Sökväg"
#: templates/debug_toolbar/panels/history.html:12
-#, fuzzy
-#| msgid "Variable"
msgid "Request Variables"
-msgstr "Variabel"
+msgstr ""
#: templates/debug_toolbar/panels/history.html:13
msgid "Status"
@@ -493,11 +525,9 @@ msgid "Timeline"
msgstr ""
#: templates/debug_toolbar/panels/sql.html:52
-#, fuzzy, python-format
-#| msgid "%(count)s message"
-#| msgid_plural "%(count)s messages"
+#, python-format
msgid "%(count)s similar queries."
-msgstr "%(count)s meddelande"
+msgstr ""
#: templates/debug_toolbar/panels/sql.html:58
#, python-format
diff --git a/debug_toolbar/locale/uk/LC_MESSAGES/django.mo b/debug_toolbar/locale/uk/LC_MESSAGES/django.mo
index 8a20bde25..0c00501e3 100644
Binary files a/debug_toolbar/locale/uk/LC_MESSAGES/django.mo and b/debug_toolbar/locale/uk/LC_MESSAGES/django.mo differ
diff --git a/debug_toolbar/locale/uk/LC_MESSAGES/django.po b/debug_toolbar/locale/uk/LC_MESSAGES/django.po
index 328de2043..4d752a52d 100644
--- a/debug_toolbar/locale/uk/LC_MESSAGES/django.po
+++ b/debug_toolbar/locale/uk/LC_MESSAGES/django.po
@@ -3,308 +3,349 @@
#
#
# Translators:
+# Illia Volochii , 2017
# Sergey Lysach , 2013
msgid ""
msgstr ""
"Project-Id-Version: Django Debug Toolbar\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-01-20 17:23+0100\n"
-"PO-Revision-Date: 2014-04-25 19:53+0000\n"
-"Last-Translator: Aymeric Augustin \n"
-"Language-Team: Ukrainian (http://www.transifex.com/projects/p/django-debug-"
-"toolbar/language/uk/)\n"
-"Language: uk\n"
+"POT-Creation-Date: 2024-08-06 07:12-0500\n"
+"PO-Revision-Date: 2010-11-30 00:00+0000\n"
+"Last-Translator: Illia Volochii , 2017\n"
+"Language-Team: Ukrainian (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/uk/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
-"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"Language: uk\n"
+"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n"
-#: apps.py:15
+#: apps.py:18
msgid "Debug Toolbar"
+msgstr "Панель Інструментів Налагодження"
+
+#: panels/alerts.py:67
+#, python-brace-format
+msgid ""
+"Form with id \"{form_id}\" contains file input, but does not have the "
+"attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:70
+msgid ""
+"Form contains file input, but does not have the attribute "
+"enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:73
+#, python-brace-format
+msgid ""
+"Input element references form with id \"{form_id}\", but the form does not "
+"have the attribute enctype=\"multipart/form-data\"."
msgstr ""
-#: panels/cache.py:180
+#: panels/alerts.py:77
+msgid "Alerts"
+msgstr ""
+
+#: panels/cache.py:168
msgid "Cache"
msgstr "Кеш"
-#: panels/cache.py:186
+#: panels/cache.py:174
#, python-format
msgid "%(cache_calls)d call in %(time).2fms"
msgid_plural "%(cache_calls)d calls in %(time).2fms"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%(cache_calls)d виклик за %(time).2f мс"
+msgstr[1] "%(cache_calls)d виклики за %(time).2f мс"
+msgstr[2] "%(cache_calls)d викликів за %(time).2f мс"
+msgstr[3] "%(cache_calls)d викликів за %(time).2f мс"
-#: panels/cache.py:195
+#: panels/cache.py:183
#, python-format
msgid "Cache calls from %(count)d backend"
msgid_plural "Cache calls from %(count)d backends"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Виклики кешу з %(count)d бекенду"
+msgstr[1] "Виклики кешу із %(count)d бекендів"
+msgstr[2] "Виклики кешу із %(count)d бекендів"
+msgstr[3] "Виклики кешу із %(count)d бекендів"
#: panels/headers.py:31
msgid "Headers"
-msgstr ""
+msgstr "Заголовки"
-#: panels/history/panel.py:18 panels/history/panel.py:19
+#: panels/history/panel.py:19 panels/history/panel.py:20
msgid "History"
msgstr ""
#: panels/profiling.py:140
msgid "Profiling"
-msgstr ""
+msgstr "Профілювання"
-#: panels/redirects.py:14
+#: panels/redirects.py:17
msgid "Intercept redirects"
-msgstr ""
+msgstr "Переривати запити"
#: panels/request.py:16
msgid "Request"
-msgstr ""
+msgstr "Запит"
-#: panels/request.py:36
+#: panels/request.py:38
msgid ""
-msgstr ""
+msgstr "<немає відображення>"
-#: panels/request.py:53
+#: panels/request.py:55
msgid ""
-msgstr ""
+msgstr "<відсутнє>"
#: panels/settings.py:17
msgid "Settings"
msgstr "Налаштування"
#: panels/settings.py:20
-#, fuzzy, python-format
-#| msgid "Settings"
+#, python-format
msgid "Settings from %s"
-msgstr "Налаштування"
+msgstr ""
#: panels/signals.py:57
#, python-format
msgid "%(num_receivers)d receiver of 1 signal"
msgid_plural "%(num_receivers)d receivers of 1 signal"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%(num_receivers)d отримувач 1 сигналу"
+msgstr[1] "%(num_receivers)d отримувача 1 сигналу"
+msgstr[2] "%(num_receivers)d отримувачів 1 сигналу"
+msgstr[3] "%(num_receivers)d отримувачів 1 сигналу"
#: panels/signals.py:62
#, python-format
msgid "%(num_receivers)d receiver of %(num_signals)d signals"
msgid_plural "%(num_receivers)d receivers of %(num_signals)d signals"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%(num_receivers)d отримувач %(num_signals)d сигналів"
+msgstr[1] "%(num_receivers)d отримувача %(num_signals)d сигналів"
+msgstr[2] "%(num_receivers)d отримувачів %(num_signals)d сигналів"
+msgstr[3] "%(num_receivers)d отримувачів %(num_signals)d сигналів"
#: panels/signals.py:67
msgid "Signals"
msgstr "Сигнали"
-#: panels/sql/panel.py:23
-msgid "Autocommit"
-msgstr ""
-
-#: panels/sql/panel.py:24
+#: panels/sql/panel.py:30 panels/sql/panel.py:41
msgid "Read uncommitted"
msgstr ""
-#: panels/sql/panel.py:25
+#: panels/sql/panel.py:31 panels/sql/panel.py:43
msgid "Read committed"
msgstr ""
-#: panels/sql/panel.py:26
+#: panels/sql/panel.py:32 panels/sql/panel.py:45
msgid "Repeatable read"
msgstr ""
-#: panels/sql/panel.py:27
+#: panels/sql/panel.py:33 panels/sql/panel.py:47
msgid "Serializable"
msgstr ""
#: panels/sql/panel.py:39
+msgid "Autocommit"
+msgstr "Автофіксація"
+
+#: panels/sql/panel.py:61 panels/sql/panel.py:71
msgid "Idle"
msgstr ""
-#: panels/sql/panel.py:40
+#: panels/sql/panel.py:62 panels/sql/panel.py:72
msgid "Active"
msgstr ""
-#: panels/sql/panel.py:41
+#: panels/sql/panel.py:63 panels/sql/panel.py:73
msgid "In transaction"
msgstr ""
-#: panels/sql/panel.py:42
+#: panels/sql/panel.py:64 panels/sql/panel.py:74
msgid "In error"
msgstr ""
-#: panels/sql/panel.py:43
+#: panels/sql/panel.py:65 panels/sql/panel.py:75
msgid "Unknown"
msgstr ""
-#: panels/sql/panel.py:130
+#: panels/sql/panel.py:162
msgid "SQL"
-msgstr ""
+msgstr "SQL"
-#: panels/sql/panel.py:135
+#: panels/sql/panel.py:168
#, python-format
msgid "%(query_count)d query in %(sql_time).2fms"
msgid_plural "%(query_count)d queries in %(sql_time).2fms"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgstr[3] ""
-#: panels/sql/panel.py:147
+#: panels/sql/panel.py:180
#, python-format
msgid "SQL queries from %(count)d connection"
msgid_plural "SQL queries from %(count)d connections"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgstr[3] ""
-#: panels/staticfiles.py:84
+#: panels/staticfiles.py:82
#, python-format
msgid "Static files (%(num_found)s found, %(num_used)s used)"
-msgstr ""
+msgstr "Статичні файли (знайдено %(num_found)s, використано %(num_used)s)"
-#: panels/staticfiles.py:105
+#: panels/staticfiles.py:103
msgid "Static files"
-msgstr ""
+msgstr "Статичні файли"
-#: panels/staticfiles.py:111
+#: panels/staticfiles.py:109
#, python-format
msgid "%(num_used)s file used"
msgid_plural "%(num_used)s files used"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Використано %(num_used)s файл"
+msgstr[1] "Використано %(num_used)s файли"
+msgstr[2] "Використано %(num_used)s файлів"
+msgstr[3] "Використано %(num_used)s файлів"
-#: panels/templates/panel.py:143
+#: panels/templates/panel.py:101
msgid "Templates"
msgstr "Шаблони"
-#: panels/templates/panel.py:148
+#: panels/templates/panel.py:106
#, python-format
msgid "Templates (%(num_templates)s rendered)"
msgstr "Шаблони (оброблено %(num_templates)s)"
-#: panels/templates/panel.py:180
+#: panels/templates/panel.py:195
msgid "No origin"
-msgstr ""
+msgstr "Немає походження"
-#: panels/timer.py:25
+#: panels/timer.py:27
#, python-format
msgid "CPU: %(cum)0.2fms (%(total)0.2fms)"
-msgstr ""
+msgstr "CPU: %(cum)0.2f мс (%(total)0.2f мс)"
-#: panels/timer.py:30
+#: panels/timer.py:32
#, python-format
msgid "Total: %0.2fms"
-msgstr ""
+msgstr "Загалом: %0.2f мс"
-#: panels/timer.py:36 templates/debug_toolbar/panels/history.html:9
+#: panels/timer.py:38 templates/debug_toolbar/panels/history.html:9
#: templates/debug_toolbar/panels/sql_explain.html:11
#: templates/debug_toolbar/panels/sql_profile.html:12
#: templates/debug_toolbar/panels/sql_select.html:11
msgid "Time"
msgstr "Час"
-#: panels/timer.py:44
+#: panels/timer.py:46
msgid "User CPU time"
-msgstr ""
+msgstr "Користувацький час CPU"
-#: panels/timer.py:44
+#: panels/timer.py:46
#, python-format
msgid "%(utime)0.3f msec"
-msgstr ""
+msgstr "%(utime)0.3f мс"
-#: panels/timer.py:45
+#: panels/timer.py:47
msgid "System CPU time"
-msgstr ""
+msgstr "Системний час CPU"
-#: panels/timer.py:45
+#: panels/timer.py:47
#, python-format
msgid "%(stime)0.3f msec"
-msgstr ""
+msgstr "%(stime)0.3f мс"
-#: panels/timer.py:46
+#: panels/timer.py:48
msgid "Total CPU time"
-msgstr ""
+msgstr "Загальний час CPU"
-#: panels/timer.py:46
+#: panels/timer.py:48
#, python-format
msgid "%(total)0.3f msec"
-msgstr ""
+msgstr "%(total)0.3f мс"
-#: panels/timer.py:47
+#: panels/timer.py:49
msgid "Elapsed time"
-msgstr ""
+msgstr "Витрачений час"
-#: panels/timer.py:47
+#: panels/timer.py:49
#, python-format
msgid "%(total_time)0.3f msec"
-msgstr ""
+msgstr "%(total_time)0.3f мс"
-#: panels/timer.py:49
+#: panels/timer.py:51
msgid "Context switches"
-msgstr ""
+msgstr "Перемикачів контексту"
-#: panels/timer.py:50
+#: panels/timer.py:52
#, python-format
msgid "%(vcsw)d voluntary, %(ivcsw)d involuntary"
-msgstr ""
+msgstr "навмисних - %(vcsw)d, мимовільних - %(ivcsw)d"
#: panels/versions.py:19
msgid "Versions"
msgstr "Версії"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide toolbar"
-msgstr ""
+msgstr "Сховати панель інструментів"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide"
msgstr "Сховати"
-#: templates/debug_toolbar/base.html:29
-msgid "Show toolbar"
+#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26
+msgid "Toggle Theme"
msgstr ""
+#: templates/debug_toolbar/base.html:35
+msgid "Show toolbar"
+msgstr "Показати панель інструментів"
+
#: templates/debug_toolbar/includes/panel_button.html:4
msgid "Disable for next and successive requests"
-msgstr ""
+msgstr "Відключити для наступного і подальших запитів"
#: templates/debug_toolbar/includes/panel_button.html:4
msgid "Enable for next and successive requests"
+msgstr "Включити для наступного і подальших запитів"
+
+#: templates/debug_toolbar/panels/alerts.html:4
+msgid "Alerts found"
+msgstr ""
+
+#: templates/debug_toolbar/panels/alerts.html:11
+msgid "No alerts found"
msgstr ""
#: templates/debug_toolbar/panels/cache.html:2
msgid "Summary"
-msgstr ""
+msgstr "Резюме"
#: templates/debug_toolbar/panels/cache.html:6
msgid "Total calls"
-msgstr ""
+msgstr "Загальна кількість викликів"
#: templates/debug_toolbar/panels/cache.html:7
msgid "Total time"
-msgstr ""
+msgstr "Загальний час"
#: templates/debug_toolbar/panels/cache.html:8
msgid "Cache hits"
-msgstr ""
+msgstr "Кеш-попадання"
#: templates/debug_toolbar/panels/cache.html:9
msgid "Cache misses"
-msgstr ""
+msgstr "Кеш-промахи"
#: templates/debug_toolbar/panels/cache.html:21
msgid "Commands"
-msgstr ""
+msgstr "Команди"
#: templates/debug_toolbar/panels/cache.html:39
msgid "Calls"
-msgstr ""
+msgstr "Виклики"
#: templates/debug_toolbar/panels/cache.html:43
#: templates/debug_toolbar/panels/sql.html:36
@@ -318,20 +359,20 @@ msgstr "Тип"
#: templates/debug_toolbar/panels/cache.html:45
#: templates/debug_toolbar/panels/request.html:8
msgid "Arguments"
-msgstr ""
+msgstr "Аргументи"
#: templates/debug_toolbar/panels/cache.html:46
#: templates/debug_toolbar/panels/request.html:9
msgid "Keyword arguments"
-msgstr ""
+msgstr "Іменовані аргументи"
#: templates/debug_toolbar/panels/cache.html:47
msgid "Backend"
-msgstr ""
+msgstr "Бекенд"
#: templates/debug_toolbar/panels/headers.html:3
msgid "Request headers"
-msgstr ""
+msgstr "Заголовки запиту"
#: templates/debug_toolbar/panels/headers.html:8
#: templates/debug_toolbar/panels/headers.html:27
@@ -351,17 +392,17 @@ msgstr "Значення"
#: templates/debug_toolbar/panels/headers.html:22
msgid "Response headers"
-msgstr ""
+msgstr "Заголовки відповіді"
#: templates/debug_toolbar/panels/headers.html:41
msgid "WSGI environ"
-msgstr ""
+msgstr "Середовище WSGI"
#: templates/debug_toolbar/panels/headers.html:43
msgid ""
"Since the WSGI environ inherits the environment of the server, only a "
"significant subset is shown below."
-msgstr ""
+msgstr "Оскільки середовище WSGI успадковує середовище сервера, тут показано лише найважливішу частину."
#: templates/debug_toolbar/panels/history.html:10
msgid "Method"
@@ -370,13 +411,11 @@ msgstr ""
#: templates/debug_toolbar/panels/history.html:11
#: templates/debug_toolbar/panels/staticfiles.html:43
msgid "Path"
-msgstr ""
+msgstr "Шлях"
#: templates/debug_toolbar/panels/history.html:12
-#, fuzzy
-#| msgid "Variable"
msgid "Request Variables"
-msgstr "Змінна"
+msgstr ""
#: templates/debug_toolbar/panels/history.html:13
msgid "Status"
@@ -394,56 +433,56 @@ msgstr "Змінна"
#: templates/debug_toolbar/panels/profiling.html:5
msgid "Call"
-msgstr ""
+msgstr "Виклик"
#: templates/debug_toolbar/panels/profiling.html:6
msgid "CumTime"
-msgstr ""
+msgstr "Кумул. час"
#: templates/debug_toolbar/panels/profiling.html:7
#: templates/debug_toolbar/panels/profiling.html:9
msgid "Per"
-msgstr ""
+msgstr "За виклик"
#: templates/debug_toolbar/panels/profiling.html:8
msgid "TotTime"
-msgstr ""
+msgstr "Заг. час"
#: templates/debug_toolbar/panels/profiling.html:10
msgid "Count"
-msgstr ""
+msgstr "Кількість"
#: templates/debug_toolbar/panels/request.html:3
msgid "View information"
-msgstr ""
+msgstr "Інформація про відображення"
#: templates/debug_toolbar/panels/request.html:7
msgid "View function"
-msgstr ""
+msgstr "Функція відображення"
#: templates/debug_toolbar/panels/request.html:10
msgid "URL name"
-msgstr ""
+msgstr "Імʼя URL"
#: templates/debug_toolbar/panels/request.html:24
msgid "Cookies"
-msgstr ""
+msgstr "Куки"
#: templates/debug_toolbar/panels/request.html:27
msgid "No cookies"
-msgstr ""
+msgstr "Немає куків"
#: templates/debug_toolbar/panels/request.html:31
msgid "Session data"
-msgstr ""
+msgstr "Дані сесії"
#: templates/debug_toolbar/panels/request.html:34
msgid "No session data"
-msgstr ""
+msgstr "Немає даних сесії"
#: templates/debug_toolbar/panels/request.html:38
msgid "GET data"
-msgstr ""
+msgstr "GET дані"
#: templates/debug_toolbar/panels/request.html:41
msgid "No GET data"
@@ -451,7 +490,7 @@ msgstr "Немає GET даних"
#: templates/debug_toolbar/panels/request.html:45
msgid "POST data"
-msgstr ""
+msgstr "POST дані"
#: templates/debug_toolbar/panels/request.html:48
msgid "No POST data"
@@ -459,7 +498,7 @@ msgstr "Немає POST даних"
#: templates/debug_toolbar/panels/settings.html:5
msgid "Setting"
-msgstr ""
+msgstr "Налаштування"
#: templates/debug_toolbar/panels/signals.html:5
msgid "Signal"
@@ -473,9 +512,10 @@ msgstr "Отримувачі сигнала"
#, python-format
msgid "%(num)s query"
msgid_plural "%(num)s queries"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%(num)s запит"
+msgstr[1] "%(num)s запити"
+msgstr[2] "%(num)s запитів"
+msgstr[3] "%(num)s запитів"
#: templates/debug_toolbar/panels/sql.html:8
#, python-format
@@ -498,7 +538,7 @@ msgstr "Запит"
#: templates/debug_toolbar/panels/sql.html:35
#: templates/debug_toolbar/panels/timer.html:36
msgid "Timeline"
-msgstr ""
+msgstr "Лінія часу"
#: templates/debug_toolbar/panels/sql.html:52
#, python-format
@@ -512,15 +552,15 @@ msgstr ""
#: templates/debug_toolbar/panels/sql.html:95
msgid "Connection:"
-msgstr ""
+msgstr "Підключення:"
#: templates/debug_toolbar/panels/sql.html:97
msgid "Isolation level:"
-msgstr ""
+msgstr "Рівень ізоляції:"
#: templates/debug_toolbar/panels/sql.html:100
msgid "Transaction status:"
-msgstr ""
+msgstr "Статус транзакції:"
#: templates/debug_toolbar/panels/sql.html:114
msgid "(unknown)"
@@ -528,7 +568,7 @@ msgstr ""
#: templates/debug_toolbar/panels/sql.html:123
msgid "No SQL queries were recorded during this request."
-msgstr ""
+msgstr "Жодного SQL запиту не було записано протягом цього запиту"
#: templates/debug_toolbar/panels/sql_explain.html:4
msgid "SQL explained"
@@ -538,7 +578,7 @@ msgstr ""
#: templates/debug_toolbar/panels/sql_profile.html:10
#: templates/debug_toolbar/panels/sql_select.html:9
msgid "Executed SQL"
-msgstr ""
+msgstr "Виконаний SQL запит"
#: templates/debug_toolbar/panels/sql_explain.html:13
#: templates/debug_toolbar/panels/sql_profile.html:14
@@ -560,19 +600,20 @@ msgstr ""
#: templates/debug_toolbar/panels/sql_select.html:36
msgid "Empty set"
-msgstr ""
+msgstr "Порожня множина"
#: templates/debug_toolbar/panels/staticfiles.html:3
msgid "Static file path"
msgid_plural "Static file paths"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Шлях до статичних файлів"
+msgstr[1] "Шляхи до статичних файлів"
+msgstr[2] "Шляхи до статичних файлів"
+msgstr[3] "Шляхи до статичних файлів"
#: templates/debug_toolbar/panels/staticfiles.html:7
#, python-format
msgid "(prefix %(prefix)s)"
-msgstr ""
+msgstr "(префікс %(prefix)s)"
#: templates/debug_toolbar/panels/staticfiles.html:11
#: templates/debug_toolbar/panels/staticfiles.html:22
@@ -581,29 +622,32 @@ msgstr ""
#: templates/debug_toolbar/panels/templates.html:30
#: templates/debug_toolbar/panels/templates.html:47
msgid "None"
-msgstr ""
+msgstr "Немає"
#: templates/debug_toolbar/panels/staticfiles.html:14
msgid "Static file app"
msgid_plural "Static file apps"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Застосунок, який використовує статичні файли"
+msgstr[1] "Застосунки, які використовують статичні файли"
+msgstr[2] "Застосунки, які використовують статичні файли"
+msgstr[3] "Застосунки, які використовують статичні файли"
#: templates/debug_toolbar/panels/staticfiles.html:25
msgid "Static file"
msgid_plural "Static files"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Статичний файл"
+msgstr[1] "Статичні файли"
+msgstr[2] "Статичні файли"
+msgstr[3] "Статичні файли"
#: templates/debug_toolbar/panels/staticfiles.html:39
#, python-format
msgid "%(payload_count)s file"
msgid_plural "%(payload_count)s files"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%(payload_count)s файл"
+msgstr[1] "%(payload_count)s файли"
+msgstr[2] "%(payload_count)s файлів"
+msgstr[3] "%(payload_count)s файлів"
#: templates/debug_toolbar/panels/staticfiles.html:44
msgid "Location"
@@ -611,14 +655,15 @@ msgstr "Місце"
#: templates/debug_toolbar/panels/template_source.html:4
msgid "Template source:"
-msgstr ""
+msgstr "Джерело шаблону:"
#: templates/debug_toolbar/panels/templates.html:2
msgid "Template path"
msgid_plural "Template paths"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Шлях до шаблонів"
+msgstr[1] "Шляхи до шаблонів"
+msgstr[2] "Шляхи до шаблонів"
+msgstr[3] "Шляхи до шаблонів"
#: templates/debug_toolbar/panels/templates.html:13
msgid "Template"
@@ -626,38 +671,40 @@ msgid_plural "Templates"
msgstr[0] "Шаблон"
msgstr[1] "Шаблони"
msgstr[2] "Шаблонів"
+msgstr[3] "Шаблонів"
#: templates/debug_toolbar/panels/templates.html:22
#: templates/debug_toolbar/panels/templates.html:40
msgid "Toggle context"
-msgstr ""
+msgstr "Контекст"
#: templates/debug_toolbar/panels/templates.html:33
msgid "Context processor"
msgid_plural "Context processors"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Процесор контексту"
+msgstr[1] "Процесори контексту"
+msgstr[2] "Процесори контексту"
+msgstr[3] "Процесори контексту"
#: templates/debug_toolbar/panels/timer.html:2
msgid "Resource usage"
-msgstr ""
+msgstr "Використання ресурсів"
#: templates/debug_toolbar/panels/timer.html:10
msgid "Resource"
-msgstr ""
+msgstr "Ресурс"
#: templates/debug_toolbar/panels/timer.html:26
msgid "Browser timing"
-msgstr ""
+msgstr "Хронометраж браузера"
#: templates/debug_toolbar/panels/timer.html:35
msgid "Timing attribute"
-msgstr ""
+msgstr "Атрибут хронометражу"
#: templates/debug_toolbar/panels/timer.html:37
msgid "Milliseconds since navigation start (+length)"
-msgstr ""
+msgstr "Мілісекунд від початку навігації (+тривалість)"
#: templates/debug_toolbar/panels/versions.html:10
msgid "Package"
@@ -665,7 +712,7 @@ msgstr ""
#: templates/debug_toolbar/panels/versions.html:11
msgid "Name"
-msgstr ""
+msgstr "Імʼя"
#: templates/debug_toolbar/panels/versions.html:12
msgid "Version"
@@ -673,17 +720,17 @@ msgstr "Версія"
#: templates/debug_toolbar/redirect.html:10
msgid "Location:"
-msgstr ""
+msgstr "Місцезнаходження:"
#: templates/debug_toolbar/redirect.html:12
msgid ""
"The Django Debug Toolbar has intercepted a redirect to the above URL for "
"debug viewing purposes. You can click the above link to continue with the "
"redirect as normal."
-msgstr ""
+msgstr "Панель Інструментів Налагодження Django перервала перенаправлення до вищевказаного URL задля налагодження перегляду. Ви можете натиснути на посилання вище, щоб продовжити перенаправлення у звичайному режимі."
#: views.py:16
msgid ""
"Data for this panel isn't available anymore. Please reload the page and "
"retry."
-msgstr ""
+msgstr "Дані для цієї панелі більше недоступні. Будь ласка, перезавантажте сторінку і спробуйте знову."
diff --git a/debug_toolbar/locale/zh_CN/LC_MESSAGES/django.mo b/debug_toolbar/locale/zh_CN/LC_MESSAGES/django.mo
index 0b1197910..d0ba24256 100644
Binary files a/debug_toolbar/locale/zh_CN/LC_MESSAGES/django.mo and b/debug_toolbar/locale/zh_CN/LC_MESSAGES/django.mo differ
diff --git a/debug_toolbar/locale/zh_CN/LC_MESSAGES/django.po b/debug_toolbar/locale/zh_CN/LC_MESSAGES/django.po
index 33659e1f1..81e5651d0 100644
--- a/debug_toolbar/locale/zh_CN/LC_MESSAGES/django.po
+++ b/debug_toolbar/locale/zh_CN/LC_MESSAGES/django.po
@@ -8,32 +8,55 @@ msgid ""
msgstr ""
"Project-Id-Version: Django Debug Toolbar\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-01-20 17:23+0100\n"
-"PO-Revision-Date: 2014-04-25 19:53+0000\n"
-"Last-Translator: Aymeric Augustin \n"
-"Language-Team: Chinese (China) (http://www.transifex.com/projects/p/django-"
-"debug-toolbar/language/zh_CN/)\n"
-"Language: zh_CN\n"
+"POT-Creation-Date: 2024-08-06 07:12-0500\n"
+"PO-Revision-Date: 2010-11-30 00:00+0000\n"
+"Last-Translator: mozillazg , 2013-2014\n"
+"Language-Team: Chinese (China) (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/zh_CN/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Language: zh_CN\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: apps.py:15
+#: apps.py:18
msgid "Debug Toolbar"
+msgstr "Debug Toolbar"
+
+#: panels/alerts.py:67
+#, python-brace-format
+msgid ""
+"Form with id \"{form_id}\" contains file input, but does not have the "
+"attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:70
+msgid ""
+"Form contains file input, but does not have the attribute "
+"enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:73
+#, python-brace-format
+msgid ""
+"Input element references form with id \"{form_id}\", but the form does not "
+"have the attribute enctype=\"multipart/form-data\"."
+msgstr ""
+
+#: panels/alerts.py:77
+msgid "Alerts"
msgstr ""
-#: panels/cache.py:180
+#: panels/cache.py:168
msgid "Cache"
msgstr "缓存"
-#: panels/cache.py:186
+#: panels/cache.py:174
#, python-format
msgid "%(cache_calls)d call in %(time).2fms"
msgid_plural "%(cache_calls)d calls in %(time).2fms"
msgstr[0] "%(time).2f 毫秒内 %(cache_calls)d 次调用"
-#: panels/cache.py:195
+#: panels/cache.py:183
#, python-format
msgid "Cache calls from %(count)d backend"
msgid_plural "Cache calls from %(count)d backends"
@@ -43,7 +66,7 @@ msgstr[0] "来自 %(count)d 个后端的缓存调用"
msgid "Headers"
msgstr "HTTP 头"
-#: panels/history/panel.py:18 panels/history/panel.py:19
+#: panels/history/panel.py:19 panels/history/panel.py:20
msgid "History"
msgstr ""
@@ -51,7 +74,7 @@ msgstr ""
msgid "Profiling"
msgstr "性能分析"
-#: panels/redirects.py:14
+#: panels/redirects.py:17
msgid "Intercept redirects"
msgstr "拦截重定向"
@@ -59,11 +82,11 @@ msgstr "拦截重定向"
msgid "Request"
msgstr "请求"
-#: panels/request.py:36
+#: panels/request.py:38
msgid ""
msgstr "<没有 view>"
-#: panels/request.py:53
+#: panels/request.py:55
msgid ""
msgstr "<不可用>"
@@ -72,10 +95,9 @@ msgid "Settings"
msgstr "设置"
#: panels/settings.py:20
-#, fuzzy, python-format
-#| msgid "Settings from %s
"
+#, python-format
msgid "Settings from %s"
-msgstr "来自 %s
的设置"
+msgstr ""
#: panels/signals.py:57
#, python-format
@@ -93,150 +115,148 @@ msgstr[0] "%(num_signals)d 个信号 %(num_receivers)d 个接收者"
msgid "Signals"
msgstr "信号"
-#: panels/sql/panel.py:23
-msgid "Autocommit"
-msgstr "自动提交"
-
-#: panels/sql/panel.py:24
+#: panels/sql/panel.py:30 panels/sql/panel.py:41
msgid "Read uncommitted"
msgstr "读取未提交的"
-#: panels/sql/panel.py:25
+#: panels/sql/panel.py:31 panels/sql/panel.py:43
msgid "Read committed"
msgstr "读取已提交的"
-#: panels/sql/panel.py:26
+#: panels/sql/panel.py:32 panels/sql/panel.py:45
msgid "Repeatable read"
msgstr "可重复读取"
-#: panels/sql/panel.py:27
+#: panels/sql/panel.py:33 panels/sql/panel.py:47
msgid "Serializable"
msgstr "可序列化"
#: panels/sql/panel.py:39
+msgid "Autocommit"
+msgstr "自动提交"
+
+#: panels/sql/panel.py:61 panels/sql/panel.py:71
msgid "Idle"
msgstr "空闲"
-#: panels/sql/panel.py:40
+#: panels/sql/panel.py:62 panels/sql/panel.py:72
msgid "Active"
msgstr "活跃"
-#: panels/sql/panel.py:41
+#: panels/sql/panel.py:63 panels/sql/panel.py:73
msgid "In transaction"
msgstr "事务"
-#: panels/sql/panel.py:42
+#: panels/sql/panel.py:64 panels/sql/panel.py:74
msgid "In error"
msgstr "错误"
-#: panels/sql/panel.py:43
+#: panels/sql/panel.py:65 panels/sql/panel.py:75
msgid "Unknown"
msgstr "未知"
-#: panels/sql/panel.py:130
+#: panels/sql/panel.py:162
msgid "SQL"
msgstr "SQL"
-#: panels/sql/panel.py:135
-#, fuzzy, python-format
-#| msgid "%(cache_calls)d call in %(time).2fms"
-#| msgid_plural "%(cache_calls)d calls in %(time).2fms"
+#: panels/sql/panel.py:168
+#, python-format
msgid "%(query_count)d query in %(sql_time).2fms"
msgid_plural "%(query_count)d queries in %(sql_time).2fms"
-msgstr[0] "%(time).2f 毫秒内 %(cache_calls)d 次调用"
+msgstr[0] ""
-#: panels/sql/panel.py:147
+#: panels/sql/panel.py:180
#, python-format
msgid "SQL queries from %(count)d connection"
msgid_plural "SQL queries from %(count)d connections"
msgstr[0] ""
-#: panels/staticfiles.py:84
+#: panels/staticfiles.py:82
#, python-format
msgid "Static files (%(num_found)s found, %(num_used)s used)"
msgstr "静态文件 (%(num_found)s 个找到,%(num_used)s 个被使用)"
-#: panels/staticfiles.py:105
+#: panels/staticfiles.py:103
msgid "Static files"
msgstr "静态文件"
-#: panels/staticfiles.py:111
+#: panels/staticfiles.py:109
#, python-format
msgid "%(num_used)s file used"
msgid_plural "%(num_used)s files used"
msgstr[0] "%(num_used)s 个文件被使用"
-#: panels/templates/panel.py:143
+#: panels/templates/panel.py:101
msgid "Templates"
msgstr "模板"
-#: panels/templates/panel.py:148
+#: panels/templates/panel.py:106
#, python-format
msgid "Templates (%(num_templates)s rendered)"
msgstr "模板 (%(num_templates)s 个被渲染)"
-#: panels/templates/panel.py:180
+#: panels/templates/panel.py:195
msgid "No origin"
msgstr ""
-#: panels/timer.py:25
+#: panels/timer.py:27
#, python-format
msgid "CPU: %(cum)0.2fms (%(total)0.2fms)"
msgstr "CPU: %(cum)0.2f 毫秒 (总耗时: %(total)0.2f 毫秒)"
-#: panels/timer.py:30
+#: panels/timer.py:32
#, python-format
msgid "Total: %0.2fms"
msgstr "总共:%0.2f 毫秒"
-#: panels/timer.py:36 templates/debug_toolbar/panels/history.html:9
+#: panels/timer.py:38 templates/debug_toolbar/panels/history.html:9
#: templates/debug_toolbar/panels/sql_explain.html:11
#: templates/debug_toolbar/panels/sql_profile.html:12
#: templates/debug_toolbar/panels/sql_select.html:11
msgid "Time"
msgstr "时间"
-#: panels/timer.py:44
+#: panels/timer.py:46
msgid "User CPU time"
msgstr "用户 CPU 时间"
-#: panels/timer.py:44
+#: panels/timer.py:46
#, python-format
msgid "%(utime)0.3f msec"
msgstr "%(utime)0.3f 毫秒"
-#: panels/timer.py:45
+#: panels/timer.py:47
msgid "System CPU time"
msgstr "系统 CPU 时间"
-#: panels/timer.py:45
+#: panels/timer.py:47
#, python-format
msgid "%(stime)0.3f msec"
msgstr "%(stime)0.3f 毫秒"
-#: panels/timer.py:46
+#: panels/timer.py:48
msgid "Total CPU time"
msgstr "总的 CPU 时间"
-#: panels/timer.py:46
+#: panels/timer.py:48
#, python-format
msgid "%(total)0.3f msec"
msgstr "%(total)0.3f 毫秒"
-#: panels/timer.py:47
+#: panels/timer.py:49
msgid "Elapsed time"
msgstr "耗时"
-#: panels/timer.py:47
+#: panels/timer.py:49
#, python-format
msgid "%(total_time)0.3f msec"
msgstr "%(total_time)0.3f 毫秒"
-#: panels/timer.py:49
+#: panels/timer.py:51
msgid "Context switches"
msgstr "上下文切换"
-#: panels/timer.py:50
+#: panels/timer.py:52
#, python-format
msgid "%(vcsw)d voluntary, %(ivcsw)d involuntary"
msgstr "%(vcsw)d 主动, %(ivcsw)d 被动"
@@ -245,15 +265,19 @@ msgstr "%(vcsw)d 主动, %(ivcsw)d 被动"
msgid "Versions"
msgstr "版本"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide toolbar"
msgstr "隐藏工具栏"
-#: templates/debug_toolbar/base.html:22
+#: templates/debug_toolbar/base.html:23
msgid "Hide"
msgstr "隐藏"
-#: templates/debug_toolbar/base.html:29
+#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26
+msgid "Toggle Theme"
+msgstr ""
+
+#: templates/debug_toolbar/base.html:35
msgid "Show toolbar"
msgstr "显示工具栏"
@@ -265,6 +289,14 @@ msgstr "针对下一个连续的请求禁用该功能"
msgid "Enable for next and successive requests"
msgstr "针对下一个连续的请求启用该功能"
+#: templates/debug_toolbar/panels/alerts.html:4
+msgid "Alerts found"
+msgstr ""
+
+#: templates/debug_toolbar/panels/alerts.html:11
+msgid "No alerts found"
+msgstr ""
+
#: templates/debug_toolbar/panels/cache.html:2
msgid "Summary"
msgstr "摘要"
@@ -360,10 +392,8 @@ msgid "Path"
msgstr "路径"
#: templates/debug_toolbar/panels/history.html:12
-#, fuzzy
-#| msgid "Request headers"
msgid "Request Variables"
-msgstr "请求头"
+msgstr ""
#: templates/debug_toolbar/panels/history.html:13
msgid "Status"
@@ -486,11 +516,9 @@ msgid "Timeline"
msgstr "时间线"
#: templates/debug_toolbar/panels/sql.html:52
-#, fuzzy, python-format
-#| msgid "%(count)s message"
-#| msgid_plural "%(count)s messages"
+#, python-format
msgid "%(count)s similar queries."
-msgstr "%(count)s 条消息"
+msgstr ""
#: templates/debug_toolbar/panels/sql.html:58
#, python-format
@@ -653,9 +681,7 @@ msgid ""
"The Django Debug Toolbar has intercepted a redirect to the above URL for "
"debug viewing purposes. You can click the above link to continue with the "
"redirect as normal."
-msgstr ""
-"Django Debug Toolbar 为了调试目的拦截了一个重定向到上面 URL 的请求。 您可以"
-"点击上面的链接继续执行重定向操作。"
+msgstr "Django Debug Toolbar 为了调试目的拦截了一个重定向到上面 URL 的请求。 您可以点击上面的链接继续执行重定向操作。"
#: views.py:16
msgid ""
diff --git a/debug_toolbar/middleware.py b/debug_toolbar/middleware.py
index b5e5d0827..598ff3eef 100644
--- a/debug_toolbar/middleware.py
+++ b/debug_toolbar/middleware.py
@@ -3,27 +3,61 @@
"""
import re
-from functools import lru_cache
-
+import socket
+from functools import cache
+
+from asgiref.sync import (
+ async_to_sync,
+ iscoroutinefunction,
+ markcoroutinefunction,
+ sync_to_async,
+)
from django.conf import settings
from django.utils.module_loading import import_string
from debug_toolbar import settings as dt_settings
from debug_toolbar.toolbar import DebugToolbar
-from debug_toolbar.utils import clear_stack_trace_caches
-
-_HTML_TYPES = ("text/html", "application/xhtml+xml")
+from debug_toolbar.utils import clear_stack_trace_caches, is_processable_html_response
def show_toolbar(request):
"""
Default function to determine whether to show the toolbar on a given page.
"""
- return settings.DEBUG and request.META.get("REMOTE_ADDR") in settings.INTERNAL_IPS
-
+ if not settings.DEBUG:
+ return False
+
+ # Test: settings
+ if request.META.get("REMOTE_ADDR") in settings.INTERNAL_IPS:
+ return True
+
+ # Test: Docker
+ try:
+ # This is a hack for docker installations. It attempts to look
+ # up the IP address of the docker host.
+ # This is not guaranteed to work.
+ docker_ip = (
+ # Convert the last segment of the IP address to be .1
+ ".".join(socket.gethostbyname("host.docker.internal").rsplit(".")[:-1])
+ + ".1"
+ )
+ if request.META.get("REMOTE_ADDR") == docker_ip:
+ return True
+ except socket.gaierror:
+ # It's fine if the lookup errored since they may not be using docker
+ pass
+
+ # No test passed
+ return False
+
+
+@cache
+def show_toolbar_func_or_path():
+ """
+ Fetch the show toolbar callback from settings
-@lru_cache(maxsize=None)
-def get_show_toolbar():
+ Cached to avoid importing multiple times.
+ """
# If SHOW_TOOLBAR_CALLBACK is a string, which is the recommended
# setup, resolve it to the corresponding callable.
func_or_path = dt_settings.get_config()["SHOW_TOOLBAR_CALLBACK"]
@@ -33,23 +67,53 @@ def get_show_toolbar():
return func_or_path
+def get_show_toolbar(async_mode):
+ """
+ Get the callback function to show the toolbar.
+
+ Will wrap the function with sync_to_async or
+ async_to_sync depending on the status of async_mode
+ and whether the underlying function is a coroutine.
+ """
+ show_toolbar = show_toolbar_func_or_path()
+ is_coroutine = iscoroutinefunction(show_toolbar)
+ if is_coroutine and not async_mode:
+ show_toolbar = async_to_sync(show_toolbar)
+ elif not is_coroutine and async_mode:
+ show_toolbar = sync_to_async(show_toolbar)
+ return show_toolbar
+
+
class DebugToolbarMiddleware:
"""
Middleware to set up Debug Toolbar on incoming request and render toolbar
on outgoing response.
"""
+ sync_capable = True
+ async_capable = True
+
def __init__(self, get_response):
self.get_response = get_response
+ # If get_response is a coroutine function, turns us into async mode so
+ # a thread is not consumed during a whole request.
+ self.async_mode = iscoroutinefunction(self.get_response)
+
+ if self.async_mode:
+ # Mark the class as async-capable, but do the actual switch inside
+ # __call__ to avoid swapping out dunder methods.
+ markcoroutinefunction(self)
def __call__(self, request):
# Decide whether the toolbar is active for this request.
- show_toolbar = get_show_toolbar()
+ if self.async_mode:
+ return self.__acall__(request)
+ # Decide whether the toolbar is active for this request.
+ show_toolbar = get_show_toolbar(async_mode=self.async_mode)
+
if not show_toolbar(request) or DebugToolbar.is_toolbar_request(request):
return self.get_response(request)
-
toolbar = DebugToolbar(request, self.get_response)
-
# Activate instrumentation ie. monkey-patch.
for panel in toolbar.enabled_panels:
panel.enable_instrumentation()
@@ -63,6 +127,40 @@ def __call__(self, request):
for panel in reversed(toolbar.enabled_panels):
panel.disable_instrumentation()
+ return self._postprocess(request, response, toolbar)
+
+ async def __acall__(self, request):
+ # Decide whether the toolbar is active for this request.
+ show_toolbar = get_show_toolbar(async_mode=self.async_mode)
+
+ if not await show_toolbar(request) or DebugToolbar.is_toolbar_request(request):
+ response = await self.get_response(request)
+ return response
+
+ toolbar = DebugToolbar(request, self.get_response)
+
+ # Activate instrumentation ie. monkey-patch.
+ for panel in toolbar.enabled_panels:
+ if hasattr(panel, "aenable_instrumentation"):
+ await panel.aenable_instrumentation()
+ else:
+ panel.enable_instrumentation()
+ try:
+ # Run panels like Django middleware.
+ response = await toolbar.process_request(request)
+ finally:
+ clear_stack_trace_caches()
+ # Deactivate instrumentation ie. monkey-unpatch. This must run
+ # regardless of the response. Keep 'return' clauses below.
+ for panel in reversed(toolbar.enabled_panels):
+ panel.disable_instrumentation()
+
+ return self._postprocess(request, response, toolbar)
+
+ def _postprocess(self, request, response, toolbar):
+ """
+ Post-process the response.
+ """
# Generate the stats for all requests when the toolbar is being shown,
# but not necessarily inserted.
for panel in reversed(toolbar.enabled_panels):
@@ -77,13 +175,7 @@ def __call__(self, request):
response.headers[header] = value
# Check for responses where the toolbar can't be inserted.
- content_encoding = response.get("Content-Encoding", "")
- content_type = response.get("Content-Type", "").split(";")[0]
- if (
- getattr(response, "streaming", False)
- or content_encoding != ""
- or content_type not in _HTML_TYPES
- ):
+ if not is_processable_html_response(response):
return response
# Insert the toolbar in the response.
diff --git a/debug_toolbar/panels/__init__.py b/debug_toolbar/panels/__init__.py
index 57f385a5e..217708ec2 100644
--- a/debug_toolbar/panels/__init__.py
+++ b/debug_toolbar/panels/__init__.py
@@ -1,3 +1,4 @@
+from django.core.handlers.asgi import ASGIRequest
from django.template.loader import render_to_string
from debug_toolbar import settings as dt_settings
@@ -9,6 +10,8 @@ class Panel:
Base class for panels.
"""
+ is_async = False
+
def __init__(self, toolbar, get_response):
self.toolbar = toolbar
self.get_response = get_response
@@ -21,6 +24,10 @@ def panel_id(self):
@property
def enabled(self) -> bool:
+ # check if the panel is async compatible
+ if not self.is_async and isinstance(self.toolbar.request, ASGIRequest):
+ return False
+
# The user's cookies should override the default value
cookie_value = self.toolbar.request.COOKIES.get("djdt" + self.panel_id)
if cookie_value is not None:
@@ -147,6 +154,9 @@ def enable_instrumentation(self):
Unless the toolbar or this panel is disabled, this method will be
called early in ``DebugToolbarMiddleware``. It should be idempotent.
+
+ Add the ``aenable_instrumentation`` method to a panel subclass
+ to support async logic for instrumentation.
"""
def disable_instrumentation(self):
diff --git a/debug_toolbar/panels/alerts.py b/debug_toolbar/panels/alerts.py
new file mode 100644
index 000000000..c8e59002c
--- /dev/null
+++ b/debug_toolbar/panels/alerts.py
@@ -0,0 +1,153 @@
+from html.parser import HTMLParser
+
+from django.utils.translation import gettext_lazy as _
+
+from debug_toolbar.panels import Panel
+from debug_toolbar.utils import is_processable_html_response
+
+
+class FormParser(HTMLParser):
+ """
+ HTML form parser, used to check for invalid configurations of forms that
+ take file inputs.
+ """
+
+ def __init__(self):
+ super().__init__()
+ self.in_form = False
+ self.current_form = {}
+ self.forms = []
+ self.form_ids = []
+ self.referenced_file_inputs = []
+
+ def handle_starttag(self, tag, attrs):
+ attrs = dict(attrs)
+ if tag == "form":
+ self.in_form = True
+ form_id = attrs.get("id")
+ if form_id:
+ self.form_ids.append(form_id)
+ self.current_form = {
+ "file_form": False,
+ "form_attrs": attrs,
+ "submit_element_attrs": [],
+ }
+ elif (
+ self.in_form
+ and tag == "input"
+ and attrs.get("type") == "file"
+ and (not attrs.get("form") or attrs.get("form") == "")
+ ):
+ self.current_form["file_form"] = True
+ elif (
+ self.in_form
+ and (
+ (tag == "input" and attrs.get("type") in {"submit", "image"})
+ or tag == "button"
+ )
+ and (not attrs.get("form") or attrs.get("form") == "")
+ ):
+ self.current_form["submit_element_attrs"].append(attrs)
+ elif tag == "input" and attrs.get("form"):
+ self.referenced_file_inputs.append(attrs)
+
+ def handle_endtag(self, tag):
+ if tag == "form" and self.in_form:
+ self.forms.append(self.current_form)
+ self.in_form = False
+
+
+class AlertsPanel(Panel):
+ """
+ A panel to alert users to issues.
+ """
+
+ messages = {
+ "form_id_missing_enctype": _(
+ 'Form with id "{form_id}" contains file input, but does not have the attribute enctype="multipart/form-data".'
+ ),
+ "form_missing_enctype": _(
+ 'Form contains file input, but does not have the attribute enctype="multipart/form-data".'
+ ),
+ "input_refs_form_missing_enctype": _(
+ 'Input element references form with id "{form_id}", but the form does not have the attribute enctype="multipart/form-data".'
+ ),
+ }
+
+ title = _("Alerts")
+
+ is_async = True
+
+ template = "debug_toolbar/panels/alerts.html"
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ self.alerts = []
+
+ @property
+ def nav_subtitle(self):
+ if alerts := self.get_stats().get("alerts"):
+ alert_text = "alert" if len(alerts) == 1 else "alerts"
+ return f"{len(alerts)} {alert_text}"
+ else:
+ return ""
+
+ def add_alert(self, alert):
+ self.alerts.append(alert)
+
+ def check_invalid_file_form_configuration(self, html_content):
+ """
+ Inspects HTML content for a form that includes a file input but does
+ not have the encoding type set to multipart/form-data, and warns the
+ user if so.
+ """
+ parser = FormParser()
+ parser.feed(html_content)
+
+ # Check for file inputs directly inside a form that do not reference
+ # any form through the form attribute
+ for form in parser.forms:
+ if (
+ form["file_form"]
+ and form["form_attrs"].get("enctype") != "multipart/form-data"
+ and not any(
+ elem.get("formenctype") == "multipart/form-data"
+ for elem in form["submit_element_attrs"]
+ )
+ ):
+ if form_id := form["form_attrs"].get("id"):
+ alert = self.messages["form_id_missing_enctype"].format(
+ form_id=form_id
+ )
+ else:
+ alert = self.messages["form_missing_enctype"]
+ self.add_alert({"alert": alert})
+
+ # Check for file inputs that reference a form
+ form_attrs_by_id = {
+ form["form_attrs"].get("id"): form["form_attrs"] for form in parser.forms
+ }
+
+ for attrs in parser.referenced_file_inputs:
+ form_id = attrs.get("form")
+ if form_id and attrs.get("type") == "file":
+ form_attrs = form_attrs_by_id.get(form_id)
+ if form_attrs and form_attrs.get("enctype") != "multipart/form-data":
+ alert = self.messages["input_refs_form_missing_enctype"].format(
+ form_id=form_id
+ )
+ self.add_alert({"alert": alert})
+
+ return self.alerts
+
+ def generate_stats(self, request, response):
+ if not is_processable_html_response(response):
+ return
+
+ html_content = response.content.decode(response.charset)
+ self.check_invalid_file_form_configuration(html_content)
+
+ # Further alert checks can go here
+
+ # Write all alerts to record_stats
+ self.record_stats({"alerts": self.alerts})
diff --git a/debug_toolbar/panels/cache.py b/debug_toolbar/panels/cache.py
index 4c7bf5af7..1b15b446f 100644
--- a/debug_toolbar/panels/cache.py
+++ b/debug_toolbar/panels/cache.py
@@ -58,6 +58,8 @@ class CachePanel(Panel):
template = "debug_toolbar/panels/cache.html"
+ is_async = True
+
_context_locals = Local()
def __init__(self, *args, **kwargs):
@@ -66,7 +68,7 @@ def __init__(self, *args, **kwargs):
self.hits = 0
self.misses = 0
self.calls = []
- self.counts = {name: 0 for name in WRAPPED_CACHE_METHODS}
+ self.counts = dict.fromkeys(WRAPPED_CACHE_METHODS, 0)
@classmethod
def current_instance(cls):
diff --git a/debug_toolbar/panels/headers.py b/debug_toolbar/panels/headers.py
index e1ea6da1e..f6086d6e6 100644
--- a/debug_toolbar/panels/headers.py
+++ b/debug_toolbar/panels/headers.py
@@ -30,6 +30,8 @@ class HeadersPanel(Panel):
title = _("Headers")
+ is_async = True
+
template = "debug_toolbar/panels/headers.html"
def process_request(self, request):
diff --git a/debug_toolbar/panels/history/panel.py b/debug_toolbar/panels/history/panel.py
index 508a60577..56a891848 100644
--- a/debug_toolbar/panels/history/panel.py
+++ b/debug_toolbar/panels/history/panel.py
@@ -16,6 +16,7 @@
class HistoryPanel(Panel):
"""A panel to display History"""
+ is_async = True
title = _("History")
nav_title = _("History")
template = "debug_toolbar/panels/history.html"
diff --git a/debug_toolbar/panels/history/views.py b/debug_toolbar/panels/history/views.py
index 3fcbd9b32..fb6e28c93 100644
--- a/debug_toolbar/panels/history/views.py
+++ b/debug_toolbar/panels/history/views.py
@@ -1,11 +1,13 @@
from django.http import HttpResponseBadRequest, JsonResponse
from django.template.loader import render_to_string
+from debug_toolbar._compat import login_not_required
from debug_toolbar.decorators import render_with_toolbar_language, require_show_toolbar
from debug_toolbar.panels.history.forms import HistoryStoreForm
from debug_toolbar.toolbar import DebugToolbar
+@login_not_required
@require_show_toolbar
@render_with_toolbar_language
def history_sidebar(request):
@@ -37,6 +39,7 @@ def history_sidebar(request):
return HttpResponseBadRequest("Form errors")
+@login_not_required
@require_show_toolbar
@render_with_toolbar_language
def history_refresh(request):
diff --git a/debug_toolbar/panels/profiling.py b/debug_toolbar/panels/profiling.py
index 2b7742400..4613a3cad 100644
--- a/debug_toolbar/panels/profiling.py
+++ b/debug_toolbar/panels/profiling.py
@@ -59,7 +59,7 @@ def func_std_string(self): # match what old profile produced
# special case for built-in functions
name = func_name[2]
if name.startswith("<") and name.endswith(">"):
- return "{%s}" % name[1:-1]
+ return f"{{{name[1:-1]}}}"
else:
return name
else:
@@ -86,13 +86,11 @@ def func_std_string(self): # match what old profile produced
)
def subfuncs(self):
- i = 0
h, s, v = self.hsv
count = len(self.statobj.all_callees[self.func])
- for func, stats in self.statobj.all_callees[self.func].items():
- i += 1
- h1 = h + (i / count) / (self.depth + 1)
- s1 = 0 if stats[3] == 0 else s * (stats[3] / self.stats[3])
+ for i, (func, stats) in enumerate(self.statobj.all_callees[self.func].items()):
+ h1 = h + ((i + 1) / count) / (self.depth + 1)
+ s1 = 0 if self.stats[3] == 0 else s * (stats[3] / self.stats[3])
yield FunctionCall(
self.statobj,
func,
@@ -138,6 +136,7 @@ class ProfilingPanel(Panel):
Panel that displays profiling information.
"""
+ is_async = False
title = _("Profiling")
template = "debug_toolbar/panels/profiling.html"
diff --git a/debug_toolbar/panels/redirects.py b/debug_toolbar/panels/redirects.py
index 195d0cf11..8055c67ad 100644
--- a/debug_toolbar/panels/redirects.py
+++ b/debug_toolbar/panels/redirects.py
@@ -1,3 +1,5 @@
+from inspect import iscoroutine
+
from django.template.response import SimpleTemplateResponse
from django.utils.translation import gettext_lazy as _
@@ -11,20 +13,50 @@ class RedirectsPanel(Panel):
has_content = False
+ is_async = True
+
nav_title = _("Intercept redirects")
- def process_request(self, request):
- response = super().process_request(request)
+ def _process_response(self, response):
+ """
+ Common response processing logic.
+ """
if 300 <= response.status_code < 400:
- redirect_to = response.get("Location")
- if redirect_to:
- status_line = f"{response.status_code} {response.reason_phrase}"
- cookies = response.cookies
- context = {"redirect_to": redirect_to, "status_line": status_line}
- # Using SimpleTemplateResponse avoids running global context processors.
- response = SimpleTemplateResponse(
- "debug_toolbar/redirect.html", context
- )
- response.cookies = cookies
+ if redirect_to := response.get("Location"):
+ response = self.get_interception_response(response, redirect_to)
response.render()
return response
+
+ async def aprocess_request(self, request, response_coroutine):
+ """
+ Async version of process_request. used for accessing the response
+ by awaiting it when running in ASGI.
+ """
+
+ response = await response_coroutine
+ return self._process_response(response)
+
+ def process_request(self, request):
+ response = super().process_request(request)
+ if iscoroutine(response):
+ return self.aprocess_request(request, response)
+ return self._process_response(response)
+
+ def get_interception_response(self, response, redirect_to):
+ """
+ Hook method to allow subclasses to customize the interception response.
+ """
+ status_line = f"{response.status_code} {response.reason_phrase}"
+ cookies = response.cookies
+ original_response = response
+ context = {
+ "redirect_to": redirect_to,
+ "status_line": status_line,
+ "toolbar": self.toolbar,
+ "original_response": original_response,
+ }
+ # Using SimpleTemplateResponse avoids running global context processors.
+ response = SimpleTemplateResponse("debug_toolbar/redirect.html", context)
+ response.cookies = cookies
+ response.original_response = original_response
+ return response
diff --git a/debug_toolbar/panels/request.py b/debug_toolbar/panels/request.py
index a936eba6b..5a24d6179 100644
--- a/debug_toolbar/panels/request.py
+++ b/debug_toolbar/panels/request.py
@@ -3,7 +3,7 @@
from django.utils.translation import gettext_lazy as _
from debug_toolbar.panels import Panel
-from debug_toolbar.utils import get_name_from_obj, get_sorted_request_variable
+from debug_toolbar.utils import get_name_from_obj, sanitize_and_sort_request_vars
class RequestPanel(Panel):
@@ -26,9 +26,9 @@ def nav_subtitle(self):
def generate_stats(self, request, response):
self.record_stats(
{
- "get": get_sorted_request_variable(request.GET),
- "post": get_sorted_request_variable(request.POST),
- "cookies": get_sorted_request_variable(request.COOKIES),
+ "get": sanitize_and_sort_request_vars(request.GET),
+ "post": sanitize_and_sort_request_vars(request.POST),
+ "cookies": sanitize_and_sort_request_vars(request.COOKIES),
}
)
@@ -39,7 +39,7 @@ def generate_stats(self, request, response):
"view_urlname": "None",
}
try:
- match = resolve(request.path)
+ match = resolve(request.path_info)
func, args, kwargs = match
view_info["view_func"] = get_name_from_obj(func)
view_info["view_args"] = args
@@ -59,10 +59,5 @@ def generate_stats(self, request, response):
self.record_stats(view_info)
if hasattr(request, "session"):
- try:
- session_list = [
- (k, request.session.get(k)) for k in sorted(request.session.keys())
- ]
- except TypeError:
- session_list = [(k, request.session.get(k)) for k in request.session]
- self.record_stats({"session": {"list": session_list}})
+ session_data = dict(request.session)
+ self.record_stats({"session": sanitize_and_sort_request_vars(session_data)})
diff --git a/debug_toolbar/panels/settings.py b/debug_toolbar/panels/settings.py
index 7b27c6243..ff32bd2c0 100644
--- a/debug_toolbar/panels/settings.py
+++ b/debug_toolbar/panels/settings.py
@@ -14,6 +14,8 @@ class SettingsPanel(Panel):
template = "debug_toolbar/panels/settings.html"
+ is_async = True
+
nav_title = _("Settings")
def title(self):
diff --git a/debug_toolbar/panels/signals.py b/debug_toolbar/panels/signals.py
index 574948d6e..db0d4961d 100644
--- a/debug_toolbar/panels/signals.py
+++ b/debug_toolbar/panels/signals.py
@@ -28,6 +28,8 @@
class SignalsPanel(Panel):
template = "debug_toolbar/panels/signals.html"
+ is_async = True
+
SIGNALS = {
"request_started": request_started,
"request_finished": request_finished,
diff --git a/debug_toolbar/panels/sql/forms.py b/debug_toolbar/panels/sql/forms.py
index 0515c5c8e..1fa90ace4 100644
--- a/debug_toolbar/panels/sql/forms.py
+++ b/debug_toolbar/panels/sql/forms.py
@@ -5,7 +5,7 @@
from django.db import connections
from django.utils.functional import cached_property
-from debug_toolbar.panels.sql.utils import reformat_sql
+from debug_toolbar.panels.sql.utils import is_select_query, reformat_sql
class SQLSelectForm(forms.Form):
@@ -27,7 +27,7 @@ class SQLSelectForm(forms.Form):
def clean_raw_sql(self):
value = self.cleaned_data["raw_sql"]
- if not value.lower().strip().startswith("select"):
+ if not is_select_query(value):
raise ValidationError("Only 'select' queries are allowed.")
return value
@@ -44,7 +44,7 @@ def clean_alias(self):
value = self.cleaned_data["alias"]
if value not in connections:
- raise ValidationError("Database alias '%s' not found" % value)
+ raise ValidationError(f"Database alias '{value}' not found")
return value
diff --git a/debug_toolbar/panels/sql/panel.py b/debug_toolbar/panels/sql/panel.py
index 58c1c2738..206686352 100644
--- a/debug_toolbar/panels/sql/panel.py
+++ b/debug_toolbar/panels/sql/panel.py
@@ -2,6 +2,7 @@
from collections import defaultdict
from copy import copy
+from asgiref.sync import sync_to_async
from django.db import connections
from django.urls import path
from django.utils.translation import gettext_lazy as _, ngettext
@@ -12,7 +13,11 @@
from debug_toolbar.panels.sql import views
from debug_toolbar.panels.sql.forms import SQLSelectForm
from debug_toolbar.panels.sql.tracking import wrap_cursor
-from debug_toolbar.panels.sql.utils import contrasting_color_generator, reformat_sql
+from debug_toolbar.panels.sql.utils import (
+ contrasting_color_generator,
+ is_select_query,
+ reformat_sql,
+)
from debug_toolbar.utils import render_stacktrace
@@ -84,7 +89,7 @@ def _duplicate_query_key(query):
raw_params = () if query["raw_params"] is None else tuple(query["raw_params"])
# repr() avoids problems because of unhashable types
# (e.g. lists) when used as dictionary keys.
- # https://github.com/jazzband/django-debug-toolbar/issues/1091
+ # https://github.com/django-commons/django-debug-toolbar/issues/1091
return (query["raw_sql"], repr(raw_params))
@@ -109,6 +114,8 @@ class SQLPanel(Panel):
the request.
"""
+ is_async = True
+
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._sql_time = 0
@@ -186,6 +193,13 @@ def get_urls(cls):
path("sql_profile/", views.sql_profile, name="sql_profile"),
]
+ async def aenable_instrumentation(self):
+ """
+ Async version of enable instrumentation.
+ For async capable panels having async logic for instrumentation.
+ """
+ await sync_to_async(self.enable_instrumentation)()
+
def enable_instrumentation(self):
# This is thread-safe because database connections are thread-local.
for connection in connections.all():
@@ -264,9 +278,7 @@ def generate_stats(self, request, response):
query["sql"] = reformat_sql(query["sql"], with_toggle=True)
query["is_slow"] = query["duration"] > sql_warning_threshold
- query["is_select"] = (
- query["raw_sql"].lower().lstrip().startswith("select")
- )
+ query["is_select"] = is_select_query(query["raw_sql"])
query["rgb_color"] = self._databases[alias]["rgb_color"]
try:
diff --git a/debug_toolbar/panels/sql/tracking.py b/debug_toolbar/panels/sql/tracking.py
index b5fc81234..477106fdd 100644
--- a/debug_toolbar/panels/sql/tracking.py
+++ b/debug_toolbar/panels/sql/tracking.py
@@ -53,8 +53,8 @@ def cursor(*args, **kwargs):
# some code in the wild which does not follow that convention,
# so we pass on the arguments even though it's not clean.
# See:
- # https://github.com/jazzband/django-debug-toolbar/pull/615
- # https://github.com/jazzband/django-debug-toolbar/pull/896
+ # https://github.com/django-commons/django-debug-toolbar/pull/615
+ # https://github.com/django-commons/django-debug-toolbar/pull/896
logger = connection._djdt_logger
cursor = connection._djdt_cursor(*args, **kwargs)
if logger is None:
@@ -66,7 +66,7 @@ def cursor(*args, **kwargs):
def chunked_cursor(*args, **kwargs):
# prevent double wrapping
- # solves https://github.com/jazzband/django-debug-toolbar/issues/1239
+ # solves https://github.com/django-commons/django-debug-toolbar/issues/1239
logger = connection._djdt_logger
cursor = connection._djdt_chunked_cursor(*args, **kwargs)
if logger is not None and not isinstance(cursor, DjDTCursorWrapperMixin):
diff --git a/debug_toolbar/panels/sql/utils.py b/debug_toolbar/panels/sql/utils.py
index cb4eda348..305543aec 100644
--- a/debug_toolbar/panels/sql/utils.py
+++ b/debug_toolbar/panels/sql/utils.py
@@ -1,4 +1,4 @@
-from functools import lru_cache
+from functools import cache, lru_cache
from html import escape
import sqlparse
@@ -86,6 +86,11 @@ def process(stmt):
return "".join(escaped_value(token) for token in stmt.flatten())
+def is_select_query(sql):
+ # UNION queries can start with "(".
+ return sql.lower().lstrip(" (").startswith("select")
+
+
def reformat_sql(sql, *, with_toggle=False):
formatted = parse_sql(sql)
if not with_toggle:
@@ -102,7 +107,7 @@ def parse_sql(sql, *, simplify=False):
return "".join(stack.run(sql))
-@lru_cache(maxsize=None)
+@cache
def get_filter_stack(*, simplify):
stack = sqlparse.engine.FilterStack()
if simplify:
diff --git a/debug_toolbar/panels/sql/views.py b/debug_toolbar/panels/sql/views.py
index 4b6ced9da..b3ad6debb 100644
--- a/debug_toolbar/panels/sql/views.py
+++ b/debug_toolbar/panels/sql/views.py
@@ -2,6 +2,7 @@
from django.template.loader import render_to_string
from django.views.decorators.csrf import csrf_exempt
+from debug_toolbar._compat import login_not_required
from debug_toolbar.decorators import render_with_toolbar_language, require_show_toolbar
from debug_toolbar.forms import SignedDataForm
from debug_toolbar.panels.sql.forms import SQLSelectForm
@@ -17,6 +18,7 @@ def get_signed_data(request):
@csrf_exempt
+@login_not_required
@require_show_toolbar
@render_with_toolbar_language
def sql_select(request):
@@ -47,6 +49,7 @@ def sql_select(request):
@csrf_exempt
+@login_not_required
@require_show_toolbar
@render_with_toolbar_language
def sql_explain(request):
@@ -86,6 +89,7 @@ def sql_explain(request):
@csrf_exempt
+@login_not_required
@require_show_toolbar
@render_with_toolbar_language
def sql_profile(request):
diff --git a/debug_toolbar/panels/staticfiles.py b/debug_toolbar/panels/staticfiles.py
index 5f9efb5c3..9f1970ef6 100644
--- a/debug_toolbar/panels/staticfiles.py
+++ b/debug_toolbar/panels/staticfiles.py
@@ -1,11 +1,10 @@
import contextlib
+import uuid
from contextvars import ContextVar
from os.path import join, normpath
-from django.conf import settings
from django.contrib.staticfiles import finders, storage
-from django.core.checks import Warning
-from django.utils.functional import LazyObject
+from django.dispatch import Signal
from django.utils.translation import gettext_lazy as _, ngettext
from debug_toolbar import panels
@@ -16,8 +15,9 @@ class StaticFile:
Representing the different properties of a static file.
"""
- def __init__(self, path):
+ def __init__(self, *, path, url):
self.path = path
+ self._url = url
def __str__(self):
return self.path
@@ -26,47 +26,30 @@ def real_path(self):
return finders.find(self.path)
def url(self):
- return storage.staticfiles_storage.url(self.path)
+ return self._url
-# This will collect the StaticFile instances across threads.
-used_static_files = ContextVar("djdt_static_used_static_files")
+# This will record and map the StaticFile instances with its associated
+# request across threads and async concurrent requests state.
+request_id_context_var = ContextVar("djdt_request_id_store")
+record_static_file_signal = Signal()
-class DebugConfiguredStorage(LazyObject):
- """
- A staticfiles storage class to be used for collecting which paths
- are resolved by using the {% static %} template tag (which uses the
- `url` method).
- """
-
- def _setup(self):
- try:
- # From Django 4.2 use django.core.files.storage.storages in favor
- # of the deprecated django.core.files.storage.get_storage_class
- from django.core.files.storage import storages
-
- configured_storage_cls = storages["staticfiles"].__class__
- except ImportError:
- # Backwards compatibility for Django versions prior to 4.2
- from django.core.files.storage import get_storage_class
-
- configured_storage_cls = get_storage_class(settings.STATICFILES_STORAGE)
-
- class DebugStaticFilesStorage(configured_storage_cls):
- def url(self, path):
- with contextlib.suppress(LookupError):
- # For LookupError:
- # The ContextVar wasn't set yet. Since the toolbar wasn't properly
- # configured to handle this request, we don't need to capture
- # the static file.
- used_static_files.get().append(StaticFile(path))
- return super().url(path)
-
- self._wrapped = DebugStaticFilesStorage()
-
-
-_original_storage = storage.staticfiles_storage
+class URLMixin:
+ def url(self, path):
+ url = super().url(path)
+ with contextlib.suppress(LookupError):
+ # For LookupError:
+ # The ContextVar wasn't set yet. Since the toolbar wasn't properly
+ # configured to handle this request, we don't need to capture
+ # the static file.
+ request_id = request_id_context_var.get()
+ record_static_file_signal.send(
+ sender=self,
+ staticfile=StaticFile(path=str(path), url=url),
+ request_id=request_id,
+ )
+ return url
class StaticFilesPanel(panels.Panel):
@@ -74,6 +57,7 @@ class StaticFilesPanel(panels.Panel):
A panel to display the found staticfiles.
"""
+ is_async = True
name = "Static files"
template = "debug_toolbar/panels/staticfiles.html"
@@ -88,12 +72,30 @@ def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.num_found = 0
self.used_paths = []
+ self.request_id = str(uuid.uuid4())
+
+ @classmethod
+ def ready(cls):
+ cls = storage.staticfiles_storage.__class__
+ if URLMixin not in cls.mro():
+ cls.__bases__ = (URLMixin, *cls.__bases__)
+
+ def _store_static_files_signal_handler(self, sender, staticfile, **kwargs):
+ # Only record the static file if the request_id matches the one
+ # that was used to create the panel.
+ # as sender of the signal and this handler will have multiple
+ # concurrent connections and we want to avoid storing of same
+ # staticfile from other connections as well.
+ if request_id_context_var.get() == self.request_id:
+ self.used_paths.append(staticfile)
def enable_instrumentation(self):
- storage.staticfiles_storage = DebugConfiguredStorage()
+ self.ctx_token = request_id_context_var.set(self.request_id)
+ record_static_file_signal.connect(self._store_static_files_signal_handler)
def disable_instrumentation(self):
- storage.staticfiles_storage = _original_storage
+ record_static_file_signal.disconnect(self._store_static_files_signal_handler)
+ request_id_context_var.reset(self.ctx_token)
@property
def num_used(self):
@@ -109,17 +111,6 @@ def nav_subtitle(self):
"%(num_used)s file used", "%(num_used)s files used", num_used
) % {"num_used": num_used}
- def process_request(self, request):
- reset_token = used_static_files.set([])
- response = super().process_request(request)
- # Make a copy of the used paths so that when the
- # ContextVar is reset, our panel still has the data.
- self.used_paths = used_static_files.get().copy()
- # Reset the ContextVar to be empty again, removing the reference
- # to the list of used files.
- used_static_files.reset(reset_token)
- return response
-
def generate_stats(self, request, response):
self.record_stats(
{
@@ -178,27 +169,3 @@ def get_staticfiles_apps(self):
if app not in apps:
apps.append(app)
return apps
-
- @classmethod
- def run_checks(cls):
- """
- Check that the integration is configured correctly for the panel.
-
- Specifically look for static files that haven't been collected yet.
-
- Return a list of :class: `django.core.checks.CheckMessage` instances.
- """
- errors = []
- for finder in finders.get_finders():
- try:
- for path, finder_storage in finder.list([]):
- finder_storage.path(path)
- except OSError:
- errors.append(
- Warning(
- "debug_toolbar requires the STATICFILES_DIRS directories to exist.",
- hint="Running manage.py collectstatic may help uncover the issue.",
- id="debug_toolbar.staticfiles.W001",
- )
- )
- return errors
diff --git a/debug_toolbar/panels/templates/jinja2.py b/debug_toolbar/panels/templates/jinja2.py
new file mode 100644
index 000000000..d343cb140
--- /dev/null
+++ b/debug_toolbar/panels/templates/jinja2.py
@@ -0,0 +1,23 @@
+import functools
+
+from django.template.backends.jinja2 import Template as JinjaTemplate
+from django.template.context import make_context
+from django.test.signals import template_rendered
+
+
+def patch_jinja_render():
+ orig_render = JinjaTemplate.render
+
+ @functools.wraps(orig_render)
+ def wrapped_render(self, context=None, request=None):
+ # This patching of render only instruments the rendering
+ # of the immediate template. It won't include the parent template(s).
+ self.name = self.template.name
+ template_rendered.send(
+ sender=self, template=self, context=make_context(context, request)
+ )
+ return orig_render(self, context, request)
+
+ if JinjaTemplate.render != wrapped_render:
+ JinjaTemplate.original_render = JinjaTemplate.render
+ JinjaTemplate.render = wrapped_render
diff --git a/debug_toolbar/panels/templates/panel.py b/debug_toolbar/panels/templates/panel.py
index f8c9242ca..e9a5b4e83 100644
--- a/debug_toolbar/panels/templates/panel.py
+++ b/debug_toolbar/panels/templates/panel.py
@@ -1,4 +1,5 @@
from contextlib import contextmanager
+from importlib.util import find_spec
from os.path import normpath
from pprint import pformat, saferepr
@@ -15,6 +16,11 @@
from debug_toolbar.panels.sql.tracking import SQLQueryTriggered, allow_sql
from debug_toolbar.panels.templates import views
+if find_spec("jinja2"):
+ from debug_toolbar.panels.templates.jinja2 import patch_jinja_render
+
+ patch_jinja_render()
+
# Monkey-patch to enable the template_rendered signal. The receiver returns
# immediately when the panel is disabled to keep the overhead small.
@@ -25,7 +31,6 @@
Template.original_render = Template._render
Template._render = instrumented_test_render
-
# Monkey-patch to store items added by template context processors. The
# overhead is sufficiently small to justify enabling it unconditionally.
@@ -63,6 +68,8 @@ class TemplatesPanel(Panel):
A panel that lists all templates used during processing of a response.
"""
+ is_async = True
+
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.templates = []
@@ -154,11 +161,11 @@ def process_context_list(self, context_layers):
# QuerySet would trigger the database: user can run the
# query from SQL Panel
elif isinstance(value, (QuerySet, RawQuerySet)):
- temp_layer[
- key
- ] = f"<<{value.__class__.__name__.lower()} of {value.model._meta.label}>>"
+ temp_layer[key] = (
+ f"<<{value.__class__.__name__.lower()} of {value.model._meta.label}>>"
+ )
else:
- token = allow_sql.set(False) # noqa: FBT003
+ token = allow_sql.set(False)
try:
saferepr(value) # this MAY trigger a db query
except SQLQueryTriggered:
diff --git a/debug_toolbar/panels/templates/views.py b/debug_toolbar/panels/templates/views.py
index e65d1a9d5..b8a0a376f 100644
--- a/debug_toolbar/panels/templates/views.py
+++ b/debug_toolbar/panels/templates/views.py
@@ -5,9 +5,11 @@
from django.template.loader import render_to_string
from django.utils.html import format_html, mark_safe
+from debug_toolbar._compat import login_not_required
from debug_toolbar.decorators import render_with_toolbar_language, require_show_toolbar
+@login_not_required
@require_show_toolbar
@render_with_toolbar_language
def template_source(request):
@@ -25,15 +27,18 @@ def template_source(request):
template_name = request.GET.get("template", template_origin_name)
final_loaders = []
- loaders = Engine.get_default().template_loaders
+ loaders = list(Engine.get_default().template_loaders)
+
+ while loaders:
+ loader = loaders.pop(0)
- for loader in loaders:
if loader is not None:
- # When the loader has loaders associated with it,
- # append those loaders to the list. This occurs with
- # django.template.loaders.cached.Loader
+ # Recursively unwrap loaders until we get to loaders which do not
+ # themselves wrap other loaders. This adds support for
+ # django.template.loaders.cached.Loader and the
+ # django-template-partials loader (possibly among others)
if hasattr(loader, "loaders"):
- final_loaders += loader.loaders
+ loaders.extend(loader.loaders)
else:
final_loaders.append(loader)
@@ -54,7 +59,7 @@ def template_source(request):
except ModuleNotFoundError:
source = format_html("{}
", source)
else:
- source = highlight(source, HtmlDjangoLexer(), HtmlFormatter())
+ source = highlight(source, HtmlDjangoLexer(), HtmlFormatter(wrapcode=True))
source = mark_safe(source)
content = render_to_string(
diff --git a/debug_toolbar/panels/versions.py b/debug_toolbar/panels/versions.py
index d517ecfb3..77915e78b 100644
--- a/debug_toolbar/panels/versions.py
+++ b/debug_toolbar/panels/versions.py
@@ -12,9 +12,11 @@ class VersionsPanel(Panel):
Shows versions of Python, Django, and installed apps if possible.
"""
+ is_async = True
+
@property
def nav_subtitle(self):
- return "Django %s" % django.get_version()
+ return f"Django {django.get_version()}"
title = _("Versions")
diff --git a/debug_toolbar/settings.py b/debug_toolbar/settings.py
index 1df24527d..4dc801c2c 100644
--- a/debug_toolbar/settings.py
+++ b/debug_toolbar/settings.py
@@ -1,10 +1,21 @@
+import os
+import sys
import warnings
-from functools import lru_cache
+from functools import cache
from django.conf import settings
from django.dispatch import receiver
from django.test.signals import setting_changed
+
+def _is_running_tests():
+ """
+ Helper function to support testing default value for
+ IS_RUNNING_TESTS
+ """
+ return "test" in sys.argv or "PYTEST_VERSION" in os.environ
+
+
CONFIG_DEFAULTS = {
# Toolbar options
"DISABLE_PANELS": {
@@ -42,11 +53,12 @@
"SQL_WARNING_THRESHOLD": 500, # milliseconds
"OBSERVE_REQUEST_CALLBACK": "debug_toolbar.toolbar.observe_request",
"TOOLBAR_LANGUAGE": None,
+ "IS_RUNNING_TESTS": _is_running_tests(),
"UPDATE_ON_FETCH": False,
}
-@lru_cache(maxsize=None)
+@cache
def get_config():
USER_CONFIG = getattr(settings, "DEBUG_TOOLBAR_CONFIG", {})
CONFIG = CONFIG_DEFAULTS.copy()
@@ -64,6 +76,7 @@ def get_config():
"debug_toolbar.panels.sql.SQLPanel",
"debug_toolbar.panels.staticfiles.StaticFilesPanel",
"debug_toolbar.panels.templates.TemplatesPanel",
+ "debug_toolbar.panels.alerts.AlertsPanel",
"debug_toolbar.panels.cache.CachePanel",
"debug_toolbar.panels.signals.SignalsPanel",
"debug_toolbar.panels.redirects.RedirectsPanel",
@@ -71,7 +84,7 @@ def get_config():
]
-@lru_cache(maxsize=None)
+@cache
def get_panels():
try:
PANELS = list(settings.DEBUG_TOOLBAR_PANELS)
diff --git a/debug_toolbar/static/debug_toolbar/css/toolbar.css b/debug_toolbar/static/debug_toolbar/css/toolbar.css
index a35286a1f..3a8d5628f 100644
--- a/debug_toolbar/static/debug_toolbar/css/toolbar.css
+++ b/debug_toolbar/static/debug_toolbar/css/toolbar.css
@@ -4,17 +4,63 @@
--djdt-font-family-primary: "Segoe UI", system-ui, Roboto, "Helvetica Neue",
Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
"Segoe UI Symbol", "Noto Color Emoji";
- --djdt-font-family-monospace: ui-monospace, Menlo, Monaco, "Cascadia Mono",
+ --djdt-font-family-monospace:
+ ui-monospace, Menlo, Monaco, "Cascadia Mono",
"Segoe UI Mono", "Roboto Mono", "Oxygen Mono", "Ubuntu Monospace",
"Source Code Pro", "Fira Mono", "Droid Sans Mono", "Courier New",
monospace, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol",
"Noto Color Emoji";
}
+:root,
+#djDebug[data-theme="light"] {
+ --djdt-font-color: black;
+ --djdt-background-color: white;
+ --djdt-panel-content-background-color: #eee;
+ --djdt-panel-content-table-background-color: var(--djdt-background-color);
+ --djdt-panel-title-background-color: #ffc;
+ --djdt-djdt-panel-content-table-strip-background-color: #f5f5f5;
+ --djdt--highlighted-background-color: lightgrey;
+ --djdt-toggle-template-background-color: #bbb;
+
+ --djdt-sql-font-color: #333;
+ --djdt-pre-text-color: #555;
+ --djdt-path-and-locals: #777;
+ --djdt-stack-span-color: black;
+ --djdt-template-highlight-color: #333;
+
+ --djdt-table-border-color: #ccc;
+ --djdt-button-border-color: var(--djdt-table-border-color);
+ --djdt-pre-border-color: var(--djdt-table-border-color);
+ --djdt-raw-border-color: var(--djdt-table-border-color);
+}
+
+#djDebug[data-theme="dark"] {
+ --djdt-font-color: #f8f8f2;
+ --djdt-background-color: #1e293bff;
+ --djdt-panel-content-background-color: #0f1729ff;
+ --djdt-panel-content-table-background-color: var(--djdt-background-color);
+ --djdt-panel-title-background-color: #242432;
+ --djdt-djdt-panel-content-table-strip-background-color: #324154ff;
+ --djdt--highlighted-background-color: #2c2a7dff;
+ --djdt-toggle-template-background-color: #282755;
+
+ --djdt-sql-font-color: var(--djdt-font-color);
+ --djdt-pre-text-color: var(--djdt-font-color);
+ --djdt-path-and-locals: #65758cff;
+ --djdt-stack-span-color: #7c8fa4;
+ --djdt-template-highlight-color: var(--djdt-stack-span-color);
+
+ --djdt-table-border-color: #324154ff;
+ --djdt-button-border-color: var(--djdt-table-border-color);
+ --djdt-pre-border-color: var(--djdt-table-border-color);
+ --djdt-raw-border-color: var(--djdt-table-border-color);
+}
+
/* Debug Toolbar CSS Reset, adapted from Eric Meyer's CSS Reset */
#djDebug {
- color: #000;
- background: #fff;
+ color: var(--djdt-font-color);
+ background: var(--djdt-background-color);
}
#djDebug,
#djDebug div,
@@ -81,13 +127,15 @@
#djDebug button {
margin: 0;
padding: 0;
- min-width: 0;
+ min-width: auto;
width: auto;
+ min-height: auto;
+ height: auto;
border: 0;
outline: 0;
font-size: 12px;
line-height: 1.5em;
- color: #000;
+ color: var(--djdt-font-color);
vertical-align: baseline;
background-color: transparent;
font-family: var(--djdt-font-family-primary);
@@ -100,7 +148,7 @@
#djDebug button {
background-color: #eee;
background-image: linear-gradient(to bottom, #eee, #cccccc);
- border: 1px solid #ccc;
+ border: 1px solid var(--djdt-button-border-color);
border-bottom: 1px solid #bbb;
border-radius: 3px;
color: #333;
@@ -234,7 +282,7 @@
font-size: 22px;
font-weight: bold;
background: #000;
- opacity: 0.5;
+ opacity: 0.6;
}
#djDebug #djShowToolBarButton:hover {
@@ -268,10 +316,10 @@
#djDebug pre {
white-space: pre-wrap;
- color: #555;
- border: 1px solid #ccc;
+ color: var(--djdt-pre-text-color);
+ border: 1px solid var(--djdt-pre-border-color);
border-collapse: collapse;
- background-color: #fff;
+ background-color: var(--djdt-background-color);
padding: 2px 3px;
margin-bottom: 3px;
}
@@ -283,7 +331,7 @@
right: 220px;
bottom: 0;
left: 0px;
- background-color: #eee;
+ background-color: var(--djdt-panel-content-background-color);
color: #666;
z-index: 100000000;
}
@@ -294,7 +342,7 @@
#djDebug .djDebugPanelTitle {
position: absolute;
- background-color: #ffc;
+ background-color: var(--djdt-panel-title-background-color);
color: #666;
padding-left: 20px;
top: 0;
@@ -357,16 +405,16 @@
}
#djDebug .djdt-panelContent table {
- border: 1px solid #ccc;
+ border: 1px solid var(--djdt-table-border-color);
border-collapse: collapse;
width: 100%;
- background-color: #fff;
+ background-color: var(--djdt-panel-content-table-background-color);
display: table;
margin-top: 0.8em;
overflow: auto;
}
#djDebug .djdt-panelContent tbody > tr:nth-child(odd):not(.djdt-highlighted) {
- background-color: #f5f5f5;
+ background-color: var(--djdt-panel-content-table-strip-background-color);
}
#djDebug .djdt-panelContent tbody td,
#djDebug .djdt-panelContent tbody th {
@@ -392,7 +440,7 @@
}
#djDebug .djTemplateContext {
- background-color: #fff;
+ background-color: var(--djdt-background-color);
}
#djDebug .djdt-panelContent .djDebugClose {
@@ -433,7 +481,7 @@
#djDebug a.toggleTemplate {
padding: 4px;
- background-color: #bbb;
+ background-color: var(--djdt-toggle-template-background-color);
border-radius: 3px;
}
@@ -445,11 +493,11 @@
}
#djDebug .djDebugCollapsed {
- color: #333;
+ color: var(--djdt-sql-font-color);
}
#djDebug .djDebugUncollapsed {
- color: #333;
+ color: var(--djdt-sql-font-color);
}
#djDebug .djUnselected {
@@ -483,67 +531,530 @@
}
#djDebug .highlight {
- color: #000;
+ color: var(--djdt-font-color);
}
#djDebug .highlight .err {
- color: #000;
+ color: var(--djdt-font-color);
} /* Error */
-#djDebug .highlight .g {
- color: #000;
-} /* Generic */
-#djDebug .highlight .k {
- color: #000;
+
+/*
+Styles for pygments HTMLFormatter
+
+- This should match debug_toolbar/panels/templates/views.py::template_source
+- Each line needs to be prefixed with #djDebug .highlight as well.
+- The .w definition needs to include:
+ white-space: pre-wrap
+
+To regenerate:
+
+ from pygments.formatters import HtmlFormatter
+ print(HtmlFormatter(wrapcode=True).get_style_defs())
+ */
+#djDebug[data-theme="light"] .highlight pre {
+ line-height: 125%;
+}
+#djDebug[data-theme="light"] .highlight td.linenos .normal {
+ color: inherit;
+ background-color: transparent;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+#djDebug[data-theme="light"] .highlight span.linenos {
+ color: inherit;
+ background-color: transparent;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+#djDebug[data-theme="light"] .highlight td.linenos .special {
+ color: #000000;
+ background-color: #ffffc0;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+#djDebug[data-theme="light"] .highlight span.linenos.special {
+ color: #000000;
+ background-color: #ffffc0;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+#djDebug[data-theme="light"] .highlight .hll {
+ background-color: #ffffcc;
+}
+#djDebug[data-theme="light"] .highlight .c {
+ color: #3d7b7b;
+ font-style: italic;
+} /* Comment */
+#djDebug[data-theme="light"] .highlight .err {
+ border: 1px solid #ff0000;
+} /* Error */
+#djDebug[data-theme="light"] .highlight .k {
+ color: #008000;
font-weight: bold;
} /* Keyword */
-#djDebug .highlight .o {
- color: #000;
+#djDebug[data-theme="light"] .highlight .o {
+ color: #666666;
} /* Operator */
-#djDebug .highlight .n {
- color: #000;
-} /* Name */
-#djDebug .highlight .mi {
- color: #000;
+#djDebug[data-theme="light"] .highlight .ch {
+ color: #3d7b7b;
+ font-style: italic;
+} /* Comment.Hashbang */
+#djDebug[data-theme="light"] .highlight .cm {
+ color: #3d7b7b;
+ font-style: italic;
+} /* Comment.Multiline */
+#djDebug[data-theme="light"] .highlight .cp {
+ color: #9c6500;
+} /* Comment.Preproc */
+#djDebug[data-theme="light"] .highlight .cpf {
+ color: #3d7b7b;
+ font-style: italic;
+} /* Comment.PreprocFile */
+#djDebug[data-theme="light"] .highlight .c1 {
+ color: #3d7b7b;
+ font-style: italic;
+} /* Comment.Single */
+#djDebug[data-theme="light"] .highlight .cs {
+ color: #3d7b7b;
+ font-style: italic;
+} /* Comment.Special */
+#djDebug[data-theme="light"] .highlight .gd {
+ color: #a00000;
+} /* Generic.Deleted */
+#djDebug[data-theme="light"] .highlight .ge {
+ font-style: italic;
+} /* Generic.Emph */
+#djDebug[data-theme="light"] .highlight .ges {
+ font-weight: bold;
+ font-style: italic;
+} /* Generic.EmphStrong */
+#djDebug[data-theme="light"] .highlight .gr {
+ color: #e40000;
+} /* Generic.Error */
+#djDebug[data-theme="light"] .highlight .gh {
+ color: #000080;
+ font-weight: bold;
+} /* Generic.Heading */
+#djDebug[data-theme="light"] .highlight .gi {
+ color: #008400;
+} /* Generic.Inserted */
+#djDebug[data-theme="light"] .highlight .go {
+ color: #717171;
+} /* Generic.Output */
+#djDebug[data-theme="light"] .highlight .gp {
+ color: #000080;
+ font-weight: bold;
+} /* Generic.Prompt */
+#djDebug[data-theme="light"] .highlight .gs {
+ font-weight: bold;
+} /* Generic.Strong */
+#djDebug[data-theme="light"] .highlight .gu {
+ color: #800080;
+ font-weight: bold;
+} /* Generic.Subheading */
+#djDebug[data-theme="light"] .highlight .gt {
+ color: #0044dd;
+} /* Generic.Traceback */
+#djDebug[data-theme="light"] .highlight .kc {
+ color: #008000;
+ font-weight: bold;
+} /* Keyword.Constant */
+#djDebug[data-theme="light"] .highlight .kd {
+ color: #008000;
+ font-weight: bold;
+} /* Keyword.Declaration */
+#djDebug[data-theme="light"] .highlight .kn {
+ color: #008000;
+ font-weight: bold;
+} /* Keyword.Namespace */
+#djDebug[data-theme="light"] .highlight .kp {
+ color: #008000;
+} /* Keyword.Pseudo */
+#djDebug[data-theme="light"] .highlight .kr {
+ color: #008000;
+ font-weight: bold;
+} /* Keyword.Reserved */
+#djDebug[data-theme="light"] .highlight .kt {
+ color: #b00040;
+} /* Keyword.Type */
+#djDebug[data-theme="light"] .highlight .m {
+ color: #666666;
+} /* Literal.Number */
+#djDebug[data-theme="light"] .highlight .s {
+ color: #ba2121;
+} /* Literal.String */
+#djDebug[data-theme="light"] .highlight .na {
+ color: #687822;
+} /* Name.Attribute */
+#djDebug[data-theme="light"] .highlight .nb {
+ color: #008000;
+} /* Name.Builtin */
+#djDebug[data-theme="light"] .highlight .nc {
+ color: #0000ff;
+ font-weight: bold;
+} /* Name.Class */
+#djDebug[data-theme="light"] .highlight .no {
+ color: #880000;
+} /* Name.Constant */
+#djDebug[data-theme="light"] .highlight .nd {
+ color: #aa22ff;
+} /* Name.Decorator */
+#djDebug[data-theme="light"] .highlight .ni {
+ color: #717171;
+ font-weight: bold;
+} /* Name.Entity */
+#djDebug[data-theme="light"] .highlight .ne {
+ color: #cb3f38;
font-weight: bold;
+} /* Name.Exception */
+#djDebug[data-theme="light"] .highlight .nf {
+ color: #0000ff;
+} /* Name.Function */
+#djDebug[data-theme="light"] .highlight .nl {
+ color: #767600;
+} /* Name.Label */
+#djDebug[data-theme="light"] .highlight .nn {
+ color: #0000ff;
+ font-weight: bold;
+} /* Name.Namespace */
+#djDebug[data-theme="light"] .highlight .nt {
+ color: #008000;
+ font-weight: bold;
+} /* Name.Tag */
+#djDebug[data-theme="light"] .highlight .nv {
+ color: #19177c;
+} /* Name.Variable */
+#djDebug[data-theme="light"] .highlight .ow {
+ color: #aa22ff;
+ font-weight: bold;
+} /* Operator.Word */
+#djDebug[data-theme="light"] .highlight .w {
+ color: #bbbbbb;
+ white-space: pre-wrap;
+} /* Text.Whitespace */
+#djDebug[data-theme="light"] .highlight .mb {
+ color: #666666;
+} /* Literal.Number.Bin */
+#djDebug[data-theme="light"] .highlight .mf {
+ color: #666666;
+} /* Literal.Number.Float */
+#djDebug[data-theme="light"] .highlight .mh {
+ color: #666666;
+} /* Literal.Number.Hex */
+#djDebug[data-theme="light"] .highlight .mi {
+ color: #666666;
} /* Literal.Number.Integer */
-#djDebug .highlight .l {
- color: #000;
+#djDebug[data-theme="light"] .highlight .mo {
+ color: #666666;
+} /* Literal.Number.Oct */
+#djDebug[data-theme="light"] .highlight .sa {
+ color: #ba2121;
+} /* Literal.String.Affix */
+#djDebug[data-theme="light"] .highlight .sb {
+ color: #ba2121;
+} /* Literal.String.Backtick */
+#djDebug[data-theme="light"] .highlight .sc {
+ color: #ba2121;
+} /* Literal.String.Char */
+#djDebug[data-theme="light"] .highlight .dl {
+ color: #ba2121;
+} /* Literal.String.Delimiter */
+#djDebug[data-theme="light"] .highlight .sd {
+ color: #ba2121;
+ font-style: italic;
+} /* Literal.String.Doc */
+#djDebug[data-theme="light"] .highlight .s2 {
+ color: #ba2121;
+} /* Literal.String.Double */
+#djDebug[data-theme="light"] .highlight .se {
+ color: #aa5d1f;
+ font-weight: bold;
+} /* Literal.String.Escape */
+#djDebug[data-theme="light"] .highlight .sh {
+ color: #ba2121;
+} /* Literal.String.Heredoc */
+#djDebug[data-theme="light"] .highlight .si {
+ color: #a45a77;
+ font-weight: bold;
+} /* Literal.String.Interpol */
+#djDebug[data-theme="light"] .highlight .sx {
+ color: #008000;
+} /* Literal.String.Other */
+#djDebug[data-theme="light"] .highlight .sr {
+ color: #a45a77;
+} /* Literal.String.Regex */
+#djDebug[data-theme="light"] .highlight .s1 {
+ color: #ba2121;
+} /* Literal.String.Single */
+#djDebug[data-theme="light"] .highlight .ss {
+ color: #19177c;
+} /* Literal.String.Symbol */
+#djDebug[data-theme="light"] .highlight .bp {
+ color: #008000;
+} /* Name.Builtin.Pseudo */
+#djDebug[data-theme="light"] .highlight .fm {
+ color: #0000ff;
+} /* Name.Function.Magic */
+#djDebug[data-theme="light"] .highlight .vc {
+ color: #19177c;
+} /* Name.Variable.Class */
+#djDebug[data-theme="light"] .highlight .vg {
+ color: #19177c;
+} /* Name.Variable.Global */
+#djDebug[data-theme="light"] .highlight .vi {
+ color: #19177c;
+} /* Name.Variable.Instance */
+#djDebug[data-theme="light"] .highlight .vm {
+ color: #19177c;
+} /* Name.Variable.Magic */
+#djDebug[data-theme="light"] .highlight .il {
+ color: #666666;
+} /* Literal.Number.Integer.Long */
+
+#djDebug[data-theme="dark"] .highlight .hll {
+ background-color: #f1fa8c;
+}
+#djDebug[data-theme="dark"] .highlight {
+ background: #282a36;
+ color: #f8f8f2;
+}
+#djDebug[data-theme="dark"] .highlight .c {
+ color: #6272a4;
+} /* Comment */
+#djDebug[data-theme="dark"] .highlight .err {
+ color: #f8f8f2;
+} /* Error */
+#djDebug[data-theme="dark"] .highlight .g {
+ color: #f8f8f2;
+} /* Generic */
+#djDebug[data-theme="dark"] .highlight .k {
+ color: #ff79c6;
+} /* Keyword */
+#djDebug[data-theme="dark"] .highlight .l {
+ color: #f8f8f2;
} /* Literal */
-#djDebug .highlight .x {
- color: #000;
+#djDebug[data-theme="dark"] .highlight .n {
+ color: #f8f8f2;
+} /* Name */
+#djDebug[data-theme="dark"] .highlight .o {
+ color: #ff79c6;
+} /* Operator */
+#djDebug[data-theme="dark"] .highlight .x {
+ color: #f8f8f2;
} /* Other */
-#djDebug .highlight .p {
- color: #000;
+#djDebug[data-theme="dark"] .highlight .p {
+ color: #f8f8f2;
} /* Punctuation */
-#djDebug .highlight .m {
- color: #000;
+#djDebug[data-theme="dark"] .highlight .ch {
+ color: #6272a4;
+} /* Comment.Hashbang */
+#djDebug[data-theme="dark"] .highlight .cm {
+ color: #6272a4;
+} /* Comment.Multiline */
+#djDebug[data-theme="dark"] .highlight .cp {
+ color: #ff79c6;
+} /* Comment.Preproc */
+#djDebug[data-theme="dark"] .highlight .cpf {
+ color: #6272a4;
+} /* Comment.PreprocFile */
+#djDebug[data-theme="dark"] .highlight .c1 {
+ color: #6272a4;
+} /* Comment.Single */
+#djDebug[data-theme="dark"] .highlight .cs {
+ color: #6272a4;
+} /* Comment.Special */
+#djDebug[data-theme="dark"] .highlight .gd {
+ color: #8b080b;
+} /* Generic.Deleted */
+#djDebug[data-theme="dark"] .highlight .ge {
+ color: #f8f8f2;
+ text-decoration: underline;
+} /* Generic.Emph */
+#djDebug[data-theme="dark"] .highlight .gr {
+ color: #f8f8f2;
+} /* Generic.Error */
+#djDebug[data-theme="dark"] .highlight .gh {
+ color: #f8f8f2;
font-weight: bold;
+} /* Generic.Heading */
+#djDebug[data-theme="dark"] .highlight .gi {
+ color: #f8f8f2;
+ font-weight: bold;
+} /* Generic.Inserted */
+#djDebug[data-theme="dark"] .highlight .go {
+ color: #44475a;
+} /* Generic.Output */
+#djDebug[data-theme="dark"] .highlight .gp {
+ color: #f8f8f2;
+} /* Generic.Prompt */
+#djDebug[data-theme="dark"] .highlight .gs {
+ color: #f8f8f2;
+} /* Generic.Strong */
+#djDebug[data-theme="dark"] .highlight .gu {
+ color: #f8f8f2;
+ font-weight: bold;
+} /* Generic.Subheading */
+#djDebug[data-theme="dark"] .highlight .gt {
+ color: #f8f8f2;
+} /* Generic.Traceback */
+#djDebug[data-theme="dark"] .highlight .kc {
+ color: #ff79c6;
+} /* Keyword.Constant */
+#djDebug[data-theme="dark"] .highlight .kd {
+ color: #8be9fd;
+ font-style: italic;
+} /* Keyword.Declaration */
+#djDebug[data-theme="dark"] .highlight .kn {
+ color: #ff79c6;
+} /* Keyword.Namespace */
+#djDebug[data-theme="dark"] .highlight .kp {
+ color: #ff79c6;
+} /* Keyword.Pseudo */
+#djDebug[data-theme="dark"] .highlight .kr {
+ color: #ff79c6;
+} /* Keyword.Reserved */
+#djDebug[data-theme="dark"] .highlight .kt {
+ color: #8be9fd;
+} /* Keyword.Type */
+#djDebug[data-theme="dark"] .highlight .ld {
+ color: #f8f8f2;
+} /* Literal.Date */
+#djDebug[data-theme="dark"] .highlight .m {
+ color: #bd93f9;
} /* Literal.Number */
-#djDebug .highlight .s {
- color: #333;
+#djDebug[data-theme="dark"] .highlight .s {
+ color: #f1fa8c;
} /* Literal.String */
-#djDebug .highlight .w {
- color: #888888;
-} /* Text.Whitespace */
-#djDebug .highlight .il {
- color: #000;
- font-weight: bold;
-} /* Literal.Number.Integer.Long */
-#djDebug .highlight .na {
- color: #333;
+#djDebug[data-theme="dark"] .highlight .na {
+ color: #50fa7b;
} /* Name.Attribute */
-#djDebug .highlight .nt {
- color: #000;
- font-weight: bold;
+#djDebug[data-theme="dark"] .highlight .nb {
+ color: #8be9fd;
+ font-style: italic;
+} /* Name.Builtin */
+#djDebug[data-theme="dark"] .highlight .nc {
+ color: #50fa7b;
+} /* Name.Class */
+#djDebug[data-theme="dark"] .highlight .no {
+ color: #f8f8f2;
+} /* Name.Constant */
+#djDebug[data-theme="dark"] .highlight .nd {
+ color: #f8f8f2;
+} /* Name.Decorator */
+#djDebug[data-theme="dark"] .highlight .ni {
+ color: #f8f8f2;
+} /* Name.Entity */
+#djDebug[data-theme="dark"] .highlight .ne {
+ color: #f8f8f2;
+} /* Name.Exception */
+#djDebug[data-theme="dark"] .highlight .nf {
+ color: #50fa7b;
+} /* Name.Function */
+#djDebug[data-theme="dark"] .highlight .nl {
+ color: #8be9fd;
+ font-style: italic;
+} /* Name.Label */
+#djDebug[data-theme="dark"] .highlight .nn {
+ color: #f8f8f2;
+} /* Name.Namespace */
+#djDebug[data-theme="dark"] .highlight .nx {
+ color: #f8f8f2;
+} /* Name.Other */
+#djDebug[data-theme="dark"] .highlight .py {
+ color: #f8f8f2;
+} /* Name.Property */
+#djDebug[data-theme="dark"] .highlight .nt {
+ color: #ff79c6;
} /* Name.Tag */
-#djDebug .highlight .nv {
- color: #333;
+#djDebug[data-theme="dark"] .highlight .nv {
+ color: #8be9fd;
+ font-style: italic;
} /* Name.Variable */
-#djDebug .highlight .s2 {
- color: #333;
+#djDebug[data-theme="dark"] .highlight .ow {
+ color: #ff79c6;
+} /* Operator.Word */
+#djDebug[data-theme="dark"] .highlight .w {
+ color: #f8f8f2;
+} /* Text.Whitespace */
+#djDebug[data-theme="dark"] .highlight .mb {
+ color: #bd93f9;
+} /* Literal.Number.Bin */
+#djDebug[data-theme="dark"] .highlight .mf {
+ color: #bd93f9;
+} /* Literal.Number.Float */
+#djDebug[data-theme="dark"] .highlight .mh {
+ color: #bd93f9;
+} /* Literal.Number.Hex */
+#djDebug[data-theme="dark"] .highlight .mi {
+ color: #bd93f9;
+} /* Literal.Number.Integer */
+#djDebug[data-theme="dark"] .highlight .mo {
+ color: #bd93f9;
+} /* Literal.Number.Oct */
+#djDebug[data-theme="dark"] .highlight .sa {
+ color: #f1fa8c;
+} /* Literal.String.Affix */
+#djDebug[data-theme="dark"] .highlight .sb {
+ color: #f1fa8c;
+} /* Literal.String.Backtick */
+#djDebug[data-theme="dark"] .highlight .sc {
+ color: #f1fa8c;
+} /* Literal.String.Char */
+#djDebug[data-theme="dark"] .highlight .dl {
+ color: #f1fa8c;
+} /* Literal.String.Delimiter */
+#djDebug[data-theme="dark"] .highlight .sd {
+ color: #f1fa8c;
+} /* Literal.String.Doc */
+#djDebug[data-theme="dark"] .highlight .s2 {
+ color: #f1fa8c;
} /* Literal.String.Double */
-#djDebug .highlight .cp {
- color: #333;
-} /* Comment.Preproc */
+#djDebug[data-theme="dark"] .highlight .se {
+ color: #f1fa8c;
+} /* Literal.String.Escape */
+#djDebug[data-theme="dark"] .highlight .sh {
+ color: #f1fa8c;
+} /* Literal.String.Heredoc */
+#djDebug[data-theme="dark"] .highlight .si {
+ color: #f1fa8c;
+} /* Literal.String.Interpol */
+#djDebug[data-theme="dark"] .highlight .sx {
+ color: #f1fa8c;
+} /* Literal.String.Other */
+#djDebug[data-theme="dark"] .highlight .sr {
+ color: #f1fa8c;
+} /* Literal.String.Regex */
+#djDebug[data-theme="dark"] .highlight .s1 {
+ color: #f1fa8c;
+} /* Literal.String.Single */
+#djDebug[data-theme="dark"] .highlight .ss {
+ color: #f1fa8c;
+} /* Literal.String.Symbol */
+#djDebug[data-theme="dark"] .highlight .bp {
+ color: #f8f8f2;
+ font-style: italic;
+} /* Name.Builtin.Pseudo */
+#djDebug[data-theme="dark"] .highlight .fm {
+ color: #50fa7b;
+} /* Name.Function.Magic */
+#djDebug[data-theme="dark"] .highlight .vc {
+ color: #8be9fd;
+ font-style: italic;
+} /* Name.Variable.Class */
+#djDebug[data-theme="dark"] .highlight .vg {
+ color: #8be9fd;
+ font-style: italic;
+} /* Name.Variable.Global */
+#djDebug[data-theme="dark"] .highlight .vi {
+ color: #8be9fd;
+ font-style: italic;
+} /* Name.Variable.Instance */
+#djDebug[data-theme="dark"] .highlight .vm {
+ color: #8be9fd;
+ font-style: italic;
+} /* Name.Variable.Magic */
+#djDebug[data-theme="dark"] .highlight .il {
+ color: #bd93f9;
+} /* Literal.Number.Integer.Long */
#djDebug svg.djDebugLineChart {
width: 100%;
@@ -595,13 +1106,13 @@
}
#djDebug .djdt-stack span {
- color: #000;
+ color: var(--djdt-stack-span-color);
font-weight: bold;
}
#djDebug .djdt-stack span.djdt-path,
#djDebug .djdt-stack pre.djdt-locals,
#djDebug .djdt-stack pre.djdt-locals span {
- color: #777;
+ color: var(--djdt-path-and-locals);
font-weight: normal;
}
#djDebug .djdt-stack span.djdt-code {
@@ -612,7 +1123,7 @@
}
#djDebug .djdt-raw {
background-color: #fff;
- border: 1px solid #ccc;
+ border: 1px solid var(--djdt-raw-border-color);
margin-top: 0.8em;
padding: 5px;
white-space: pre-wrap;
@@ -631,7 +1142,7 @@
max-height: 100%;
}
#djDebug .djdt-highlighted {
- background-color: lightgrey;
+ background-color: var(--djdt--highlighted-background-color);
}
#djDebug tr.djdt-highlighted.djdt-profile-row {
background-color: #ffc;
@@ -654,3 +1165,19 @@
.djdt-hidden {
display: none;
}
+
+#djDebug #djDebugToolbar a#djToggleThemeButton {
+ display: flex;
+ align-items: center;
+ cursor: pointer;
+}
+#djToggleThemeButton > svg {
+ margin-left: auto;
+}
+#djDebug[data-user-theme="light"] #djToggleThemeButton svg.theme-light,
+#djDebug[data-user-theme="dark"] #djToggleThemeButton svg.theme-dark,
+#djDebug[data-user-theme="auto"] #djToggleThemeButton svg.theme-auto {
+ display: block;
+ height: 1rem;
+ width: 1rem;
+}
diff --git a/debug_toolbar/static/debug_toolbar/js/history.js b/debug_toolbar/static/debug_toolbar/js/history.js
index 314ddb3ef..d10156660 100644
--- a/debug_toolbar/static/debug_toolbar/js/history.js
+++ b/debug_toolbar/static/debug_toolbar/js/history.js
@@ -14,11 +14,7 @@ function difference(setA, setB) {
* Create an array of dataset properties from a NodeList.
*/
function pluckData(nodes, key) {
- const data = [];
- nodes.forEach(function (obj) {
- data.push(obj.dataset[key]);
- });
- return data;
+ return [...nodes].map((obj) => obj.dataset[key]);
}
function refreshHistory() {
@@ -29,18 +25,18 @@ function refreshHistory() {
);
ajaxForm(formTarget)
- .then(function (data) {
+ .then((data) => {
// Remove existing rows first then re-populate with new data
- container
- .querySelectorAll("tr[data-store-id]")
- .forEach(function (node) {
- node.remove();
- });
- data.requests.forEach(function (request) {
+ for (const node of container.querySelectorAll(
+ "tr[data-store-id]"
+ )) {
+ node.remove();
+ }
+ for (const request of data.requests) {
container.innerHTML = request.content + container.innerHTML;
- });
+ }
})
- .then(function () {
+ .then(() => {
const allIds = new Set(
pluckData(
container.querySelectorAll("tr[data-store-id]"),
@@ -55,26 +51,26 @@ function refreshHistory() {
lastRequestId,
};
})
- .then(function (refreshInfo) {
- refreshInfo.newIds.forEach(function (newId) {
+ .then((refreshInfo) => {
+ for (const newId of refreshInfo.newIds) {
const row = container.querySelector(
`tr[data-store-id="${newId}"]`
);
row.classList.add("flash-new");
- });
+ }
setTimeout(() => {
- container
- .querySelectorAll("tr[data-store-id]")
- .forEach((row) => {
- row.classList.remove("flash-new");
- });
+ for (const row of container.querySelectorAll(
+ "tr[data-store-id]"
+ )) {
+ row.classList.remove("flash-new");
+ }
}, 2000);
});
}
function switchHistory(newStoreId) {
const formTarget = djDebug.querySelector(
- ".switchHistory[data-store-id='" + newStoreId + "']"
+ `.switchHistory[data-store-id='${newStoreId}']`
);
const tbody = formTarget.closest("tbody");
@@ -84,11 +80,11 @@ function switchHistory(newStoreId) {
}
formTarget.closest("tr").classList.add("djdt-highlighted");
- ajaxForm(formTarget).then(function (data) {
+ ajaxForm(formTarget).then((data) => {
if (Object.keys(data).length === 0) {
const container = document.getElementById("djdtHistoryRequests");
container.querySelector(
- 'button[data-store-id="' + newStoreId + '"]'
+ `button[data-store-id="${newStoreId}"]`
).innerHTML = "Switch [EXPIRED]";
}
replaceToolbarState(newStoreId, data);
@@ -100,7 +96,7 @@ $$.on(djDebug, "click", ".switchHistory", function (event) {
switchHistory(this.dataset.storeId);
});
-$$.on(djDebug, "click", ".refreshHistory", function (event) {
+$$.on(djDebug, "click", ".refreshHistory", (event) => {
event.preventDefault();
refreshHistory();
});
diff --git a/debug_toolbar/static/debug_toolbar/js/timer.js b/debug_toolbar/static/debug_toolbar/js/timer.js
index a88ab0d15..a01dbb2d1 100644
--- a/debug_toolbar/static/debug_toolbar/js/timer.js
+++ b/debug_toolbar/static/debug_toolbar/js/timer.js
@@ -1,17 +1,16 @@
import { $$ } from "./utils.js";
function insertBrowserTiming() {
- const timingOffset = performance.timing.navigationStart,
- timingEnd = performance.timing.loadEventEnd,
- totalTime = timingEnd - timingOffset;
+ const timingOffset = performance.timing.navigationStart;
+ const timingEnd = performance.timing.loadEventEnd;
+ const totalTime = timingEnd - timingOffset;
function getLeft(stat) {
if (totalTime !== 0) {
return (
((performance.timing[stat] - timingOffset) / totalTime) * 100.0
);
- } else {
- return 0;
}
+ return 0;
}
function getCSSWidth(stat, endStat) {
let width = 0;
@@ -28,36 +27,31 @@ function insertBrowserTiming() {
} else {
width = 0;
}
- return width < 1 ? "2px" : width + "%";
+ return width < 1 ? "2px" : `${width}%`;
}
function addRow(tbody, stat, endStat) {
const row = document.createElement("tr");
+ const elapsed = performance.timing[stat] - timingOffset;
if (endStat) {
+ const duration =
+ performance.timing[endStat] - performance.timing[stat];
// Render a start through end bar
- row.innerHTML =
- "" +
- stat.replace("Start", "") +
- " " +
- ' ' +
- "" +
- (performance.timing[stat] - timingOffset) +
- " (+" +
- (performance.timing[endStat] - performance.timing[stat]) +
- ") ";
+ row.innerHTML = `
+${stat.replace("Start", "")}
+
+${elapsed} (+${duration})
+`;
row.querySelector("rect").setAttribute(
"width",
getCSSWidth(stat, endStat)
);
} else {
// Render a point in time
- row.innerHTML =
- "" +
- stat +
- " " +
- ' ' +
- "" +
- (performance.timing[stat] - timingOffset) +
- " ";
+ row.innerHTML = `
+${stat}
+
+${elapsed}
+`;
row.querySelector("rect").setAttribute("width", 2);
}
row.querySelector("rect").setAttribute("x", getLeft(stat));
diff --git a/debug_toolbar/static/debug_toolbar/js/toolbar.js b/debug_toolbar/static/debug_toolbar/js/toolbar.js
index 199616336..19658f76e 100644
--- a/debug_toolbar/static/debug_toolbar/js/toolbar.js
+++ b/debug_toolbar/static/debug_toolbar/js/toolbar.js
@@ -1,4 +1,4 @@
-import { $$, ajax, replaceToolbarState, debounce } from "./utils.js";
+import { $$, ajax, debounce, replaceToolbarState } from "./utils.js";
function onKeyDown(event) {
if (event.keyCode === 27) {
@@ -37,9 +37,9 @@ const djdt = {
this.parentElement.classList.add("djdt-active");
const inner = current.querySelector(
- ".djDebugPanelContent .djdt-scroll"
- ),
- storeId = djDebug.dataset.storeId;
+ ".djDebugPanelContent .djdt-scroll"
+ );
+ const storeId = djDebug.dataset.storeId;
if (storeId && inner.children.length === 0) {
const url = new URL(
djDebug.dataset.renderPanelUrl,
@@ -47,7 +47,7 @@ const djdt = {
);
url.searchParams.append("store_id", storeId);
url.searchParams.append("panel_id", panelId);
- ajax(url).then(function (data) {
+ ajax(url).then((data) => {
inner.previousElementSibling.remove(); // Remove AJAX loader
inner.innerHTML = data.content;
$$.executeScripts(data.scripts);
@@ -67,7 +67,7 @@ const djdt = {
}
}
});
- $$.on(djDebug, "click", ".djDebugClose", function () {
+ $$.on(djDebug, "click", ".djDebugClose", () => {
djdt.hideOneLevel();
});
$$.on(
@@ -102,7 +102,7 @@ const djdt = {
url = this.href;
}
- ajax(url, ajaxData).then(function (data) {
+ ajax(url, ajaxData).then((data) => {
const win = document.getElementById("djDebugWindow");
win.innerHTML = data.content;
$$.show(win);
@@ -116,48 +116,46 @@ const djdt = {
const toggleClose = "-";
const openMe = this.textContent === toggleOpen;
const name = this.dataset.toggleName;
- const container = document.getElementById(name + "_" + id);
- container
- .querySelectorAll(".djDebugCollapsed")
- .forEach(function (e) {
- $$.toggle(e, openMe);
- });
- container
- .querySelectorAll(".djDebugUncollapsed")
- .forEach(function (e) {
- $$.toggle(e, !openMe);
- });
- const self = this;
- this.closest(".djDebugPanelContent")
- .querySelectorAll(".djToggleDetails_" + id)
- .forEach(function (e) {
- if (openMe) {
- e.classList.add("djSelected");
- e.classList.remove("djUnselected");
- self.textContent = toggleClose;
- } else {
- e.classList.remove("djSelected");
- e.classList.add("djUnselected");
- self.textContent = toggleOpen;
- }
- const switch_ = e.querySelector(".djToggleSwitch");
- if (switch_) {
- switch_.textContent = self.textContent;
- }
- });
+ const container = document.getElementById(`${name}_${id}`);
+ for (const el of container.querySelectorAll(".djDebugCollapsed")) {
+ $$.toggle(el, openMe);
+ }
+ for (const el of container.querySelectorAll(
+ ".djDebugUncollapsed"
+ )) {
+ $$.toggle(el, !openMe);
+ }
+ for (const el of this.closest(
+ ".djDebugPanelContent"
+ ).querySelectorAll(`.djToggleDetails_${id}`)) {
+ if (openMe) {
+ el.classList.add("djSelected");
+ el.classList.remove("djUnselected");
+ this.textContent = toggleClose;
+ } else {
+ el.classList.remove("djSelected");
+ el.classList.add("djUnselected");
+ this.textContent = toggleOpen;
+ }
+ const switch_ = el.querySelector(".djToggleSwitch");
+ if (switch_) {
+ switch_.textContent = this.textContent;
+ }
+ }
});
- $$.on(djDebug, "click", "#djHideToolBarButton", function (event) {
+ $$.on(djDebug, "click", "#djHideToolBarButton", (event) => {
event.preventDefault();
djdt.hideToolbar();
});
- $$.on(djDebug, "click", "#djShowToolBarButton", function () {
+ $$.on(djDebug, "click", "#djShowToolBarButton", () => {
if (!djdt.handleDragged) {
djdt.showToolbar();
}
});
- let startPageY, baseY;
+ let startPageY;
+ let baseY;
const handle = document.getElementById("djDebugToolbarHandle");
function onHandleMove(event) {
// Chrome can send spurious mousemove events, so don't do anything unless the
@@ -172,11 +170,11 @@ const djdt = {
top = window.innerHeight - handle.offsetHeight;
}
- handle.style.top = top + "px";
+ handle.style.top = `${top}px`;
djdt.handleDragged = true;
}
}
- $$.on(djDebug, "mousedown", "#djShowToolBarButton", function (event) {
+ $$.on(djDebug, "mousedown", "#djShowToolBarButton", (event) => {
event.preventDefault();
startPageY = event.pageY;
baseY = handle.offsetTop - startPageY;
@@ -184,12 +182,12 @@ const djdt = {
document.addEventListener(
"mouseup",
- function (event) {
+ (event) => {
document.removeEventListener("mousemove", onHandleMove);
if (djdt.handleDragged) {
event.preventDefault();
localStorage.setItem("djdt.top", handle.offsetTop);
- requestAnimationFrame(function () {
+ requestAnimationFrame(() => {
djdt.handleDragged = false;
});
djdt.ensureHandleVisibility();
@@ -213,16 +211,42 @@ const djdt = {
if (djDebug.dataset.sidebarUrl !== undefined) {
djdt.updateOnAjax();
}
+
+ const prefersDark = window.matchMedia(
+ "(prefers-color-scheme: dark)"
+ ).matches;
+ const themeList = prefersDark
+ ? ["auto", "light", "dark"]
+ : ["auto", "dark", "light"];
+ const setTheme = (theme) => {
+ djDebug.setAttribute(
+ "data-theme",
+ theme === "auto" ? (prefersDark ? "dark" : "light") : theme
+ );
+ djDebug.setAttribute("data-user-theme", theme);
+ };
+
+ // Updates the theme using user settings
+ let userTheme = localStorage.getItem("djdt.user-theme") || "auto";
+ setTheme(userTheme);
+
+ // Adds the listener to the Theme Toggle Button
+ $$.on(djDebug, "click", "#djToggleThemeButton", () => {
+ const index = themeList.indexOf(userTheme);
+ userTheme = themeList[(index + 1) % themeList.length];
+ localStorage.setItem("djdt.user-theme", userTheme);
+ setTheme(userTheme);
+ });
},
hidePanels() {
const djDebug = getDebugElement();
$$.hide(document.getElementById("djDebugWindow"));
- djDebug.querySelectorAll(".djdt-panelContent").forEach(function (e) {
- $$.hide(e);
- });
- document.querySelectorAll("#djDebugToolbar li").forEach(function (e) {
- e.classList.remove("djdt-active");
- });
+ for (const el of djDebug.querySelectorAll(".djdt-panelContent")) {
+ $$.hide(el);
+ }
+ for (const el of document.querySelectorAll("#djDebugToolbar li")) {
+ el.classList.remove("djdt-active");
+ }
},
ensureHandleVisibility() {
const handle = document.getElementById("djDebugToolbarHandle");
@@ -231,7 +255,7 @@ const djdt = {
localStorage.getItem("djdt.top") || 265,
window.innerHeight - handle.offsetWidth
);
- handle.style.top = handleTop + "px";
+ handle.style.top = `${handleTop}px`;
},
hideToolbar() {
djdt.hidePanels();
@@ -273,18 +297,18 @@ const djdt = {
const slowjax = debounce(ajax, 200);
function handleAjaxResponse(storeId) {
- storeId = encodeURIComponent(storeId);
- const dest = `${sidebarUrl}?store_id=${storeId}`;
- slowjax(dest).then(function (data) {
- if (djdt.needUpdateOnFetch){
- replaceToolbarState(storeId, data);
+ const encodedStoreId = encodeURIComponent(storeId);
+ const dest = `${sidebarUrl}?store_id=${encodedStoreId}`;
+ slowjax(dest).then((data) => {
+ if (djdt.needUpdateOnFetch) {
+ replaceToolbarState(encodedStoreId, data);
}
});
}
// Patch XHR / traditional AJAX requests
const origOpen = XMLHttpRequest.prototype.open;
- XMLHttpRequest.prototype.open = function () {
+ XMLHttpRequest.prototype.open = function (...args) {
this.addEventListener("load", function () {
// Chromium emits a "Refused to get unsafe header" uncatchable warning
// when the header can't be fetched. While it doesn't impede execution
@@ -295,21 +319,30 @@ const djdt = {
handleAjaxResponse(this.getResponseHeader("djdt-store-id"));
}
});
- origOpen.apply(this, arguments);
+ origOpen.apply(this, args);
};
const origFetch = window.fetch;
- window.fetch = function () {
- const promise = origFetch.apply(this, arguments);
- promise.then(function (response) {
+ window.fetch = function (...args) {
+ // Heads up! Before modifying this code, please be aware of the
+ // possible unhandled errors that might arise from changing this.
+ // For details, see
+ // https://github.com/django-commons/django-debug-toolbar/pull/2100
+ const promise = origFetch.apply(this, args);
+ return promise.then((response) => {
if (response.headers.get("djdt-store-id") !== null) {
- handleAjaxResponse(response.headers.get("djdt-store-id"));
+ try {
+ handleAjaxResponse(
+ response.headers.get("djdt-store-id")
+ );
+ } catch (err) {
+ throw new Error(
+ `"${err.name}" occurred within django-debug-toolbar: ${err.message}`
+ );
+ }
}
- // Don't resolve the response via .json(). Instead
- // continue to return it to allow the caller to consume as needed.
return response;
});
- return promise;
};
},
cookie: {
@@ -318,35 +351,34 @@ const djdt = {
return null;
}
- const cookieArray = document.cookie.split("; "),
- cookies = {};
+ const cookieArray = document.cookie.split("; ");
+ const cookies = {};
- cookieArray.forEach(function (e) {
+ for (const e of cookieArray) {
const parts = e.split("=");
cookies[parts[0]] = parts[1];
- });
+ }
return cookies[key];
},
- set(key, value, options) {
- options = options || {};
-
+ set(key, value, options = {}) {
if (typeof options.expires === "number") {
- const days = options.expires,
- t = (options.expires = new Date());
- t.setDate(t.getDate() + days);
+ const days = options.expires;
+ const expires = new Date();
+ expires.setDate(expires.setDate() + days);
+ options.expires = expires;
}
document.cookie = [
- encodeURIComponent(key) + "=" + String(value),
+ `${encodeURIComponent(key)}=${String(value)}`,
options.expires
- ? "; expires=" + options.expires.toUTCString()
+ ? `; expires=${options.expires.toUTCString()}`
: "",
- options.path ? "; path=" + options.path : "",
- options.domain ? "; domain=" + options.domain : "",
+ options.path ? `; path=${options.path}` : "",
+ options.domain ? `; domain=${options.domain}` : "",
options.secure ? "; secure" : "",
"samesite" in options
- ? "; samesite=" + options.samesite
+ ? `; samesite=${options.samesite}`
: "; samesite=lax",
].join("");
diff --git a/debug_toolbar/static/debug_toolbar/js/utils.js b/debug_toolbar/static/debug_toolbar/js/utils.js
index b4c7a4cb8..0cfa80474 100644
--- a/debug_toolbar/static/debug_toolbar/js/utils.js
+++ b/debug_toolbar/static/debug_toolbar/js/utils.js
@@ -1,7 +1,7 @@
const $$ = {
on(root, eventName, selector, fn) {
root.removeEventListener(eventName, fn);
- root.addEventListener(eventName, function (event) {
+ root.addEventListener(eventName, (event) => {
const target = event.target.closest(selector);
if (root.contains(target)) {
fn.call(target, event);
@@ -17,7 +17,7 @@ const $$ = {
panelId: The Id of the panel.
fn: A function to execute when the event is triggered.
*/
- root.addEventListener("djdt.panel.render", function (event) {
+ root.addEventListener("djdt.panel.render", (event) => {
if (event.detail.panelId === panelId) {
fn.call(event);
}
@@ -40,13 +40,13 @@ const $$ = {
return !element.classList.contains("djdt-hidden");
},
executeScripts(scripts) {
- scripts.forEach(function (script) {
+ for (const script of scripts) {
const el = document.createElement("script");
el.type = "module";
el.src = script;
el.async = true;
document.head.appendChild(el);
- });
+ }
},
applyStyles(container) {
/*
@@ -54,39 +54,43 @@ const $$ = {
* The format is data-djdt-styles="styleName1:value;styleName2:value2"
* The style names should use the CSSStyleDeclaration camel cased names.
*/
- container
- .querySelectorAll("[data-djdt-styles]")
- .forEach(function (element) {
- const styles = element.dataset.djdtStyles || "";
- styles.split(";").forEach(function (styleText) {
- const styleKeyPair = styleText.split(":");
- if (styleKeyPair.length === 2) {
- const name = styleKeyPair[0].trim();
- const value = styleKeyPair[1].trim();
- element.style[name] = value;
- }
- });
- });
+ for (const element of container.querySelectorAll(
+ "[data-djdt-styles]"
+ )) {
+ const styles = element.dataset.djdtStyles || "";
+ for (const styleText of styles.split(";")) {
+ const styleKeyPair = styleText.split(":");
+ if (styleKeyPair.length === 2) {
+ const name = styleKeyPair[0].trim();
+ const value = styleKeyPair[1].trim();
+ element.style[name] = value;
+ }
+ }
+ }
},
};
function ajax(url, init) {
- init = Object.assign({ credentials: "same-origin" }, init);
- return fetch(url, init)
- .then(function (response) {
+ return fetch(url, Object.assign({ credentials: "same-origin" }, init))
+ .then((response) => {
if (response.ok) {
- return response.json();
+ return response
+ .json()
+ .catch((error) =>
+ Promise.reject(
+ new Error(
+ `The response is a invalid Json object : ${error}`
+ )
+ )
+ );
}
return Promise.reject(
- new Error(response.status + ": " + response.statusText)
+ new Error(`${response.status}: ${response.statusText}`)
);
})
- .catch(function (error) {
+ .catch((error) => {
const win = document.getElementById("djDebugWindow");
- win.innerHTML =
- '»
' +
- error.message +
- "
";
+ win.innerHTML = `
${error.message} » `;
$$.show(win);
throw error;
});
@@ -109,25 +113,27 @@ function replaceToolbarState(newStoreId, data) {
const djDebug = document.getElementById("djDebug");
djDebug.setAttribute("data-store-id", newStoreId);
// Check if response is empty, it could be due to an expired storeId.
- Object.keys(data).forEach(function (panelId) {
+ for (const panelId of Object.keys(data)) {
const panel = document.getElementById(panelId);
if (panel) {
panel.outerHTML = data[panelId].content;
- document.getElementById("djdt-" + panelId).outerHTML =
+ document.getElementById(`djdt-${panelId}`).outerHTML =
data[panelId].button;
}
- });
+ }
}
function debounce(func, delay) {
let timer = null;
let resolves = [];
- return function (...args) {
+ return (...args) => {
clearTimeout(timer);
timer = setTimeout(() => {
const result = func(...args);
- resolves.forEach((r) => r(result));
+ for (const r of resolves) {
+ r(result);
+ }
resolves = [];
}, delay);
diff --git a/debug_toolbar/templates/debug_toolbar/base.html b/debug_toolbar/templates/debug_toolbar/base.html
index 6f4967f21..607863104 100644
--- a/debug_toolbar/templates/debug_toolbar/base.html
+++ b/debug_toolbar/templates/debug_toolbar/base.html
@@ -1,11 +1,11 @@
{% load i18n static %}
{% block css %}
-
-
-{% endblock %}
+
+
+{% endblock css %}
{% block js %}
-
-{% endblock %}
+
+{% endblock js %}